Skip to content

Commit

Permalink
Merge pull request #266 from openfisca/ameliore_idfoy
Browse files Browse the repository at this point in the history
Ameliore idfoy
  • Loading branch information
clallemand authored Nov 19, 2024
2 parents 2628f8b + eee8c40 commit 8908e0d
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 20 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

### 3.7.1 [#266](https://github.com/openfisca/openfisca-france-data/pull/266)

* New features
- Ajoute une étape de création des foyers fiscaux dans le builder de l'erfs fpr
- Les foyers fiscaux étaient égaux aux familles. Or les couples en concubinages sont dans la même famille mais dans deux foyers fiscaux séparés. C'est pour prendre en compte cette différence qu'une nouvelle étape a été créée.
- Chemins impactés : ` openfisca_france_data/erfs_fpr/input_data_builder`)

### 3.7.0 [#263](https://github.com/openfisca/openfisca-france-data/pull/263)

* Adapte le code pour pouvoir utiliser l'ERFS-FPR 2021
Expand Down
22 changes: 10 additions & 12 deletions openfisca_france_data/erfs_fpr/input_data_builder/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
step_02_menage as menage,
step_03_variables_individuelles as variables_individuelles,
step_04_famille as famille,
step_05_foyer as foyer,
step_06_final as final,
)

Expand Down Expand Up @@ -49,7 +50,7 @@ def build(year: int, export_flattened_df_filepath: str = None) -> None:
# - On merge les tables individus / menages
#
# Note : c'est ici où on objectivise les hypothèses, step 1
log.info('\n [[[ Year {} - Step 1 / 5 ]]] \n'.format(year))
log.info('\n [[[ Year {} - Step 1 / 6 ]]] \n'.format(year))
preprocessing.build_merged_dataframes(year = year)

# Step 02 : Si on veut calculer les allocations logement, il faut faire le matching avec une autre enquête (ENL)
Expand All @@ -58,28 +59,25 @@ def build(year: int, export_flattened_df_filepath: str = None) -> None:
# stata_directory = openfisca_survey_collection.config.get('data', 'stata_directory')
# stata_file = os.path.join(stata_directory, 'log_men_ERFS.dta')
# imputation_loyer.merge_imputation_loyer(stata_file = stata_file, year = year)
log.info('\n [[[ Year {} - Step 2 / 5 SKIPPED ]]] \n'.format(year))
log.info('\n [[[ Year {} - Step 2 / 6 SKIPPED ]]] \n'.format(year))
menage.build_variables_menage(year = year)

# Step 03 : on commence par les variables indivuelles
log.info('\n [[[ Year {} - Step 3 / 5 ]]] \n'.format(year))
log.info('\n [[[ Year {} - Step 3 / 6 ]]] \n'.format(year))
variables_individuelles.build_variables_individuelles(year = year)

# Step 04 : ici on va constituer foyer et famille à partir d'invididu et ménage
#
# - On fait individu/ménage pour pouvoir faire des familles (foyers sociaux)
# - On va faire des suppositions pour faire les familles
# - On va faire les foyers fiscaux à partir des familles
# - On va faire de suppositions pour faire les foyers fiscaux
log.info('\n [[[ Year {} - Step 4 / 5 ]]] \n'.format(year))

log.info('\n [[[ Year {} - Step 4 / 6 ]]] \n'.format(year))
famille.build_famille(year = year)

# Affreux ! On injectait tout dans un même DataFrame !!!
# C'est très moche !
#
# On crée une df par entité par période.
# Elles sont stockées dans un fichier h5
log.info('\n [[[ Year {} - Step 5 / 5 ]]] \n'.format(year))
log.info('\n [[[ Year {} - Step 5 / 6 ]]] \n'.format(year))
foyer.build_foyer(year = year)

log.info('\n [[[ Year {} - Step 6 / 6 ]]] \n'.format(year))
final.create_input_data_frame(year = year, export_flattened_df_filepath = export_flattened_df_filepath)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1387,7 +1387,7 @@ def create_statut_matrimonial(individus, year):
individus.loc[individus[matri] == 3, 'statut_marital'] = 4 # veuf(ve)
individus.loc[individus[matri] == 4, 'statut_marital'] = 3 # divorcé(e)
else:
individus['statut_marital'] = 2 # célibataire par défaut
individus['statut_marital'] = 2 # célibataire par défaut ATTENTION IL Y A BCP DE VALEURS MANQUANTES
individus.loc[individus[matri] == 1, 'statut_marital'] = 1 # marié(e)
individus.loc[individus[matri] == 4, 'statut_marital'] = 4 # veuf(ve)
individus.loc[individus[matri] == 5, 'statut_marital'] = 3 # divorcé(e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,10 +328,12 @@ def famille_2(base, year = None):
def famille_3(base = None, famille = None, kind = 'erfs_fpr', year = None):

# nom de la colonne du lien avec la personne de référence selon le millésime
if year < 2013:
lpr = "lpr"
else:
if year >= 2021:
lpr = "lprl"
elif year >= 2013:
lpr = "lprm"
else:
lpr = "lpr"

assert base is not None
assert famille is not None
Expand All @@ -347,7 +349,7 @@ def famille_3(base = None, famille = None, kind = 'erfs_fpr', year = None):
log.info(" [3.1] personnes seules de catégorie 1")

seul1 = base[~(base.noindiv.isin(famille.noindiv.values))].copy()
cohab = 'cohab' if year < 2013 else ('coupl_men' if year > 2020 else 'coured') # coupl_men remplace coured
cohab = 'cohab' if year < 2013 else ('coupl_log' if year > 2020 else 'coured') # coupl_log remplace coured

seul1 = seul1[
(seul1[lpr].isin([3, 4,5,6])) & ((seul1.jeune_non_eligible_rsa & seul1.smic55) | seul1.jeune_eligible_rsa) & (seul1[cohab] == 1) &
Expand Down
70 changes: 70 additions & 0 deletions openfisca_france_data/erfs_fpr/input_data_builder/step_05_foyer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import gc
import logging
import numpy as np
import pandas as pd

from openfisca_survey_manager.temporary import temporary_store_decorator # type: ignore


log = logging.getLogger(__name__)


@temporary_store_decorator(file_name = 'erfs_fpr')
def build_foyer(temporary_store = None, year = None):
assert temporary_store is not None
assert year is not None
if year >= 2021:
statut = 'etamatri_y_comp'
else:
statut = 'matri'
individus = temporary_store['individus_{}'.format(year)]


individus['idfoy'] = individus['idfam']
individus['quifoy'] = individus['quifam']
id_couples = individus[individus['quifam'] == 1].idfam
celibataires = individus[~individus['idfam'].isin(id_couples)]
couples = individus[individus['idfam'].isin(id_couples)]

decls = pd.merge(
couples[couples.quifam == 0][['idfam',statut]].rename(columns={statut:'statut_decl1'}),
couples[couples.quifam == 1][['idfam',statut]].rename(columns={statut:'statut_decl2'}),
on = 'idfam',
how = "inner"
)

decls['statut_decl1'] = np.where(
(decls.statut_decl1 != decls.statut_decl2),
np.where(
decls.statut_decl1.isin([1,2]) | decls.statut_decl2.isin([1,2]),
1,
8
),
decls.statut_decl1
)

assert len(couples[couples.quifam.isin([0])]) == len(decls)
couples = pd.merge(couples,decls[['idfam',"statut_decl1"]],on = 'idfam', how = 'inner')
assert len(couples[couples.quifam.isin([0])]) == len(decls)

couples_concubinage = couples[couples['statut_decl1'].isin([3,4,5,6,7,8])]
couples_maries = couples[~couples['statut_decl1'].isin([3,4,5,6,7,8])] ## les couples avec de la non réponses sur le statut marital sont mis en mariés

couples_concubinage['idfoy'] = np.where(couples_concubinage.quifam == 1,couples_concubinage.idfoy + len(individus),couples_concubinage.idfoy)
couples_concubinage['quifoy'] = np.where(couples_concubinage.quifam == 1,0,couples_concubinage.quifam)
# pour l'instant on met les conjoints dans un autre foyer seul, on ne s'occupe pas de dispatcher les personnes à charge
tag = couples_concubinage[couples_concubinage.quifam == 1].noindiv
assert len(individus) == (len(celibataires) + len(couples_maries) + len(couples_concubinage))

individus['idfoy'] = np.where(individus.noindiv.isin(tag),individus.idfoy +len(individus),individus.idfoy)
individus['quifoy'] = np.where(individus.noindiv.isin(tag),0,individus.quifoy)

ids = individus[['idfam','idfoy']].drop_duplicates().sort_values(by =['idfam','idfoy'])
ids['new_idfoy'] = range(len(ids))
individus = pd.merge(individus,ids,on = ['idfam','idfoy'], how = 'inner')

individus.drop('idfoy',axis = 1,inplace = True)
individus.rename(columns = {'new_idfoy':'idfoy'},inplace = True, errors="raise")

temporary_store['individus_{}'.format(year)] = individus

Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,6 @@ def create_ids_and_roles(individus):
lpr = "lprl"
individus.loc[individus[lpr] == 1, 'quimen'] = 0
individus.loc[individus[lpr] == 2, 'quimen'] = 1
individus['idfoy'] = individus['idfam'].copy()
individus['quifoy'] = individus['quifam'].copy()
return individus


Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

setup(
name = "OpenFisca-France-Data",
version = "3.7.0",
version = "3.7.1",
description = "OpenFisca-France-Data module to work with French survey data",
long_description = long_description,
long_description_content_type="text/markdown",
Expand Down

0 comments on commit 8908e0d

Please sign in to comment.