Global Earthquake Monitor
Un pipeline Bronze → Silver → Gold quotidien et entièrement automatisé qui récupère les séismes depuis l'API USGS, les géo-enrichit avec PySpark et les cartographie dans Power BI.
2,059
séismes cartographiés en une semaine
Quotidien
rafraîchissement automatisé
3
couches Medallion
Plateforme
Microsoft Fabric
Stack
- Microsoft Fabric
- PySpark
- Delta Lake
- Data Factory
- REST API
- Power BI
Contexte
Dans ce projet, j'ai construit un pipeline de bout en bout qui traite les événements sismiques de l'API de l'United States Geological Survey (USGS). L'objectif était d'extraire, transformer et analyser ces données pour produire un rapport Power BI interactif visualisant l'activité sismique mondiale.
J'ai mis en place l'architecture Medallion : les données brutes arrivent dans la couche Bronze pour la traçabilité, la couche Silver les nettoie, les transforme et les valide, et la couche Gold les affine dans un format métier optimisé pour le reporting.
Le stockage et le traitement reposent sur le moteur Spark, tandis qu'Azure Data Factory automatise l'orchestration de l'ingestion et des transformations. Le jeu de données final alimente un dashboard Power BI sur la magnitude, la localisation et la fréquence des séismes.
Architecture de la solution
- USGS API
- Bronze
- Silver
- Gold
- Power BI
- Étape 01Source
Collecte des données — API USGS
J'ai d'abord créé un lakehouse nommé
earthquakes_lakehousepour stocker les données sismiques brutes de l'API USGS. C'est la base qui permet de structurer les données selon l'architecture Medallion. L'ingestion se fait depuis un notebook du lakehouse, en Python, via l'appel :HTTPGET https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2014-01-01&endtime=2014-01-02Les données sont ensuite stockées en tables Delta Lake, qui apportent transactions ACID, contrôle du schéma et time travel — un format fiable et scalable pour la suite.
- Étape 02Bronze
Couche Bronze — stockage brut
Un script Python récupère les séismes depuis l'API et les stocke dans la couche Bronze, sur une fenêtre glissante de 7 jours pour garder un jeu de données à jour.
- 01Dates dynamiques —
start_datecorrespond à il y a sept jours etend_dateà hier ; les deux sont ensuite paramétrées depuis Data Factory. - 02Requête API — le script construit l'URL avec ces dates, demande du GeoJSON et ne conserve que le champ
features, qui contient les événements. - 03Stockage dans le lakehouse — en cas de succès, les événements sont enregistrés en JSON dans
/lakehouse/default/Files/avec un nom daté (YYYY-MM-DD_earthquake_data.json).
Le fichier JSON est ensuite chargé dans un DataFrame Spark pour affiner progressivement les données à travers les couches Medallion.
- 01Dates dynamiques —
- Étape 03Silver
Couche Silver — transformation
Dans la couche Silver, les événements bruts sont nettoyés et structurés : les attributs pertinents sont extraits et des transformations utiles sont appliquées.
- 01Extraction des champs — le JSON imbriqué est aplati et renommé, en se concentrant sur la localisation (latitude, longitude, altitude), la magnitude, la significativité, les horodatages et les descriptions.
- 02Restructuration —
geometry.coordinatesest éclaté en longitude, latitude et altitude ;propertiesfournit le titre, le lieu, la significativité (sig), la magnitude (mag), le type de magnitude (magType) et les horodatages.
- 01Horodatages lisibles —
timeetupdatedsont stockés en millisecondes epoch Unix et convertis en timestamps standards. - 02Table Silver — les données nettoyées sont persistées dans
earthquake_events_silveren mode append, pour ajouter les nouveaux événements sans écraser l'historique. - 03Interrogation — la table Silver peut être explorée en SQL directement dans le lakehouse.
- Étape 04Gold
Couche Gold — enrichissement
- →Seuls les événements récents (postérieurs à
start_date) sont lus depuis Silver. - →Le code pays est déduit de la latitude et de la longitude avec la bibliothèque
reverse_geocoder. - →Comme Spark travaille sur des données distribuées,
get_country_codeest enregistrée comme UDF pour être utilisée dans les transformations.
- 01Code pays —
get_country_code_udfajoute une colonnecountry_codepour l'analyse géographique. - 02Classes de significativité — les événements sont classés Low (
sig < 100), Moderate (100 ≤ sig < 500) ou High (sig ≥ 500). - 03Table Gold — le DataFrame affiné est ajouté à
earthquake_events_gold.
- →Seuls les événements récents (postérieurs à
- Étape 05Orchestration
Orchestration — pipeline Data Factory
Un pipeline Data Factory exécute chaque jour les trois notebooks, dans l'ordre :
- 01Bronze Notebook — lance l'ingestion brute avec des paramètres dynamiques :
start_date→ hier,end_date→ aujourd'hui. - 02Silver Notebook — enchaîné en cas de succès, reçoit
start_date. - 03Gold Notebook — enchaîné en cas de succès, reçoit
start_date.
Tout le workflow est désormais automatisé : Bronze, Silver et Gold s'exécutent séquentiellement selon une planification, et des données fraîches sont disponibles chaque jour sans intervention manuelle.
- 01Bronze Notebook — lance l'ingestion brute avec des paramètres dynamiques :
- Étape 06Gold
Modélisation sémantique
Au-dessus de la couche Gold, un modèle sémantique définit les relations et les mesures calculées pour rendre l'analyse et la visualisation dans Power BI efficaces.
- Étape 07Restitution
Rapport Power BI
Le rapport final visualise l'activité sismique mondiale. On filtre par période et par niveau de significativité (High, Moderate, Low) ; la carte dimensionne chaque bulle selon la significativité, et des KPI affichent le nombre total de séismes et la significativité maximale.
Synthèse
Ce projet automatise l'ingestion, la transformation et la visualisation des données sismiques sur une architecture lakehouse. Data Factory récupère chaque jour les données de l'API USGS, les fait passer par Bronze, Silver et Gold et les enrichit avec la géolocalisation avant qu'elles n'alimentent un modèle sémantique et Power BI.
Le schéma ci-dessous résume le flux complet, de l'ingestion brute au rapport rafraîchi automatiquement.
Projet suivant · 03
Real-Time Weather Stream
Streaming · Spark Structured Streaming