Exemple #1
0
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    
Exemple #2
0
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
Exemple #3
0
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