c9cf744d84
feat: Complete Phase 5 dashboard implementation
...
Implement full 5-tab Toronto Neighbourhood Dashboard with real data
connectivity:
Dashboard Structure:
- Overview tab with livability scores and rankings
- Housing tab with affordability metrics
- Safety tab with crime statistics
- Demographics tab with population/income data
- Amenities tab with parks, schools, transit
Figure Factories (portfolio_app/figures/):
- bar_charts.py: ranking, stacked, horizontal bars
- scatter.py: scatter plots, bubble charts
- radar.py: spider/radar charts
- demographics.py: donut, age pyramid, income distribution
Service Layer (portfolio_app/toronto/services/):
- neighbourhood_service.py: queries dbt marts for all tab data
- geometry_service.py: generates GeoJSON from PostGIS
- Graceful error handling when database unavailable
Callbacks (portfolio_app/pages/toronto/callbacks/):
- map_callbacks.py: choropleth updates, map click handling
- chart_callbacks.py: supporting chart updates
- selection_callbacks.py: dropdown handlers, KPI updates
Data Pipeline (scripts/data/):
- load_toronto_data.py: orchestration script with CLI flags
Lessons Learned:
- Graceful error handling in service layers
- Modular callback structure for multi-tab dashboards
- Figure factory pattern for reusable charts
Closes : #64 , #65 , #66 , #67 , #68 , #69 , #70
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-17 11:46:18 -05:00
c7e9b88adb
feat: project bootstrap and structure
...
Sprint 1 initialization:
- Project directory structure (portfolio_app/, tests/, dbt/, data/, scripts/)
- CLAUDE.md with AI assistant context
- pyproject.toml with all dependencies
- docker-compose.yml for PostgreSQL 16 + PostGIS
- Makefile with standard targets
- Pre-commit configuration (ruff, mypy)
- Environment template (.env.example)
- Error handling foundation (PortfolioError hierarchy)
- Test configuration (conftest.py, pytest config)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-11 13:49:28 -05:00