← Back to all products

Forecast Accuracy Monitoring Accelerator

$990

Universal time-series forecast monitoring: one TVF + dashboards for MAE/RMSE/MAPE, bias, horizon buckets, weekly trend, and fair multi-system comparison. Ships a dependency-free metrics library + offline tests. Deploy in 30 minutes for any forecast.

📁 17 files🏷 v1.0.0
Production-readyUnit-testedDatabricks Asset Bundle
✓ Instant download✓ Lifetime updates✓ MIT licensed✓ Secure checkout (Stripe)

⚙ Try the Live Demo interactive

Generate a forecast vs actuals series and watch MAE, RMSE, MAPE, bias and horizon buckets update live — the same metrics the accelerator computes.

⚡ Open Accuracy Calculator

📋 What's Inside 17 files

  • README.md
  • LICENSE
  • manifest.json
  • databricks.yml
  • resources/jobs.yml
  • src/tvf/dashboard_forecasts.sql
  • src/dashboard/01_headline_kpis.sql
  • src/dashboard/02_weekly_mae_trend.sql
  • src/dashboard/03_error_by_horizon.sql
  • lib/forecast_metrics.py
  • tests/test_forecast_metrics.py
  • conftest.py
  • guide/01_what-you-get.md
  • guide/02_getting-started.md
  • guide/03_architecture.md
  • guide/04_support.md
  • guides/forecast-monitoring-methodology.md

📁 File Structure 17 files

forecast-accuracy-monitoring/
├── README.md
├── LICENSE
├── manifest.json
├── databricks.yml
├── resources/
│   ├── jobs.yml
├── src/
│   ├── tvf/
│   │   ├── dashboard_forecasts.sql
│   ├── dashboard/
│   │   ├── 01_headline_kpis.sql
│   │   ├── 02_weekly_mae_trend.sql
│   │   ├── 03_error_by_horizon.sql
├── lib/
│   ├── forecast_metrics.py
├── tests/
│   ├── test_forecast_metrics.py
├── conftest.py
├── guide/
│   ├── 01_what-you-get.md
│   ├── 02_getting-started.md
│   ├── 03_architecture.md
│   ├── 04_support.md
├── guides/
│   ├── forecast-monitoring-methodology.md

📖 Documentation Preview README excerpt

Forecast Accuracy Monitoring Accelerator

Universal time-series **forecast monitoring**. Plug in any forecast + actuals

and get MAE / RMSE / MAPE dashboards with horizon-bucketed error, weekly trends,

and **fair multi-system comparison** — deploy in about 30 minutes for heating,

wind, solar, price, load, or any other time series.

The idea

All dashboard queries call **one table-valued function** (`dashboard_forecasts`)

that unions your forecast systems with actuals and computes error + horizon.

Zero SQL duplication: to add a forecast system you add one `UNION ALL` block.

Why "fair comparison" matters

If system A forecasts 48h ahead and system B only 6h ahead, comparing their raw

MAE is misleading — long-horizon errors are larger. The framework caps every

system at the **minimum of each system's max horizon** before computing KPIs, so

comparisons are apples-to-apples. The same logic is in `lib/forecast_metrics.py`

and unit-tested.

What's inside

- **Databricks Asset Bundle** — daily job that deploys the TVF and refreshes KPI

datasets.

- **One TVF + three dashboard queries** — headline KPIs, weekly MAE trend, and

error-by-horizon, all parameterized by `:catalog`, `:schema`, `:lookback_days`.

- **A dependency-free metrics library** (`lib/forecast_metrics.py`) — MAE, RMSE,

MAPE, bias, bias share, horizon bucketing, and the fair-max-horizon rule.

- **An offline test suite** (`tests/`, 7 passing tests).

Quickstart

```bash

pip install pytest && pytest tests/ -v # validate metrics offline

databricks bundle deploy -t dev -p <profile>

```

Provide `forecast_primary`, `forecast_secondary`, `actuals`, and (optional)

`weather_observations` tables in your `:schema` — schemas documented in

`guide/03_architecture.md`.

License

MIT — see `LICENSE`.

... preview truncated, see full README in product download.

📄 Code Sample .sql preview

src/tvf/dashboard_forecasts.sql-- Forecast Monitoring Accelerator: Core TVF (single source of truth) -- Unions multiple forecast systems with actuals + weather, computes error and -- horizon. All dashboard datasets call this TVF — zero SQL duplication. -- To add a forecast system: add another UNION ALL block below. CREATE OR REPLACE FUNCTION IDENTIFIER(:catalog || '.' || :schema || '.dashboard_forecasts')( lookback_days INT ) RETURNS TABLE ( system STRING, predict_timestamp TIMESTAMP, target_hour TIMESTAMP, forecast_value DOUBLE, actual_value DOUBLE, error DOUBLE, abs_error DOUBLE, horizon_hours DOUBLE, temp_c DOUBLE, iso_week STRING ) RETURN WITH forecasts AS ( SELECT 'Primary' AS system, predict_timestamp, target_hour, forecast_value FROM IDENTIFIER(:catalog || '.' || :schema || '.forecast_primary') WHERE target_hour >= DATEADD(DAY, -lookback_days, CURRENT_TIMESTAMP()) UNION ALL SELECT 'Secondary' AS system, predict_timestamp, target_hour, forecast_value FROM IDENTIFIER(:catalog || '.' || :schema || '.forecast_secondary') WHERE target_hour >= DATEADD(DAY, -lookback_days, CURRENT_TIMESTAMP()) ), actuals AS ( SELECT target_hour, actual_value FROM IDENTIFIER(:catalog || '.' || :schema || '.actuals') WHERE target_hour >= DATEADD(DAY, -lookback_days, CURRENT_TIMESTAMP()) ), weather AS ( SELECT target_hour, temperature_c AS temp_c FROM IDENTIFIER(:catalog || '.' || :schema || '.weather_observations') WHERE target_hour >= DATEADD(DAY, -lookback_days, CURRENT_TIMESTAMP()) ) SELECT f.system, f.predict_timestamp, f.target_hour, f.forecast_value, a.actual_value, f.forecast_value - a.actual_value AS error, ABS(f.forecast_value - a.actual_value) AS abs_error, (UNIX_TIMESTAMP(f.target_hour) - UNIX_TIMESTAMP(f.predict_timestamp)) / 3600.0 AS horizon_hours, w.temp_c, DATE_FORMAT(f.target_hour, "yyyy-'W'ww") AS iso_week FROM forecasts f