Zakariae Jaafari

ProjetsProjet phare

NYC Taxi dbt Analytics

Modélisation dimensionnelle avec dbt et DuckDB : 109 047 518 courses yellow en source, 8 298 395 faits échantillonnés et 34 tests exécutés en CI.

Vue d'ensemble

Entrepôt d'analytics engineering pour les taxis yellow et green. ingest_data.py pose les fichiers mensuels en Parquet dans DuckDB (schéma prod). dbt enchaîne staging, intermediate et marts — dimensions zones et vendors, fct_trips incrémental, revenu mensuel par zone. Seeds, macros, dbt_utils et docs générées. Module 04 du Zoomcamp, exécuté en local plutôt que sur BigQuery.

Interface

dbt docs for the incremental fct_trips mart in taxi_rides_ny (staging → marts star schema)
DuckDB explorer showing prod.yellow_tripdata and prod.green_tripdata
dbt docs project tree for taxi_rides_ny, with sources, models, seeds and packages

Problème

La TLC publie des dizaines de millions de lignes, avec des colonnes yellow/green incompatibles. Il faut des modèles typés, documentés, joignables — pas un tas de CSV.

Solution technique

Chargement Parquet dans DuckDB, puis construction staging → intermediate → marts avec dbt. La couche intermédiaire calcule désormais trip_id à partir du grain stable complet : une ancienne clé trop courte supprimait 202 906 courses valides. Le modèle corrigé conserve les 8 298 395 lignes de janvier et une fixture CI protège cette régression.

Ce que contient le dépôt

  • ingest_data.py : CSV.gz → Parquet → schéma DuckDB prod
  • Staging yellow et green avec nommage commun
  • Schéma en étoile : dim_zones, dim_vendors, fct_trips incrémental, fct_monthly_zone_revenue
  • Seeds zones et types de paiement ; macros safe_cast et durée de course
  • Packages dbt_utils et codegen ; docs dbt générées et servies en local

Choix techniques

DuckDB plutôt que BigQuery en local
Le module Zoomcamp vise BigQuery. Ici les mêmes idées de modélisation tiennent dans un fichier DuckDB, sans facture cloud.
Faits incrémentaux
fct_trips fusionne sur trip_id pour ajouter des mois sans reconstruire 8 millions de lignes.