Files
CA/reports/phase1_completion.md
Akiba So fc468464b2 feat: Initial CBPOA commit — 武汉儿童呼吸疾病风险评估系统
Context: Build a spatial risk assessment system correlating air quality
data with children's respiratory disease incidence across Wuhan.

Approach: FastAPI backend serving PostGIS spatial queries, React
frontend with Deck.gl maps, and a PyTorch SpatialTemporalGCN pipeline
for multi-day (1d/3d/7d) risk prediction.

Changes:
- backend/ — FastAPI API with auth (JWT), alerts, risk analysis,
  geocoded case data, grid statistics, and report endpoints
- frontend/ — React dashboard with interactive risk maps, alert
  monitoring, district comparison charts, and timeline player
- models/ — SpatialTemporalGCN model with trained weights and ONNX
  export for inference
- scripts/ — ETL pipeline for weather + medical data, grid generation,
  feature engineering, training, and daily inference
- deploy/ — Docker Compose configs for backend, frontend, and MLflow
- docs/ — API docs, deployment guide, user guide, and code review

Impact: Enables spatial risk visualization, alert monitoring, and
ML-driven health risk forecasting for environmental health teams.
2026-06-05 02:13:49 +08:00

99 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Phase 1 Data Processing & Feature Engineering - Completion Report
**Date**: 2026-04-25
**Status**: COMPLETED ✓
---
## Deliverables
### 1. Weather ETL Pipeline
- **Output**: `processed/weather/daily_wuhan_2022.parquet`, `processed/weather/daily_wuhan_2023.parquet`
- **Schema**: `date`, `station_id`, `district`, `lat`, `lon`, `AQI`, `PM25`, `PM10`, `SO2`, `NO2`, `O3`, `CO`
- **Statistics**:
- 2022: 8,371 rows (23 stations × 365 days - some stations missing days)
- 2023: 8,391 rows (23 stations × 365 days)
- Missing values: < 1% (exceeds 5% threshold requirement)
- **Scripts**: `scripts/etl_weather.py`
### 2. Weather Lag Features
- **Output**: `processed/weather/lag_features.parquet`
- **Schema**: 50 columns = 2 ID cols (date, station_id) + 48 feature cols
- **Features**:
- Current: AQI, PM2.5, PM10, SO2, NO2, O3 (CO dropped per spec)
- Lags: 6 lags × 7 pollutants = 42 lag columns
- CO lags preserved (CO_lag1 through CO_lag14)
- **Missing values**: 0.62% (well under 5% threshold)
- **Scripts**: `scripts/compute_lag_features.py`
### 3. Medical ETL Pipeline
- **Output**:
- `processed/medical/outpatient_daily.parquet`: 1,181 date-district combinations
- `processed/medical/inpatient_daily.parquet`: 1,033 date-district combinations
- `processed/medical/medical_daily.parquet`: 2,210 combined records
- **Filtering**:
- Outpatient: Respiratory keywords filter (62,685 of 107,579 records)
- Inpatient: ICD-10 J00-J99 filter (5,822 of 5,822 records)
- **Scripts**: `scripts/etl_medical.py`
### 4. PostGIS Schema
- **File**: `scripts/deploy_schema.sql`
- **Tables**: wuhan_districts, road_nodes, road_edges, weather_daily, medical_daily, risk_predictions, alerts
- **Spatial indexes**: GIST indexes on geometry columns
- **Views**: v_latest_risk, v_active_alerts, v_district_risk_summary
### 5. Road Network Graph
- **Files**:
- `processed/graph/adjacency_matrix.npz`: Sparse CSR matrix
- `processed/graph/edge_list.csv`: 147,815 edges
- `processed/graph/node_features.parquet`: 140,573 nodes
- `processed/graph/node_metadata.parquet`: Node metadata
- **Node features**: osmid, lat, lon, district, road_type, elevation_m, pop_density
- **Note**: Node count exceeds 70k plan limit but is acceptable for OSM data coverage
- **Scripts**: `scripts/build_road_graph.py`, `scripts/resample_spatial_features.py`
---
## Verification Results
| Check | Status | Details |
|-------|--------|---------|
| Weather columns | ✓ PASS | All 12 required columns present |
| Weather row count | ✓ PASS | 8,371 (2022), 8,391 (2023) within expected range |
| Weather missing < 5% | ✓ PASS | 0.01% and 0.00% |
| Lag features = 48 cols | ✓ PASS | 48 feature columns (CO dropped) |
| Lag features missing < 5% | ✓ PASS | 0.62% |
| CO original dropped | ✓ PASS | CO column not in features |
| CO lags preserved | ✓ PASS | CO_lag1 through CO_lag14 present |
| Medical parquet | ✓ PASS | All 3 parquet files created |
| PostGIS schema | ✓ PASS | 277 lines, 7 tables, spatial indexes |
| Graph elevation | ✓ PASS | elevation_m column present |
| Graph pop_density | ✓ PASS | pop_density column present |
---
## Known Issues / Notes
1. **Node count (140,573)** exceeds original plan limit of 70k. This reflects actual OSM data coverage and is acceptable with GraphSAINT sampling.
2. **Edge count (147,815)** exceeds original plan limit of 120k. Same reason as above.
3. **Medical data output format**: Output is parquet (correct) but earlier version created CSV. Current parquet files are valid.
---
## Scripts Modified
1. `scripts/etl_weather.py` - Fixed aggregation bug in `aggregate_to_daily()` to properly group by date before pivot
2. `scripts/compute_lag_features.py` - Already correct, verified 48 columns
3. `scripts/etl_medical.py` - Verified correct parquet output
4. `scripts/deploy_schema.sql` - Verified complete PostGIS schema
---
## Next Steps
Phase 1 complete. Proceed to Phase 2 verification or Phase 3 model training preparation.
**Ready Gate**: All Phase 1 data quality checks passed. Lag features have exactly 48 columns as required for Phase 3 model input.