Pipeline data engineering end-to-end analysant 9+ millions de transactions immobilières françaises (2020-2023) issues de la base DVF (Demandes de Valeurs Foncières).
Stack technique : Snowflake / dbt Core / Python / Streamlit
Dashboard interactif : projetdvf.streamlit.app
┌─────────────┐
│ DVF (txt) │ 2.4 Go — 4 fichiers annuels pipe-delimited
└──────┬──────┘
│ Python ingestion (load_raw_data.py)
▼
┌─────────────┐
│ SNOWFLAKE │
│ RAW │ 15M+ lignes brutes
└──────┬──────┘
│ dbt run
▼
┌─────────────┐
│ STAGING │ Nettoyage, typage, IDs synthétiques
│ │ stg_dvf__mutations
└──────┬──────┘
│
▼
┌─────────────┐
│ MARTS │ Tables analytiques finales
│ │ fct_transactions (5M+ lignes)
│ │ agg_communes (36k communes)
└──────┬──────┘
│ CSV export
▼
┌─────────────┐
│ STREAMLIT │ Dashboard interactif déployé
│ DASHBOARD │ projetdvf.streamlit.app
└─────────────┘
- 5M+ transactions résidentielles après nettoyage (maisons et appartements uniquement)
- 36 000+ communes couvertes sur 4 années (2020-2023)
- Ramatuelle en tête à 15 000 €/m², Paris 06/07 à 14 000-15 000 €/m²
- 9 tests qualité automatisés : nulls, unicité, valeurs aberrantes
stg_dvf__mutations : union des 4 fichiers annuels, nettoyage des types, gestion des formats français (virgules vers points), génération d'IDs synthétiques pour les lignes sans identifiant.
fct_transactions : table de faits dédupliquée par mutation (ROW_NUMBER sur identifiant_de_document), filtrée sur les ventes résidentielles uniquement, avec calcul du prix/m² et flags de qualité. Filtres appliqués : 1 000 € < valeur < 50 000 000 €, prix/m² entre 500 et 30 000 €.
agg_communes : KPIs agrégés par commune et année — prix médian, prix/m² médian, volume de transactions, surfaces médianes, répartition maisons/appartements.
9 tests dbt couvrant :
- Nulls sur les colonnes critiques (date_mutation, valeur_fonciere, code_commune)
- Unicité de l'identifiant de document
- Valeurs acceptées sur l'année (2020-2023)
- Cohérence du nombre de transactions
dbt test
Done. PASS=9 WARN=0 ERROR=0 SKIP=0 TOTAL=9
Python 3.11+
Compte Snowflake
dbt Core 1.11+
- Cloner le repo
git clone https://github.com/Sidi4PF/projet_dvf.git
cd projet_dvf- Environnement Python
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt- Variables d'environnement — créer un fichier
.envà la racine
SNOWFLAKE_ACCOUNT=...
SNOWFLAKE_USER=...
SNOWFLAKE_PASSWORD=...
SNOWFLAKE_DATABASE=DVF_DB
SNOWFLAKE_WAREHOUSE=DVF_WH
SNOWFLAKE_SCHEMA=RAW
- Créer les schemas Snowflake
CREATE DATABASE IF NOT EXISTS DVF_DB;
CREATE WAREHOUSE IF NOT EXISTS DVF_WH WITH WAREHOUSE_SIZE = 'XSMALL';
USE DATABASE DVF_DB;
CREATE SCHEMA IF NOT EXISTS RAW;
CREATE SCHEMA IF NOT EXISTS STAGING;
CREATE SCHEMA IF NOT EXISTS MARTS;-
Configurer dbt — voir la documentation Snowflake pour
~/.dbt/profiles.yml -
Lancer le pipeline
python scripts/load_raw_data.py
cd dvf_project
dbt run
dbt test-
Données DVF — télécharger depuis data.gouv.fr et placer dans
data/raw/ -
Dashboard Streamlit (optionnel en local)
pip install -r requirements_streamlit.txt
streamlit run app.pyprojet_dvf/
├── assets/ # Screenshots pipeline outputs
│ ├── dbt_test_pass.png
│ ├── fct_transactions_sample.png
│ └── agg_communes_top_prix.png
├── data/
│ ├── raw/ # Fichiers DVF sources (non versionnés)
│ └── processed/ # CSV exports pour le dashboard
│ ├── fct_transactions_sample.csv
│ └── agg_communes.csv
├── scripts/
│ └── load_raw_data.py # Ingestion Python vers Snowflake
├── dvf_project/ # Projet dbt
│ ├── macros/
│ │ └── generate_schema_name.sql
│ ├── models/
│ │ ├── staging/
│ │ │ ├── stg_dvf__mutations.sql
│ │ │ ├── sources.yml
│ │ │ └── schema.yml
│ │ └── marts/
│ │ ├── fct_transactions.sql
│ │ ├── agg_communes.sql
│ │ └── schema.yml
│ ├── dbt_project.yml
│ └── packages.yml
├── app.py # Dashboard Streamlit
├── requirements.txt # Dependances pipeline
├── requirements_streamlit.txt # Dependances dashboard
├── .gitignore
└── README.md
| Technologie | Usage |
|---|---|
| Snowflake | Data warehouse cloud |
| dbt Core | Transformations ELT |
| Python | Ingestion des données brutes |
| pandas | Lecture et chargement des fichiers |
| Streamlit | Dashboard interactif déployé |
| Plotly | Visualisations interactives |
DVF (Demandes de Valeurs Foncières) — Direction Générale des Finances Publiques (DGFiP) Disponible sur data.gouv.fr sous Licence Ouverte Etalab. Période couverte : 2020-2023, format .txt pipe-delimited.
Sidi Amadou Bocoum
- LinkedIn : https://www.linkedin.com/in/sidi-amadou-bocoum-046b691b6/
- GitHub : https://github.com/Sidi4PF
- Email : sidi.bocoum02@gmail.com


