jaimalklyde commited on
Commit
3ede7bb
·
verified ·
1 Parent(s): 79766de

Update src/module/Validation_Contract.py

Browse files
Files changed (1) hide show
  1. src/module/Validation_Contract.py +21 -11
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 (C'est ce qui manquait !) ---
283
- # Cela nettoie les espaces invisibles dans Excel qui empêchaient la détection
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
- for col in config.get('numeric', []):
 
 
 
 
 
 
 
302
  if col in df_typed.columns:
303
- # Nettoyage préalable des chaînes
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
- # Coerce force NaN si erreur
309
  df_typed[col] = pd.to_numeric(df_typed[col], errors='coerce')
310
 
311
- # FIX CRITIQUE : On remplace les NaN par 0
312
- # C'est ÇA qui empêche le Dashboard de planter sur des calculs
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()