Skip to content

Instantly share code, notes, and snippets.

@dlmrr
Last active June 23, 2025 05:33
Show Gist options
  • Save dlmrr/6636c85e8bc86e86a40d55f13951e423 to your computer and use it in GitHub Desktop.
Save dlmrr/6636c85e8bc86e86a40d55f13951e423 to your computer and use it in GitHub Desktop.
Arriaga decomposition
import pandas as pd
file_path = 'bltper_1x1.txt'
df = pd.read_csv(file_path, sep=r"\s+", engine='python', skiprows=2)
df["Age"] = df["Age"].str.replace("+","").astype("int64")
df = df.drop(columns=["mx","qx","ax","dx"])
start_year = 1900
end_year = 2022
# variables used in start year at age x : lx,Lx
d1 = df[df["Year"] == start_year][["lx","Lx","Tx"]].add_suffix("_" + str(start_year)).reset_index(drop=True)
# variable used in end year at age x : lx,Lx
d2 = df[df["Year"] == end_year][["lx","Lx","Tx"]].add_suffix("_" + str(end_year)).reset_index(drop=True)
#variable used in start year at age x+1 : lx
d3 = df[(df["Year"] == start_year)].shift(-1)["lx"].rename("lxnext_" + str(start_year) ).reset_index(drop=True)
#variables used in end year at age x+1 : lx,Tx
d4 = df[(df["Year"] == end_year)].shift(-1)[["lx","Tx"]].add_suffix("next_" + str(end_year)).reset_index(drop=True)
df_calc = pd.concat([d1,d2,d3,d4],axis=1)
lx_start_year = df_calc["lx_" + str(start_year)]
nLx_start_year = df_calc["Lx_" + str(start_year)]
lx_end_year = df_calc["lx_" + str(end_year)]
nLx_end_year = df_calc["Lx_" + str(end_year)]
Txnext_end_year = df_calc["Txnext_" + str(end_year)]
lxnext_start_year = df_calc["lxnext_" + str(start_year)]
lxnext_end_year = df_calc["lxnext_" + str(end_year)]
direct_effect = (lx_start_year/100000) * ( (nLx_end_year/lx_end_year) - (nLx_start_year/lx_start_year) )
indirect_effect = (Txnext_end_year/100000) * ((lx_start_year / lx_end_year ) - (lxnext_start_year/lxnext_end_year ))
df_calc["gain"] = direct_effect + indirect_effect
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment