0-chronos-etth-demo.ipynb 代码说明

这份 notebook 在做什么

这份 notebook 做的事情其实很简单:

  1. 读取本地 ETTh1.csv
  2. 读取其中的 OT
  3. 从最后一段序列里切出历史窗口和真实未来
  4. 调用本地 chronos-t5-tiny
  5. 画出历史、真实值和预测区间

如果你把它和前面 4/2-prog/0-qwen3-vl-demo.ipynb 对照着看,会发现:

也就是说,虽然任务不同,但本质上都是:

先看整体结构

这份 notebook 可以分成 7 步:

  1. 导入依赖
  2. 读取 ETTh1 数据
  3. 选出 OT
  4. 切出 history 和 future
  5. 加载 Chronos 模型
  6. 做预测
  7. 画图并解释结果

Cell 0:标题页

这一格只是告诉你:

它不执行代码,但它很重要,因为它定义了 notebook 的任务边界:
不是训练模型,而是调用现成模型做 zero-shot forecasting。

Cell 1:导入依赖

这里会导入:

每个包的角色分别是:

Cell 2:准备本地数据文件

这一格会先设定:

这里最重要的工程点是:

Cell 3:读取数据并查看前几行

这里会用:

df = pd.read_csv(csv_path)
df.head()

作用是:

这一步很重要,因为 ETTh1 不只有一个变量。
我们后面只是先选其中一列:

Cell 4:选择目标列并切分窗口

这里会做三件事:

  1. 选出 OT
  2. 指定 context_length = 512
  3. 指定 prediction_length = 96

然后把序列切成:

也就是:

这里最该理解的是:

Cell 5:加载模型

关键代码会像这样:

pipeline = ChronosPipeline.from_pretrained(
    "models/chronos-t5-tiny",
    device_map=device,
    torch_dtype=dtype,
)

逐项解释:

这里和 3-1 里加载本地 Qwen 或本地 tiny-gpt2 的逻辑非常像:

Cell 6:运行预测

关键调用会像这样:

forecast = pipeline.predict(
    context,
    prediction_length,
    num_samples=20,
)

逐项解释:

为什么要多条样本?

因为 Chronos 想做的不是:

而是:

这也是为什么后面能算:

Cell 7:画图并解释结果

最后会把:

画在同一张图上。

这张图里最值得学生看懂的是:

如果红线和黑色虚线差得很远,不一定说明模型“完全没用”,也可能说明:

这份 notebook 最想让你理解什么

  1. 时间序列 foundation model 也可以像语言模型一样被直接调用。
  2. Chronos 的关键不是“记住 ETTh1”,而是用预训练学到可迁移的时序模式。
  3. 预测任务常常不只关心点预测,还关心区间和不确定性。
  4. 一段历史窗口、一个预测长度、一个预训练模型,就已经能构成最小 forecasting demo。