--- 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" ---
{% raw %}
{% endraw %} {% raw %}
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")
{% endraw %} {% raw %}
from leximpact_prepare_data.calibration_tools import *
{% endraw %} {% raw %}
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))
{% endraw %}

I - Calcul du RFR

{% raw %}
from openfisca_france import FranceTaxBenefitSystem

TBS = FranceTaxBenefitSystem()
{% endraw %} {% raw %}
my_simu, dico = create_simulation(data=erfs_02, tbs=TBS, period=annee_de_calcul)
{% endraw %} {% raw %}
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
{% endraw %} {% raw %}
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())
{% endraw %}

II - Comparaison avec le RFR_POTE

{% raw %}
file = config.get("CALIB") + "CalibPote-" + config.get("YEAR_ERFS") + "-revkire.json"
with open(file) as f:
    calib = json.load(f)

calib["buckets"][12]
{% endraw %} {% raw %}
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())
{% endraw %} {% raw %}
len(erfs_03_ff[erfs_03_ff["rfr"] == 0])
{% endraw %} {% raw %}
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=[],
)
{% endraw %} {% raw %}
df_pote.head()
df_erfs.head()
{% endraw %}

III - Calibration du RFR

{% raw %}
erreur_max = 0.01  # 05 # On choisit de calibrer à 1%
tracking, erfs_cal_ff = calibration_quantiles("rfr", erfs_03_ff, df_pote, erreur_max)
{% endraw %} {% raw %}
1663290068.7522333 / 1663290068.752233
# erfs_cal_ff.head()
{% endraw %} {% raw %}
tracking
{% endraw %} {% raw %}
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,
    " %",
)
{% endraw %} {% raw %}
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)
{% endraw %} {% raw %}
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
{% endraw %} {% raw %}
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)",
)
{% endraw %}

VII - Export de la nouvelle base

{% raw %}
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()
{% endraw %} {% raw %}
# 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")
{% endraw %} {% raw %}
erfs_cal.describe()
{% endraw %}