Source code for policy_modules.premium_calculate
#!/usr/bin/env python
import re
from utility_modules.get_parameters import get_params
import pandas as pd
import numpy as np
import pdb
[docs]class CalculatePremium():
def __init__(self, policy_params, year):
gid_subsidy = policy_params['prem_sub']
self.prem_sub = get_params(gid_subsidy)
#subset to only values in designated year
self.premium_sub = self.prem_sub[(self.prem_sub.year==year) & (self.prem_sub.metal_tier=='silver')]
self.premium_sub= self.premium_sub.reset_index(drop=True)
#subset from subset table
self.fpl_bracket = np.ndarray((2, self.premium_sub.fpl_lower.shape[0]))
self.fpl_bracket[0,:]= self.premium_sub.fpl_lower
self.fpl_bracket[1,:]= self.premium_sub.fpl_upper
self.beta_0= self.premium_sub.beta0
self.beta_1= self.premium_sub.beta1
[docs] def get_fpl_bracket(self):
return self.fpl_bracket
[docs] def get_beta_0(self):
return self.beta_0
[docs] def get_beta_1(self):
return self.beta_1
[docs] def get_year(self):
return self.year
[docs] def calculate_premium(self, fpl, pop_df):
fpl_check = [fpl-self.fpl_bracket[1, i] for i in range(len(self.fpl_bracket[0,]))]
fpl_index = sum(x>0 for x in fpl_check)
#If income is below 100% FPL, they are treated as if they have income at 100% FPL
if(fpl<100):
fpl=100
prem_sub_percent= fpl*self.beta_1[fpl_index]+ self.beta_0[fpl_index]
return prem_sub_percent
##########################
# #
# Qiyang's code #
# #
##########################
[docs] def calculate_premium_h(self, fpl_base, incomeArr):
xp = self.premium_sub.fpl_lower/100.0 * fpl_base
fp = self.premium_sub.p_lower/100.0 * fpl_base
xp[0] = xp[1] - 0.1 # when fpl is less than 133%, it is in medicaid region
premArr = np.interp(incomeArr, xp, fp)
return premArr
# famMemberLst[0:'age', 1:'undoc', 2:'prem cap', 3:'plan_id', 4:'firm_id', 5:'Pr1')]
[docs] def prem_cap_sum(self, famMemLst, esi_drop):
ppsum_undoc = 0
ppsum_doc = 0
for m in famMemLst :
#if esi_drop and self.planIsInFirm(m[3], m[4]): continue
if m[2] == None: continue
if m[1] :
ppsum_undoc += m[2]
else :
ppsum_doc += m[2]
return (ppsum_doc, ppsum_undoc)
[docs] def calculate_premium_h_df(self, incomeArr, df, esi_drop):
x = df['income'].shape[0]
premArr = np.empty((x, 1), dtype=float)
for ind, tr in df.iterrows():
income = incomeArr[int(ind)]
fpl_base = tr['fpl_base']
famMemLst = tr['fam_members']
prem_cap = self.prem_cap_sum(famMemLst, esi_drop)
xp = self.premium_sub.fpl_lower/100.0 * fpl_base
fp = self.premium_sub.p_lower/100.0 * income
xp[0] = xp[1] - 0.1 # when fpl is less than 133%, it is in medicaid region
premArr[int(ind)] = min(prem_cap[0], np.interp(income, xp.astype(float), fp.astype(float))) + prem_cap[1]
return premArr