A newer version of the Gradio SDK is available:
6.5.1
title: Bdv
emoji: 🌍
colorFrom: green
colorTo: green
sdk: gradio
sdk_version: 6.2.0
app_file: app.py
pinned: false
Elections Sète - Prévision municipales
Pipeline complet pour harmoniser les données électorales, construire un dataset panel sans fuite temporelle, entraîner des modèles multi-blocs, charger l'historique dans PostgreSQL et exposer des résultats via Gradio.
Installation
- Python 3.10+ recommandé.
python3 -m venv .venv && source .venv/bin/activatepip install -r requirements.txt
Fichiers YAML (configuration)
config/communes.yaml
Ce fichier définit les communes à inclure (codes INSEE). Il est consommé par le pipeline (src.pipeline.run_full_pipeline) pour filtrer les données au niveau commune.
Formats acceptés (les codes sont normalisés en 5 chiffres) :
communes:
"34301": "Sète"
"34172": "Frontignan"
ou
communes:
- code_insee: "34301"
nom: "Sète"
- "34172"
Si tu modifies ce fichier, il faut relancer le pipeline pour régénérer les données filtrées.
config/raw_sources.yaml
Description des fichiers bruts et de leur structure (colonnes, séparateur, métadonnées). C'est le point d'entrée pour ajouter un nouveau CSV au pipeline.
Exemple (copie d'une election precedente + ajustements) :
24_L_T1.csv:
copy_from: 22_L_T1.csv
date_scrutin: "2024-06-30"
code_bv_cols: ["Code commune", "Code BV"]
rename_map:
Nuance Liste: code_candidature
Libellé Abrégé Liste: nom_candidature
config/nuances.yaml
Mapping des nuances vers les blocs politiques (avec overrides). Par défaut, le mapping CSV historique est réutilise et on peut surcharger ou ajouter des nuances :
base_mapping: data/mapping_candidats_blocs.csv
overrides:
- code_candidature: "XYZ"
nom_candidature: "Exemple"
blocs: [gauche_modere, centre]
docker-compose.yml
Fichier YAML pour démarrer PostgreSQL (et éventuellement pgAdmin). Utilisé par :
docker-compose up -d postgres
docker-compose --profile admin up
1. Prétraitement (harmonisation)
# Harmonisation des CSV bruts -> data/interim/elections_long.parquet
python -m src.data.preprocess --raw-dir data/raw --output-dir data/interim
Par défaut, le prétraitement lit config/raw_sources.yaml. Tu peux surcharger via --meta-config.
2. Pipeline communes + features (optionnel mais recommandé si tu filtres par communes)
Le pipeline applique le filtre config/communes.yaml et génère data/processed/elections_blocs.*.
À lancer depuis un notebook ou un petit script :
python3 - <<'PY'
from pathlib import Path
from src.pipeline import run_full_pipeline
run_full_pipeline(
elections_long_path=Path("data/interim/elections_long.parquet"),
mapping_path=Path("config/nuances.yaml"),
output_dir=Path("data/processed"),
target_communes_path=Path("config/communes.yaml"),
)
PY
3. Construction du panel (features + cibles)
python -m src.features.build_features \
--elections-long data/interim/elections_long.parquet \
--mapping config/nuances.yaml \
--output data/processed/panel.parquet
Le dictionnaire de données est généré dans data/processed/data_dictionary.md.
Note : src.features.build_features ne filtre pas via config/communes.yaml. Si tu veux limiter l'entraînement à certaines communes, filtre elections_long en amont ou adapte le pipeline.
4. Base PostgreSQL
cp .env.example .env
docker-compose up -d postgres # pgAdmin en option: `docker-compose --profile admin up`
# Ingestion du panel dans le schéma normalisé
python -m src.db.ingest --input data/processed/panel.parquet
Le schéma est défini dans src/db/schema.py.
5. Entraînement & évaluation
Commande demandée (CV stricte par scrutin) :
python3 -m src.model.train --cv-splits 4 --models hist_gradient_boosting
Options principales :
--panel: chemin du panel (data/processed/panel.parquetpar défaut).--models-dir/--reports-dir: sorties modèles et rapports.--train-end-year,--valid-end-year,--test-start-year: split temporel.--cv-splits: nb de folds temporels (par scrutin).--no-tune: désactive la grille d'hyperparamètres.--max-trials: limite le nombre d'essais par modèle.--models: liste de modèles à tester (ex:ridge,hist_gradient_boosting,lightgbm,xgboost,two_stage_hgb,catboost).
Sorties :
- Modèle + preprocessor :
models/<nom>.joblibetmodels/feature_columns.json - Modèle sélectionné :
models/best_model.json - Rapport métriques :
reports/metrics.jsonetreports/metrics.md - CV détaillée :
reports/cv_summary.csv - Figure :
reports/figures/mae_per_category.png - Model card :
models/model_card.md
6. Génération de prédictions hors ligne
python -m src.model.predict \
--model-path models/hist_gradient_boosting.joblib \
--target-election-type municipales \
--target-year 2026 \
--commune-code 34301
# -> predictions/pred_municipales_2026_sete.csv
Cette commande produit des parts (%) et des deltas vs législatives et municipales 2020.
7. Application Gradio
python -m app.gradio_app
Comportement :
- Backend PostgreSQL si disponible, sinon fallback fichiers locaux.
- Historique : consultation bureau par bureau (pas de ML).
- Prédiction : parts par bloc converties en comptes (personnes) +
blancs,nuls,abstentions. inscritspeut être fourni par l'utilisateur (sinon valeur historique la plus récente du bureau).- Cibles proposées : municipales 2026 (tour 1), legislatives 2027 (tour 1), presidentielles 2027 (tour 1).
Structure des données
- Configurations :
config/ - Bruts :
data/raw/ - Long harmonisé :
data/interim/elections_long.parquet - Élections blocs (filtrées) :
data/processed/elections_blocs.parquet - Stats communales par scrutin :
data/processed/commune_event_stats.parquet - Panel features+cibles :
data/processed/panel.parquet - Mapping nuances -> catégories :
config/nuances.yaml(base:data/mapping_candidats_blocs.csv)
Notes
- Aucune fuite temporelle : les features sont calculées uniquement sur des scrutins strictement antérieurs à la cible.
- Les parts sont clipées à [0, 1] puis renormalisées.
- Les blancs/nuls dépendent des colonnes disponibles dans l'historique ; si une source ne les fournit pas, ils seront à 0.
Inventaire des fichiers (snapshot)
Statuts :
actif: utilisé par le pipeline actuel.généré: produit par le pipeline/entraînement (recréable).hérité (début projet): ancien fichier ou prototype.optionnel: utile mais non requis au runtime.système (inutile): métadonnées OS.
| Fichier | Fonction | Statut |
|---|---|---|
.DS_Store |
Métadonnées macOS | système (inutile) |
.env.example |
Template des variables d'environnement (DB) | actif |
.gitignore |
Règles gitignore | actif |
Elections_Sete.code-workspace |
Config VSCode (workspace) | optionnel |
README.md |
Documentation projet | actif |
app/__init__.py |
Package app (init) | actif |
app/app.py |
Ancienne app Gradio (bv_features.parquet) | hérité (début projet) |
app/gradio_app.py |
Application Gradio principale | actif |
app.py |
Ancienne interface Gradio (compute_predictions) | hérité (début projet) |
catboost_info/catboost_training.json |
Artefacts CatBoost (logs/metrics) | généré |
catboost_info/learn/events.out.tfevents |
Artefacts CatBoost (logs/metrics) | généré |
catboost_info/learn_error.tsv |
Artefacts CatBoost (logs/metrics) | généré |
catboost_info/time_left.tsv |
Artefacts CatBoost (logs/metrics) | généré |
config/communes.yaml |
Liste des communes cibles (codes INSEE) | actif |
config/nuances.yaml |
Overrides mapping nuances -> blocs | actif |
config/raw_sources.yaml |
Schéma des CSV bruts (meta-config) | actif |
data/.DS_Store |
Métadonnées macOS | système (inutile) |
data/contours-france-entiere-latest-v2.geojson |
Fond cartographique (geojson) | optionnel |
data/interim/.DS_Store |
Métadonnées macOS | système (inutile) |
data/interim/candidates_long.parquet |
Données intermédiaires long format | généré |
data/interim/elections_long.csv |
Données intermédiaires long format | généré |
data/interim/elections_long.parquet |
Données intermédiaires long format | généré |
data/interim/frames_std/14_EU.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/14_MN14_T1T2.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/17_L_T1.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/17_L_T2.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/17_PR_T1.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/17_PR_T2.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/19_EU.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/20_MN_T1.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/20_MN_T2.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/21_DEP_T1.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/21_DEP_T2.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/21_REG_T1.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/21_REG_T2.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/22_L_T1.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/22_L_T2.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/22_PR_T1.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/22_PR_T2.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/frames_std/24_EU.parquet |
Intermédiaire standardisé par scrutin | généré |
data/interim/harmonized/14_EU_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/14_MN14_T1T2_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/17_L_T1_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/17_L_T2_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/17_PR_T1_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/17_PR_T2_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/19_EU_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/20_MN_T1_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/20_MN_T2_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/21_DEP_T1_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/21_DEP_T2_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/21_REG_T1_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/21_REG_T2_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/22_L_T1_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/22_L_T2_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/22_PR_T1_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/22_PR_T2_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/harmonized/24_EU_harmonized.csv |
CSV harmonisé par scrutin | généré |
data/interim/unmapped_nuances.csv |
Données intermédiaires long format | généré |
data/mapping_candidats_blocs.csv |
Mapping nuances -> blocs (base) | actif |
data/mappings/category_mapping.csv |
Copie/variante de mapping | hérité (début projet) |
data/processed/bv_features.parquet |
Features legacy (utilisées par app/app.py) | hérité (début projet) |
data/processed/data_dictionary.md |
Dictionnaire de données généré | généré (doc) |
data/processed/elections_blocs.csv |
Dataset blocs (filtré communes) | généré (utilisé) |
data/processed/elections_blocs.parquet |
Dataset blocs (filtré communes) | généré (utilisé) |
data/processed/history_cache.parquet |
Cache local (historique/prédictions) | généré (cache) |
data/processed/panel.csv |
Panel features+cibles | généré (utilisé) |
data/processed/panel.parquet |
Panel features+cibles | généré (utilisé) |
data/processed/predictions_cache.parquet |
Cache local (historique/prédictions) | généré (cache) |
data/processed/predictions_municipales_2026.csv |
Exports de prédictions | généré (résultats) |
data/processed/predictions_municipales_2026_blocs.csv |
Exports de prédictions | généré (résultats) |
data/processed/predictions_municipales_sete_2026.csv |
Exports de prédictions | généré (résultats) |
data/raw/14_EU.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/14_MN14_T1T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/17_L_T1.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/17_L_T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/17_PR_T1.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/17_PR_T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/19_EU.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/20_MN_T1.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/20_MN_T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/21_DEP_T1.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/21_DEP_T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/21_REG_T1.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/21_REG_T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/22_L_T1.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/22_L_T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/22_PR_T1.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/22_PR_T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/24_EU.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/24_L_T1.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
data/raw/24_L_T2.csv |
Données brutes (entrée prétraitement) | actif (entrée pipeline) |
datasets/.DS_Store |
Métadonnées macOS | système (inutile) |
datasets/14_EU.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/14_MN14_T1T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/17_L_T1.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/17_L_T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/17_PR_T1.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/17_PR_T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/19_EU.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/20_MN_T1.tsv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/20_MN_T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/21_DEP_T1.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/21_DEP_T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/21_REG_T1.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/21_REG_T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/22_L_T1.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/22_L_T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/22_PR_T1.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/22_PR_T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/24_EU.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/24_L_T1T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
datasets/24_L_T2.csv |
Copie brute des datasets (ancienne structure) | hérité (début projet) |
docker-compose.yml |
Services Docker (PostgreSQL/pgAdmin) | actif |
harmoniser.md |
Notes d'harmonisation | optionnel |
main.py |
Orchestrateur pipeline (CLI utilitaire) | optionnel |
mission.md |
Backlog / notes projet | optionnel |
models/best_model.json |
Nom du meilleur modèle | généré (utilisé) |
models/feature_columns.json |
Liste des features du modèle | généré (utilisé) |
models/hist_gradient_boosting.joblib |
Modèle entraîné | généré (utilisé) |
models/model_card.md |
Model card (synthèse) | généré (doc) |
notebooks/01_pretraitement.ipynb |
Notebook d'analyse / exploration | optionnel (exploration) |
notebooks/02_feature_engineering.ipynb |
Notebook d'analyse / exploration | optionnel (exploration) |
notebooks/03_modelisation_prediction.ipynb |
Notebook d'analyse / exploration | optionnel (exploration) |
notebooks/aed.ipynb |
Notebook d'analyse / exploration | optionnel (exploration) |
notebooks/catboost_info/catboost_training.json |
Artefacts CatBoost (notebook) | généré |
notebooks/catboost_info/learn/events.out.tfevents |
Artefacts CatBoost (notebook) | généré |
notebooks/catboost_info/learn_error.tsv |
Artefacts CatBoost (notebook) | généré |
notebooks/catboost_info/time_left.tsv |
Artefacts CatBoost (notebook) | généré |
output/.DS_Store |
Métadonnées macOS | système (inutile) |
output/Sans titre 2.png |
Exports graphiques | hérité (début projet) |
output/Sans titre 3.png |
Exports graphiques | hérité (début projet) |
output/Sans titre 4.png |
Exports graphiques | hérité (début projet) |
output/Sans titre 5.png |
Exports graphiques | hérité (début projet) |
output/Sans titre 6.png |
Exports graphiques | hérité (début projet) |
output/Sans titre.png |
Exports graphiques | hérité (début projet) |
output/output.png |
Exports graphiques | hérité (début projet) |
predictions/pred_municipales_2026_sete.csv |
Exports de prédictions | généré (résultats) |
reports/colonnes_comparatif.csv |
Rapport / métriques | généré |
reports/cv_summary.csv |
Rapport / métriques | généré |
reports/figures/mae_per_category.png |
Figures de rapports | généré |
reports/metrics.json |
Rapport / métriques | généré |
reports/metrics.md |
Rapport / note analytique | généré (doc) |
reports/notebook_audit.md |
Rapport / note analytique | généré (doc) |
requirements.txt |
Dépendances Python | actif |
src/__init__.py |
Package src (init) | actif |
src/constants.py |
Constantes projet | actif |
src/data/__init__.py |
Module data | actif |
src/data/preprocess.py |
Prétraitement/harmonisation | actif |
src/data_prep.py |
Librairie d'harmonisation des données | actif |
src/database.py |
Accès base SQL (fallback/app) | actif |
src/db/__init__.py |
Module DB | actif |
src/db/ingest.py |
Ingestion PostgreSQL | actif |
src/db/schema.py |
Schéma PostgreSQL | actif |
src/features/__init__.py |
Module features | actif |
src/features/build_features.py |
Construction du panel features+cibles | actif |
src/model/predict.py |
Prédiction hors ligne | actif |
src/model/train.py |
Entraînement + CV | actif |
src/pipeline.py |
Pipeline de construction (blocs + stats) | actif |
src/prediction.py |
Prédiction legacy (app.py) | hérité (début projet) |
supports/Plan-2024_Bureaux-de-vote.pdf |
Documents de référence | optionnel |
supports/zonages_admin_canton.pdf |
Documents de référence | optionnel |