Commit 1500f5a8 authored by Lionel DURAND's avatar Lionel DURAND
Browse files

Vectorisation pour reduire temps d'exec et fix warning lors du chargement du fichier agreste

parent 40c8bc78
......@@ -4,6 +4,7 @@ from typing import Dict, List
import numpy as np
import pandas as pd
from pandas import Series
from crater.crater_logger import log
......@@ -154,6 +155,15 @@ def calculerNoteParInterpolation2Seuils(valeur, seuil1, seuil2, note_seuil1, not
return n
def calculer_note_par_interpolation_2_seuils(indicateur: Series, seuil1: float, note_seuil1: float, seuil2: float, note_seuil2: float) -> Series:
coefficient_directeur = (note_seuil2 - note_seuil1) / (seuil2 - seuil1)
note : Series = (indicateur - seuil1) * coefficient_directeur + note_seuil1
note = note.clip(lower=0, upper= 10).round(2)
return note
#TODO fonction à tester
def calculerNoteParInterpolation3Seuils(valeur, seuil1, seuil2, seuil3, note_seuil1, note_seuil2, note_seuil3):
try:
......
......@@ -69,19 +69,21 @@ def _creer_df_actifs_agricoles_permanents(df):
return df
def _selectionner_et_renommer_les_territoires(df):
df.insert(0, "id_territoire", np.nan)
df_communes = df.query("COM != '............'")
df_departements = df.query("COM == '............' & DEP != '............'")
df_regions = df.query("DEP == '............' & REGION != '............'")
df_pays = df.query("FRDOM == 'METRO' & REGION == '............'")
mask_communes = df['COM'] != '............'
df.loc[mask_communes, "id_territoire"] = traduire_code_insee_vers_id_commune_crater(df.loc[mask_communes, 'COM'])
df_communes.id_territoire = traduire_code_insee_vers_id_commune_crater(df_communes.COM)
df_departements.id_territoire = traduire_code_insee_vers_id_departement_crater(df_departements.DEP)
df_regions.id_territoire = traduire_code_insee_vers_id_region_crater(df_regions.REGION.str.replace('NR', ''))
df_pays.id_territoire = traduire_code_insee_vers_id_pays_crater(df_pays.FRANCE)
mask_departements = (df['COM'] == '............') & (df['DEP'] != '............')
df.loc[mask_departements, "id_territoire"] = traduire_code_insee_vers_id_departement_crater(df.loc[mask_departements, 'DEP'])
return pd.concat([df_communes, df_departements, df_regions, df_pays]).drop(columns=['FRANCE', 'FRDOM', 'REGION', 'DEP', 'COM'])
mask_regions = (df['DEP'] == '............') & (df['REGION'] != '............')
df.loc[mask_regions, "id_territoire"] = traduire_code_insee_vers_id_region_crater(df.loc[mask_regions, 'REGION'].str.replace('NR', ''))
mask_pays = (df['REGION'] == '............') & (df['FRDOM'] == 'METRO')
df.loc[mask_pays, "id_territoire"] = traduire_code_insee_vers_id_pays_crater(df.loc[mask_pays, 'FRANCE'])
df = df[df['id_territoire'].notna()]
return df
def _extraire_colonnes_par_pivot(df):
return df.pivot(index='id_territoire', columns='indicateur', values='valeur').reset_index()
......
......@@ -7,57 +7,24 @@ import crater.territoires.outils as outils_territoires
from crater.crater_logger import log
def ajouter_evolution_part_population_agricole(donnees_population_agricole: DataFrame) -> DataFrame:
def ajouter_evolution_part_population_agricole(population_agricole: DataFrame) -> DataFrame:
log.info(" => Indicateur évolution part population agricole")
donnees_population_agricole.loc[:, 'evolution_part_population_agricole_valeur_pt_de_pourcentage'] = (
donnees_population_agricole.apply(
lambda x:
_evolution_part_population_agricole_valeur_pt_de_pourcentage(
x['population_totale_2010'],
x['population_totale_1990'],
x['actifs_agricoles_permanents_2010'],
x['actifs_agricoles_permanents_1988']
),
axis=1
)
)
population_agricole.loc[:, 'evolution_part_population_agricole_valeur_pt_de_pourcentage'] = (
(population_agricole['actifs_agricoles_permanents_2010'] / population_agricole['population_totale_2010']
- population_agricole['actifs_agricoles_permanents_1988'] / population_agricole['population_totale_1990'])
* 100
# on caste explicitement en float64 sinon le type attribué par pandas est Float64
# Float64 est expérimental et ne fonctionne pas encore avec to_csv (format %.2f non respecté)
# (voir https://pandas.pydata.org/pandas-docs/dev/user_guide/missing_data.html#missing-data-na) ou https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.2.0.html?highlight=float64dtype
).round(2).astype('float64')
valeur_France = donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
'evolution_part_population_agricole_valeur_pt_de_pourcentage'][0]
if valeur_France >= 0 or np.isnan(valeur_France):
raise ValueError('Attention, la valeur moyenne française pose problème vu la définition de calcul de la note !')
seuil_france = population_agricole.at[outils_territoires.ID_FRANCE,
'evolution_part_population_agricole_valeur_pt_de_pourcentage']
donnees_population_agricole.loc[:, 'evolution_part_population_agricole_note'] = (
donnees_population_agricole.apply(
lambda x:
outils.calculerNoteParInterpolation2Seuils(
x['evolution_part_population_agricole_valeur_pt_de_pourcentage'],
2 * donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
'evolution_part_population_agricole_valeur_pt_de_pourcentage'][0],
donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
'evolution_part_population_agricole_valeur_pt_de_pourcentage'][0],
0, 5
),
axis=1
)
)
return donnees_population_agricole
def _evolution_part_population_agricole_valeur_pt_de_pourcentage(
population_finale,
population_initiale,
population_agricole_finale,
population_agricole_initiale
):
if not pd.isnull(population_agricole_finale) and not pd.isnull(population_finale) and not pd.isnull(population_agricole_initiale) and not pd.isnull(population_initiale) and population_agricole_finale >= 0 and population_finale > 0 and population_agricole_initiale >= 0 and population_initiale > 0:
x = round(
(population_agricole_finale / population_finale -
population_agricole_initiale / population_initiale) * 100,
2)
else:
x = np.nan
return x
population_agricole.loc[:, 'evolution_part_population_agricole_note'] = \
outils.calculer_note_par_interpolation_2_seuils(
population_agricole['evolution_part_population_agricole_valeur_pt_de_pourcentage'],
2 * seuil_france, 0, seuil_france, 5)
return population_agricole
\ No newline at end of file
......@@ -11,38 +11,18 @@ def ajouter_part_population_agricole_1988(donnees_population_agricole: DataFrame
log.info(" => Indicateur part population agricole 1988")
donnees_population_agricole.loc[:, 'part_population_agricole_1988_valeur_pourcent'] = (
donnees_population_agricole.apply(
lambda x:
_part_population_agricole_1988_valeur_pourcent(
x['actifs_agricoles_permanents_1988'],
x['population_totale_1990']
),
axis=1
)
)
donnees_population_agricole.loc[:, 'part_population_agricole_1988_note'] = (
donnees_population_agricole.apply(
lambda x:
outils.calculerNoteParInterpolation2Seuils(
x['part_population_agricole_1988_valeur_pourcent'],
0, donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
'part_population_agricole_1988_valeur_pourcent'][0],
0, 5
),
axis=1
)
)
donnees_population_agricole['actifs_agricoles_permanents_1988'] /
donnees_population_agricole['population_totale_1990'] * 100
# on caste explicitement en float64 sinon le type attribué par pandas est Float64
# Float64 est expérimental et ne fonctionne pas encore avec to_csv (format %.2f non respecté)
# (voir https://pandas.pydata.org/pandas-docs/dev/user_guide/missing_data.html#missing-data-na) ou https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.2.0.html?highlight=float64dtype
).round(2).astype('float64')
seuil_valeur_france = donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
'part_population_agricole_1988_valeur_pourcent'][0]
donnees_population_agricole.loc[:, 'part_population_agricole_1988_note'] = \
outils.calculer_note_par_interpolation_2_seuils(
donnees_population_agricole['part_population_agricole_1988_valeur_pourcent'], 0, 0, seuil_valeur_france, 5)
return donnees_population_agricole
def _part_population_agricole_1988_valeur_pourcent(
actifs_agricoles_permanents_1988,
population_totale_1990
):
if not pd.isnull(actifs_agricoles_permanents_1988) and not pd.isnull(population_totale_1990) and actifs_agricoles_permanents_1988 >= 0 and population_totale_1990 > 0:
x = round(actifs_agricoles_permanents_1988 / population_totale_1990 * 100, 2)
else:
x = np.nan
return x
......@@ -11,35 +11,17 @@ def ajouter_part_population_agricole_2010(donnees_population_agricole: DataFrame
log.info(" => Indicateur part population agricole 2010")
donnees_population_agricole.loc[:, 'part_population_agricole_2010_valeur_pourcent'] = (
donnees_population_agricole.apply(
lambda x:
_part_population_agricole_2010_valeur_pourcent(
x['actifs_agricoles_permanents_2010'],
x['population_totale_2010']
),
axis=1
)
)
donnees_population_agricole.loc[:, 'part_population_agricole_2010_note'] = (
donnees_population_agricole.apply(
lambda x:
outils.calculerNoteParInterpolation2Seuils(
x['part_population_agricole_2010_valeur_pourcent'],
0, donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
'part_population_agricole_2010_valeur_pourcent'][0],
0, 5
),
axis=1
)
)
donnees_population_agricole['actifs_agricoles_permanents_2010'] /
donnees_population_agricole['population_totale_2010'] * 100
# on caste explicitement en float64 sinon le type attribué par pandas est Float64
# Float64 est expérimental et ne fonctionne pas encore avec to_csv (format %.2f non respecté)
# (voir https://pandas.pydata.org/pandas-docs/dev/user_guide/missing_data.html#missing-data-na) ou https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.2.0.html?highlight=float64dtype
).round(2).astype('float64')
seuil_valeur_france = donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
'part_population_agricole_2010_valeur_pourcent'][0]
donnees_population_agricole.loc[:, 'part_population_agricole_2010_note'] = \
outils.calculer_note_par_interpolation_2_seuils(donnees_population_agricole['part_population_agricole_2010_valeur_pourcent'], 0, 0, seuil_valeur_france, 5)
return donnees_population_agricole
def _part_population_agricole_2010_valeur_pourcent(actifs_agricoles_permanents_2010, population_totale_2010):
if not pd.isnull(actifs_agricoles_permanents_2010) and not pd.isnull(population_totale_2010) and actifs_agricoles_permanents_2010 >= 0 and population_totale_2010 > 0:
x = round(actifs_agricoles_permanents_2010 / population_totale_2010 * 100, 2)
else:
x = np.nan
return x
......@@ -7,25 +7,24 @@ import crater.outils as outils
from crater.crater_logger import log
def ajouter_synthese_population_agricole(donnees_population_agricole: DataFrame) -> DataFrame:
def ajouter_synthese_population_agricole(population_agricole: DataFrame) -> DataFrame:
log.info(" => Synthèse")
donnees_population_agricole.loc[:, 'synthese_note'] = (
donnees_population_agricole.apply(
lambda x:
_note(
x['part_population_agricole_2010_note'],
x['evolution_part_population_agricole_note']
),
axis=1
)
).astype('Int64')
donnees_population_agricole.loc[:, 'synthese_message'] = (
donnees_population_agricole.apply(
population_agricole.loc[:, 'synthese_note'] = (
population_agricole['part_population_agricole_2010_note']
+ population_agricole['evolution_part_population_agricole_note'] / 2
- 2.5
# TODO: pourquoi Int64 et pas int64 ? Il faudrait uniformiser
# (pour l'instant Int64 et Float6' sont encore expérimentaux)
).round(0).clip(lower=0, upper=10).astype('Int64')
population_agricole.loc[:, 'synthese_message'] = (
population_agricole.apply(
lambda x:
_message(
donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
'part_population_agricole_2010_valeur_pourcent'][0],
x['part_population_agricole_2010_valeur_pourcent'],
x['evolution_part_population_agricole_valeur_pt_de_pourcentage']
......@@ -34,18 +33,7 @@ def ajouter_synthese_population_agricole(donnees_population_agricole: DataFrame)
)
)
return donnees_population_agricole
def _note(
part_population_agricole_2010_note,
evolution_part_population_agricole_note
):
if not pd.isnull(part_population_agricole_2010_note) and not pd.isnull(evolution_part_population_agricole_note) :
x = round(min(10, max(0, round(part_population_agricole_2010_note + (evolution_part_population_agricole_note / 2 - 2.5), 0))))
else:
x = np.nan
return x
return population_agricole
def _message(
......
......@@ -7,15 +7,15 @@ D-32;Gers;DEPARTEMENT;49;51;;;;;;;;;;;;Données non disponibles
D-40;Landes;DEPARTEMENT;6445;6370;;;;;;;;;;;;Données non disponibles
D-75;Paris;DEPARTEMENT;20000;2000;;;;;;;;;;;;Données non disponibles
PAT-1;Le PAT monocommunal du Gée-Rivière;REGROUPEMENT_COMMUNES;49;51;9;24;44;87;48.98;10.00;170.59;10.00;-121.61;0.00;8;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
PAT-2;Le PAT interdepartemental D-32 (3 communes) D-40 (2 communes);REGROUPEMENT_COMMUNES;6494;6421;54;102;184;344;1.57;10.00;5.36;6.60;-3.79;4.90;10;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
PAT-2;Le PAT interdepartemental D-32 (3 communes) D-40 (2 communes);REGROUPEMENT_COMMUNES;6494;6421;54;102;184;344;1.57;10.00;5.36;6.55;-3.79;4.88;10;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
SCOT-1;Le SCOT monocommunal de Paris;REGROUPEMENT_COMMUNES;20000;2000;0;0;0;0;0.00;0.00;0.00;0.00;0.00;10.00;2;Population agricole <strong>stable</strong> mais <strong>en proportion plus faible que la moyenne française</strong>
SCOT-2;Le SCOT monocommunal de Gée-Rivière;REGROUPEMENT_COMMUNES;49;51;9;24;44;87;48.98;10.00;170.59;10.00;-121.61;0.00;8;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
SCOT-3;Le SCOT interdepartemental D-32 (3 communes) D-40 (2 communes);REGROUPEMENT_COMMUNES;6494;6421;54;102;184;344;1.57;10.00;5.36;6.60;-3.79;4.90;10;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
E-200030435;CC d'Aire-sur-l'Adour;EPCI;6494;6421;54;102;184;344;1.57;10.00;5.36;6.60;-3.79;4.90;10;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
SCOT-3;Le SCOT interdepartemental D-32 (3 communes) D-40 (2 communes);REGROUPEMENT_COMMUNES;6494;6421;54;102;184;344;1.57;10.00;5.36;6.55;-3.79;4.88;10;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
E-200030435;CC d'Aire-sur-l'Adour;EPCI;6494;6421;54;102;184;344;1.57;10.00;5.36;6.55;-3.79;4.88;10;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
E-200054781;Métropole du Grand Paris;EPCI;20000;2000;0;0;0;0;0.00;0.00;0.00;0.00;0.00;10.00;2;Population agricole <strong>stable</strong> mais <strong>en proportion plus faible que la moyenne française</strong>
C-32145;Gée-Rivière;COMMUNE;49;51;9;24;44;87;48.98;10.00;170.59;10.00;-121.61;0.00;8;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
C-32333;Projan(scission2020);COMMUNE;;;;;;;;;;;;;;Données non disponibles
C-32424;Ségos(fusion2017);COMMUNE;;;;;;;;;;;;;;Données non disponibles
C-40001;Aire-sur-l'Adour;COMMUNE;6279;6205;9;14;38;71;0.22;2.90;1.14;1.40;-0.92;8.80;5;Population agricole <strong>en proportion plus faible que la moyenne française</strong> et <strong>en déclin</strong>
C-40001;Aire-sur-l'Adour;COMMUNE;6279;6205;9;14;38;71;0.22;2.89;1.14;1.39;-0.92;8.76;5;Population agricole <strong>en proportion plus faible que la moyenne française</strong> et <strong>en déclin</strong>
C-40146;Latrille;COMMUNE;166;165;36;64;102;186;38.55;10.00;112.73;10.00;-74.17;0.00;8;Population agricole <strong>en proportion plus élevée que la moyenne française</strong> mais <strong>en déclin</strong>
C-75056;Paris;COMMUNE;20000;2000;0;0;0;0;0.00;0.00;0.00;0.00;0.00;10.00;2;Population agricole <strong>stable</strong> mais <strong>en proportion plus faible que la moyenne française</strong>
import unittest
import numpy as np
import pandas as pd
from crater.outils import calculerNoteParInterpolation2Seuils, calculer_note_par_interpolation_2_seuils
from tests.test_outils import augmenter_nombre_colonnes_affichees_pandas
augmenter_nombre_colonnes_affichees_pandas()
class TestUnitaireOutils(unittest.TestCase):
def test_calculer_note_par_interpolation_2_seuils_cas_coef_directeur_positif(self):
df = pd.DataFrame(
columns=['indicateur'],
data=[
[-1],
[6],
[8],
[12],
[17],
[np.nan],
])
# given
df_attendu = pd.DataFrame(
columns=['note'],
data=[
[0],
[3.75],
[5],
[7.5],
[10],
[np.nan],
]
)
# when
# pour garantir que le fonctionnement est le meme on teste sur les 2 fonctions
df.loc[:, 'note'] = calculer_note_par_interpolation_sur_df(df, 'indicateur', 0, 8, 0, 5)
df.loc[:, 'note'] = calculer_note_par_interpolation_2_seuils(df['indicateur'], 0, 0, 8, 5)
# then
pd.testing.assert_series_equal(df['note'], df_attendu['note'], check_names=False)
def test_calculer_note_par_interpolation_2_seuils_cas_coef_directeur_negatif(self):
df = pd.DataFrame(
columns=['indicateur'],
data=[
[9],
[8],
[4],
[0],
[-1],
[np.nan],
])
# given
df_attendu = pd.DataFrame(
columns=['note'],
data=[
[0],
[0],
[5],
[10],
[10],
[np.nan],
]
)
# when
# pour garantir que le fonctionnement est le meme on teste sur les 2 fonctions
df.loc[:, 'note'] = calculer_note_par_interpolation_sur_df(df, 'indicateur', 0, 8, 10, 0)
df.loc[:, 'note'] = calculer_note_par_interpolation_2_seuils(df['indicateur'], 0, 10, 8, 0)
# then
pd.testing.assert_series_equal(df['note'], df_attendu['note'], check_names=False)
def calculer_note_par_interpolation_sur_df(df, nom_colonne_indicateur, seuil1, seuil2, note_seuil1, note_seuil2):
return df.apply(
lambda x:
calculerNoteParInterpolation2Seuils(
x[nom_colonne_indicateur],
seuil1, seuil2,
note_seuil1, note_seuil2
),
axis=1
)
if __name__ == '__main__':
unittest.main()
......@@ -19,7 +19,7 @@ class TestUnitairePopulationAgricole(unittest.TestCase):
columns=['id_territoire','actifs_agricoles_permanents_2010', 'population_totale_2010'],
data=[['P-FR', 12 ,100],
['C-1', 6 ,100]
])
]).set_index('id_territoire')
resultat_attendu = pd.DataFrame(
columns=['part_population_agricole_2010_valeur_pourcent','part_population_agricole_2010_note'],
data=[[12.0, 5],
......@@ -28,6 +28,7 @@ class TestUnitairePopulationAgricole(unittest.TestCase):
)
# when
df_resultat = ajouter_part_population_agricole_2010(df_population_agricole)
df_resultat = df_resultat.reset_index()
# then
pd.testing.assert_series_equal(df_resultat['part_population_agricole_2010_valeur_pourcent'], resultat_attendu['part_population_agricole_2010_valeur_pourcent'], check_names=False)
pd.testing.assert_series_equal(df_resultat['part_population_agricole_2010_note'], resultat_attendu['part_population_agricole_2010_note'], check_names=False)
......@@ -38,7 +39,7 @@ class TestUnitairePopulationAgricole(unittest.TestCase):
columns=['id_territoire','actifs_agricoles_permanents_1988', 'population_totale_1990'],
data=[['P-FR', 12, 100],
['C-1', 6, 100]
])
]).set_index('id_territoire')
resultat_attendu = pd.DataFrame(
columns=['part_population_agricole_1988_valeur_pourcent','part_population_agricole_1988_note'],
data=[[12.0, 5],
......@@ -47,6 +48,7 @@ class TestUnitairePopulationAgricole(unittest.TestCase):
)
# when
df_resultat = ajouter_part_population_agricole_1988(df_population_agricole)
df_resultat = df_resultat.reset_index()
# then
pd.testing.assert_series_equal(df_resultat['part_population_agricole_1988_valeur_pourcent'], resultat_attendu['part_population_agricole_1988_valeur_pourcent'], check_names=False)
pd.testing.assert_series_equal(df_resultat['part_population_agricole_1988_note'], resultat_attendu['part_population_agricole_1988_note'], check_names=False)
......@@ -59,7 +61,7 @@ class TestUnitairePopulationAgricole(unittest.TestCase):
data=[['P-FR', 100, 100, 5, 10],
['C-1', 10, 10, 2, 1],
['C-2', 10, 10, 0, 2]
])
]).set_index('id_territoire')
resultat_attendu = pd.DataFrame(
columns=['evolution_part_population_agricole_valeur_pt_de_pourcentage','evolution_part_population_agricole_note'],
data=[[-5.0, 5.0],
......@@ -69,6 +71,7 @@ class TestUnitairePopulationAgricole(unittest.TestCase):
)
# when
df_resultat = ajouter_evolution_part_population_agricole(df_population_agricole)
df_resultat = df_resultat.reset_index()
# then
pd.testing.assert_series_equal(df_resultat['evolution_part_population_agricole_valeur_pt_de_pourcentage'], resultat_attendu['evolution_part_population_agricole_valeur_pt_de_pourcentage'], check_names=False)
pd.testing.assert_series_equal(df_resultat['evolution_part_population_agricole_note'], resultat_attendu['evolution_part_population_agricole_note'], check_names=False)
......@@ -82,7 +85,7 @@ class TestUnitairePopulationAgricole(unittest.TestCase):
['C-1', np.nan, np.nan, np.nan, np.nan],
['C-2', 0, 0, 0.0, -15.0],
['C-3', 10, 10, 20.0, 10.0]
])
]).set_index('id_territoire')
resultat_attendu = pd.DataFrame(
columns=['synthese_note','synthese_message'],
data=[[5, 'Population agricole <strong>en proportion proche de la moyenne française</strong> mais <strong>en déclin</strong>'],
......@@ -93,6 +96,7 @@ class TestUnitairePopulationAgricole(unittest.TestCase):
).astype({'synthese_note': 'Int64'})
# when
df_resultat = ajouter_synthese_population_agricole(df_population_agricole)
df_resultat = df_resultat.reset_index()
# then
pd.testing.assert_series_equal(df_resultat['synthese_note'], resultat_attendu['synthese_note'], check_names=False)
pd.testing.assert_series_equal(df_resultat['synthese_message'], resultat_attendu['synthese_message'], check_names=False)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment