| # 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) |
|
|