# Common Workflows End-to-end sequences: the standard single-series forecast, forecasting many series from a wide-format CSV, and backtesting with held-out data including interval coverage. ## 📋 Common Workflows ### Workflow 1: Single Series Forecast ```mermaid flowchart TD accTitle: Single Series Forecast Workflow accDescr: Step-by-step workflow for forecasting a single time series with system checking. check["1. Run check_system.py"] --> load["2. Load model
from_pretrained()"] load --> compile["3. Compile with ForecastConfig"] compile --> prep["4. Prepare data
pd.read_csv → np.array"] prep --> forecast["5. model.forecast()
horizon=N"] forecast --> extract["6. Extract point + PI"] extract --> plot["7. Plot or export results"] classDef step fill:#f3f4f6,stroke:#6b7280,stroke-width:2px,color:#1f2937 class check,load,compile,prep,forecast,extract,plot step ``` ```python import torch, numpy as np, pandas as pd, timesfm # 1. System check (run once) # python scripts/check_system.py # 2-3. Load and compile torch.set_float32_matmul_precision("high") model = timesfm.TimesFM_2p5_200M_torch.from_pretrained( "google/timesfm-2.5-200m-pytorch" ) model.compile(timesfm.ForecastConfig( max_context=512, max_horizon=52, normalize_inputs=True, use_continuous_quantile_head=True, fix_quantile_crossing=True, )) # 4. Prepare data df = pd.read_csv("weekly_demand.csv", parse_dates=["week"]) values = df["demand"].values.astype(np.float32) # 5. Forecast point, quantiles = model.forecast(horizon=52, inputs=[values]) # 6. Extract prediction intervals forecast_df = pd.DataFrame({ "forecast": point[0], "lower_80": quantiles[0, :, 1], "upper_80": quantiles[0, :, 9], }) # 7. Plot import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(12, 5)) ax.plot(values[-104:], label="Historical") x_fc = range(len(values[-104:]), len(values[-104:]) + 52) ax.plot(x_fc, forecast_df["forecast"], label="Forecast", color="tab:orange") ax.fill_between(x_fc, forecast_df["lower_80"], forecast_df["upper_80"], alpha=0.2, color="tab:orange", label="80% PI") ax.legend() ax.set_title("52-Week Demand Forecast") plt.tight_layout() plt.savefig("forecast.png", dpi=150) print("Saved forecast.png") ``` ### Workflow 2: Batch Forecasting (Many Series) ```python import pandas as pd, numpy as np # Load wide-format CSV (one column per series) df = pd.read_csv("all_stores.csv", parse_dates=["date"], index_col="date") inputs = [df[col].dropna().values.astype(np.float32) for col in df.columns] # Forecast all series at once (batched internally) point, quantiles = model.forecast(horizon=30, inputs=inputs) # Collect results results = {} for i, col in enumerate(df.columns): results[col] = { "forecast": point[i].tolist(), "lower_80": quantiles[i, :, 1].tolist(), "upper_80": quantiles[i, :, 9].tolist(), } # Export import json with open("batch_forecasts.json", "w") as f: json.dump(results, f, indent=2) print(f"Forecasted {len(results)} series → batch_forecasts.json") ``` ### Workflow 3: Evaluate Forecast Accuracy ```python import numpy as np # Hold out the last H points for evaluation H = 24 train = values[:-H] actual = values[-H:] point, quantiles = model.forecast(horizon=H, inputs=[train]) pred = point[0] # Metrics mae = np.mean(np.abs(actual - pred)) rmse = np.sqrt(np.mean((actual - pred) ** 2)) mape = np.mean(np.abs((actual - pred) / actual)) * 100 # Prediction interval coverage lower = quantiles[0, :, 1] upper = quantiles[0, :, 9] coverage = np.mean((actual >= lower) & (actual <= upper)) * 100 print(f"MAE: {mae:.2f}") print(f"RMSE: {rmse:.2f}") print(f"MAPE: {mape:.1f}%") print(f"80% PI Coverage: {coverage:.1f}% (target: 80%)") ```