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,56 → 1234.56 |
| Normalisation | IDs territoire 7 chars → 5 chars | 33XXXXX → XXXXX |
| 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