Skip to main content

Local-first observability, evaluation, and UI for production forecasts.

Project description

ForecastOps

PyPI Python CI License

ForecastOps is a local-first observability and evaluation layer for production forecasts. It works with the forecasting code you already have.

Add one line after .predict(), then run fops ui.

import forecastops as fops

forecast = model.predict(future)

run = fops.capture(
    forecast,
    project="site-traffic",
    series_id="homepage",
    cutoff=train_df["ds"].max(),
    actuals=actuals_df,
)
fops ui

ForecastOps stores forecast artifacts locally as Parquet, writes run metadata to DuckDB, computes horizon-aware metrics, generates static HTML reports, and serves a read-only local UI. It does not train forecasting models, require a cloud account, or upload raw forecast data.

Install

From PyPI:

pip install forecastops

From source:

git clone https://github.com/Parisi-Labs/forecastops.git
cd forecastops
pip install -e .

Quickstart

python -m venv .venv
source .venv/bin/activate
pip install -e .
python examples/generic_dataframe.py
fops report --latest
fops ui

Open http://127.0.0.1:4784 after starting the UI.

Local UI

CleanShot 2026-06-12 at 10 45 00@2x

fops ui serves a read-only explorer for the local store:

  • Runs — every captured run with horizon, points, MAE, WAPE, bias, coverage, skill, and validation status; filterable and sortable.
  • Run detail — headline metrics, a forecast inspector with one chart per series, and a diagnostics cockpit: residual distribution, error by horizon, per-series worst offenders, and per-regime breakdowns — plus metrics, validation, residuals, artifacts, and the capture trace timeline.
  • Projects — runs grouped by project with error trends across captures.
  • Groups — experiment and backtest groups with run counts and mean error; open a group to see per-metric mean ± std and stability across its runs.
  • Compare — metric deltas and regressions between any two runs, backed by fops diff.

Core Concepts

  • capture: normalize forecasts from existing workflows.
  • ForecastSchema: map arbitrary dataframe columns to canonical semantics.
  • validate: catch schema, timestamp, duplicate, interval, and leakage issues.
  • evaluate: compute MAE, RMSE, WAPE, sMAPE, bias, coverage, interval width, pinball loss (for quantile forecasts), and count — sliced by horizon and by any categorical columns you keep (e.g. region, holiday_flag, event_type).
  • compare: calculate benchmark metrics and skill.
  • backtest: evaluate a rolling-origin forecast panel as one grouped run set, with per-cutoff and aggregate (mean/std) metrics.
  • diff: compare two captured runs.
  • groups: tag related runs with capture(group=...) (or a backtest) and browse them together in the UI.
  • local store: .forecastops/forecastops.duckdb plus Parquet artifacts.
  • UI: local read-only browser explorer for runs, metrics, residuals, validation, artifacts, and run differences.

Privacy Defaults

ForecastOps is local-first by default:

  • binds the UI to 127.0.0.1 and refuses other hosts unless you pass --allow-remote
  • makes no outbound network calls
  • stores raw forecast points in the configured local store
  • emits OpenTelemetry only when explicitly enabled
  • avoids raw forecast points in telemetry

Development

pip install -e ".[dev]"
pytest
ruff check .
mypy forecastops

License

Apache-2.0. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

forecastops-0.2.0.tar.gz (81.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

forecastops-0.2.0-py3-none-any.whl (75.8 kB view details)

Uploaded Python 3

File details

Details for the file forecastops-0.2.0.tar.gz.

File metadata

  • Download URL: forecastops-0.2.0.tar.gz
  • Upload date:
  • Size: 81.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for forecastops-0.2.0.tar.gz
Algorithm Hash digest
SHA256 cac4151ecb32422ee2bb5fffec120b9af46d84e99316330064a6160c11169987
MD5 1d4836d247cec5afce2a40b57cd083b5
BLAKE2b-256 646b40607aa428c23046b2b6e1f6f4c12192035cd7a43b7e5940179a7539894e

See more details on using hashes here.

Provenance

The following attestation bundles were made for forecastops-0.2.0.tar.gz:

Publisher: release.yml on Parisi-Labs/forecastops

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file forecastops-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: forecastops-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 75.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for forecastops-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 030538e4a5a172eab840759b93c8ee7d00c24072ea0982926c5451ca6a0b7df2
MD5 3e12f5b8c9c979238e93dba4ce430862
BLAKE2b-256 de373c58a73b5be74ef770224efe852a97eeffa3b1a97613e53119fcb7ce900f

See more details on using hashes here.

Provenance

The following attestation bundles were made for forecastops-0.2.0-py3-none-any.whl:

Publisher: release.yml on Parisi-Labs/forecastops

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page