Spaces:
Sleeping
Sleeping
Update src/module/Validation_Contract.py
Browse files
src/module/Validation_Contract.py
CHANGED
|
@@ -279,12 +279,13 @@ class ETL_Engine:
|
|
| 279 |
"""Étape 1 : Conversion et Typage Strict"""
|
| 280 |
df_typed = df.copy()
|
| 281 |
|
| 282 |
-
# --- MODIF 1 : Normalisation des noms de colonnes
|
| 283 |
-
#
|
| 284 |
df_typed.columns = df_typed.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('-', '_')
|
| 285 |
|
| 286 |
name_normalized = name.lower().strip().replace(' ', '_').replace('-', '_')
|
| 287 |
|
|
|
|
| 288 |
if name_normalized in self.REFERENCE_TABLES:
|
| 289 |
return df_typed
|
| 290 |
|
|
@@ -292,27 +293,36 @@ class ETL_Engine:
|
|
| 292 |
if not config:
|
| 293 |
return df_typed
|
| 294 |
|
| 295 |
-
# Conversion DATES
|
| 296 |
for col in config.get('date', []):
|
| 297 |
if col in df_typed.columns:
|
| 298 |
df_typed[col] = pd.to_datetime(df_typed[col], errors='coerce')
|
| 299 |
|
| 300 |
-
# --- MODIF 2 : Conversion NUMÉRIQUES BLINDÉE ---
|
| 301 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
if col in df_typed.columns:
|
| 303 |
-
# Nettoyage
|
| 304 |
if df_typed[col].dtype == 'object':
|
| 305 |
df_typed[col] = df_typed[col].astype(str).str.replace(',', '.', regex=False)
|
| 306 |
df_typed[col] = df_typed[col].str.replace(r'\s+', '', regex=True)
|
|
|
|
|
|
|
| 307 |
|
| 308 |
-
#
|
| 309 |
df_typed[col] = pd.to_numeric(df_typed[col], errors='coerce')
|
| 310 |
|
| 311 |
-
# FIX CRITIQUE :
|
| 312 |
-
# C'est
|
| 313 |
df_typed[col] = df_typed[col].fillna(0)
|
| 314 |
-
|
| 315 |
-
# Conversion CATÉGORIELLES
|
| 316 |
for col in config.get('categorical', []):
|
| 317 |
if col in df_typed.columns:
|
| 318 |
df_typed[col] = df_typed[col].astype(str).str.strip()
|
|
|
|
| 279 |
"""Étape 1 : Conversion et Typage Strict"""
|
| 280 |
df_typed = df.copy()
|
| 281 |
|
| 282 |
+
# --- MODIF 1 : Normalisation des noms de colonnes ---
|
| 283 |
+
# Nettoie les espaces, met en minuscule et remplace les tirets pour une détection fiable
|
| 284 |
df_typed.columns = df_typed.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('-', '_')
|
| 285 |
|
| 286 |
name_normalized = name.lower().strip().replace(' ', '_').replace('-', '_')
|
| 287 |
|
| 288 |
+
# Tables de référence : on conserve le format brut
|
| 289 |
if name_normalized in self.REFERENCE_TABLES:
|
| 290 |
return df_typed
|
| 291 |
|
|
|
|
| 293 |
if not config:
|
| 294 |
return df_typed
|
| 295 |
|
| 296 |
+
# 1. Conversion DATES
|
| 297 |
for col in config.get('date', []):
|
| 298 |
if col in df_typed.columns:
|
| 299 |
df_typed[col] = pd.to_datetime(df_typed[col], errors='coerce')
|
| 300 |
|
| 301 |
+
# 2. --- MODIF 2 : Conversion NUMÉRIQUES BLINDÉE ---
|
| 302 |
+
# Liste des colonnes numériques à traiter
|
| 303 |
+
num_cols = config.get('numeric', [])
|
| 304 |
+
|
| 305 |
+
# On ajoute dynamiquement les colonnes de DQ si elles existent pour éviter le crash 'str' vs 'int'
|
| 306 |
+
if 'dq_is_anomaly' in df_typed.columns:
|
| 307 |
+
num_cols.append('dq_is_anomaly')
|
| 308 |
+
|
| 309 |
+
for col in num_cols:
|
| 310 |
if col in df_typed.columns:
|
| 311 |
+
# Nettoyage des caractères parasites (espaces, virgules)
|
| 312 |
if df_typed[col].dtype == 'object':
|
| 313 |
df_typed[col] = df_typed[col].astype(str).str.replace(',', '.', regex=False)
|
| 314 |
df_typed[col] = df_typed[col].str.replace(r'\s+', '', regex=True)
|
| 315 |
+
# Suppression des termes textuels courants
|
| 316 |
+
df_typed[col] = df_typed[col].replace(['Full', 'Erreur', 'nan', 'None', ''], np.nan)
|
| 317 |
|
| 318 |
+
# Conversion en numérique (coerce transforme les erreurs en NaN)
|
| 319 |
df_typed[col] = pd.to_numeric(df_typed[col], errors='coerce')
|
| 320 |
|
| 321 |
+
# FIX CRITIQUE : Remplacement des NaN par 0
|
| 322 |
+
# C'est l'assurance vie du Dashboard pour les comparaisons mathématiques
|
| 323 |
df_typed[col] = df_typed[col].fillna(0)
|
| 324 |
+
|
| 325 |
+
# 3. Conversion CATÉGORIELLES
|
| 326 |
for col in config.get('categorical', []):
|
| 327 |
if col in df_typed.columns:
|
| 328 |
df_typed[col] = df_typed[col].astype(str).str.strip()
|