Source code for ogusa.bequest_transmission

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
from ogusa.utils import MVKDE

CURDIR = os.path.split(os.path.abspath(__file__))[0]


[docs] def get_bequest_matrix( J=7, lambdas=np.array([0.25, 0.25, 0.2, 0.1, 0.1, 0.09, 0.01]), graphs=True ): """ Returns S x J matrix representing the fraction of aggregate bequests that go to each household by age and lifetime income group. """ # Create directory if output directory does not already exist CURDIR = os.path.split(os.path.abspath(__file__))[0] output_fldr = "csv_output_files" output_dir = os.path.join(CURDIR, "..", "data", output_fldr) if not os.access(output_dir, os.F_OK): os.makedirs(output_dir) image_fldr = "images" image_dir = os.path.join(CURDIR, "..", "data", image_fldr) if not os.access(image_dir, os.F_OK): os.makedirs(image_dir) # Define a lambda function to compute the weighted mean: # wm = lambda x: np.average( # x, weights=df.loc[x.index, "fam_smpl_wgt_core"]) # Read in dataframe of PSID data # df = ogcore.utils.safe_read_pickle( # os.path.join(CURDIR, "data", "PSID", "psid_lifetime_income.pkl") # ) df = pd.read_csv( os.path.join(CURDIR, "..", "data", "PSID", "psid_lifetime_income.csv") ) # Do some tabs with data file... # 'net_wealth', 'inheritance', 'value_inheritance_1st', # 'value_inheritance_2nd', 'value_inheritance_3rd's # inheritance available from 1988 onwards... # Note that the resulting distribution is very different from what # Rick has found with the SCF df["sum_inherit"] = ( df["value_inheritance_1st"] + df["value_inheritance_2nd"] + df["value_inheritance_3rd"] ) # print(df[['sum_inherit', 'inheritance']].describe()) if graphs: # Total inheritances by year df.groupby("year_data").mean(numeric_only=True).plot(y="inheritance") plt.savefig(os.path.join(image_dir, "inheritance_year.png")) df.groupby("year_data").mean(numeric_only=True).plot(y="sum_inherit") plt.savefig(os.path.join(image_dir, "sum_inherit_year.png")) # not that summing up inheritances gives a much larger value than # taking the inheritance variable # Fraction of inheritances in a year by age # line plot df[df["year_data"] >= 1988].groupby("age").mean( numeric_only=True ).plot(y="net_wealth") plt.savefig(os.path.join(image_dir, "net_wealth_age.png")) df[df["year_data"] >= 1988].groupby("age").mean( numeric_only=True ).plot(y="inheritance") plt.savefig(os.path.join(image_dir, "inheritance_age.png")) # Inheritances by lifetime income group # bar plot df[df["year_data"] >= 1988].groupby("li_group").mean( numeric_only=True ).plot.bar(y="net_wealth") plt.savefig(os.path.join(image_dir, "net_wealth_li.png")) df[df["year_data"] >= 1988].groupby("li_group").mean( numeric_only=True ).plot.bar(y="inheritance") plt.savefig(os.path.join(image_dir, "inheritance_li.png")) # lifecycle plots with line for each ability type pd.pivot_table( df[df["year_data"] >= 1988], values="net_wealth", index="age", columns="li_group", aggfunc="mean", ).plot(legend=True) plt.savefig(os.path.join(image_dir, "net_wealth_age_li.png")) pd.pivot_table( df[df["year_data"] >= 1988], values="inheritance", index="age", columns="li_group", aggfunc="mean", ).plot(legend=True) plt.savefig(os.path.join(image_dir, "inheritance_age_li.png")) # Matrix Fraction of inheritances in a year by age and lifetime_inc inheritance_matrix = pd.pivot_table( df[df["year_data"] >= 1988], values="inheritance", index="age", columns="li_group", aggfunc="sum", ) # replace NaN with zero inheritance_matrix.fillna(value=0, inplace=True) inheritance_matrix = inheritance_matrix / inheritance_matrix.sum().sum() # inheritance_matrix.to_csv(os.path.join( # output_dir, 'bequest_matrix.csv')) # estimate kernel density of bequests kde_matrix = MVKDE( 80, 7, inheritance_matrix.to_numpy(), filename=os.path.join(image_dir, "inheritance_kde.png"), plot=graphs, bandwidth=0.5, ) if (J == 10) and np.array_equal( np.squeeze(lambdas[:6]), np.array([0.25, 0.25, 0.2, 0.1, 0.1, 0.09]) ): kde_matrix_new = np.zeros((80, J)) kde_matrix_new[:, :6] = kde_matrix[:, :6] kde_matrix_new[:, 6:] = ( kde_matrix[:, 6:].sum(axis=1).reshape(80, 1) * np.tile(np.reshape(lambdas[6:], (1, 4)), (80, 1)) / lambdas[6:].sum() ) kde_matrix = kde_matrix_new np.savetxt( os.path.join(output_dir, "bequest_matrix_kde.csv"), kde_matrix, delimiter=",", ) return kde_matrix