Aller au contenu

B1 - Pipeline ETL (Stratégie Big Data)

Compétence C3 : Définir une stratégie big data (de la collecte aux traitements des données) afin d'aider l'entreprise à mieux comprendre ses clients et à créer de nouveaux services.


1. Stratégie collecte → traitement

flowchart LR
    subgraph EXTRACT
        G["geo.api.gouv.fr\nREST JSON, 200 KB"]
        D["data.gouv.fr\nJSON+Parquet, 151 MB"]
        S["SSMSI\nCSV gzip, 34 MB"]
    end

    subgraph TRANSFORM
        TG["JSON → CSV communes\n534 lignes"]
        TD["Parquet → CSV agrégé\nparticipation + candidats"]
        TS["CSV → CSV filtré\nBordeaux 2016-2024"]
    end

    subgraph LOAD
        PG[("PostgreSQL 15\n17 tables - Schéma v3.0\n21 007 lignes\nFK, UNIQUE, CHECK")]
    end

    G --> TG --> PG
    D --> TD --> PG
    S --> TS --> PG

2. Architecture modulaire (ADR-003)

src/etl/
├── extract/                    # Phase 1 : Collecte
│   ├── config/settings.py      # URLs API, chemins de sortie
│   ├── core/
│   │   ├── geographie.py       # geo.api.gouv.fr → 3 JSON
│   │   ├── elections.py        # data.gouv.fr → 4 JSON + 1 Parquet
│   │   └── securite.py         # SSMSI → 1 CSV gzip
│   ├── utils/download.py       # Streaming avec barre de progression
│   └── main.py                 # Orchestrateur extract
├── transform/                  # Phase 2 : Nettoyage
│   ├── config/settings.py      # Chemins, mappings colonnes
│   ├── core/
│   │   ├── geographie.py       # JSON → CSV (régions, dépts, communes)
│   │   ├── elections.py        # Agrégation participation, pivot candidats
│   │   └── securite.py         # Filtrage Gironde, mapping types
│   ├── utils/parsing.py        # Parsing nombres français (1.234,56)
│   └── main.py                 # Orchestrateur transform
├── load/                       # Phase 3 : Chargement BDD
│   ├── config/settings.py      # Tailles de batch, chemins CSV
│   ├── core/
│   │   ├── geographie.py       # Region, Departement, Commune
│   │   ├── candidats.py        # Candidat, Parti, CandidatParti
│   │   ├── elections.py        # ElectionTerritoire, Résultats
│   │   └── indicateurs.py      # Batch loading (1000 lignes/batch)
│   ├── utils/validators.py     # 14 fonctions de validation
│   └── main.py                 # Orchestrateur load (respect ordre FK)
└── main.py                     # Orchestrateur global E→T→L

Principe : chaque source = 1 fichier dans core/. Ajout d'une nouvelle source = 1 fichier, sans toucher aux autres.

3. Traitements appliqués

Étape Traitement Exemple
Parsing Nombres français → float 1.234,561234.56
Normalisation IDs territoire 7 chars → 5 chars 33XXXXXXXXXX
Gestion NULL Pourcentages manquants → 0% 745 lignes avec 0 voix
Agrégation Somme voix par commune/candidat Bureau → Commune
Validation Colonnes, types, bornes, unicité 14 validators

4. Résultats

Métrique Valeur
Données brutes collectées 185 MB (3 sources)
Données nettoyées 3 MB (8 fichiers CSV)
Lignes chargées en BDD 21 007
Tables alimentées 17
Temps d'exécution ETL ~5 min

Fichiers de référence : - Code ETL : src/etl/ - Documentation : src/etl/README.md - ADR architecture : docs/02-architecture/adr/ADR-003-architecture-modulaire-etl.md