--- title: Objectif: Ajouter le RFR dans notre base de données keywords: fastai sidebar: home_sidebar nb_path: "notebooks/retraitement_erfs-fpr/modules/calibration_02_add_and_cal_var.ipynb" ---
import json
import pandas as pd
from leximpact_socio_fisca_simu_etat.config import Configuration
from leximpact_prepare_data.toolbase import (
compute_var_in_ff,
create_simulation,
foyers_fiscaux_to_individus,
individus_to_foyers_fiscaux,
)
config = Configuration(project_folder="leximpact-prepare-data")
from leximpact_prepare_data.calibration_tools import *
erfs_02 = pd.read_hdf(
config.get("DATA_OUT") + "02_erfs_enlarged_" + config.get("YEAR_ERFS") + "_dev.h5"
)
erfs_02.columns
# DEBUG - SUBSET
# erfs_02 = erfs_02.sample(n=100, random_state=1)
erfs_02.sort_values(by="idfoy")
# Année de calcul du RFR = Année de la base POTE = Année de la base ERFS
annee_de_calcul = config.get("YEAR_ERFS")
annee_erfs = config.get("YEAR_ERFS")
annee_pote = config.get("YEAR_ERFS")
# Choix de la variable de calibration
var_name = "rfr"
print("Nombre d'individus : ", len(erfs_02))
from openfisca_france import FranceTaxBenefitSystem
TBS = FranceTaxBenefitSystem()
my_simu, dico = create_simulation(data=erfs_02, tbs=TBS, period=annee_de_calcul)
var_list = ["rfr"]
cols_declarant_principal = ["rfr"]
erfs_03 = compute_var_in_ff(
my_simu, annee_de_calcul, erfs_02, var_list, cols_declarant_principal
)
print("Nombre d'individus : ", len(erfs_03))
print("Somme des poids : ", erfs_03["wprm"].sum())
erfs_03
print("Max : ", erfs_03["rfr"].max())
print("Min : ", erfs_03["rfr"].max())
print("Somme : ", erfs_03["rfr"].sum())
print("Somme pondérée : ", (erfs_03["rfr"] * erfs_03["wprm"]).sum())
file = config.get("CALIB") + "CalibPote-" + config.get("YEAR_ERFS") + "-revkire.json"
with open(file) as f:
calib = json.load(f)
calib["buckets"][12]
erfs_03_ff = individus_to_foyers_fiscaux(erfs_03)
erfs_03_ff.head()
print("Nombre de foyers : ", len(erfs_03_ff))
print("Somme des poids : ", erfs_03_ff["wprm"].sum())
len(erfs_03_ff[erfs_03_ff["rfr"] == 0])
df_erfs, df_pote = distrib_to_quantiles(erfs_03_ff, "rfr", calib)
# On plot l'amélioration
fig1, error_avant_calib = compare_distributions(
df_erfs,
df_pote,
"rfr",
annee_erfs,
annee_pote,
log=False,
title_suffix="avant_calib",
df_cal=[],
)
df_pote.head()
df_erfs.head()
erreur_max = 0.01 # 05 # On choisit de calibrer à 1%
tracking, erfs_cal_ff = calibration_quantiles("rfr", erfs_03_ff, df_pote, erreur_max)
1663290068.7522333 / 1663290068.752233
# erfs_cal_ff.head()
tracking
erfs_cal_ff["rfr"] = erfs_cal_ff["var_cal"]
# Analyse
avant = (erfs_03_ff["rfr"] * erfs_03_ff["wprm"]).sum()
apres = (erfs_cal_ff["rfr"] * erfs_cal_ff["wprm"]).sum()
pote = df_pote["sum"].sum()
# print(f"{avant=:,}, {apres=:,}, {pote=:,}")
print(
"Amélioration ",
(avant - apres),
"Erreur restante :",
100 * (pote - apres) / pote,
" %",
)
df_cal, df_pote = distrib_to_quantiles(erfs_cal_ff, "rfr", calib)
error = 100 * (df_pote["sum"].sum() - df_cal["sum"].sum()) / df_pote["sum"].sum()
print(error)
fig2, error_post_calib = compare_distributions(
df_erfs,
df_pote,
"rfr",
annee_erfs,
annee_pote,
log=False,
title_suffix="avant_calib",
df_cal=df_cal,
)
df_cal
print(
"Après calibration de la variable ",
var_name,
"sur POTE ",
annee_pote,
", on est passé d'une erreur de ",
error_avant_calib,
"% à une erreur de ",
error_post_calib,
"%",
"soit une amélioration de ",
error_avant_calib - error_post_calib,
"% (doit être >0)",
)
outfile_path = (
config.get("DATA_OUT") + "03_erfs_rfr_ff" + config.get("YEAR_ERFS") + "_dev.h5"
)
erfs_cal_ff.to_hdf(outfile_path, key="input")
erfs_cal_ff.describe()
# Conversion de la base foyers fiscaux en individus
erfs_cal = foyers_fiscaux_to_individus(
erfs_03,
erfs_03,
["rfr"],
["rfr"],
new_ppl=True,
)
# Export
outfile_path = config.get("DATA_OUT") + "03_erfs_rfr_" + config.get("YEAR_ERFS") + ".h5"
erfs_cal.to_hdf(outfile_path, key="input", mode="w")
erfs_cal.describe()