--- title: ISO-NE Energy Demand Forecasting emoji: ⚡ colorFrom: blue colorTo: indigo sdk: gradio sdk_version: 5.30.0 python_version: "3.10" app_file: app.py pinned: false license: mit short_description: Real-time day-ahead demand forecasting for ISO New England --- # ⚡ Multi-Modal Deep Learning for Energy Demand Forecasting Live demo of a trained CNN-Transformer baseline (1.75 M params), blended in a per-zone weighted ensemble with **Chronos-Bolt-mini** (Amazon, 21 M params, zero-shot on demand history). The deployed system is also the case study for our workshop paper on deployment drift and inference-time ensemble adaptation under behind-the-meter (BTM) solar buildout — see [docs/paper.pdf](https://github.com/jeffliulab/real-time-power-predict/blob/main/docs/paper.pdf). **All inputs are now fully real** — no synthetic weather, no proportionally-split system demand: - HRRR f00 weather analyses for the past 24 h (NOAA AWS S3, public) - HRRR f01..f24 forecast for the future 24 h (most recent long cycle ≤ T-2h) - True per-zone load from ISO-NE's public 5-minute zonal estimated load feed - Calendar features (deterministic from timestamps) Headline offline number: **5.24 % MAPE** baseline / **4.21 % MAPE** ensemble (with future analyses at training time — see disclosure in `about.md`). Live MAPE will be modestly worse because deployment substitutes HRRR forecasts for the future window. ## What it does 1. **Real-time tab**: every click pulls real ISO-NE per-zone demand + real HRRR weather and runs the ensemble. Expect ~3-5 min on the very first click of a fresh Space (cold HRRR cache + Chronos load), then ~10-30 s on subsequent clicks within the same uptime session. 2. **Backtest tab**: 7 daily forecasts on the most recent fully-published days, with full predict-vs-truth comparisons + per-zone MAPE table. Refreshed daily by a GitHub Actions cron in the [auxiliary data repo](https://github.com/jeffliulab/new-england-real-time-power-predict-data). 3. **About tab**: a live MAPE summary (refreshed every cron run, no hardcoded numbers) plus the static demo description and figures from the report. ## Recent live performance Live MAPE numbers (per-model, per-zone, plus the 7-day window endpoints + `built_at` timestamp) are rendered inside the Space's About tab and refreshed every day at 04:00 UTC by the GitHub Actions cron in [the auxiliary data repo](https://github.com/jeffliulab/new-england-real-time-power-predict-data). To inspect raw values without launching the Space: ```bash curl -s https://raw.githubusercontent.com/jeffliulab/new-england-real-time-power-predict-data/main/data/last_built.json ``` ## Links - 📄 [Final report (PDF)](https://github.com/jeffliulab/real-time-power-predict/blob/main/report/final_report.pdf) - 💻 [GitHub repository](https://github.com/jeffliulab/real-time-power-predict) - 👤 Author: **Pang Liu** · Independent Researcher · [`jeff.pang.liu@gmail.com`](mailto:jeff.pang.liu@gmail.com) ## Local development ```bash cd space pip install -r requirements.txt python app.py # http://localhost:7860 ``` ## File map | File | Purpose | |---|---| | `app.py` | Gradio Blocks UI + Real-time / Backtest / About tabs | | `iso_ne_fetch.py` | High-level demand fetcher: live ISO-NE 5-min → hourly + bundled CSV fallback + 30-day data-repo cache | | `iso_ne_zonal.py` | Low-level ISO-NE 5-minute zonal CSV fetcher (cookie-prime) | | `hrrr_fetch.py` | Real-time HRRR weather fetcher (Herbie + AWS S3 + KDTree-based regrid + `/tmp` cache) | | `calendar_features.py` | 44-d calendar one-hot encoder | | `model_utils.py` | Model loading + inference + Chronos ensemble | | `models/cnn_transformer_baseline.py` | Baseline architecture (1.75 M params) | | `checkpoints/best.pt` | Trained baseline weights (~20 MB) | | `checkpoints/norm_stats.pt` | z-score statistics (weather + energy) | | `assets/` | Figures shown in the *About* tab + bundled fallback samples | | `assets/backtest_fallback.json` | Last-known-good backtest snapshot (used if data repo unreachable) | | `about.md` | Demo explanation rendered in the UI | | `packages.txt` | apt-style packages: `libeccodes-dev`, `libeccodes-tools` (for cfgrib) | ## No secrets required The Space pulls real data from public, no-auth endpoints: - ISO-NE: `https://www.iso-ne.com/transform/csv/fiveminuteestimatedzonalload?start=...&end=...` (with browser-cookie prime; see `iso_ne_zonal.py`) - HRRR: `s3://noaa-hrrr-bdp-pds/hrrr.{date}/conus/...` via the Herbie library The Backtest tab loads pre-built JSON from the auxiliary data repo [`new-england-real-time-power-predict-data`](https://github.com/jeffliulab/new-england-real-time-power-predict-data), also public; no auth needed.