def test_unaf(): e = 2 ea = 0 rev_smic_chef = 1.5 rev_smic_part = 1.5 temps_garde ="classique" # alternee_pension_non_decl', 'alternee_pension_decl uc_parameters = {'alpha' : 0, 'beta' : .5, 'gamma' : 1} print get_unaf(e,ea,a=1) disabled = None opt_pension_unaf = compute_optimal_pension(e, ea, rev_smic_chef, rev_smic_part, temps_garde, uc_parameters = uc_parameters, criterium = "unaf2", disabled=disabled) print "unaf2 : ", opt_pension_unaf
def optimal_pension(criterium, disable_api = False): e = 2 ea = 0 rev_smic_chef = 3.5 rev_smic_part = 0 temps_garde ="alternee_pension_non_decl" # 'classique', 'alternee_pension_decl uc_parameters = {'alpha' : 0.4, 'beta' : .7, 'gamma' : 1.4} disabled = [] if disable_api: disabled += ['api'] if criterium == "unaf": print get_unaf(e,ea) opt_pension_nv = compute_optimal_pension(e, ea, rev_smic_chef, rev_smic_part, temps_garde, uc_parameters = uc_parameters, criterium = "nivvie", disabled=disabled) print "nivvie : ", opt_pension_nv opt_pension_unaf = compute_optimal_pension(e, ea, rev_smic_chef, rev_smic_part, temps_garde, uc_parameters = uc_parameters, criterium = "unaf", disabled=disabled) print "unaf : ", opt_pension_unaf opt_pension = max(opt_pension_nv, opt_pension_unaf) else: opt_pension = compute_optimal_pension(e, ea, rev_smic_chef, rev_smic_part, temps_garde, uc_parameters = uc_parameters, criterium=criterium, disabled=disabled) asf = get_asf(e+ea, year=YEAR) print 'opt_pension :', opt_pension print 'asf :', asf if opt_pension >= asf: df = get_results_df(e, ea, rev_smic_chef, rev_smic_part, temps_garde, uc_parameters = uc_parameters, pension = opt_pension, disabled = disabled + ['asf'] ) else: df = get_results_df(e, ea, rev_smic_chef, rev_smic_part, temps_garde, uc_parameters = uc_parameters, pension = 0, disabled=disabled) print df.to_string() return df
def compute_optimal_pension(e, ea, rev_smic_chef, rev_smic_part, temps_garde, uc_parameters=None, criterium=None, disabled=None): """ Return optimal pension according to different criteria Parameters ---------- e : number of kids ea : number of teenagers rev_smic_chef : revenue of the non custodian parent (in SMIC) rev_smic_part : revenue of the custodian parent (in SMIC) temps_garde : type of custody uc_parameters : parameters to compute the household consumption units criterium : the normative criteria used to compute the optimal pension disabled : the disabled presattions of the socio-fiscal model Returns ------- optimal_pension : the optimal pension """ EPS = 1e-3 from scipy.optimize import fixed_point, fsolve from scripts.unaf import get_unaf dep_decent_unaf = get_unaf(e, ea) dep_decent_unaf2 = get_unaf(e, ea, a=1) # Define a useful function def func_optimal_pension(pension): if disabled is None: dis = ["asf"] elif "asf" not in disabled: dis = disabled + ['asf'] df = get_results_df(e, ea, rev_smic_chef, rev_smic_part, temps_garde, uc_parameters=uc_parameters, pension=pension, disabled=dis) print df.to_string() df = df.set_index([u"ménage"]) private_cost_after = ( df.get_value(u"chef", u"prise en charge privée de l'enfant") + df.get_value(u"part", u"prise en charge privée de l'enfant") ) revdisp_chef = df.get_value(u"chef", u"revdisp") revdisp_part = df.get_value(u"part", u"revdisp") total_cost_after_chef = df.get_value(u"chef", u"dépense totale pour enfants") total_cost_after_part = df.get_value(u"part", u"dépense totale pour enfants") total_cost_before = df.get_value(u"couple", u"dépense totale pour enfants") public_cost_after_chef = df.get_value(u"chef", u"prise en charge publique de l'enfant") public_cost_after_part = df.get_value(u"part", u"prise en charge publique de l'enfant") nivvie_chef_after = df.get_value(u"chef", u"nivvie") nivvie_part_after = df.get_value(u"part", u"nivvie") nivvie_chef_before = df.get_value(u"chef", u"nivvie")/df.get_value(u"chef", u"nivvie_loss") nivvie_part_before = df.get_value(u"part", u"nivvie")/df.get_value(u"part", u"nivvie_loss") # opt_pension = private_cost_after*(revdisp_chef + pension)/(revdisp_chef+revdisp_part) - total_cost_after_chef + public_cost_after_chef private_cost_after_chef = df.get_value(u"chef", u"prise en charge privée de l'enfant") private_cost_after_part = df.get_value(u"part", u"prise en charge privée de l'enfant") private_cost_before = df.get_value(u"couple", u"prise en charge privée de l'enfant") if criterium == "revdisp": opt_pension = private_cost_after*revdisp_chef/(revdisp_chef+revdisp_part)-private_cost_after_chef elif criterium == "nivvie": opt_pension = private_cost_after*nivvie_chef_after/(nivvie_chef_after+nivvie_part_after)-private_cost_after_chef elif criterium == "revdisp_pyc": opt_pension = private_cost_after*(revdisp_chef+pension)/(revdisp_chef+revdisp_part)-private_cost_after_chef elif criterium == "jacquot": alpha = uc_parameters['alpha'] beta = uc_parameters['beta'] gamma = uc_parameters['gamma'] A = (.3*e + .5*ea)/(1 + .3*e + .5*ea) B = (alpha*gamma*(.3*e + .5*ea))/(1 + alpha*gamma*(.3*e + .5*ea)) C = 1 + .3*e + .5*ea D = 1 + alpha*gamma*(.3*e + .5*ea) opt_pension = ((A-B)*revdisp_chef*revdisp_part)/((revdisp_chef/C) + (revdisp_part/D)) elif criterium == "share_private_cost_before_chef": opt_pension = - private_cost_after_chef + private_cost_before*nivvie_chef_before/(nivvie_chef_before+nivvie_part_before) elif criterium == "share_private_cost_before_part": opt_pension = private_cost_after_part - private_cost_before*nivvie_part_before/(nivvie_chef_before+nivvie_part_before) elif criterium == "share_private_cost_before_chef_nivvie_after": opt_pension = - private_cost_after_chef + private_cost_before*nivvie_chef_after/(nivvie_chef_after+nivvie_part_after) elif criterium == "share_private_cost_before_chef_nivvie_after_coef": opt_pension = - private_cost_after_chef + 1.4*private_cost_before*nivvie_chef_after/(nivvie_chef_after+nivvie_part_after) elif criterium == "share_private_cost_before_part_nivvie_after": opt_pension = private_cost_after_part - private_cost_before*nivvie_part_after/(nivvie_chef_after+nivvie_part_after) elif criterium == "same_total_cost": return total_cost_after_chef+total_cost_after_part-total_cost_before elif criterium == "unaf": return total_cost_after_part - dep_decent_unaf elif criterium == "unaf2": return revdisp_part - dep_decent_unaf2 return opt_pension if criterium == "same_total_cost" or criterium in ["unaf", "unaf2"]: res = fsolve(func_optimal_pension, 10000, xtol = EPS) print res optimal_pension = res[0] else: try : optimal_pension = fixed_point(func_optimal_pension, 0, xtol = EPS, maxiter = 10) except RuntimeError: optimal_pension = 10000 return optimal_pension