Loading repository data…
Loading repository data…
JunENSAI / repository
Ce projet vise à pratiquer l'exploitation de données publiques ouvertes sur le prix des carburants en France. L'architecture repose sur PostgreSQL pour le schéma relationnel et Python pour la collecte (API/XML) et le traitement. L'objectif est d'expérimenter l'ingestion de données pour bâtir une base pérenne, contrôlée et performante.
Ce projet vise à pratiquer l'exploitation de données publiques ouvertes sur le prix des carburants en France. L'architecture repose sur PostgreSQL pour le schéma relationnel et Python pour la collecte (API/XML) et le traitement. L'objectif est d'expérimenter l'ingestion de données pour bâtir une base pérenne, contrôlée et performante.
Les données proviennent de l'API officielle des prix des carburants en France :
HIstorique : https://www.prix-carburants.gouv.fr/rubrique/opendata/
API : https://data.economie.gouv.fr/explore/dataset/prix-des-carburants-en-france-flux-instantane-v2/api/ .
Fuel-Price-Open-Data/
├── .streamlit/ # Configuration Streamlit & Secrets (API Keys)
├── data/ # Données locales
│ ├── raw/ # Stockage temporaire (XML Historique)
│ └── departements.json # Config départements cibles
├── sql/ # Scripts SQL (Schéma, Index, Vues)
├── src/ # Code source Python
│ ├── dashboard/ # Visualisation (Streamlit, Cartes, IA)
│ ├── extract/ # Acquisition (API Client & Scrapper XML)
│ ├── transform/ # Parsers JSON & XML
│ ├── load/ # Chargement BDD (SQLAlchemy, Upserts)
│ ├── import_history.py # Script ingestion Batch (2015-2025)
│ └── main.py # Orchestrateur ETL quotidien
├── app.py # Point d'entrée Web
├── poetry.lock # Verrouillage des versions
└── pyproject.toml # Dépendances du projet
Python 3.10+ (https://www.python.org/downloads/)
PostgreSQL (https://www.postgresql.org/download/)
Poetry (gestionnaire de paquets) [https://python-poetry.org/]
Installation des dépendances :
poetry install
Configuration de la Base de Données :
Connectez-vous à votre serveur PostgreSQL et exécutez les commandes suivantes (à effectuer une seule fois) :
-- Création de l'utilisateur dédié
CREATE USER user_fuel WITH PASSWORD 'open-data@fuel';
-- Création de la base
CREATE DATABASE fuel_db OWNER user_fuel;
-- Attribution des privilèges
GRANT ALL PRIVILEGES ON DATABASE fuel_db TO user_fuel;
Ensuite, initialisez le schéma (tables, dimensions, faits) via un client SQL (DBeaver ou psql) en exécutant les scripts du dossier sql/.
Configuration des secrets (api) :
Créer un fichier .streamlit/secrets.toml :
GEMINI_API_KEY = "votre_cle_api"
Lancement de l'ETL (Historique ou Temps Réel) :
# Pour l'historique XML
poetry run python src/import_history.py
# Pour la mise à jour API
poetry run python src/main.py
Lancement du Dashboard :
poetry run streamlit run app.py
Cette section détaille la conception logique du projet.
Afin d’optimiser les performances de lecture analytique (OLAP), la base de données fuel_db est structurée selon un modèle dimensionnel.
fact_fuel_priceContient les mesures (> 47M lignes).
station_id, fuel_id, date_idprice_value (prix du carburant)update_timedim_*Apportent le contexte analytique.
dim_station : Unicité et géolocalisation des points de ventedim_fuel : Typologie (Gazole, SP95, etc.)dim_date : Agrégations temporellesAperçu de la base de données : on note la table de faits de 9.3 Go et la vue matérialisée pour l'optimisation.
Le pipeline assure à la fois l’historique profond et la fraîcheur des données.
mv_monthly_avg_price)Pour éviter les biais géographiques, les prix moyens sont pondérés par le volume de relevés selon la formule :
$$ P_{pondéré} = \frac{\sum (Prix_{i} \times Volume_{i})}{\sum Volume_{i}} $$