Commit 18634b02 authored by Lionel's avatar Lionel
Browse files

Premiers essais pour tests qualité des données

parent 46a0cd46
import numpy
from pandas import DataFrame, Series
from crater.crater_logger import creer_logger
......@@ -64,55 +65,55 @@ def verifier_donnees_nan_ou_zero(df_donnees: DataFrame, nom_colonne_a_verifier:
raise AssertionError(message_erreur)
def verifier_donnees_nan_ou_zero(df_donnees: DataFrame, nom_colonne_a_verifier: str, nom_indicateur: str,
seuil_erreur: int) -> None:
log.debug(f"VERIFICATION ZERO et NAN dans df indicateur : {nom_indicateur}")
# nb_valeurs_nan = df_donnees[nom_colonne_a_verifier].isna().sum()
df_valeur_nulle_ou_nan = df_donnees.loc[
(df_donnees[nom_colonne_a_verifier] == 0) | (df_donnees[nom_colonne_a_verifier].isna())]
liste_id_territoires_str = ", ".join(list(df_valeur_nulle_ou_nan['id_territoire']))
if df_valeur_nulle_ou_nan.shape[0] <= seuil_erreur:
log.debug(
f"\tRésultat OK : nb de valeurs nulles ou nan pour l'indicateur {nom_indicateur} = {df_valeur_nulle_ou_nan.shape[0]} (<= au seuil d'erreur {seuil_erreur})")
log.debug(f"\tListe id_territoires concernés : {liste_id_territoires_str}")
else:
message_erreur = f"\tERREUR : il y a {df_valeur_nulle_ou_nan.shape[0]} territoires avec des données nulles ou nan pour l'indicateur {nom_indicateur} (> au seuil d'erreur {seuil_erreur})\n" \
+ liste_id_territoires_str
log.debug(message_erreur)
raise AssertionError(message_erreur)
# def verifier_donnees_nan_ou_zero(df_donnees: DataFrame, nom_colonne_a_verifier: str, nom_indicateur: str,
# seuil_erreur: int) -> None:
# log.debug(f"VERIFICATION ZERO et NAN dans df indicateur : {nom_indicateur}")
# # nb_valeurs_nan = df_donnees[nom_colonne_a_verifier].isna().sum()
# df_valeur_nulle_ou_nan = df_donnees.loc[
# (df_donnees[nom_colonne_a_verifier] == 0) | (df_donnees[nom_colonne_a_verifier].isna())]
# liste_id_territoires_str = ", ".join(list(df_valeur_nulle_ou_nan['id_territoire']))
# if df_valeur_nulle_ou_nan.shape[0] <= seuil_erreur:
# log.debug(
# f"\tRésultat OK : nb de valeurs nulles ou nan pour l'indicateur {nom_indicateur} = {df_valeur_nulle_ou_nan.shape[0]} (<= au seuil d'erreur {seuil_erreur})")
# log.debug(f"\tListe id_territoires concernés : {liste_id_territoires_str}")
# else:
# message_erreur = f"\tERREUR : il y a {df_valeur_nulle_ou_nan.shape[0]} territoires avec des données nulles ou nan pour l'indicateur {nom_indicateur} (> au seuil d'erreur {seuil_erreur})\n" \
# + liste_id_territoires_str
# log.debug(message_erreur)
# raise AssertionError(message_erreur)
def verifier_donnees_nan(df_donnees: DataFrame, nom_colonne_a_verifier: str, seuil_erreur: int) -> None:
log.debug(f"VERIFICATION NAN pour la colonne : {nom_colonne_a_verifier}")
df_valeur_nan = df_donnees.loc[df_donnees[nom_colonne_a_verifier].isna()]
liste_id_territoires_str = ", ".join(list(df_valeur_nan['id_territoire']))
if df_valeur_nan.shape[0] <= seuil_erreur:
log.debug(
f"\tRésultat OK : nb de valeurs nan pour la colonne {nom_colonne_a_verifier} = {df_valeur_nan.shape[0]} (<= au seuil d'erreur {seuil_erreur})")
log.debug(f"\tListe id_territoires concernés : {liste_id_territoires_str}")
else:
message_erreur = f"\tERREUR : il y a {df_valeur_nan.shape[0]} territoires avec des données nan pour la colonne {nom_colonne_a_verifier} (> au seuil d'erreur {seuil_erreur})\n" \
+ liste_id_territoires_str
log.debug(message_erreur)
raise AssertionError(message_erreur)
_verifier_depassement_seuil("NaN", df_valeur_nan, nom_colonne_a_verifier, seuil_erreur)
def verifier_donnees_nulles(df_donnees: DataFrame, nom_colonne_a_verifier: str, seuil_erreur: int) -> None:
log.debug(f"VERIFICATION VALEURS NULLES pour la colonne : {nom_colonne_a_verifier}")
df_valeur_nulle = df_donnees.loc[df_donnees[nom_colonne_a_verifier] == 0]
liste_id_territoires_str = ", ".join(list(df_valeur_nulle['id_territoire']))
if df_valeur_nulle.shape[0] <= seuil_erreur:
df_valeur_nulle = df_donnees.loc[(df_donnees[nom_colonne_a_verifier] == 0)]
_verifier_depassement_seuil("0", df_valeur_nulle, nom_colonne_a_verifier, seuil_erreur)
def verifier_donnees_inf(df_donnees: DataFrame, nom_colonne_a_verifier: str, seuil_erreur: int) -> None:
df_valeur_inf = df_donnees.loc[numpy.isinf(df_donnees[nom_colonne_a_verifier])]
_verifier_depassement_seuil("inf", df_valeur_inf, nom_colonne_a_verifier, seuil_erreur)
def _verifier_depassement_seuil(nom_valeur_a_verifier, df_valeur_nan, nom_colonne_a_verifier, seuil_erreur):
log.debug(f"Vérification nb de cellules = {nom_valeur_a_verifier} pour la colonne {nom_colonne_a_verifier}")
liste_id_territoires_str = ", ".join(list(df_valeur_nan['id_territoire']))
if df_valeur_nan.shape[0] <= seuil_erreur:
log.debug(
f"\tRésultat OK : nb de valeurs nan pour colonne {nom_colonne_a_verifier} = {df_valeur_nulle.shape[0]} (<= au seuil d'erreur {seuil_erreur})")
f"\tRésultat OK : {df_valeur_nan.shape[0]} cellules ont une valeur = {nom_valeur_a_verifier} dans la colonne {nom_colonne_a_verifier} (<= au seuil d'erreur {seuil_erreur})")
log.debug(f"\tListe id_territoires concernés : {liste_id_territoires_str}")
else:
message_erreur = f"\tERREUR : il y a {df_valeur_nulle.shape[0]} territoires avec des données nulles pour la colonne {nom_colonne_a_verifier} (> au seuil d'erreur {seuil_erreur})\n" \
message_erreur = f"\tERREUR : {df_valeur_nan.shape[0]} cellulles ont une valeur = {nom_valeur_a_verifier} dans la colonne {nom_colonne_a_verifier} (> au seuil d'erreur {seuil_erreur})\n" \
+ liste_id_territoires_str
log.debug(message_erreur)
raise AssertionError(message_erreur)
def verifier_stats_descriptives(series: Series, taille, moyenne, min, max, nom_indicateur_colonne: str) -> None:
def verifier_stats_descriptives(series: Series, nom_indicateur_colonne: str, taille=None, moyenne=None, min=None,
max=None) -> None:
log.debug(f"VERIFICATION STATISTIQUES DESCRIPTIVES pour indicateur : {nom_indicateur_colonne}")
message_erreur = verifier_indicateur_statistique(series, 'count', taille)
message_erreur += verifier_indicateur_statistique(series, 'mean', moyenne)
......@@ -125,8 +126,8 @@ def verifier_stats_descriptives(series: Series, taille, moyenne, min, max, nom_i
def verifier_indicateur_statistique(series, indicateur_statistique, valeur_attendue):
message_erreur = ''
statistiques = series.describe()
if statistiques[indicateur_statistique] == valeur_attendue:
log.debug(f"\tStatistique OK : {indicateur_statistique} = ({valeur_attendue})")
if (valeur_attendue is None) | (statistiques[indicateur_statistique] == valeur_attendue):
log.debug(f"\tStatistique OK : {indicateur_statistique} = ({statistiques[indicateur_statistique]})")
else:
message_erreur = f"\tERREUR : valeur statistique constatée pour {indicateur_statistique} ({statistiques[indicateur_statistique]}) différente celle attendue ({valeur_attendue})"
log.debug(message_erreur)
......
......@@ -4,7 +4,8 @@ from pathlib import Path
import pandas
from matplotlib import pyplot
from crater.reglages import DOSSIER_PRODUCTION_BESOINS
from crater.reglages import DOSSIER_PRODUCTION_BESOINS, DOSSIER_PRATIQUES_AGRICOLES
from tests_qualite_donnees.outils_qualite_donnee import verifier_stats_descriptives
CHEMIN_DONNEES_SOURCES = Path('../../crater-data-sources')
CHEMIN_DONNEES_RESULTATS = Path('../../crater-data-resultats')
......@@ -17,6 +18,10 @@ class TestGenerationDiagrammes(unittest.TestCase):
CHEMIN_DONNEES_RESULTATS / DOSSIER_PRODUCTION_BESOINS / 'production_besoins.csv',
sep=";"
)
self.df_pratiques_agricoles = pandas.read_csv(
CHEMIN_DONNEES_RESULTATS / DOSSIER_PRATIQUES_AGRICOLES / 'pratiques_agricoles.csv',
sep=";"
)
def test_histogrammes(self):
# distribution_notes = pandas.DataFrame()
......@@ -37,3 +42,17 @@ class TestGenerationDiagrammes(unittest.TestCase):
fig = hist.get_figure()
fig.savefig('diagrammes/notes_production_besoins_pays_region_departement.png')
pyplot.show()
def test_generation_histogrammes_part_sau_bio_valeur_pourcent(self):
dataframe = self.df_pratiques_agricoles[self.df_pratiques_agricoles.part_sau_bio_note == 10]
nom_colonne = 'part_sau_bio_note'
self._generer_histogramme_note(dataframe, nom_colonne)
def _generer_histogramme_note(self, dataframe, nom_colonne):
verifier_stats_descriptives(dataframe[nom_colonne], nom_colonne)
hist = dataframe[nom_colonne].hist(bins=10)
# fig = hist.get_figure()
# fig.savefig('diagrammes/notes_production_besoins_epci.png')
fig = hist.get_figure()
fig.savefig(f'diagrammes/notes_{nom_colonne}.png')
pyplot.show()
......@@ -4,7 +4,8 @@ from pathlib import Path
import pandas
from crater.reglages import DOSSIER_PRATIQUES_AGRICOLES
from tests_qualite_donnees.outils_qualite_donnee import verifier_donnees_nulles, verifier_donnees_nan
from tests_qualite_donnees.outils_qualite_donnee import verifier_donnees_nulles, verifier_donnees_nan, \
verifier_donnees_inf
CATEGORIES_TERRITOIRES = ['COMMUNE', 'EPCI', 'DEPARTEMENT', 'REGION', 'PAYS']
......@@ -34,6 +35,20 @@ class TestQualitePratiquesAgricoles(unittest.TestCase):
self.df_production_besoins[self.df_production_besoins.categorie_territoire == categorie],
"surface_bio_ha", 0)
def test_territoires_avec_part_sau_bio_infinie(self):
for categorie in CATEGORIES_TERRITOIRES:
with self.subTest(categorie=categorie):
verifier_donnees_inf(
self.df_production_besoins[self.df_production_besoins.categorie_territoire == categorie],
"part_sau_bio_valeur_pourcent", 0)
def test_notes_pratiques_agricoles_nan(self):
for categorie in CATEGORIES_TERRITOIRES:
with self.subTest(categorie=categorie):
verifier_donnees_nan(
self.df_production_besoins[self.df_production_besoins.categorie_territoire == categorie],
"synthese_note", 0)
def test_notes_pratiques_agricoles_nan(self):
for categorie in CATEGORIES_TERRITOIRES:
with self.subTest(categorie=categorie):
......
......@@ -6,7 +6,8 @@ import pandas
from crater.reglages import DOSSIER_PRODUCTION_BESOINS, DOSSIER_TERRITOIRES
from crater.territoires.calculateur import charger_referentiel_territoires
from tests_qualite_donnees.outils_qualite_donnee import verifier_ordre_de_grandeur, \
verifier_seuil_territoires_manquants_dans_df_indicateur, verifier_donnees_nan_ou_zero, verifier_stats_descriptives
verifier_seuil_territoires_manquants_dans_df_indicateur, verifier_stats_descriptives, \
verifier_donnees_nulles, verifier_donnees_nan
BESOINS_HA_FRANCE_PARCEL = 20891216
BESOINS_HA_BLAGNAC_PARCEL = 6710
......@@ -30,12 +31,12 @@ class TestQualiteProductionBesoins(unittest.TestCase):
"Indicateur besoins pour P-FR")
def test_statistiques_production_besoins(self):
verifier_stats_descriptives(self.df_production_besoins['besoins_ha_assiette_actuelle'], 35740,
3197.0716340235026, 0, 20840968.47, "Besoins ha assiette actuelle")
verifier_stats_descriptives(self.df_production_besoins['production_ha'], 35740, 3798.281815332961, 0,
27566816.6, "Production ha")
verifier_stats_descriptives(self.df_production_besoins['taux_couverture_besoins'], 35739, 0, 0, 0,
"Taux de couverture des besoins")
verifier_stats_descriptives(self.df_production_besoins['besoins_ha_assiette_actuelle'],
"Besoins ha assiette actuelle", 35740, 3197.0716340235026, 0, 20840968.47)
verifier_stats_descriptives(self.df_production_besoins['production_ha'], "Production ha", 35740,
3798.281815332961, 0, 27566816.6)
verifier_stats_descriptives(self.df_production_besoins['taux_couverture_besoins'],
"Taux de couverture des besoins", 35739, 0, 0, 0)
def test_valeur_besoins_globaux_Blagnac(self):
besoins_ha_france_crater = self.df_production_besoins.set_index('id_territoire').at[
......@@ -61,5 +62,5 @@ class TestQualiteProductionBesoins(unittest.TestCase):
"besoins_ha_assiette_actuelle pour epcis", 0)
def test_valeurs_zero_ou_nan_pour_indicateur_besoins(self):
verifier_donnees_nan_ou_zero(self.df_production_besoins, 'besoins_ha_assiette_actuelle',
'besoins_ha_assiette_actuelle', 0)
verifier_donnees_nan(self.df_production_besoins, 'besoins_ha_assiette_actuelle', 0)
verifier_donnees_nulles(self.df_production_besoins, 'besoins_ha_assiette_actuelle', 0)
Supports Markdown
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