Skip to content

preprocess_dads_openfisca_ag

preprocess_dads_openfisca_ag(data_dads: DataFrame, year: int, list_zonage_zrr: List[str], list_zonage_zrd: List[str]) -> DataFrame

Preprocesses the data to make it compatible with Openfisca for simulating general exemptions.

Parameters:

Name Type Description Default
data_dads DataFrame

The input data.

required
year int

The year for which the data is being processed.

required
list_zonage_zrr List[str]

A list of codes for rural revitalization zones.

required
list_zonage_zrd List[str]

A list of codes for defense restructuring zones.

required

Returns:

Type Description
DataFrame

The preprocessed data.

Source code in bozio_wasmer_simulations/simulation/empirical/preprocessing.py
def preprocess_dads_openfisca_ag(
    data_dads: pd.DataFrame,
    year: int,
    list_zonage_zrr: List[str],
    list_zonage_zrd: List[str],
) -> pd.DataFrame:
    """
    Preprocesses the data to make it compatible with Openfisca for simulating general exemptions.

    Args:
        data_dads (pd.DataFrame):
            The input data.
        year (int):
            The year for which the data is being processed.
        list_zonage_zrr (List[str]):
            A list of codes for rural revitalization zones.
        list_zonage_zrd (List[str]):
            A list of codes for defense restructuring zones.

    Returns:
        (pd.DataFrame): The preprocessed data.
    """
    # Construction de colonnes d'intérêt

    # Création d'une pcs à deux chiffres
    data_dads["pcs_2"] = data_dads["pcs"].str[:2]
    # Conversion de la de la date de début de contrat de travail en datetime
    data_dads["date_fin_contrat"] = (
        pd.to_datetime(f"{year}-01-01", format="%Y-%m-%d")
        + pd.to_timedelta(arg=data_dads["datfin"], unit="D")
    ).dt.strftime("%Y-%m-%d")
    # Conversion en string
    data_dads["date_debut_contrat"] = (
        pd.to_datetime(data_dads["date_debut_contrat"], format="%Y-%m-%d")
        .dt.strftime("%Y-%m-%d")
        .fillna("1970-01-01")
    )

    # Secteur d'activite employeur (prend les valeurs 'agricole', 'non agricole' et 'non_renseigné')
    data_dads["secteur_activite_employeur"] = np.where(
        data_dads["a88"] == "01",
        TypesSecteurActivite.agricole,
        TypesSecteurActivite.non_agricole,
    )
    # Travailleur occasionnel agricole
    tode_condition = (data_dads["a88"] == "01") & data_dads["motifcdd"].isin(
        ["03", "04"]
    )
    data_dads["exoneration_cotisations_employeur_tode_eligibilite"] = np.where(
        tode_condition, True, False
    )
    data_dads["choix_exoneration_cotisations_employeur_agricole"] = np.where(
        tode_condition, True, False
    )
    data_dads["travailleur_occasionnel_agricole"] = np.where(
        tode_condition, True, False
    )
    # Indicatrices de zonage
    data_dads["zone_restructuration_defense"] = data_dads["comt"].isin(list_zonage_zrd)
    data_dads["zone_revitalisation_rurale"] = data_dads["comt"].isin(list_zonage_zrr)

    # Catégorie du salarié (prend des valeurs parmi 'prive_non_cadre', 'prive_cadre', 'public_titulaire_etat', 'public_titulaire_militaire', 'public_titulaire_territoriale', 'public_titulaire_hospitaliere', 'public_non_titulaire', 'non_pertinent')
    # On ne s'intéresse qu'au statut cadre/non cadre
    # 'domempl_empl' in ['1', '2', '3'],
    # 'nat_contrat'=='50' 104929
    data_dads["categorie_salarie"] = np.where(
        data_dads["pcs_2"] == "37",
        TypesCategorieSalarie.prive_cadre,
        TypesCategorieSalarie.prive_non_cadre,
    )
    # Contrat de travail (prend des valeurs parmi 'temps_plein', 'temps_partiel', 'forfait_heures_semaines', 'forfait_heures_mois', 'forfait_heures_annee', 'forfait_jours_annee', 'sans_objet')
    # On se restreint à l'implémentattion de 'temps_plein', 'temps_partiel'
    data_dads["contrat_de_travail"] = np.where(
        data_dads["eqtp"] < 1,
        TypesContratDeTravail.temps_partiel,
        TypesContratDeTravail.temps_plein,
    )
    data_dads["contrat_de_travail_fin"] = np.where(
        data_dads["datfin"] < 360, data_dads["date_fin_contrat"], "2099-12-31"
    )
    # Ajout du type de contrat de travail
    data_dads["contrat_de_travail_type"] = (
        data_dads["nat_contrat"].map(dict_nat_type_contrat).fillna(TypesContrat.cdi)
    )
    # Régime Alsace-Moselle
    data_dads["salarie_regime_alsace_moselle"] = np.where(
        data_dads["dept"].isin(["57", "67", "68"]), True, False
    )

    # Variables construites suivant le statut d'apprenti
    apprenti_condition = data_dads["contrat_travail"].isin(["04", "05"])
    # Construction de la rémunération
    data_dads["salaire_de_base"] = np.where(apprenti_condition, 0, data_dads["brut_s"])
    data_dads["remuneration_apprenti"] = np.where(
        apprenti_condition, data_dads["brut_s"], 0
    )
    # Date de début du contrat d'apprentissage
    data_dads["apprentissage_contrat_debut"] = np.where(
        apprenti_condition, data_dads["date_debut_contrat"], "1970-01-01"
    )
    # Statut d'apprenti
    data_dads["apprenti"] = np.where(apprenti_condition, True, False)

    # Variables construites suivant le statut de stagiaire
    stagiaire_condition = data_dads["nat_contrat"] == "29"
    # Nombre d'heures effectuées en stage
    data_dads["stage_duree_heures"] = np.where(
        stagiaire_condition, data_dads["nbheur"], 0
    )
    # Gratification
    data_dads["stage_gratification"] = np.where(
        stagiaire_condition, data_dads["salaire_de_base"], 0
    )
    data_dads["salaire_de_base"] = np.where(
        stagiaire_condition, 0, data_dads["salaire_de_base"]
    )

    # Ajout des taux de versement transport
    # data_dads['taux_versement_transport'] = 0.032
    # Ajout des taux d'accident du travail
    data_dads["taux_accident_travail"] = 0.0212

    # Ajout de l'effectif de l'entreprise
    data_dads = pd.merge(
        left=data_dads,
        right=data_dads.groupby(["siren"], as_index=False)["eqtp"]
        .sum()
        .rename({"eqtp": "effectif_entreprise"}, axis=1),
        on="siren",
        how="left",
        validate="many_to_one",
    )

    # Variables identiques à celles des DADS
    data_dads.rename(
        {
            "comr": "depcom",
            "comt": "depcom_entreprise",
            "date_debut_contrat": "contrat_de_travail_debut",
            "nbheur": "heures_remunerees_volume",
            "pepa": "prime_exceptionnelle_pouvoir_achat",
        },
        axis=1,
        inplace=True,
    )  # 'eqtp' : 'quotite_de_travail',
    # Ajout de la PPV si l'année de référence est bien 2022
    if year == 2022:
        data_dads.rename(
            {
                "ppv_defisc": "prime_partage_valeur_exoneree",
                "ppv_ndefisc": "prime_partage_valeur_non_exoneree",
            },
            axis=1,
            inplace=True,
        )
        data_dads["prime_partage_valeur_exoneree"] = data_dads[
            "prime_partage_valeur_exoneree"
        ].fillna(0)
        data_dads["prime_partage_valeur_non_exoneree"] = data_dads[
            "prime_partage_valeur_non_exoneree"
        ].fillna(0)

    # Complétion des Nan
    data_dads[["depcom", "depcom_entreprise"]] = data_dads[
        ["depcom", "depcom_entreprise"]
    ].fillna("")
    # data_dads['quotite_de_travail'] = data_dads['quotite_de_travail'].fillna(1)
    data_dads["salaire_de_base"] = data_dads["salaire_de_base"].fillna(0)

    return data_dads