Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IPP contributions #176

Closed
wants to merge 15 commits into from
2 changes: 1 addition & 1 deletion openfisca_france_data/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ def select_to_match_target(target_probability = None, target_mass = None, eligib
elif target_probability == 1:
return eligible * True

data = pd.DataFrame({
data = pandas.DataFrame({
'eligible': eligible,
'weights': weights,
'take': take,
Expand Down
6 changes: 4 additions & 2 deletions openfisca_france_data/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@
from openfisca_core.taxscales import MarginalRateTaxScale, combine_tax_scales
from openfisca_core.formula_helpers import switch
from openfisca_france.model.base import TypesCategorieSalarie, TAUX_DE_PRIME
from openfisca_france import FranceTaxBenefitSystem
from openfisca_france_data import openfisca_france_tax_benefit_system



log = logging.getLogger(__name__)


smic_horaire_brut = dict()
for year in range(2010,2020):
try:
smic_horaire_brut[year] = FranceTaxBenefitSystem().get_parameters_at_instant(instant = periods.period(year).start).cotsoc.gen.smic_h_b
smic_horaire_brut[year] = openfisca_france_tax_benefit_system.get_parameters_at_instant(instant = periods.period(year).start).cotsoc.gen.smic_h_b
except:
continue

Expand Down
24 changes: 19 additions & 5 deletions openfisca_france_data/erfs_fpr/get_survey_scenario.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ def get_survey_scenario(
baseline_tax_benefit_system: Optional[TaxBenefitSystem] = None,
data: Any = None, # Plusiers formats possibles.
reform: Optional[Reform] = None,
use_marginal_tax_rate: bool = False,
variation_factor: float = 0.03,
varying_variable: str = None,
) -> ErfsFprSurveyScenario:
"""Helper pour créer un :class:`ErfsFprSurveyScenario`.

Expand All @@ -38,11 +41,21 @@ def get_survey_scenario(
baseline_tax_benefit_system,
)

survey_scenario = ErfsFprSurveyScenario.create(
tax_benefit_system = tax_benefit_system,
baseline_tax_benefit_system = baseline_tax_benefit_system,
year = year,
)
if use_marginal_tax_rate == False:
survey_scenario = ErfsFprSurveyScenario.create(
tax_benefit_system = tax_benefit_system,
baseline_tax_benefit_system = baseline_tax_benefit_system,
year = year,
)
else:
assert varying_variable is not None, "You need to specify the varying variable."
survey_scenario = ErfsFprSurveyScenario.create(
tax_benefit_system = tax_benefit_system,
baseline_tax_benefit_system = baseline_tax_benefit_system,
year = year,
)
survey_scenario.variation_factor = variation_factor
survey_scenario.varying_variable = varying_variable

# S'il n'y a pas de données, on sait où les trouver.
if data is None:
Expand Down Expand Up @@ -70,6 +83,7 @@ def get_survey_scenario(
survey_scenario.init_from_data(
data = data,
rebuild_input_data = rebuild_input_data,
use_marginal_tax_rate = use_marginal_tax_rate,
)

return survey_scenario
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import logging


from multipledispatch import dispatch # type: ignore
#from multipledispatch import dispatch # type: ignore


from openfisca_france_data.erfs_fpr.input_data_builder import (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ def imputation_loyer(temporary_store = None, year = None):
receiver = erf,
donor = logement,
matching_variables = matchvars,
z_variables = u"lmlm",
z_variables = "lmlm",
donor_classes = classes,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
create_traitement_indiciaire_brut,
create_revenus_remplacement_bruts,
)
from openfisca_france_data import openfisca_france_tax_benefit_system
from openfisca_france_data.utils import assert_dtype
from openfisca_survey_manager.temporary import temporary_store_decorator

Expand All @@ -32,7 +33,7 @@
smic_horaire_brut = dict()
for year in range(2010, 2020):
try:
smic_horaire_brut[year] = FranceTaxBenefitSystem().get_parameters_at_instant(instant = periods.period(year).start).cotsoc.gen.smic_h_b
smic_horaire_brut[year] = openfisca_france_tax_benefit_system.get_parameters_at_instant(instant = periods.period(year).start).cotsoc.gen.smic_h_b
except:
continue

Expand Down Expand Up @@ -80,7 +81,7 @@ def smic_annuel_imposbale_from_net(year):


smic_horaire_brut_by_year = dict([
(year, FranceTaxBenefitSystem().get_parameters_at_instant(instant = periods.period(year).start).cotsoc.gen.smic_h_b)
(year, openfisca_france_tax_benefit_system.get_parameters_at_instant(instant = periods.period(year).start).cotsoc.gen.smic_h_b)
for year in range(2005, 2020)
])

Expand Down Expand Up @@ -146,7 +147,7 @@ def create_variables_individuelles(individus, year, survey_year = None):
# On fait ça car, aussi bien le TaxBenefitSystem et celui réformé peuvent être des réformes
# Par exemple : si je veux calculer le diff entre le PLF2019 et un ammendement,
# je besoin d'un droit courantcomme même du droit currant pour l'année des données
tax_benefit_system = FranceTaxBenefitSystem()
tax_benefit_system = openfisca_france_tax_benefit_system

# On n'a pas le salaire brut mais le salaire net ou imposable, on doit l'invertir
create_salaire_de_base(individus, period = period, revenu_type = revenu_type, tax_benefit_system = tax_benefit_system)
Expand All @@ -159,7 +160,7 @@ def create_variables_individuelles(individus, year, survey_year = None):


def create_individu_variables_brutes(individus, revenu_type = None, period = None, tax_benefit_system = None,
mass_by_categorie_salarie = None):
mass_by_categorie_salarie = None, calibration_eec = False):
"""
Crée les variables brutes de revenus:
- salaire_de_base
Expand Down Expand Up @@ -187,7 +188,7 @@ def create_individu_variables_brutes(individus, revenu_type = None, period = Non
created_variables.append('categorie_non_salarie')

# FIXME: categorie_non_salarie modifie aussi categorie_salarie !!
if mass_by_categorie_salarie is not None:
if (mass_by_categorie_salarie is not None) & (calibration_eec is True):
calibrate_categorie_salarie(individus, year = None, mass_by_categorie_salarie = mass_by_categorie_salarie)

create_salaire_de_base(individus, period = period, revenu_type = revenu_type, tax_benefit_system = tax_benefit_system)
Expand Down Expand Up @@ -623,8 +624,6 @@ def create_categorie_non_salarie(individus):
] = 2




def create_contrat_de_travail(individus, period, salaire_type = 'imposable'):
"""
Création de la variable contrat_de_travail et heure_remunerees_volume
Expand Down Expand Up @@ -661,9 +660,10 @@ def create_contrat_de_travail(individus, period, salaire_type = 'imposable'):
period = periods.period(period)

assert salaire_type in ['net', 'imposable']

individus.loc[individus.hhc == "", "hhc"] = np.nan
individus.hhc = individus.hhc.astype(float)

if ((individus.hhc.dtype != 'float') & (individus.hhc.dtype != 'float32')):
individus.loc[individus.hhc == "", "hhc"] = np.nan
individus.hhc = individus.hhc.astype(float)
individus.loc[individus.hhc <= 0.01 , "hhc"] = np.nan

assert ((individus.hhc > 0) | individus.hhc.isnull()).all()
Expand Down Expand Up @@ -1161,10 +1161,10 @@ def compute_taux_csg_remplacement(rfr, nbptr):
log.debug(
"Distribution of taux_csg_remplacement:\n",
distribution)
log.info(
"Target of taux_csg_remplacement (in thousands):\n",
distribution[[(2, 1), (3 , 2)]].sum()
)
# log.info(
# "Target of taux_csg_remplacement (in thousands):\n",
# distribution[[(2, 1), (3 , 2)]].sum()
# )
assert individus['taux_csg_remplacement_n_1'].isin(range(4)).all()
assert individus['taux_csg_remplacement'].isin(range(4)).all()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -831,6 +831,8 @@ def famille_7(base = None, famille = None, indivi = None, kind = 'erfs_fpr',
log.info(u'Il y a {} ménages contenant des familles sans chefs. on les retire'.format(
len(idents)))
famille = famille.loc[~famille.ident.isin(idents)].copy()
indivi = indivi.loc[~indivi.ident.isin(idents)].copy()

control_04(famille, base)

log.info(u"value_counts quifam : \n {}".format(famille['quifam'].value_counts().sort_index()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ def create_input_data_frame(temporary_store = None, year = None):
log.info('step_05_create_input_data_frame: Etape finale ')
individus = temporary_store['individus_{}'.format(year)]
menages = temporary_store['menages_{}'.format(year)]

variables = [
'activite',
'age',
Expand Down Expand Up @@ -74,8 +75,9 @@ def create_input_data_frame(temporary_store = None, year = None):

menages = extract_menages_variables(menages)
individus = create_collectives_foyer_variables(individus, menages)

menages = menages[
idmens = individus.idmen.unique()
menages = menages.loc[
menages.idmen.isin(idmens),
[
'idmen',
'loyer',
Expand Down
22 changes: 11 additions & 11 deletions openfisca_france_data/model/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@

class Deciles(Enum):
__order__ = 'hors_champs decile_1 decile_2 decile_3 decile_4 decile_5 decile_6 decile_7 decile_8 decile_9 decile_10' # Needed to keep the order in Python 2
hors_champs = u"Hors champ"
decile_1 = u"1er décile"
decile_2 = u"2nd décile"
decile_3 = u"3e décile"
decile_4 = u"4e décile"
decile_5 = u"5e décile"
decile_6 = u"6e décile"
decile_7 = u"7e décile"
decile_8 = u"8e décile"
decile_9 = u"9e décile"
decile_10 = u"10e décile"
hors_champs = "Hors champ"
decile_1 = "1er décile"
decile_2 = "2nd décile"
decile_3 = "3e décile"
decile_4 = "4e décile"
decile_5 = "5e décile"
decile_6 = "6e décile"
decile_7 = "7e décile"
decile_8 = "8e décile"
decile_9 = "9e décile"
decile_10 = "10e décile"
44 changes: 22 additions & 22 deletions openfisca_france_data/model/calage.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
class nbinde(Variable):
value_type = int
entity = Menage
label = u"Nombre d'individus dans le ménage. La valeur varie entre 1 et 6 pour 6 membres et plus."
label = "Nombre d'individus dans le ménage. La valeur varie entre 1 et 6 pour 6 membres et plus."
definition_period = YEAR

def formula(menage, period, parameters):
Expand Down Expand Up @@ -67,7 +67,7 @@ def _nb_ageq0(self, age_en_mois_holder):
class cohab(Variable):
value_type = bool
entity = Menage
label = u"Vie en couple"
label = "Vie en couple"
definition_period = YEAR

def formula(menage, period, parameters):
Expand All @@ -83,7 +83,7 @@ class act_cpl(Variable):
is_period_size_independent = True
value_type = int
entity = Menage
label = u"Nombre d'actifs parmi la personne de référence du méange et son conjoint"
label = "Nombre d'actifs parmi la personne de référence du méange et son conjoint"
definition_period = YEAR

def formula(menage, period, parameters):
Expand All @@ -103,7 +103,7 @@ class act_enf(Variable):
is_period_size_independent = True
value_type = int
entity = Menage
label = u"Nombre d'enfants actifs"
label = "Nombre d'enfants actifs"
definition_period = YEAR

def formula(menage, period, parameters):
Expand All @@ -128,7 +128,7 @@ def _nb_act(act_cpl, act_enf):
class cplx(Variable):
value_type = bool
entity = Menage
label = u"Indicatrice de ménage complexe. Un ménage est complexe si les personnes autres que la personne de référence ou son conjoint ne sont pas enfants."
label = "Indicatrice de ménage complexe. Un ménage est complexe si les personnes autres que la personne de référence ou son conjoint ne sont pas enfants."
definition_period = YEAR

def formula(menage, period, parameters):
Expand Down Expand Up @@ -157,30 +157,30 @@ def formula(menage, period, parameters):

class TypesMenage15(Enum):
__order__ = 'inconnu personne_seule_active personne_seule_inactive famille_monoparentale_parent_actif famille_monoparentale_parent_inactif_enfant_actif famille_monoparentale_inactifs couple_sans_enfants_1_actif couple_sans_enfants_2_actifs couple_sans_enfants_inactifs couple_avec_enfants_1_actif couple_avec_enfants_2_actifs couple_avec_enfants_parents_inactifs_enfant_actif couple_avec_enfants_inactifs autres_1_actif autres_2_actifs autres_inactifs' # Needed to preserve the order in Python 2
inconnu = u""
personne_seule_active = u"Personne seule active"
personne_seule_inactive = u"Personne seule inactive"
famille_monoparentale_parent_actif = u"Familles monoparentales, parent actif"
famille_monoparentale_parent_inactif_enfant_actif = u"Familles monoparentales, parent inactif et au moins un enfant actif"
famille_monoparentale_inactifs = u"Familles monoparentales, tous inactifs"
couple_sans_enfants_1_actif = u"Couples sans enfant, 1 actif"
couple_sans_enfants_2_actifs = u"Couples sans enfant, 2 actifs"
couple_sans_enfants_inactifs = u"Couples sans enfant, tous inactifs"
couple_avec_enfants_1_actif = u"Couples avec enfant, 1 membre du couple actif"
couple_avec_enfants_2_actifs = u"Couples avec enfant, 2 membres du couple actif"
couple_avec_enfants_parents_inactifs_enfant_actif = u"Couples avec enfant, couple inactif et au moins un enfant actif"
couple_avec_enfants_inactifs = u"Couples avec enfant, tous inactifs"
autres_1_actif = u"Autres ménages, 1 actif"
autres_2_actifs = u"Autres ménages, 2 actifs ou plus"
autres_inactifs = u"Autres ménages, tous inactifs"
inconnu = ""
personne_seule_active = "Personne seule active"
personne_seule_inactive = "Personne seule inactive"
famille_monoparentale_parent_actif = "Familles monoparentales, parent actif"
famille_monoparentale_parent_inactif_enfant_actif = "Familles monoparentales, parent inactif et au moins un enfant actif"
famille_monoparentale_inactifs = "Familles monoparentales, tous inactifs"
couple_sans_enfants_1_actif = "Couples sans enfant, 1 actif"
couple_sans_enfants_2_actifs = "Couples sans enfant, 2 actifs"
couple_sans_enfants_inactifs = "Couples sans enfant, tous inactifs"
couple_avec_enfants_1_actif = "Couples avec enfant, 1 membre du couple actif"
couple_avec_enfants_2_actifs = "Couples avec enfant, 2 membres du couple actif"
couple_avec_enfants_parents_inactifs_enfant_actif = "Couples avec enfant, couple inactif et au moins un enfant actif"
couple_avec_enfants_inactifs = "Couples avec enfant, tous inactifs"
autres_1_actif = "Autres ménages, 1 actif"
autres_2_actifs = "Autres ménages, 2 actifs ou plus"
autres_inactifs = "Autres ménages, tous inactifs"


class typmen15(Variable):
value_type = Enum
possible_values = TypesMenage15
default_value = TypesMenage15.inconnu
entity = Menage
label = u"Type de ménage"
label = "Type de ménage"
definition_period = YEAR

def formula(menage, period, parameters):
Expand Down