bdv / README.md
stephmnt's picture
Sync from GitHub Actions
46f9144 verified

A newer version of the Gradio SDK is available: 6.5.1

Upgrade
metadata
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/activate
  • pip 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.parquet par 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>.joblib et models/feature_columns.json
  • Modèle sélectionné : models/best_model.json
  • Rapport métriques : reports/metrics.json et reports/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.
  • inscrits peut ê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