Source code for policy_modules.employer_penalty

#!/usr/bin/env python

#needed to correctly run unit tests
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
import pdb

[docs]class EmployerPenalty(): def __init__(self, policy_dict): #read in fpl data self.penalty_table = get_params(policy_dict['employer_penalty']) self.firm_parameters = get_params(policy_dict['firm_behavior']) self.firm_nfte_pnlty = get_params(policy_dict['firm_nfte_pnlty']) # define first year of penalty self.penalty_year_start = min(self.penalty_table[self.penalty_table.min_fte <= 0].year)
[docs] def set_year(self, curr_year): """ return slice of pertinant year allows this to be reset at begining of each simulation year """ if curr_year not in self.penalty_table.year.values: raise ValueError("penalty sheet does not contain information on year under simulation") else: # collect parameters self.min_first_workers = self.penalty_table[self.penalty_table.year == curr_year].min_fte.item() self.min_firm_size = self.firm_nfte_pnlty[self.firm_nfte_pnlty.year == curr_year].min_firm_size.item() self.amt_pp = self.firm_nfte_pnlty[self.firm_nfte_pnlty.year == curr_year].amt_pp.item() self.subsidy_pp = self.firm_nfte_pnlty[self.firm_nfte_pnlty.year == curr_year].subsidy_pp.item() self.nfte_exempt = self.firm_nfte_pnlty[self.firm_nfte_pnlty.year == curr_year].nfte_exempt.item() self.curr_year = curr_year
[docs] def set_firm(self, firm_id, worker_table): f_wrks = worker_table[worker_table.firm_id == firm_id] if f_wrks.shape[0] == 0: return 0 else: #f_wrks = pd.merge(f_wrks, worker_table.Hieu[["person_id", "in_firm_weight"]], on = "person_id", how = "left") self.firm_size = (f_wrks.in_firm_weight * f_wrks.full_time).sum() # number of full-time workers
[docs] def penalty(self, esi_offer, workers_on_xc=0, fplty_mult = 1): # "Large employers not offering coverage with at least one employee receiving susidies in the exchange..." if (not esi_offer) and (self.curr_year > self.penalty_year_start) and (self.firm_size >= self.min_firm_size) and workers_on_xc > 0: return self.amt_pp * fplty_mult* max(self.firm_size - self.min_first_workers, 0) # "Large employers offering coverage with at least one employee receiving subsidies in the exchange pay the lesser of..." elif (esi_offer) and (self.curr_year > self.penalty_year_start) and (self.firm_size >= self.min_firm_size) and workers_on_xc > 0: penalty_possibility_one = self.subsidy_pp * workers_on_xc penalty_possibility_two = self.amt_pp * fplty_mult* max(self.firm_size - self.min_first_workers, 0) return min(penalty_possibility_one, penalty_possibility_two) else: return 0