Full-stack data pipeline project: Python ETL → SQLite → Next.js interactive dashboard.
| Layer | Tech |
|---|---|
| Data Generation | Python · pandas · numpy |
| ETL Pipeline | Python · sqlite3 · logging |
| Database | SQLite |
| Dashboard | Next.js 15 · TypeScript · Recharts · Tailwind CSS v4 |
| Deployment | Vercel |
├── ecommerce-etl/ # Python ETL pipeline
│ ├── src/
│ │ ├── generate_api.py # Simulate dirty API JSON (1200 customers, 8500 orders)
│ │ ├── etl_pipeline.py # Extract → Validate → Transform → Load → SQLite
│ │ └── analytics.py # SQL queries → results.json + matplotlib visuals
│ ├── data/ # Raw API payload
│ ├── db/ # SQLite database output
│ ├── logs/ # ETL run logs
│ ├── model_output/ # results.json consumed by dashboard
│ └── visuals/ # Matplotlib charts
│
└── ecommerce-dashboard/ # Next.js dashboard (deployed on Vercel)
└── app/
├── page.tsx # Full dashboard — all charts & layout
├── layout.tsx
└── data/results.json # Exported by analytics.py
cd ecommerce-etl
pip install -r requirements.txt
python src/generate_api.py # generates data/api_payload.json
python src/etl_pipeline.py # validates, cleans → db/ecommerce.db
python src/analytics.py # SQL queries → model_output/results.jsoncp ecommerce-etl/model_output/results.json ecommerce-dashboard/app/data/results.jsoncd ecommerce-dashboard
npm install
npm run dev # http://localhost:3000- generate_api.py — creates 1,200 customers, 80 products, 8,500 orders with intentional dirty data (nulls, type mismatches, duplicates)
- etl_pipeline.py — validates each entity, coerces types, skips orphans, loads 4 tables into SQLite
- analytics.py — runs 10 SQL queries, exports
results.jsonfor the dashboard
Matteo Aslam · Data & Business Analyst · Microsoft PL-300
LinkedIn · GitHub
