import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from statsforecast import StatsForecast
from statsforecast.models import AutoETS
from conformalforecast import (
AdaptiveConformalInference,
AggregatedAdaptiveConformalInference,
SplitConformal,
)
from conformalforecast.adapters import StatsForecastAdapter
from conformalforecast.diagnostics import agaci_state
SEASON, ALPHA = 12, 0.1
TRAIN_END = 96
# The gamma=0.2 expert below is deliberately outside the recommended range
# and warns on construction. That is the point of the table, not a surprise.
warnings.filterwarnings("ignore", message="gamma=.* is unusually large")
df = pd.read_csv("nbs/data/air_passengers.csv", parse_dates=["ds"])
panel = df["y"].to_numpy()[None, :]
train_df = df.iloc[:TRAIN_END].reset_index(drop=True)
sf = StatsForecast(models=[AutoETS(season_length=SEASON)], freq="MS", n_jobs=1)
sf.fit(train_df)
forecaster = StatsForecastAdapter(
sf=sf, train_df=train_df, horizon=1, freq="MS", model_name="AutoETS"
)
def stream(fitted, *, online=True):
lower, upper, covered = [], [], []
for t in range(TRAIN_END, panel.shape[1]):
prediction = fitted.predict(panel[:, :t])
lo, hi = prediction.interval[0, 0, 0]
lower.append(lo)
upper.append(hi)
covered.append(lo <= panel[0, t] <= hi)
if online:
fitted.update(prediction.point, panel[:, t : t + 1][:, None, :])
return {"lower": np.array(lower), "upper": np.array(upper), "covered": np.array(covered)}