Spaces:
Runtime error
Runtime error
| # T2.3 Β· Grid Outage Forecaster + Appliance Prioritizer | |
| **AIMS KTT Fellowship Hackathon 2026** | |
| Predict 24-hour grid outage probability and generate actionable load-shedding plans for SMEs β designed for low-bandwidth, offline-first, non-smartphone users in Rwanda. | |
| --- | |
| ## β‘ Quickstart (β€ 2 commands, free Colab CPU) | |
| ```bash | |
| pip install pandas numpy scikit-learn lightgbm | |
| python generate_data.py && python prioritizer.py salon | |
| ``` | |
| That's it. Generates all data, fits the model, prints the 24h plan and SMS digest for the salon archetype. | |
| --- | |
| ## π Evaluation Metrics (30-day held-out) | |
| | Metric | Value | Baseline | | |
| |--------|-------|----------| | |
| | Brier Score (P outage) | **0.1756** | 0.212 (naΓ―ve rate) | | |
| | Duration MAE | **61.2 min** | β | | |
| | Avg Lead Time | **2.79 h** | β | | |
| | Inference Latency | **< 300 ms CPU** | β | | |
| | Retrain Time | **< 5 min** | β | | |
| --- | |
| ## π Repository Structure | |
| ``` | |
| βββ generate_data.py # Synthetic data generator (reproducible, seed=42) | |
| βββ forecaster.py # LightGBM probabilistic outage forecaster | |
| βββ prioritizer.py # Constrained appliance load-shedding planner | |
| βββ lite_ui.html # Static 50KB dashboard (open in any browser) | |
| βββ digest_spec.md # Product & Business adaptation artifact | |
| βββ process_log.md # Hour-by-hour timeline + LLM tool use | |
| βββ SIGNED.md # Honor code (signed) | |
| βββ eval.ipynb # Rolling evaluation notebook | |
| βββ grid_history.csv # Generated: 180 days Γ hourly grid data | |
| βββ appliances.json # 10 appliances with categories + revenue | |
| βββ businesses.json # 3 business archetypes (salon, cold room, tailor) | |
| ``` | |
| --- | |
| ## π§ Usage | |
| ### Generate data | |
| ```bash | |
| python generate_data.py | |
| # β grid_history.csv, appliances.json, businesses.json | |
| ``` | |
| ### Run forecast (CLI) | |
| ```bash | |
| python forecaster.py # 24h forecast preview | |
| python forecaster.py --eval # Rolling 30-day Brier + MAE | |
| python forecaster.py --serve # JSON output + latency | |
| ``` | |
| ### Run appliance plan | |
| ```bash | |
| python prioritizer.py salon # Salon archetype | |
| python prioritizer.py cold_room # Cold room archetype | |
| python prioritizer.py tailor # Tailor archetype | |
| ``` | |
| ### Open UI | |
| ```bash | |
| # Just open lite_ui.html in any browser β no server needed | |
| ``` | |
| --- | |
| ## ποΈ Architecture | |
| ``` | |
| grid_history.csv | |
| β | |
| βΌ | |
| forecaster.py::build_features() β lag features, rolling stats, weather, temporal | |
| β | |
| βΌ | |
| LightGBM Classifier β P(outage) per hour | |
| LightGBM Regressor β E[duration | outage] per hour | |
| β | |
| βΌ | |
| prioritizer.py::plan() | |
| Shed order: luxury β comfort β critical | |
| Tie-break: lowest revenue-per-hour shed first | |
| Exception: critical protected during peak hours | |
| β | |
| βΌ | |
| lite_ui.html (forecast chart + appliance grid + SMS digest) | |
| ``` | |
| --- | |
| ## π Product & Business Design | |
| Designed for **low-bandwidth, offline-first, non-smartphone users**: | |
| - **Feature phone SMS digest** (3 Γ 160 chars) at 06:30 CAT β no internet required for the end user | |
| - **Offline fallback**: cached plan valid 6h, staleness banner after that, plan expired after 8h | |
| - **Illiteracy adaptation**: Colored LED relay board (ESP32 + 3-channel relay, ~USD 8/unit) β red/green/yellow per appliance slot, no reading required | |
| - **Cost**: ~RWF 30/business/day all-in (SMS + server amortized across 200+ subscribers) | |
| - **Revenue protected**: ~RWF 62,000/week per salon vs naΓ―ve full-on operation | |
| See `digest_spec.md` for full specification with numbers, users, and workflows. | |
| --- | |
| ## πΉ 4-Minute Video | |
| [YouTube link β to be inserted before submission] | |
| **Video structure:** | |
| - 0:00β0:30 On-camera intro: name, challenge ID, Brier score 0.1756 | |
| - 0:30β1:30 Live code: `prioritizer.py::plan()` β critical-before-luxury logic | |
| - 1:30β2:30 Live demo: `lite_ui.html` salon forecast + plan | |
| - 2:30β3:30 Read `digest_spec.md` morning SMS aloud | |
| - 3:30β4:00 Three spoken answers | |
| --- | |
| ## π€ Model Hosting | |
| Model weights (LightGBM pkl files) hosted on Hugging Face Hub: | |
| `[HF link β to be inserted before submission]` | |
| Alternatively, retrain from scratch in < 5 min: | |
| ```bash | |
| python forecaster.py --fit | |
| ``` | |
| --- | |
| ## π License | |
| MIT License β see LICENSE file. | |
| --- | |
| ## β Submission Checklist | |
| - [x] Public GitHub repo with README | |
| - [x] `generate_data.py` β reproducible in 2 commands | |
| - [x] `forecaster.py` + `prioritizer.py` | |
| - [x] `lite_ui.html` β < 50KB static page | |
| - [x] `eval.ipynb` β rolling 30-day metrics | |
| - [x] `digest_spec.md` β Product & Business artifact with real numbers | |
| - [x] `process_log.md` β timeline + LLM use declared | |
| - [x] `SIGNED.md` β honor code signed | |
| - [ ] 4-minute video URL (to be added) | |
| - [ ] Hugging Face model card link (to be added) | |