scale-forecasting 1.2.0__tar.gz → 1.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/CHANGELOG.md +55 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/PKG-INFO +25 -6
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/README.md +50 -29
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/pyproject.toml +1 -1
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/__init__.py +71 -1
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/agent_surfaces.py +347 -1
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/airflow_emit.py +99 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/airflow_tasks.py +328 -0
- scale_forecasting-1.3.0/src/scale_forecasting/auto.py +4507 -0
- scale_forecasting-1.3.0/src/scale_forecasting/auto_policy.py +2401 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/automl_submit.py +15 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/batch_telemetry.py +39 -8
- scale_forecasting-1.3.0/src/scale_forecasting/benchmarks.py +1738 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/calibration.py +54 -40
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/cluster_submit.py +23 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/code_delivery.py +42 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/automl_engine.py +6 -2
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/bigquery_engine.py +4 -2
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/bigquery_sql.py +4 -1
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/ray_engine.py +3 -1
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/spark_explode.py +7 -1
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ensemble_run.py +184 -40
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ensembler.py +350 -139
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/features.py +96 -18
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/gce_submit.py +44 -2
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/gke_submit.py +26 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/main.py +271 -3
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/mcp.py +518 -2
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/_foundation_base.py +40 -32
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/notebook_acceptance.py +2 -1
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/runtimes.py +48 -8
- scale_forecasting-1.3.0/src/scale_forecasting/profiling/__init__.py +21 -0
- scale_forecasting-1.3.0/src/scale_forecasting/profiling/duration.py +826 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/quota.py +395 -4
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_submit.py +21 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/ids.py +14 -3
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/ops.py +4 -4
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/rows.py +247 -19
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/write_api.py +86 -9
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/report.py +44 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/sdk.py +594 -1
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/submit.py +103 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/vertex_submit.py +101 -38
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/worker.py +15 -2
- scale_forecasting-1.2.0/src/scale_forecasting/profiling/__init__.py +0 -3
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/.gitignore +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/LICENSE +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/_entry.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/_infra_args.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/backtest.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/batch_infra.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/capacity.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/cluster_deps.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/cluster_telemetry.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/commands.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/compute_fallback.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/config.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/dag.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/data_gen/__init__.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/data_gen/generator.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/data_gen/seed_spark.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/dataproc_cluster.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/device_audit.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/diagnostics.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/__init__.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/bigquery_names.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/ray_io.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/spark_io.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/engines/vertex_engine.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/errors.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/hardware.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/hpo.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/identity.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/job_launch.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/job_outcome.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/job_wait.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/launch_plan.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/__init__.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/_intervals.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/base_metric.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/bias.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/coverage.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/cv.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/interval_score.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/interval_width.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/maape.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mae.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mape.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mase.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mase_seasonal.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/mse.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/msis.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/msse.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/ope.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/pinball.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/r2.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/rmse.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/rmsle.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/rmsse.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/smape.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/metrics/wape.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/__init__.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/_lag_forecaster.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/_neuralforecast_base.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/_vertex_automl_base.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/auto_arima.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/auto_ces.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/auto_theta.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/autoets.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/base_model.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/bigquery_native.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/catboost_model.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/chronos2.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/chronos_bolt.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/croston.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/fft.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/holtwinters.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/kalman.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/lightgbm_model.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/naive_drift.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/naive_mean.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/naive_moving_average.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/naive_seasonal.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/neuralprophet_model.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/patchtst.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/prophet_model.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/random_forest.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/regression_lags.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/sarimax.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/stl_bagging.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/tbats_model.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/tft.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/theta.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/tide.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/timesfm_torch.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/tsmixer.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/ucm.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/vertex_l2l.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/vertex_seq2seq.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/vertex_tft.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/vertex_tide.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/models/xgboost_model.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/playground.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/__init__.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/cancel.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/reconcile.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/settle.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/probes/vocabulary.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/baseline.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/cost.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/measure.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/numeric.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/sampling.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/signature.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/source.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/profiling/stats.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/py.typed +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_cluster.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_entry.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_infra.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_jobs.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_reaper.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/ray_telemetry.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/reconciliation.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/__init__.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/artifacts.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/cells.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/ddl.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/harvest.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/header.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/jobs.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/lifecycle.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/params.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/reads.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/tables.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/registry/views.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/__init__.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/audit.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/catalog.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/cluster.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/fleet.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/serverless.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/resources/slot.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/retry_policy.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/retry_run.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/review.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/router.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/scenarios.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/seasonality.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/settings.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/shared_clusters.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/smoke_run.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/spark_entry.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/staging.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/submitters.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/validation.py +0 -0
- {scale_forecasting-1.2.0 → scale_forecasting-1.3.0}/src/scale_forecasting/vertex_entry.py +0 -0
|
@@ -11,6 +11,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
## [1.3.0] - 2026-10-16
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **Glass-Box Auto-Forecaster (`Forecaster.build_config()` & `Forecaster.auto()`, [`auto_policy.py`](./src/scale_forecasting/auto_policy.py)):**
|
|
19
|
+
- Compiles a profiled time-series panel (or BigQuery source table) into a standard, inspectable [`RunConfig`](./src/scale_forecasting/config.py) (`AutoBlueprint.config`) paired with a structured per-parameter evidence ledger (`AutoBlueprint.rationale_df()`), automatic schema-backed column detection (`detect_panel_columns`), automatic regime classification (`smooth`, `intermittent`, `lumpy`, `erratic` via Syntetos-Boylan `ADI` and $\text{CV}^2$), automatic `log1p` target transform (`skewness >= 1.35`), and 5 series-count scale regimes (`micro`, `small`, `medium`, `large`, `hyperscale` up to 100,000+ series).
|
|
20
|
+
- Supports 4 observational exposure tiers (`first_light`, `wide_field`, `deep_field`, `survey`) and 4 execution targets (`where="local" | "bigquery" | "cloud_cpu" | "cloud_all"`), plus CLI (`python -m scale_forecasting.main --auto ...`) and MCP (`auto_compile_config` and `run_auto_forecaster` tools in [`mcp.py`](./src/scale_forecasting/mcp.py)).
|
|
21
|
+
- **Multi-Branch Bounded `autofocus` Tournament (`autofocus=True`, `autofocus_mode="dag" | "linear"`):**
|
|
22
|
+
- Explores up to 3 specialized Pass 2 refinement branches (`pass_2_prune_1`, `pass_2_cov_ablation`, `pass_2_transform_probe`) from Pass 1 telemetry (`leaderboard`, `fva_df`, `bias_report_df`, `horizon_decay_df`, `exceptions_df`), followed by a Pass 3 Synthesis Ensemble that borrows all evaluated models (`reuse_prior_runs=True` with snapshot-fingerprint verification) and fits `horizon_specialist`, `champion`, `nnls`, `ridge`, `ensemble_InverseError`, and `trimmed_mean` stackers.
|
|
23
|
+
- Enforces a strict **non-degradation ratchet**: returns the branch with the lowest out-of-fold backtest error (`MASE` / `WAPE`) across Pass 1, Pass 2, and Pass 3, guaranteeing zero regret relative to Pass 1.
|
|
24
|
+
- **7-Question Practitioner Assessment (`AutoForecastResult.assessment_df()`), 4-Anchor Baseline Value Ladder (`baseline_value_df()`), and Hierarchy Reconciliation Value (`hierarchy_value_df()`):**
|
|
25
|
+
- Every `Forecaster.auto()` run answers 7 practitioner trust questions from out-of-fold backtest evidence: (1) Baseline Value (`snaive`, `naive`, `historic_average`, `seasonal_window_average`), (2) Ensemble Parsimony (`parsimony_tolerance_pct`), (3) Covariate FVA & Overfitting Check, (4) Global Pooling vs. Local Independence, (5) Horizon Crossover (`horizon_specialist`), (6) Hierarchy Reconciliation Lift, and (7) Operational Readiness & Exceptions.
|
|
26
|
+
- **20-Panel Synthetic DGP & 9-Dataset Public Open-Data Benchmark Suites ([`benchmarks.py`](./src/scale_forecasting/benchmarks.py)):**
|
|
27
|
+
- Added 20 ground-truth synthetic Data Generating Process (DGP) panels (`dgp_01` through `dgp_20` across `h`, `D`, `W`, `MS` cadences, intermittent/lumpy demand, structural level breaks, true vs. decoy covariates, and 2/3-level hierarchies) via `load_benchmark()`.
|
|
28
|
+
- Added on-demand fetchers (`fetch_public_benchmark()`, zero repo data bloat) for 9 real-world open-data benchmarks (`m5_walmart`, `favorita_grocery`, `m4_daily`, `m4_weekly`, `m4_monthly`, `monash_tourism_monthly`, `monash_hospital`, `monash_car_parts`, `etth1`), achieving **9/9 non-negative held-out test MAE lift over `SNaive`** (`+14.92%` mean test lift, `+25.18%` mean OOF FVA).
|
|
29
|
+
- **Dynamic 6-Runtime Live Quota Preflight ([`quota.py`](./src/scale_forecasting/quota.py)) & Empirical 7-Runtime Duration Estimator ([`profiling/duration.py`](./src/scale_forecasting/profiling/duration.py)):**
|
|
30
|
+
- Live Cloud Quotas / Compute Engine regional quota preflight across all 6 compute-provisioning runtimes (`gce`, `vertex`, `ray`, `spark` cluster & Serverless DCU/shuffle guard, `gke`, `vertex_automl`) with automatic worker cap or machine downgrade before submission.
|
|
31
|
+
- Empirical duration estimator (`predict_run_duration()`) calibrated against 606 completed cloud jobs (`5.59M` evaluated cells).
|
|
32
|
+
- **Interactive Showcase Notebook 11 ([`notebooks/11_auto_forecaster_and_autofocus.ipynb`](./notebooks/11_auto_forecaster_and_autofocus.ipynb)):**
|
|
33
|
+
- End-to-end walkthrough of `Forecaster.build_config()`, `Forecaster.auto()`, multi-branch `autofocus`, the 4-Anchor Baseline Value Ladder, and the 7-Question Practitioner Assessment across local and cloud execution.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- **Physical Annual (`365.25d`) & Multi-Seasonal Sub-Daily (`24h`/`12h`/`168h`) Fourier Harmonics ([`features.py`](./src/scale_forecasting/features.py)) & Frequency-Matched Lags ([`auto_policy.py`](./src/scale_forecasting/auto_policy.py)):**
|
|
38
|
+
- [`_fourier_terms()`](./src/scale_forecasting/features.py) now normalizes daily, weekly, monthly, and quarterly timestamps by the physical `365.25`-day year and encodes multi-seasonal diurnal ($24\text{h}$), semi-diurnal ($12\text{h}$), and weekly ($168\text{h}$) harmonics for hourly (`h`/`H`) panels.
|
|
39
|
+
- [`_frequency_matched_lags()`](./src/scale_forecasting/auto_policy.py) aligns tabular lag depths (`lightgbm`, `catboost`, `xgboost`, `ridge`) with hourly (`[1, 2, 3, 6, 12, 24, 48, 168]`) and monthly (`[1, 2, 3, 6, 12]` / `[1, 2, 3, 6, 12, 24]`) cadences while preserving intermittent/lumpy series.
|
|
40
|
+
- **Leave-One-Fold-Out (LOFO) Out-of-Fold Ensemble Selection & Finite-Sample Conformal Bounds ([`ensembler.py`](./src/scale_forecasting/ensembler.py)):**
|
|
41
|
+
- [`_compute_oof_ensemble_scores()`](./src/scale_forecasting/ensembler.py) evaluates learned stackers (`nnls`, `ridge`, `xgb`, `ensemble_InverseError`) strictly out-of-fold across backtest folds (`n_folds >= 2`) so in-sample weight fitting cannot win `ensemble_champion`, and [`ensemble_oof_bounds()`](./src/scale_forecasting/ensembler.py) uses finite-sample conformal rank quantiles (`_empirical_quantile`).
|
|
42
|
+
- **Vectorized Local & Spark `applyInPandas` Baseline Fast-Path ([`playground.py`](./src/scale_forecasting/playground.py), [`spark_explode.py`](./src/scale_forecasting/engines/spark_explode.py)) & BigQuery Storage Write API Historical Window Fallback ([`write_api.py`](./src/scale_forecasting/registry/write_api.py)):**
|
|
43
|
+
- Added vectorized NumPy panel evaluation for baseline models (`naive`, `snaive`, `historic_average`, `seasonal_window_average`) in both local `playground` and Spark `applyInPandas` workers, cutting 100,000-series baseline execution from minutes to `< 2.5s`.
|
|
44
|
+
- [`write_dataframe_storage_api()`](./src/scale_forecasting/registry/write_api.py) automatically routes tables with partition dates outside BigQuery Storage Write API's `[-3650d, +366d]` streaming window to `load_table_from_dataframe` (Parquet batch load).
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## [1.2.1] - 2026-10-14
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- **Atomic Version Bump Automation (`make bump VERSION=X.Y.Z`):**
|
|
53
|
+
- Added [`bump_version()`](./src/scale_forecasting/agent_surfaces.py) (`python -m scale_forecasting.agent_surfaces --bump-version X.Y.Z`) and `make bump VERSION=X.Y.Z` in [`Makefile`](./Makefile) to atomically update all 7 version-locked files ([`pyproject.toml`](./pyproject.toml), [`src/scale_forecasting/__init__.py`](./src/scale_forecasting/__init__.py), [`plugin.json`](./plugin.json), [`skills/scale-forecasting/SKILL.md`](./skills/scale-forecasting/SKILL.md), [`CHANGELOG.md`](./CHANGELOG.md), [`CITATION.cff`](./CITATION.cff), and [`docker/cloudbuild.yaml`](./docker/cloudbuild.yaml)), refresh `uv.lock` and `docker/requirements.txt`, sync the editable `.venv` `.dist-info`, and regenerate all 6 AI agent surface files.
|
|
54
|
+
- **Version-Tagged Runtime Containers (`:vX.Y.Z`) & Launcher $\leftrightarrow$ Worker Version Parity Guard (`code_delivery.py`):**
|
|
55
|
+
- [`docker/cloudbuild.yaml`](./docker/cloudbuild.yaml) and `make image` in [`Makefile`](./Makefile) now tag and push both `:latest` and `:v<version>` (`:v1.2.1`) to Artifact Registry alongside the content-addressed `venv_archive` tarball.
|
|
56
|
+
- Added [`verify_version_parity()`](./src/scale_forecasting/code_delivery.py), wired into `spark_explode._stamp_executed_fanout` and `ray_engine._stamp_executed_sizing` (shared across `ray`, `vertex`, `gce`, and `gke`), stamping `launcher` and `worker` `scale_forecasting.__version__` (`$.version`) into `run_registry.job_telemetry` and raising `ConfigError` on mismatch when `SF_STRICT_VERSION_PARITY=1`.
|
|
57
|
+
- **Complete 7-Runtime Provisioning vs. Execution Telemetry (`$.platform`):**
|
|
58
|
+
- Extended [`batch_telemetry.platform_phases()`](./src/scale_forecasting/batch_telemetry.py) (`_to_epoch_seconds` / `_rfc3339_seconds`) to accept protobuf `Timestamp`, `datetime`, epoch seconds/milliseconds, and RFC 3339 strings, and wired `$.platform` (`provision_s`, `execute_s`, `total_wall_s`) into `RayProbe`, `GceProbe`, `GkeProbe`, and `VertexAutoMLProbe` in [`src/scale_forecasting/probes/runtimes.py`](./src/scale_forecasting/probes/runtimes.py) as well as ephemeral submitters ([`gce_submit.py`](./src/scale_forecasting/gce_submit.py), [`gke_submit.py`](./src/scale_forecasting/gke_submit.py), [`ray_submit.py`](./src/scale_forecasting/ray_submit.py), [`cluster_submit.py`](./src/scale_forecasting/cluster_submit.py), [`automl_submit.py`](./src/scale_forecasting/automl_submit.py)) so `v_run_jobs.provision_seconds` and `execute_seconds` are populated across all compute runtimes.
|
|
59
|
+
- **Cross-Version BigQuery Registry Compatibility Tripwire ([`tests/unit/test_cross_version_resilience.py`](./tests/unit/test_cross_version_resilience.py)):**
|
|
60
|
+
- Verifies backward and forward compatibility of `Forecaster.from_run_id()`, `ops.match_reusable_models()` & `render_borrow_model_sql()`, `review._assemble_review()` & DataFrame builders, and `diagnostics.py` (`compute_fva`, `compute_inventory_policy`, `compute_anomalies`, `compute_change_points`) across historical `v1.0.0`, `v1.1.0`, and `v1.2.0` registry payloads.
|
|
61
|
+
|
|
62
|
+
### Changed
|
|
63
|
+
|
|
64
|
+
- **Interactive Showcase Notebook Refresh ([`notebooks/01_bigquery_native_sql.ipynb`](./notebooks/01_bigquery_native_sql.ipynb) & [`notebooks/08_multi_engine_master_workflow.ipynb`](./notebooks/08_multi_engine_master_workflow.ipynb)):**
|
|
65
|
+
- Re-executed and persisted `01_bigquery_native_sql.ipynb` (`arima_plus`, `arima_plus_xreg`, `timesfm` `TimesFM 3.0` multivariate, `timesfm@univariate` `TimesFM 2.5`, Covariate FVA, Two-Tier `ML.EXPLAIN_FORECAST` attributions, anomaly/change-point detection, and $(s, S)$ inventory replenishment policy) and `08_multi_engine_master_workflow.ipynb` (4-family parallel DAG with `[models-foundation]` `chronos_bolt`, FVA, TreeSHAP attributions, `v_run_jobs` provisioning telemetry, anomaly/change-point detection, and inventory replenishment policy) against the `v1.2.1` runtime container.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
14
69
|
## [1.2.0] - 2026-10-14
|
|
15
70
|
|
|
16
71
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: scale-forecasting
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: Time-series forecasting on Google Cloud at any scale: one JSON configuration runs every model family on Dataproc Serverless, Ray, Vertex AI, GKE, Compute Engine, or BigQuery ML and writes forecasts and leaderboards back to BigQuery.
|
|
5
5
|
Project-URL: Homepage, https://github.com/statmike/scale-forecasting
|
|
6
6
|
Project-URL: Documentation, https://statmike.github.io/scale-forecasting/
|
|
@@ -205,11 +205,12 @@ import scale_forecasting as sf
|
|
|
205
205
|
from scale_forecasting import playground
|
|
206
206
|
|
|
207
207
|
result = playground.run_one(model="theta", horizon=14, backtest=True)
|
|
208
|
+
auto_run = sf.Forecaster.auto(playground.sample_data(n_series=3), tier="first_light", autofocus=True)
|
|
208
209
|
plan = sf.Forecaster.from_file("configs/ensemble_demo.json").dry_run()
|
|
209
|
-
print(result.metrics["wape"], plan.run_id)
|
|
210
|
+
print(result.metrics["wape"], auto_run.leaderboard_df().iloc[0]["model_type"], plan.run_id)
|
|
210
211
|
```
|
|
211
212
|
|
|
212
|
-
Continue in [`notebooks/00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) or [Getting started (`docs/getting_started.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md).
|
|
213
|
+
Continue in [`notebooks/00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb), [`notebooks/11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb), [Auto-forecaster & `autofocus` (`docs/auto_forecaster.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md), or [Getting started (`docs/getting_started.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md).
|
|
213
214
|
|
|
214
215
|
### Journey 2 — Deploy to your Google Cloud project in 15 minutes
|
|
215
216
|
|
|
@@ -278,6 +279,23 @@ Every run is a validated [`RunConfig`](https://github.com/statmike/scale-forecas
|
|
|
278
279
|
|
|
279
280
|
---
|
|
280
281
|
|
|
282
|
+
## Write a `RunConfig` by hand — or let the Glass-Box Auto-Forecaster compile & refine it
|
|
283
|
+
|
|
284
|
+
You can always author a [`RunConfig`](https://github.com/statmike/scale-forecasting/blob/main/docs/configuration_reference.md) JSON file directly and run it with any method in this repository. Or, when starting on a new dataset, let **`Forecaster.build_config()`** and **`Forecaster.auto()`** profile your data (`Forecaster.profile_data()`), compile a standard `RunConfig` across **4 exposure tiers** (`first_light`, `wide_field`, `deep_sky`, `deep_field`), optionally refine it with multi-branch **`autofocus`**, and answer the 7 core questions every forecaster asks (`f.practitioner_assessment_df()`, `f.compare_models()`):
|
|
285
|
+
|
|
286
|
+
| What Forecasters Care About | Manual Trial-and-Error | Typical Black-Box AutoML | `scale-forecasting` Glass-Box Auto-Forecaster & `autofocus` |
|
|
287
|
+
| :--- | :--- | :--- | :--- |
|
|
288
|
+
| **Transparency & ownership** | Full control, but days of hand-tuning JSON/code across model families. | Swallows your data and hides *why* models or features were picked. | **100% glass-box:** Prints a plain-English rationale table (`bp.explain()`) and saves a standard, editable `RunConfig` JSON you own (`--init-config`). |
|
|
289
|
+
| **User constraints (`[PINNED]`)** | You wire every constraint and fallback by hand. | Take-it-or-leave-it automation; hard to lock specific families or metrics. | **Pin any dial:** Lock `allowed_families`, `models`, `decision_metric`, `n_folds`, `hpo`, `ensemble`, or `max_minutes`; `autofocus` optimizes strictly around your pins. |
|
|
290
|
+
| **Compute & scale awareness (`n_series`)** | You manually size VMs, GPUs, and worker pools for 10 vs. 100k series. | Assumes a single Python machine or a single fixed cluster. | **Co-designs models + 7 cloud runtimes:** Adapts portfolios from `micro` (`<15` series) to `hyperscale` (`25,000+` series) across `local`, `bigquery`, `spark`, `ray`, `vertex`, `gce`, and `gke`. |
|
|
291
|
+
| **Iterative learning & compute reuse** | Re-running a tweak refits every model from scratch. | Runs a single fixed pipeline or brute-forces everything upfront. | **Multi-branch `autofocus` DAG + cell borrowing:** Tests isolated upgrades (`2A` scale/outliers, `2B` feature pruning/horizon, `2C` intermittent/hierarchy/stockouts), **borrows Pass 1's finished models**, and guarantees non-degradation via the **Champion Ratchet**. |
|
|
292
|
+
| **"Earn your complexity" proof** | Easy to overfit noisy features without noticing a simple model was better. | Often crowns a heavy model without proving lift over simple baselines. | **4-anchor Baseline Ladder & 7-Question Assessment:** Benchmarks against seasonal naive, plain univariate (`theta`), and dual-mode foundation baselines (`@univariate` vs. `@global_cov_all`). If a simple univariate model wins, it becomes champion and lists the complex models it beat (`f.baseline_value_df()`, `f.practitioner_assessment_df()`). |
|
|
293
|
+
| **How the policy was built** | Individual intuition and ad-hoc rules of thumb. | Fixed vendor heuristics or slow, costly runtime LLM calls. | **Evolved with AlphaEvolve on Gemini Enterprise (`26.08 -> 74.82` fitness across 20 synthetic DGPs + 9 public benchmarks)** and compiled into deterministic pure Python (**zero LLM calls at runtime**). |
|
|
294
|
+
|
|
295
|
+
Full guide and interactive notebook: **[Glass-Box Auto-Forecaster & `autofocus` (`docs/auto_forecaster.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md)** and **[`notebooks/11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb)**.
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
281
299
|
## Why Google Cloud for forecasting at any scale
|
|
282
300
|
|
|
283
301
|
| Pillar | What it means for you | Proof in this repository |
|
|
@@ -303,15 +321,16 @@ Every run is a validated [`RunConfig`](https://github.com/statmike/scale-forecas
|
|
|
303
321
|
|
|
304
322
|
- **Evaluation, quantiles & calibration:** **21 evaluation metrics** (16 point + 5 interval: `wape`, `smape`, `mape`, `maape`, `ope`, `mae`, `rmse`, `mse`, `rmsle`, `bias`, `mase`, `mase_seasonal`, `rmsse`, `msse`, `r2`, `cv`, `coverage`, `pinball`, `interval_score`, `interval_width`, `msis`), empirical conformal prediction intervals, monotone multi-percentile fans (`output.quantiles` with Chernozhukov rearrangement), and Newsvendor asymmetric cost targets (`underage_cost` / `overage_cost`) ([`docs/metrics_reference.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/metrics_reference.md)).
|
|
305
323
|
- **Hierarchy, smart ensembles & explainability:** All 8 Hyndman FPP3 reconciliation methods (including active-set non-negative `"mint_nonneg"` alongside `mint_shrink`, `wls_var`, `wls_struct`, `ols`, `bottom_up`, `top_down`, `middle_out`), 8 ensemble strategies (`mean`, `median`, `inverse_error`, `champion`, `horizon_specialist`, `nnls`, `ridge`, `xgb`) with `top_k` & `parsimony_margin` pruning and calibrated ensemble intervals, physical bounds (`floor`, `cap`, `cumulative_round`), and two-tier feature attributions (`attributions_df` / `plot_attributions`).
|
|
324
|
+
- **Glass-box auto-forecaster & multi-branch `autofocus`:** Compile an explained `RunConfig` from any DataFrame or BigQuery table (`Forecaster.build_config()` / `--init-config`) across 4 exposure tiers (`first_light`, `wide_field`, `deep_sky`, `deep_field`) with optional user scope pins and approximate 7-runtime duration/cost estimates (`predict_run_duration`), or run a multi-branch `autofocus=True` tournament (`Forecaster.auto()`) whose pure-Python decision rules were evolved with **AlphaEvolve on Gemini Enterprise** across 20 synthetic ground-truth test panels and 9 public open-data benchmarks ([`docs/auto_forecaster.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md)).
|
|
306
325
|
- **Forecaster workbench, econometrics, inventory policy & executive reports:** Pre-fit data hygiene & SBC demand regime routing (`smooth`, `erratic`, `intermittent`, `lumpy`), Forecast Value Added (`compute_fva`) with Harvey–Leybourne–Newbold (1997) modified Diebold–Mariano $p$-values, lead-time horizon decay, Trigg tracking-signal bias audits, AR(1)-aware time rollups (`rollup_time`) and replenishment policy translators (`compute_inventory_policy` / `inventory_policy_df` for $(s, S)$, $(R, S)$, Fill Rate, and Newsvendor safety stock, reorder point, and EOQ), counterfactual promo/price scenario simulation (`simulate_scenarios`), live drift & whipsaw stability scoring, Top-$N$ exception triage (`exceptions_df`), and self-contained interactive HTML/JSON reports (`python -m scale_forecasting.report`) ([`docs/forecaster_workbench.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md)).
|
|
307
326
|
|
|
308
327
|
---
|
|
309
328
|
|
|
310
|
-
## Learn by doing (
|
|
329
|
+
## Learn by doing (12 notebooks across 4 tracks)
|
|
311
330
|
|
|
312
331
|
All notebooks in [`notebooks/`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/README.md) include committed outputs and one-click **Colab Enterprise** launch links:
|
|
313
332
|
|
|
314
|
-
- **Track 1 — Local sandbox & plugins (no GCP setup):** [`00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) · [`09_custom_models_and_metrics.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/09_custom_models_and_metrics.ipynb)
|
|
333
|
+
- **Track 1 — Local sandbox, auto-forecaster & plugins (no GCP setup):** [`00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) · [`11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb) · [`09_custom_models_and_metrics.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/09_custom_models_and_metrics.ipynb)
|
|
315
334
|
- **Track 2 — Cloud runtimes:** [`01_bigquery_native_sql.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/01_bigquery_native_sql.ipynb) · [`02_vertex_and_gce_vms.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/02_vertex_and_gce_vms.ipynb) · [`03_spark_serverless_and_connect.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/03_spark_serverless_and_connect.ipynb) · [`04_ray_on_vertex_gpu.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/04_ray_on_vertex_gpu.ipynb)
|
|
316
335
|
- **Track 3 — Covariates, hierarchy, HPO & ensembles:** [`05_covariates_and_global_models.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/05_covariates_and_global_models.ipynb) · [`06_hierarchical_reconciliation.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/06_hierarchical_reconciliation.ipynb) · [`07_hpo_backtesting_and_ensembles.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/07_hpo_backtesting_and_ensembles.ipynb)
|
|
317
336
|
- **Track 4 — Master multi-engine DAG & operations:** [`08_multi_engine_master_workflow.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/08_multi_engine_master_workflow.ipynb) · [`10_registry_operations_and_scale.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/10_registry_operations_and_scale.ipynb)
|
|
@@ -321,7 +340,7 @@ All notebooks in [`notebooks/`](https://github.com/statmike/scale-forecasting/bl
|
|
|
321
340
|
|
|
322
341
|
## Where next
|
|
323
342
|
|
|
324
|
-
- **Start here:** [Getting started](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md) · [Platform overview](https://github.com/statmike/scale-forecasting/blob/main/docs/overview.md) · [Forecaster workbench](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md) · [AI agents, skills & MCP](https://github.com/statmike/scale-forecasting/blob/main/docs/agent_and_mcp_guide.md) · [Choosing a runtime](https://github.com/statmike/scale-forecasting/blob/main/docs/choosing_a_runtime.md) · [Cost estimates & controls](https://github.com/statmike/scale-forecasting/blob/main/docs/cost_estimates.md) · [Why Google Cloud](https://github.com/statmike/scale-forecasting/blob/main/docs/why_google_cloud.md) · [FAQ](https://github.com/statmike/scale-forecasting/blob/main/docs/faq.md) · [Glossary](https://github.com/statmike/scale-forecasting/blob/main/docs/glossary.md) · [Documentation map](https://github.com/statmike/scale-forecasting/blob/main/docs/README.md)
|
|
343
|
+
- **Start here:** [Getting started](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md) · [Platform overview](https://github.com/statmike/scale-forecasting/blob/main/docs/overview.md) · [Auto-forecaster & `autofocus`](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md) · [Forecaster workbench](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md) · [AI agents, skills & MCP](https://github.com/statmike/scale-forecasting/blob/main/docs/agent_and_mcp_guide.md) · [Choosing a runtime](https://github.com/statmike/scale-forecasting/blob/main/docs/choosing_a_runtime.md) · [Cost estimates & controls](https://github.com/statmike/scale-forecasting/blob/main/docs/cost_estimates.md) · [Why Google Cloud](https://github.com/statmike/scale-forecasting/blob/main/docs/why_google_cloud.md) · [FAQ](https://github.com/statmike/scale-forecasting/blob/main/docs/faq.md) · [Glossary](https://github.com/statmike/scale-forecasting/blob/main/docs/glossary.md) · [Documentation map](https://github.com/statmike/scale-forecasting/blob/main/docs/README.md)
|
|
325
344
|
- **Reference:** [Compute runtimes](https://github.com/statmike/scale-forecasting/blob/main/docs/runtimes_reference.md) · [Configuration](https://github.com/statmike/scale-forecasting/blob/main/docs/configuration_reference.md) · [Models & ensembles](https://github.com/statmike/scale-forecasting/blob/main/docs/models_reference.md) · [Evaluation metrics](https://github.com/statmike/scale-forecasting/blob/main/docs/metrics_reference.md) · [Output schemas & views](https://github.com/statmike/scale-forecasting/blob/main/docs/output_schemas.md)
|
|
326
345
|
- **Operate & extend:** [Python SDK (`Forecaster`)](https://github.com/statmike/scale-forecasting/blob/main/docs/using_the_sdk.md) · [Running & reviewing](https://github.com/statmike/scale-forecasting/blob/main/docs/running_and_reviewing.md) · [Operations & repair](https://github.com/statmike/scale-forecasting/blob/main/docs/operations.md) · [Quota & 100k scale](https://github.com/statmike/scale-forecasting/blob/main/docs/quota_and_scale.md) · [System validation ledger](https://github.com/statmike/scale-forecasting/blob/main/docs/validation.md) · [API reference](https://statmike.github.io/scale-forecasting/api/)
|
|
327
346
|
|
|
@@ -16,38 +16,40 @@
|
|
|
16
16
|
|
|
17
17
|
```mermaid
|
|
18
18
|
flowchart LR
|
|
19
|
-
subgraph
|
|
20
|
-
|
|
19
|
+
subgraph PREP["1. Data, Config & Launch"]
|
|
20
|
+
direction TB
|
|
21
|
+
SRC["Your Data (BigQuery or DataFrame)<br/>series · timestamps · covariates · hierarchies"]
|
|
22
|
+
CFG["Create a Config File (JSON)<br/>Hand-crafted OR use Auto-Forecaster"]
|
|
23
|
+
LAUNCH["Launch & Orchestrate<br/>SDK · CLI · Notebooks · Airflow · Batch · MCP"]
|
|
24
|
+
R["Parallel Family DAG Router<br/>Routes active families (1 job or pool per family)<br/>statistical · ml · deep_learning · automl · native"]
|
|
25
|
+
SRC --> CFG --> LAUNCH --> R
|
|
21
26
|
end
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
end
|
|
26
|
-
subgraph RUN["Zero-idle compute on Google Cloud (chosen per family)"]
|
|
27
|
-
S["Dataproc Serverless Spark"]
|
|
27
|
+
subgraph RUN["2. Zero-Idle Compute on Google Cloud (Chosen per Family)"]
|
|
28
|
+
direction LR
|
|
29
|
+
S["Serverless Spark or Spark Cluster"]
|
|
28
30
|
RY["Ray on Vertex AI or GKE"]
|
|
29
31
|
V["Vertex AI CustomJob"]
|
|
30
|
-
G["Compute Engine
|
|
31
|
-
K["GKE Indexed Job"]
|
|
32
|
-
A["Vertex AI AutoML
|
|
33
|
-
B["BigQuery ML
|
|
32
|
+
G["Compute Engine Single VM (Self-Deleting)"]
|
|
33
|
+
K["GKE (Indexed Job or Ray · Scale-to-Zero)"]
|
|
34
|
+
A["Vertex AI AutoML & Tabular Workflows"]
|
|
35
|
+
B["BigQuery ML (CREATE MODEL · AI.FORECAST)"]
|
|
34
36
|
end
|
|
35
|
-
subgraph OUT["Results
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
subgraph OUT["3. Governed Results & Trust in BigQuery"]
|
|
38
|
+
direction TB
|
|
39
|
+
REG["5 BigQuery Registry Tables<br/>forecasts · backtests · metadata<br/>runs · jobs"]
|
|
40
|
+
VIEWS["5 Analytical SQL Views<br/>Leaderboards · Backtest Coverage<br/>Run & Job Summaries"]
|
|
41
|
+
USE["Practitioner Trust & Consumption<br/>7-Question Assessment · FVA Ladder<br/>Attributions · SDK · Looker"]
|
|
42
|
+
REG --> VIEWS --> USE
|
|
38
43
|
end
|
|
39
|
-
USE["Notebooks · Python SDK · Looker · Cloud Composer DAGs"]
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
R --> S & RY & V & G & K & A & B
|
|
43
|
-
S & RY & V & G & K & A & B --> REG --> VIEWS --> USE
|
|
45
|
+
PREP --> RUN --> OUT
|
|
44
46
|
|
|
45
|
-
classDef data fill:#E8F0FE,stroke:#4285F4,color:#174EA6
|
|
46
|
-
classDef config fill:#FEF7E0,stroke:#F9AB00,color:#7A5A00
|
|
47
|
-
classDef route fill:#FCE8E6,stroke:#EA4335,color:#A50E0E
|
|
48
|
-
classDef compute fill:#E6F4EA,stroke:#34A853,color:#0D652D
|
|
47
|
+
classDef data fill:#E8F0FE,stroke:#4285F4,stroke-width:2px,color:#174EA6
|
|
48
|
+
classDef config fill:#FEF7E0,stroke:#F9AB00,stroke-width:2px,color:#7A5A00
|
|
49
|
+
classDef route fill:#FCE8E6,stroke:#EA4335,stroke-width:2px,color:#A50E0E
|
|
50
|
+
classDef compute fill:#E6F4EA,stroke:#34A853,stroke-width:2px,color:#0D652D
|
|
49
51
|
class SRC,REG,VIEWS,USE data
|
|
50
|
-
class CFG config
|
|
52
|
+
class CFG,LAUNCH config
|
|
51
53
|
class R route
|
|
52
54
|
class S,RY,V,G,K,A,B compute
|
|
53
55
|
```
|
|
@@ -80,11 +82,12 @@ import scale_forecasting as sf
|
|
|
80
82
|
from scale_forecasting import playground
|
|
81
83
|
|
|
82
84
|
result = playground.run_one(model="theta", horizon=14, backtest=True)
|
|
85
|
+
auto_run = sf.Forecaster.auto(playground.sample_data(n_series=3), tier="first_light", autofocus=True)
|
|
83
86
|
plan = sf.Forecaster.from_file("configs/ensemble_demo.json").dry_run()
|
|
84
|
-
print(result.metrics["wape"], plan.run_id)
|
|
87
|
+
print(result.metrics["wape"], auto_run.leaderboard_df().iloc[0]["model_type"], plan.run_id)
|
|
85
88
|
```
|
|
86
89
|
|
|
87
|
-
Continue in [`notebooks/00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) or [Getting started (`docs/getting_started.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md).
|
|
90
|
+
Continue in [`notebooks/00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb), [`notebooks/11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb), [Auto-forecaster & `autofocus` (`docs/auto_forecaster.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md), or [Getting started (`docs/getting_started.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md).
|
|
88
91
|
|
|
89
92
|
### Journey 2 — Deploy to your Google Cloud project in 15 minutes
|
|
90
93
|
|
|
@@ -153,6 +156,23 @@ Every run is a validated [`RunConfig`](https://github.com/statmike/scale-forecas
|
|
|
153
156
|
|
|
154
157
|
---
|
|
155
158
|
|
|
159
|
+
## Write a `RunConfig` by hand — or let the Glass-Box Auto-Forecaster compile & refine it
|
|
160
|
+
|
|
161
|
+
You can always author a [`RunConfig`](https://github.com/statmike/scale-forecasting/blob/main/docs/configuration_reference.md) JSON file directly and run it with any method in this repository. Or, when starting on a new dataset, let **`Forecaster.build_config()`** and **`Forecaster.auto()`** profile your data (`Forecaster.profile_data()`), compile a standard `RunConfig` across **4 exposure tiers** (`first_light`, `wide_field`, `deep_sky`, `deep_field`), optionally refine it with multi-branch **`autofocus`**, and answer the 7 core questions every forecaster asks (`f.practitioner_assessment_df()`, `f.compare_models()`):
|
|
162
|
+
|
|
163
|
+
| What Forecasters Care About | Manual Trial-and-Error | Typical Black-Box AutoML | `scale-forecasting` Glass-Box Auto-Forecaster & `autofocus` |
|
|
164
|
+
| :--- | :--- | :--- | :--- |
|
|
165
|
+
| **Transparency & ownership** | Full control, but days of hand-tuning JSON/code across model families. | Swallows your data and hides *why* models or features were picked. | **100% glass-box:** Prints a plain-English rationale table (`bp.explain()`) and saves a standard, editable `RunConfig` JSON you own (`--init-config`). |
|
|
166
|
+
| **User constraints (`[PINNED]`)** | You wire every constraint and fallback by hand. | Take-it-or-leave-it automation; hard to lock specific families or metrics. | **Pin any dial:** Lock `allowed_families`, `models`, `decision_metric`, `n_folds`, `hpo`, `ensemble`, or `max_minutes`; `autofocus` optimizes strictly around your pins. |
|
|
167
|
+
| **Compute & scale awareness (`n_series`)** | You manually size VMs, GPUs, and worker pools for 10 vs. 100k series. | Assumes a single Python machine or a single fixed cluster. | **Co-designs models + 7 cloud runtimes:** Adapts portfolios from `micro` (`<15` series) to `hyperscale` (`25,000+` series) across `local`, `bigquery`, `spark`, `ray`, `vertex`, `gce`, and `gke`. |
|
|
168
|
+
| **Iterative learning & compute reuse** | Re-running a tweak refits every model from scratch. | Runs a single fixed pipeline or brute-forces everything upfront. | **Multi-branch `autofocus` DAG + cell borrowing:** Tests isolated upgrades (`2A` scale/outliers, `2B` feature pruning/horizon, `2C` intermittent/hierarchy/stockouts), **borrows Pass 1's finished models**, and guarantees non-degradation via the **Champion Ratchet**. |
|
|
169
|
+
| **"Earn your complexity" proof** | Easy to overfit noisy features without noticing a simple model was better. | Often crowns a heavy model without proving lift over simple baselines. | **4-anchor Baseline Ladder & 7-Question Assessment:** Benchmarks against seasonal naive, plain univariate (`theta`), and dual-mode foundation baselines (`@univariate` vs. `@global_cov_all`). If a simple univariate model wins, it becomes champion and lists the complex models it beat (`f.baseline_value_df()`, `f.practitioner_assessment_df()`). |
|
|
170
|
+
| **How the policy was built** | Individual intuition and ad-hoc rules of thumb. | Fixed vendor heuristics or slow, costly runtime LLM calls. | **Evolved with AlphaEvolve on Gemini Enterprise (`26.08 -> 74.82` fitness across 20 synthetic DGPs + 9 public benchmarks)** and compiled into deterministic pure Python (**zero LLM calls at runtime**). |
|
|
171
|
+
|
|
172
|
+
Full guide and interactive notebook: **[Glass-Box Auto-Forecaster & `autofocus` (`docs/auto_forecaster.md`)](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md)** and **[`notebooks/11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb)**.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
156
176
|
## Why Google Cloud for forecasting at any scale
|
|
157
177
|
|
|
158
178
|
| Pillar | What it means for you | Proof in this repository |
|
|
@@ -178,15 +198,16 @@ Every run is a validated [`RunConfig`](https://github.com/statmike/scale-forecas
|
|
|
178
198
|
|
|
179
199
|
- **Evaluation, quantiles & calibration:** **21 evaluation metrics** (16 point + 5 interval: `wape`, `smape`, `mape`, `maape`, `ope`, `mae`, `rmse`, `mse`, `rmsle`, `bias`, `mase`, `mase_seasonal`, `rmsse`, `msse`, `r2`, `cv`, `coverage`, `pinball`, `interval_score`, `interval_width`, `msis`), empirical conformal prediction intervals, monotone multi-percentile fans (`output.quantiles` with Chernozhukov rearrangement), and Newsvendor asymmetric cost targets (`underage_cost` / `overage_cost`) ([`docs/metrics_reference.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/metrics_reference.md)).
|
|
180
200
|
- **Hierarchy, smart ensembles & explainability:** All 8 Hyndman FPP3 reconciliation methods (including active-set non-negative `"mint_nonneg"` alongside `mint_shrink`, `wls_var`, `wls_struct`, `ols`, `bottom_up`, `top_down`, `middle_out`), 8 ensemble strategies (`mean`, `median`, `inverse_error`, `champion`, `horizon_specialist`, `nnls`, `ridge`, `xgb`) with `top_k` & `parsimony_margin` pruning and calibrated ensemble intervals, physical bounds (`floor`, `cap`, `cumulative_round`), and two-tier feature attributions (`attributions_df` / `plot_attributions`).
|
|
201
|
+
- **Glass-box auto-forecaster & multi-branch `autofocus`:** Compile an explained `RunConfig` from any DataFrame or BigQuery table (`Forecaster.build_config()` / `--init-config`) across 4 exposure tiers (`first_light`, `wide_field`, `deep_sky`, `deep_field`) with optional user scope pins and approximate 7-runtime duration/cost estimates (`predict_run_duration`), or run a multi-branch `autofocus=True` tournament (`Forecaster.auto()`) whose pure-Python decision rules were evolved with **AlphaEvolve on Gemini Enterprise** across 20 synthetic ground-truth test panels and 9 public open-data benchmarks ([`docs/auto_forecaster.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md)).
|
|
181
202
|
- **Forecaster workbench, econometrics, inventory policy & executive reports:** Pre-fit data hygiene & SBC demand regime routing (`smooth`, `erratic`, `intermittent`, `lumpy`), Forecast Value Added (`compute_fva`) with Harvey–Leybourne–Newbold (1997) modified Diebold–Mariano $p$-values, lead-time horizon decay, Trigg tracking-signal bias audits, AR(1)-aware time rollups (`rollup_time`) and replenishment policy translators (`compute_inventory_policy` / `inventory_policy_df` for $(s, S)$, $(R, S)$, Fill Rate, and Newsvendor safety stock, reorder point, and EOQ), counterfactual promo/price scenario simulation (`simulate_scenarios`), live drift & whipsaw stability scoring, Top-$N$ exception triage (`exceptions_df`), and self-contained interactive HTML/JSON reports (`python -m scale_forecasting.report`) ([`docs/forecaster_workbench.md`](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md)).
|
|
182
203
|
|
|
183
204
|
---
|
|
184
205
|
|
|
185
|
-
## Learn by doing (
|
|
206
|
+
## Learn by doing (12 notebooks across 4 tracks)
|
|
186
207
|
|
|
187
208
|
All notebooks in [`notebooks/`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/README.md) include committed outputs and one-click **Colab Enterprise** launch links:
|
|
188
209
|
|
|
189
|
-
- **Track 1 — Local sandbox & plugins (no GCP setup):** [`00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) · [`09_custom_models_and_metrics.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/09_custom_models_and_metrics.ipynb)
|
|
210
|
+
- **Track 1 — Local sandbox, auto-forecaster & plugins (no GCP setup):** [`00_model_playground.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/00_model_playground.ipynb) · [`11_auto_forecaster_and_autofocus.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/11_auto_forecaster_and_autofocus.ipynb) · [`09_custom_models_and_metrics.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/09_custom_models_and_metrics.ipynb)
|
|
190
211
|
- **Track 2 — Cloud runtimes:** [`01_bigquery_native_sql.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/01_bigquery_native_sql.ipynb) · [`02_vertex_and_gce_vms.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/02_vertex_and_gce_vms.ipynb) · [`03_spark_serverless_and_connect.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/03_spark_serverless_and_connect.ipynb) · [`04_ray_on_vertex_gpu.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/04_ray_on_vertex_gpu.ipynb)
|
|
191
212
|
- **Track 3 — Covariates, hierarchy, HPO & ensembles:** [`05_covariates_and_global_models.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/05_covariates_and_global_models.ipynb) · [`06_hierarchical_reconciliation.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/06_hierarchical_reconciliation.ipynb) · [`07_hpo_backtesting_and_ensembles.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/07_hpo_backtesting_and_ensembles.ipynb)
|
|
192
213
|
- **Track 4 — Master multi-engine DAG & operations:** [`08_multi_engine_master_workflow.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/08_multi_engine_master_workflow.ipynb) · [`10_registry_operations_and_scale.ipynb`](https://github.com/statmike/scale-forecasting/blob/main/notebooks/10_registry_operations_and_scale.ipynb)
|
|
@@ -196,7 +217,7 @@ All notebooks in [`notebooks/`](https://github.com/statmike/scale-forecasting/bl
|
|
|
196
217
|
|
|
197
218
|
## Where next
|
|
198
219
|
|
|
199
|
-
- **Start here:** [Getting started](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md) · [Platform overview](https://github.com/statmike/scale-forecasting/blob/main/docs/overview.md) · [Forecaster workbench](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md) · [AI agents, skills & MCP](https://github.com/statmike/scale-forecasting/blob/main/docs/agent_and_mcp_guide.md) · [Choosing a runtime](https://github.com/statmike/scale-forecasting/blob/main/docs/choosing_a_runtime.md) · [Cost estimates & controls](https://github.com/statmike/scale-forecasting/blob/main/docs/cost_estimates.md) · [Why Google Cloud](https://github.com/statmike/scale-forecasting/blob/main/docs/why_google_cloud.md) · [FAQ](https://github.com/statmike/scale-forecasting/blob/main/docs/faq.md) · [Glossary](https://github.com/statmike/scale-forecasting/blob/main/docs/glossary.md) · [Documentation map](https://github.com/statmike/scale-forecasting/blob/main/docs/README.md)
|
|
220
|
+
- **Start here:** [Getting started](https://github.com/statmike/scale-forecasting/blob/main/docs/getting_started.md) · [Platform overview](https://github.com/statmike/scale-forecasting/blob/main/docs/overview.md) · [Auto-forecaster & `autofocus`](https://github.com/statmike/scale-forecasting/blob/main/docs/auto_forecaster.md) · [Forecaster workbench](https://github.com/statmike/scale-forecasting/blob/main/docs/forecaster_workbench.md) · [AI agents, skills & MCP](https://github.com/statmike/scale-forecasting/blob/main/docs/agent_and_mcp_guide.md) · [Choosing a runtime](https://github.com/statmike/scale-forecasting/blob/main/docs/choosing_a_runtime.md) · [Cost estimates & controls](https://github.com/statmike/scale-forecasting/blob/main/docs/cost_estimates.md) · [Why Google Cloud](https://github.com/statmike/scale-forecasting/blob/main/docs/why_google_cloud.md) · [FAQ](https://github.com/statmike/scale-forecasting/blob/main/docs/faq.md) · [Glossary](https://github.com/statmike/scale-forecasting/blob/main/docs/glossary.md) · [Documentation map](https://github.com/statmike/scale-forecasting/blob/main/docs/README.md)
|
|
200
221
|
- **Reference:** [Compute runtimes](https://github.com/statmike/scale-forecasting/blob/main/docs/runtimes_reference.md) · [Configuration](https://github.com/statmike/scale-forecasting/blob/main/docs/configuration_reference.md) · [Models & ensembles](https://github.com/statmike/scale-forecasting/blob/main/docs/models_reference.md) · [Evaluation metrics](https://github.com/statmike/scale-forecasting/blob/main/docs/metrics_reference.md) · [Output schemas & views](https://github.com/statmike/scale-forecasting/blob/main/docs/output_schemas.md)
|
|
201
222
|
- **Operate & extend:** [Python SDK (`Forecaster`)](https://github.com/statmike/scale-forecasting/blob/main/docs/using_the_sdk.md) · [Running & reviewing](https://github.com/statmike/scale-forecasting/blob/main/docs/running_and_reviewing.md) · [Operations & repair](https://github.com/statmike/scale-forecasting/blob/main/docs/operations.md) · [Quota & 100k scale](https://github.com/statmike/scale-forecasting/blob/main/docs/quota_and_scale.md) · [System validation ledger](https://github.com/statmike/scale-forecasting/blob/main/docs/validation.md) · [API reference](https://statmike.github.io/scale-forecasting/api/)
|
|
202
223
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "scale-forecasting"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.3.0"
|
|
4
4
|
description = "Time-series forecasting on Google Cloud at any scale: one JSON configuration runs every model family on Dataproc Serverless, Ray, Vertex AI, GKE, Compute Engine, or BigQuery ML and writes forecasts and leaderboards back to BigQuery."
|
|
5
5
|
dynamic = ["readme"]
|
|
6
6
|
# Two different pins, on purpose. `requires-python` is what *the package* installs on: the pure
|
|
@@ -53,7 +53,7 @@ from .settings import Settings
|
|
|
53
53
|
try:
|
|
54
54
|
__version__: str = _pkg_version("scale-forecasting")
|
|
55
55
|
except PackageNotFoundError: # pragma: no cover - zip-staged cloud worker without .dist-info
|
|
56
|
-
__version__ = "1.
|
|
56
|
+
__version__ = "1.3.0"
|
|
57
57
|
|
|
58
58
|
# Lazy (heavy): name -> (module, attribute). Resolved on first access by ``__getattr__`` (PEP 562)
|
|
59
59
|
# so the model modules (statsmodels et al., ~5s) load only when a caller actually reaches for the
|
|
@@ -150,6 +150,40 @@ _LAZY: dict[str, tuple[str, str]] = {
|
|
|
150
150
|
"build_report_payload": (".report", "build_report_payload"),
|
|
151
151
|
"render_html_report": (".report", "render_html_report"),
|
|
152
152
|
"export_report": (".report", "export_report"),
|
|
153
|
+
# Glass-Box Auto-Forecaster, Duration Predictor & DGP Benchmarks.
|
|
154
|
+
"EXPOSURE_TIERS": (".auto", "EXPOSURE_TIERS"),
|
|
155
|
+
"SCALE_REGIMES": (".auto", "SCALE_REGIMES"),
|
|
156
|
+
"classify_scale_regime": (".auto", "classify_scale_regime"),
|
|
157
|
+
"select_default_baselines": (".auto", "select_default_baselines"),
|
|
158
|
+
"select_hierarchy_reconciliation_methods": (
|
|
159
|
+
".auto",
|
|
160
|
+
"select_hierarchy_reconciliation_methods",
|
|
161
|
+
),
|
|
162
|
+
"ConfigBlueprint": (".auto", "ConfigBlueprint"),
|
|
163
|
+
"AutofocusPassRecord": (".auto", "AutofocusPassRecord"),
|
|
164
|
+
"NextLoopPreview": (".auto", "NextLoopPreview"),
|
|
165
|
+
"PanelAutoProfile": (".auto", "PanelAutoProfile"),
|
|
166
|
+
"inspect_panel_for_auto": (".auto", "inspect_panel_for_auto"),
|
|
167
|
+
"build_config": (".auto", "build_config"),
|
|
168
|
+
"auto_forecast": (".auto", "auto_forecast"),
|
|
169
|
+
"DurationEstimate": (".profiling.duration", "DurationEstimate"),
|
|
170
|
+
"FamilyDurationBreakdown": (".profiling.duration", "FamilyDurationBreakdown"),
|
|
171
|
+
"DurationCalibration": (".profiling.duration", "DurationCalibration"),
|
|
172
|
+
"predict_run_duration": (".profiling.duration", "predict_run_duration"),
|
|
173
|
+
"calibrate_duration_from_frames": (".profiling.duration", "calibrate_duration_from_frames"),
|
|
174
|
+
"calibrate_duration_from_registry": (".profiling.duration", "calibrate_duration_from_registry"),
|
|
175
|
+
"BENCHMARK_NAMES": (".benchmarks", "BENCHMARK_NAMES"),
|
|
176
|
+
"BenchmarkSpec": (".benchmarks", "BenchmarkSpec"),
|
|
177
|
+
"BenchmarkDataset": (".benchmarks", "BenchmarkDataset"),
|
|
178
|
+
"list_benchmarks": (".benchmarks", "list_benchmarks"),
|
|
179
|
+
"benchmark_catalog": (".benchmarks", "benchmark_catalog"),
|
|
180
|
+
"load_benchmark": (".benchmarks", "load_benchmark"),
|
|
181
|
+
"PUBLIC_BENCHMARK_NAMES": (".benchmarks", "PUBLIC_BENCHMARK_NAMES"),
|
|
182
|
+
"PUBLIC_BENCHMARK_SPECS": (".benchmarks", "PUBLIC_BENCHMARK_SPECS"),
|
|
183
|
+
"PublicBenchmarkSpec": (".benchmarks", "PublicBenchmarkSpec"),
|
|
184
|
+
"list_public_benchmarks": (".benchmarks", "list_public_benchmarks"),
|
|
185
|
+
"public_benchmark_catalog": (".benchmarks", "public_benchmark_catalog"),
|
|
186
|
+
"fetch_public_benchmark": (".benchmarks", "fetch_public_benchmark"),
|
|
153
187
|
}
|
|
154
188
|
|
|
155
189
|
__all__ = [
|
|
@@ -174,6 +208,34 @@ __all__ = [
|
|
|
174
208
|
|
|
175
209
|
if TYPE_CHECKING: # so IDEs / type-checkers see the lazy names as real imports (re-exported below)
|
|
176
210
|
from .agent_surfaces import probe_environment # noqa: F401
|
|
211
|
+
from .auto import ( # noqa: F401
|
|
212
|
+
EXPOSURE_TIERS,
|
|
213
|
+
SCALE_REGIMES,
|
|
214
|
+
AutofocusPassRecord,
|
|
215
|
+
ConfigBlueprint,
|
|
216
|
+
NextLoopPreview,
|
|
217
|
+
PanelAutoProfile,
|
|
218
|
+
auto_forecast,
|
|
219
|
+
build_config,
|
|
220
|
+
classify_scale_regime,
|
|
221
|
+
inspect_panel_for_auto,
|
|
222
|
+
select_default_baselines,
|
|
223
|
+
select_hierarchy_reconciliation_methods,
|
|
224
|
+
)
|
|
225
|
+
from .benchmarks import ( # noqa: F401
|
|
226
|
+
BENCHMARK_NAMES,
|
|
227
|
+
PUBLIC_BENCHMARK_NAMES,
|
|
228
|
+
PUBLIC_BENCHMARK_SPECS,
|
|
229
|
+
BenchmarkDataset,
|
|
230
|
+
BenchmarkSpec,
|
|
231
|
+
PublicBenchmarkSpec,
|
|
232
|
+
benchmark_catalog,
|
|
233
|
+
fetch_public_benchmark,
|
|
234
|
+
list_benchmarks,
|
|
235
|
+
list_public_benchmarks,
|
|
236
|
+
load_benchmark,
|
|
237
|
+
public_benchmark_catalog,
|
|
238
|
+
)
|
|
177
239
|
from .dag import DagNode # noqa: F401
|
|
178
240
|
from .diagnostics import ( # noqa: F401
|
|
179
241
|
compute_anomalies,
|
|
@@ -205,6 +267,14 @@ if TYPE_CHECKING: # so IDEs / type-checkers see the lazy names as real imports
|
|
|
205
267
|
from .mcp import McpServer # noqa: F401
|
|
206
268
|
from .models import get_model, list_models # noqa: F401
|
|
207
269
|
from .playground import metric_catalog, model_catalog # noqa: F401
|
|
270
|
+
from .profiling.duration import ( # noqa: F401
|
|
271
|
+
DurationCalibration,
|
|
272
|
+
DurationEstimate,
|
|
273
|
+
FamilyDurationBreakdown,
|
|
274
|
+
calibrate_duration_from_frames,
|
|
275
|
+
calibrate_duration_from_registry,
|
|
276
|
+
predict_run_duration,
|
|
277
|
+
)
|
|
208
278
|
from .reconciliation import ( # noqa: F401
|
|
209
279
|
HierarchySpec,
|
|
210
280
|
build_hierarchy,
|