Skip to main content

Forecastability triage for time series using AMI, pAMI, and covariate-aware dependence diagnostics before expensive model search.

Project description

Forecastability Triage Toolkit

Forecastability Triage Toolkit

Forecastability triage for time series using AMI, pAMI, and covariate-aware dependence diagnostics before expensive model search.

CI PyPI Downloads PyPI version Version Docs Python 3.11-3.12 Research base License

Why this package

Forecastability triage for time series using AMI, pAMI, and covariate-aware dependence diagnostics before expensive model search.

This repository is a deterministic forecastability triage toolkit for time series. When the task is time-series forecasting, do not jump directly to model fitting. Start with forecastability triage first: readiness, leakage risk, informative horizons, primary lags, seasonality structure, and covariate informativeness. Only then recommend downstream model families or framework-specific settings.

Use this before model search

Use this package when you need to decide what kind of forecasting work is justified before you start model search. Run deterministic triage first, read the readiness and structure signals, and then hand those outputs to downstream model families for model-family selection, baselines, or tuning.

Downstream model families are next-step consumers after triage, not alternatives to triage.

Install

pip install dependence-forecastability

Optional runtime extras:

pip install "dependence-forecastability[transport]"
pip install "dependence-forecastability[agent]"
# With holiday calendar features
pip install dependence-forecastability[calendar]

Quickstart

Run one deterministic univariate triage call through the top-level facade:

from forecastability import TriageRequest, generate_ar1, run_triage

series = generate_ar1(n_samples=300, phi=0.8, random_state=42)
result = run_triage(
    TriageRequest(
        series=series,
        goal="univariate",
        max_lag=20,
        n_surrogates=99,
        random_state=42,
    )
)

summary = {
    "blocked": result.blocked,
    "readiness_status": result.readiness.status.value,
    "compute_surrogates": None if result.method_plan is None else result.method_plan.compute_surrogates,
    "forecastability_class": None if result.interpretation is None else result.interpretation.forecastability_class,
    "primary_lags": [] if result.interpretation is None else list(result.interpretation.primary_lags),
}
print(summary)

Equivalent minimal files:

Start here

Canonical walkthrough

The canonical entry point is scripts/run_showcase.py. Walkthrough notebooks live in the sibling forecastability-examples repository; see docs/examples_index.md for the full index.

V0.3.1 fingerprint showcase

The v0.3.1 fingerprint surface is intentionally univariate-first and AMI-first. It packages AMI information geometry, the compact four-field fingerprint, deterministic family routing, and a strict agent-layer explanation that stays downstream of the deterministic outputs.

Run the canonical showcase:

MPLBACKEND=Agg uv run scripts/run_showcase_fingerprint.py --smoke

Minimal Python entry:

from forecastability import generate_fingerprint_archetypes, run_forecastability_fingerprint

series = generate_fingerprint_archetypes(n=320, seed=42)["seasonal_periodic"]
bundle = run_forecastability_fingerprint(
    series,
    target_name="seasonal_periodic",
    max_lag=24,
    n_surrogates=99,
    random_state=42,
)
print(bundle.recommendation.primary_families)

Batch CSV entry:

uv run python scripts/run_ami_information_geometry_csv.py \
  --input-csv outputs/examples/ami_geometry_csv/inputs/synthetic_fingerprint_panel.csv \
  --output-root outputs/ami_geometry_csv_script \
  --max-lag 24 \
  --n-surrogates 99 \
  --random-state 42

Primary fingerprint surfaces:

V0.3.2 Lagged-Exogenous Triage

The v0.3.2 surface classifies each exogenous driver by lag role (contemporaneous vs predictive), applies sparse lag selection, and emits a typed lag map ready for forecasting tensor construction.

Run the canonical showcase:

MPLBACKEND=Agg uv run scripts/run_showcase_lagged_exogenous.py --smoke

Minimal Python entry:

from forecastability import generate_lagged_exog_panel, run_lagged_exogenous_triage

df = generate_lagged_exog_panel(n=1500, seed=42)
target = df["target"].to_numpy()
drivers = {name: df[name].to_numpy() for name in df.columns if name != "target"}

bundle = run_lagged_exogenous_triage(
    target,
    drivers,
    target_name="target",
    max_lag=6,
    n_surrogates=99,
    random_state=42,
)

# Sparse selected lags ready for tensor construction
for row in bundle.selected_lags:
    if row.selected_for_tensor:
        print(f"  {row.driver} @ lag={row.lag}  tensor_role={row.tensor_role}")

Primary lagged-exogenous triage surfaces:

[!IMPORTANT] selected_for_tensor=True is impossible at lag=0 by default. Use the known_future_drivers parameter to opt in for features whose contemporaneous value is legitimately available at prediction time (calendar flags, planned promotions, regulator-set prices).

V0.3.3 Routing Validation

The v0.3.3 routing-validation surface audits deterministic routing against synthetic archetypes and, when assets are present, a small real-series sanity panel. It adds the public run_routing_validation() use case and RoutingValidationBundle result surface, and it widens routing confidence labels additively so abstain is available when the routing policy emits no primary families.

Run the clean-checkout smoke path:

uv run python scripts/run_routing_validation_report.py --smoke --no-real-panel

Primary routing-validation surfaces:

[!IMPORTANT] Routing validation does not benchmark or train models. It checks whether the existing routing policy emits defensible family-level guidance before any downstream framework-specific hand-off.

[!NOTE] run_covariant_analysis() supports six methods: cross_ami, cross_pami, te, gcmi, pcmci, and pcmci_ami. The two PCMCI methods are optional and skip gracefully when the causal extra is unavailable.

Install optional causal dependencies only if you need PCMCI methods:

pip install "dependence-forecastability[causal]"

Transport and runtime entry points:

Surface Entry point Stability
Python facade forecastability, forecastability.triage Stable
CLI forecastability Beta
HTTP API forecastability.adapters.api:app Beta
Dashboard forecastability-dashboard Beta
MCP server adapter surface Experimental
Agent narration adapter surface Experimental

Hand-off after triage

After triage, the contract converts triage outputs into structured, machine-readable downstream guidance — lag recommendations, covariate roles, model families, and calendar features — without importing any downstream library.

from forecastability import build_forecast_prep_contract, forecast_prep_contract_to_markdown
import pandas as pd

# contract = build_forecast_prep_contract(
#     triage_result,
#     horizon=12,
#     target_frequency="M",
#     add_calendar_features=True,
#     datetime_index=pd.date_range("1949-01", periods=144, freq="ME"),
# )
print(contract.model_dump_json(indent=2))
print(forecast_prep_contract_to_markdown(contract))

For framework-specific wiring, see docs/recipes/forecast_prep_to_external_frameworks.md.

Repository Workflow

If you are working in the repository rather than installing the package, start here:

uv sync

Canonical maintainer scripts:

Script Role
scripts/run_canonical_triage.py Canonical single-series workflow
scripts/run_benchmark_panel.py Benchmark-panel workflow
scripts/build_report_artifacts.py Report artifact builder

Secondary utilities:

  • scripts/download_data.py
  • scripts/run_exog_analysis.py
  • scripts/rebuild_benchmark_fixture_artifacts.py
  • scripts/rebuild_diagnostic_regression_fixtures.py

Current config status:

Config Current role
configs/benchmark_panel.yaml Active benchmark-panel configuration
configs/canonical_examples.yaml Descriptive reference for canonical examples, not the root runner's only source of truth
configs/interpretation_rules.yaml Reference thresholds for interpretation policy
configs/benchmark_exog_panel.yaml Secondary exogenous benchmark workflow
configs/exogenous_screening_workbench.yaml Secondary workbench configuration
configs/robustness_study.yaml Secondary robustness-study workflow

Tutorials, Walkthroughs, and Integrations

Notebooks and interactive walkthroughs live in the forecastability-examples sibling repository. See docs/examples_index.md for the full index with source and executed-output links.

For issues with notebooks or walkthroughs, file in the forecastability-examples issue tracker. For issues with the core library API, file in the core repo issue tracker.

Main checked-in artifact surfaces:

  • outputs/json/canonical_examples_summary.json and related canonical JSON outputs
  • outputs/tables/*.csv
  • outputs/reports/*.md

[!NOTE] Checked-in artifacts are reference outputs. They are useful examples of the output surface, but they should not be treated as guaranteed-fresh build products for the current working tree.

Statistical Notes

  • AMI is computed per horizon rather than aggregated before computation.
  • pAMI is a project extension and a linear-residual approximation, not exact conditional mutual information.
  • Surrogate significance uses phase-randomized FFT surrogates with at least 99 surrogates and two-sided 95% bands.
  • “Significance skipped” and “no significant lags” are different outcomes. Use compute_surrogates or the route choice to tell them apart.
  • In rolling-origin workflows, diagnostics are computed on the training window only.
  • Phase surrogates can be conservative for strongly periodic series.

Documentation Map

Need Start here
Documentation index by role docs/README.md
Stable imports and runtime entry points docs/public_api.md
Live module layout docs/code/module_map.md
HTTP API contract docs/reference/api_contract.md
Walkthroughs and integrations docs/examples_index.md
Contributor workflow docs/maintenance/developer_guide.md

For the repository-wide docs map, see docs/README.md.

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

dependence_forecastability-0.4.0.tar.gz (2.8 MB view details)

Uploaded Source

Built Distribution

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

dependence_forecastability-0.4.0-py3-none-any.whl (351.2 kB view details)

Uploaded Python 3

File details

Details for the file dependence_forecastability-0.4.0.tar.gz.

File metadata

File hashes

Hashes for dependence_forecastability-0.4.0.tar.gz
Algorithm Hash digest
SHA256 4ab7f38946d7f5996f707c8702a3a1f7cb9a4ad01bb2a0c4d76e67c6785006a3
MD5 4955cffecb45841d58bd8d8e1808b4dd
BLAKE2b-256 c6a9965b999bf8377c5b01786e163a7898c43ca6db809f4e014e7bffc3bea13f

See more details on using hashes here.

Provenance

The following attestation bundles were made for dependence_forecastability-0.4.0.tar.gz:

Publisher: publish-pypi.yml on AdamKrysztopa/dependence-forecastability

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

File details

Details for the file dependence_forecastability-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for dependence_forecastability-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c86f21d59084b98ff6d25b3b891f06f09979988bd0aa9823680b7df7b0dd9404
MD5 30904ab9da511575b0557e78fd03f696
BLAKE2b-256 c50e9779e139ef764184d37df7e52396f7fa136d325cd2cad0d3c0796fd7900b

See more details on using hashes here.

Provenance

The following attestation bundles were made for dependence_forecastability-0.4.0-py3-none-any.whl:

Publisher: publish-pypi.yml on AdamKrysztopa/dependence-forecastability

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