Source code for ogphl.input_output
import pandas as pd
import numpy as np
import os
from ogphl.constants import CONS_DICT, PROD_DICT
CUR_DIR = os.path.dirname(os.path.realpath(__file__))
"""
Read in Social Accounting Matrix (SAM) file
"""
sam_path = os.path.join(CUR_DIR, "data", "002_IFPRI_SAM_PHL_2018_SAM.csv")
def read_SAM():
"""
Read in the packaged Social Accounting Matrix (SAM) file.
Returns:
SAM (pd.DataFrame | None): Social Accounting Matrix, or None
if unavailable
"""
try:
sam = pd.read_csv(sam_path, index_col=1, thousands=",")
sam.fillna(0, inplace=True)
return sam
except Exception as exc:
print(f"Failed to read packaged SAM file: {exc}")
return None
[docs]
def get_alpha_c(sam=None, cons_dict=CONS_DICT):
"""
Calibrate the alpha_c vector, showing the shares of household
expenditures for each consumption category
Args:
sam (pd.DataFrame): SAM file
cons_dict (dict): Dictionary of consumption categories
Returns:
alpha_c (dict): Dictionary of shares of household expenditures
"""
if sam is None:
sam = read_SAM()
if sam is None:
raise RuntimeError("SAM data is unavailable. Cannot compute alpha_c.")
hh_cols = [
"hhd-r1",
"hhd-r2",
"hhd-r3",
"hhd-r4",
"hhd-r5",
"hhd-u1",
"hhd-u2",
"hhd-u3",
"hhd-u4",
"hhd-u5",
]
alpha_c = {}
overall_sum = 0
for key, value in cons_dict.items():
# note the subtraction of the row to focus on domestic consumption
category_total = (
sam.loc[sam.index.isin(value), hh_cols].values.astype(float).sum()
)
alpha_c[key] = category_total
overall_sum += category_total
for key, value in cons_dict.items():
alpha_c[key] = alpha_c[key] / overall_sum
return alpha_c
[docs]
def get_io_matrix(sam=None, cons_dict=CONS_DICT, prod_dict=PROD_DICT):
"""
Calibrate the io_matrix array. This array relates the share of each
production category in each consumption category
Args:
sam (pd.DataFrame): SAM file
cons_dict (dict): Dictionary of consumption categories
prod_dict (dict): Dictionary of production categories
Returns:
io_df (pd.DataFrame): Dataframe of io_matrix
"""
if sam is None:
sam = read_SAM()
if sam is None:
raise RuntimeError(
"SAM data is unavailable. Cannot compute io_matrix."
)
# Create initial matrix as dataframe of 0's to fill in
io_dict = {}
for key in prod_dict.keys():
io_dict[key] = np.zeros(len(cons_dict.keys()))
io_df = pd.DataFrame(io_dict, index=cons_dict.keys())
# Fill in the matrix
# Note, each cell in the SAM represents a payment from the columns
# account to the row account
# (see https://www.un.org/en/development/desa/policy/capacity/presentations/manila/6_sam_mams_philippines.pdf)
# We are thus going to take the consumption categories from rows and
# the production categories from columns
for ck, cv in cons_dict.items():
for pk, pv in prod_dict.items():
io_df.loc[io_df.index == ck, pk] = (
sam.loc[sam.index.isin(cv), pv].values.astype(float).sum()
)
# change from levels to share (where each row sums to one)
io_df = io_df.div(io_df.sum(axis=1), axis=0)
return io_df