2024 · DATA ENGINEERING | PIPELINE
NBA Analytics Dashboard
End-to-end NBA analytics: Python → dbt → DuckDB → live dashboard with 5 interactive filters

Tech Stack
Overview
A production data pipeline that ingests 500+ NBA player records nightly, transforms them through dbt models with automated data quality tests, and surfaces insights through a live Plotly Dash dashboard. Features interactive filtering by position, age, minutes, team, and games played, plus an Impact Score leaderboard ranking players by a weighted composite metric. Built with Python, dbt, DuckDB, and deployed on Render with auto-deploy from GitHub.
What I Built
- 529+ NBA players tracked across the 2025-26 season
- 5 interactive filters: Minutes, Position, Age, Team, Games Played
- Top 15 Scorers visualization with blue gradient bars
- Team Efficiency scatter — PPG vs FG%, bubble-sized by roster depth
- Impact Score leaderboard: weighted composite of PPG, APG, RPG, +/-
- 7 dbt data quality tests — all passing
- Nightly data refresh from NBA Stats API with graceful fallback
- Technical architecture page with pipeline diagrams
Screenshots

Dashboard Overview

Filter Controls

Impact Score Leaderboard

Technical Architecture
What I Learned
stats.nba.com blocks non-browser traffic — built graceful fallback to sample dataset
dbt + protobuf version conflicts: pinned to protobuf==4.25.9 for stable builds
pandas==2.1.4 + Python 3.11 required for Render deployment (3.14 incompatible)
Context-managed DuckDB connections prevent resource leaks in production
Plotly Dash styling requires inline styles — Tailwind CDN classes don't apply without a build step
dcc.RangeSlider is better UX than dropdown for continuous numeric filters like Games Played