Applez Nous: +41 22 518 70 00
Le pattern ETL constitue l’épine dorsale de la consolidation de données. Il sépare clairement les responsabilités techniques :
import pandas as pd
import logging
from datetime import datetime
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def extract_sales_data(filepath: str) -> pd.DataFrame:
logging.info(f"Extraction des données depuis {filepath}")
return pd.read_csv(filepath)
def transform_sales_data(df: pd.DataFrame) -> pd.DataFrame:
logging.info("Démarrage des transformations métier...")
# Nettoyage et typage
df_clean = df.dropna(subset=['id_client', 'montant']).copy()
df_clean['date'] = pd.to_datetime(df_clean['date'])
df_clean['montant_chf'] = df_clean['montant'].astype(float)
# Calcul de la TVA suisse à 8.1%
df_clean['tva_chf'] = df_clean['montant_chf'] * 0.081
df_clean['total_ttc_chf'] = df_clean['montant_chf'] + df_clean['tva_chf']
return df_clean
def load_to_parquet(df: pd.DataFrame, target_path: str) -> None:
logging.info(f"Sauvegarde au format optimisé Parquet : {target_path}")
df.to_parquet(target_path, engine='pyarrow', index=False)
logging.info("Chargement terminé avec succès.")
# Exécution orchestrée du pipeline
if __name__ == "__main__":
raw_df = extract_sales_data("ventes_suisse_brutes.csv")
clean_df = transform_sales_data(raw_df)
load_to_parquet(clean_df, "datalake/ventes_clean.parquet")
Un pipeline de données professionnel doit être idempotent : exécuter le pipeline deux fois sur la même journée doit produire exactement le même état final sans créer de doublons ni corrompre les métriques historiques.