Source code for policy_modules.excise_tax
#!/usr/bin/env python
import numpy as np
import pandas as pd
from utility_modules.get_parameters import get_params
from utility_modules.get_parameters import get_parse_params
[docs]class ExciseTax:
def __init__(self, policy_params):
#policy file identifiers
g_age_id = policy_params['gruber_age_rating']
fb_id = policy_params['firm_behavior']
pr_id = policy_params['premium_ratios']
self.ar = get_params(g_age_id)
self.fparam = get_parse_params(fb_id)
self.Avg_AgeRating_4workers = float(self.fparam.Avg_AgeRating_4workers)
self.pr = get_params(pr_id)
if (float(self.fparam.FEHBprem_increase_2010to_yr1) > float(self.fparam.target_increase_2010to_yr1)):
self.adjuster=float(self.fparam.FEHBprem_increase_2010to_yr1)/float(self.fparam.target_increase_2010to_yr1)
else: self.adjuster = 1
[docs] def set_year(self, curr_year):
self.adjuster=self.adjuster*(float(self.fparam.cpiu))**(curr_year-float(self.fparam.Year_excise_tax_begins))
if (curr_year>float(self.fparam.Year_excise_tax_begins)): self.adjuster=self.adjuster*1.01
self.Excise_threshold_single_yr1 = float(self.fparam.Excise_threshold_single_yr1)*self.adjuster
self.Excise_threshold_family_yr1 = float(self.fparam.Excise_threshold_family_yr1)*self.adjuster
self.Excise_bump_if_high_risk_single = float(self.fparam.Excise_bump_if_high_risk_single)*self.adjuster
self.Excise_bump_if_high_risk_family = float(self.fparam.Excise_bump_if_high_risk_family)*self.adjuster
[docs] def get_rate_by_age(self, age):
df_age = self.ar[(self.ar['age_lb']<=age) & (self.ar['age_ub']>=age)]
y = df_age.iloc[0]['rate']
return y/self.Avg_AgeRating_4workers
[docs] def get_excise_av_threshold(self, worker_table):
age_rating = np.array(map(self.get_rate_by_age, worker_table['age']))
single = age_rating*self.Excise_threshold_single_yr1 + \
age_rating*worker_table['high_risk']*self.Excise_bump_if_high_risk_single
family = age_rating*self.Excise_threshold_family_yr1 + \
age_rating*worker_table['high_risk']*self.Excise_bump_if_high_risk_family
return pd.concat([single, family], axis=1, ignore_index=True)
[docs] def premium_change(self, firm_id, worker_table, prem_df):
excise_av_thresh= self.get_excise_av_threshold(worker_table[worker_table['firm_id']==firm_id])
threshold_s= float(np.mean(excise_av_thresh[0]))
threshold_f= float(np.mean(excise_av_thresh[1]))
premium_self= float(prem_df['premium_self_actual'].item())
premium_fam = float(prem_df['premium_fam_actual'].item())
prop_av=float(prem_df['av_value'])
if (premium_self > threshold_s or premium_fam > threshold_f) & (float(prem_df['av_value']) > float(self.fparam['av_lowest'])):
prop_av = prem_df['av_value']*min(threshold_s/premium_self, threshold_f/premium_fam)
if (prop_av.item() >=float(self.fparam['av_lowest'])):
prem_df['premium_self_actual'] = float(prem_df['av_value'])*threshold_s/prem_df['premium_self_actual'].item()
prem_df['premium_sp_actual'] = premium_self*self.pr['Value'][self.pr['Name']=='self_spouse'].item()
prem_df['premium_ch_actual'] = premium_self*self.pr['Value'][self.pr['Name']=='self_child'].item()
prem_df['premium_fam_actual'] = premium_self*self.pr['Value'][self.pr['Name']=='self_all'].item()
prem_df['av_value'] = prop_av
else:
prem_df['premium_self'] = premium_self*self.fparam['av_lowest']/prem_df['av_value'].item()
prem_df['premium_sp'] = premium_self*self.pr['Value'][self.pr['Name']=='self_spouse'].item()
prem_df['premium_ch'] = premium_self*self.pr['Value'][self.pr['Name']=='self_child'].item()
prem_df['premium_fam'] = premium_self*self.pr['Value'][self.pr['Name']=='self_all'].item()
prem_df['av_value'] = self.fparam['av_lowest']