Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

附录 B:Python 入门

北京大学光华管理学院

本附录提供课程所需的 Python 最小基础。你不需要先成为软件工程师,但需要能够读懂 notebook(交互式笔记本)、修改参数、运行函数、安装包,并把模型输出整理成表格和图形。

学习目标

完成本附录后,你应该能够:

本地 Jupyter 环境

如果你还没有 Python 环境,我们建议先安装 Anaconda。Windows 用户从 Anaconda 官网选择 64 位图形安装包;macOS 用户注意区分 Intel 芯片和 Apple Silicon 芯片。安装过程可以使用图形安装器,一路按提示完成即可。

安装后打开 Anaconda Navigator 或开始菜单中的 Anaconda 文件夹,启动 Jupyter Notebook。Jupyter 会在浏览器中打开一个文件列表,这个列表对应你电脑上的某个本地目录。新建 notebook 时选择 Python kernel(Python 内核),然后先运行一个最简单的单元:

3 + 4

如果输出 7,说明 notebook 基本可用。给 notebook 重命名并保存后,会得到一个 .ipynb 文件。Windows 上启动 Jupyter 时通常还会打开一个黑色终端窗口;不要关闭它,否则浏览器里的 notebook 也会断开。

Python 作为计算器

Python 可以直接做算术:

3**2
17 - 4
4 / 2
(5 + 4) * 3

注意 ** 表示乘方,^ 不是乘方。在 Python 中,^ 是异或运算。取余使用 %

x = 2004
print(x % 100 == 0)
print(x % 4 == 0)

这类表达式常用于日期、周期和分组判断。

变量

变量(variable)用等号 = 赋值:

a = 3
b = 5
c = a + b
c

变量是给值起名字。预测代码中常见变量包括 dftrain_dftest_dfhmodel_namefreq。阅读 notebook 时,先弄清每个变量保存了什么对象。

字符串

字符串(string)可以用单引号或双引号:

last_name = "Li"
first_name = "Feng"

反斜杠会触发转义。普通字符串中 \n 表示换行,原始字符串前加 r

print("Hello\nWorld")
print(r"Hello\nWorld")

字符串可以拼接和重复:

"time" + "series"
"ha" * 3

在 API 预测中,prompt 本质上就是字符串。构造 prompt 时要特别注意换行、引号和变量插入。

后续章节中的 JSON 输出和模型提示词都可以从这里理解:prompt 是字符串,模型返回是待解析文本,预测结果最终要进入 DataFrame 才能画图、合并和评估。

索引与切片

Python 索引(indexing)从 0 开始:

name = "Feng Li"
name[0]
name[-1]
name[0:4]

切片(slicing)[a:b] 取从 ab 之前的位置,不包含 b。时间序列中也常用类似思想,例如取最后 12 期:

tail = values[-12:]

列表

列表(list)用于存放一组值:

values = [1, 5, 7, 9, 12]
len(values)
values[0]
values[-2:]

列表可以修改:

values[2] = 1000
values.append(9999)

预测任务中,列表常用于保存多个模型名、多个指标、多个预测步长或多条记录。

内置函数

Python 有很多内置函数(built-in functions),例如 lensumminmaxprintrangetypehelp。遇到不熟悉的函数,可以先查看帮助:

help(len)

调试 notebook 时,type(obj) 很有用。它能告诉你对象是字符串、列表、字典、DataFrame 还是其他类型。

导入模块

很多功能需要导入模块(module):

import math
math.exp(0)

也可以只导入某个函数:

from math import exp
exp(0)

本课程常用模块包括:

定义函数

函数把重复逻辑封装起来。一个简单例子:

def fib(n):
    """Print a Fibonacci series up to n."""
    a, b = 0, 1
    while a < n:
        print(a, end=" ")
        a, b = b, a + b

预测 notebook 中也应使用函数减少重复,例如:

def split_train_test(df, h):
    train = df.iloc[:-h].copy()
    test = df.iloc[-h:].copy()
    return train, test

函数的好处是让实验更可复现。你只需要改变参数,而不是复制粘贴整段代码。

后续如果计算时间序列特征,代码通常也是这个思路:输入一个包含 unique_iddsy 的 DataFrame,函数返回一张特征表。每一行对应一条序列,每一列对应一个特征,例如 trendlinearitycurvatureacf。理解函数输入和输出,比背某个包的名字更重要。

安装第三方包

在 notebook 中可以安装第三方包(third-party packages):

!python -m pip install pandas

课程中会用到 nixtla 等预测相关包。你可以直接在 notebook 或终端运行:

python -m pip install nixtla

安装成功后,再在 notebook 中测试:

import nixtla

在终端中也可以安装:

python -m pip install pandas
python -m pip install pandas -U
python -m pip uninstall pandas

推荐使用 python -m pip,因为它更明确地使用当前 Python 环境。不要在不了解环境的情况下随意加 --break-system-packages,除非你清楚它会修改系统 Python 管理规则。

Windows、Anaconda、Jupyter 和服务器环境可能各自使用不同 Python。安装包时先确认这个 python 就是当前 notebook 的 kernel;很多初学错误不是代码逻辑错,而是包安装到了另一个环境。

这个原则在本地 AI 设备上同样成立。无论是在普通笔记本、集群、云服务器还是本地 AI 盒子上运行 Chronos、PyTorch 或其他深度学习包,先确认当前 Python,再安装依赖。Chronos 这类本地时间序列基座模型尤其依赖正确的模型文件、运行库和解释器环境 Ansari et al., 2024。硬件变强不能自动解决环境问题;如果 notebook 使用的 kernel 和终端里安装包的 Python 不一致,仍然会出现 ModuleNotFoundError

涉及 GPU 或本地模型时,可以在 notebook 中先做最小检查:

import sys
print(sys.executable)

import torch
print(torch.cuda.is_available())

如果模型只能在 CPU 上运行,也不代表不能做练习,只是推理速度可能更慢。本书中的小型时间序列预测模型通常可以先在 CPU 上跑通,再根据需要迁移到 GPU 或共享内存设备。

课程中的最小 Python 工作流

一个常见预测实验会按下面流程写:

import pandas as pd

df = pd.read_csv("data.csv")
df["ds"] = pd.to_datetime(df["ds"])
df = df.sort_values(["unique_id", "ds"])

h = 12
train = df.iloc[:-h].copy()
test = df.iloc[-h:].copy()

之后再调用模型、生成预测、合并真实值并计算误差。只要理解变量、DataFrame、函数和模块,就能读懂大部分课程代码;更系统的时间序列实践可以继续参考 Forecasting: Principles and Practice 的 Python/R 思路与评价框架 Hyndman & Athanasopoulos, 2021

因此,本附录不是孤立语法课。变量、列表、函数和模块的最终目的,是让你能读懂 notebook 中的数据流:历史数据如何变成训练集,预测步长如何传给模型,模型输出如何进入评估表。

常见错误

NameError 通常表示变量还没有定义,可能是前面的 notebook 单元没有运行。

ModuleNotFoundError 表示当前 Python 环境没有安装某个包,或者安装到了另一个环境。

KeyError 常见于 DataFrame 列名写错,例如使用了 date 但实际列名是 ds

TypeError 常见于把字符串当数字、把列表当函数、或者参数类型不匹配。

遇到错误时不要只看最后一行。错误信息会告诉你出错的文件、行号和对象名称。

小结

学习本课程需要的 Python 并不复杂。重点是能读懂 notebook 中的数据流:读入数据、清洗列、切分训练测试、调用模型、保存预测、计算误差。先把这些基本动作练熟,再学习更复杂的模型。

练习

  1. 用 Python 计算 12 个月后日期对应的预测步长变量 h

  2. 创建一个包含 5 个销量数字的列表,取最后 2 个值。

  3. 写一个函数,输入真实值和预测值,返回绝对误差。

  4. 导入 math,计算 exp(1)\exp(1)

  5. python -m pip 检查当前环境是否安装了 pandas

参考文献

References
  1. Garza, A., Challu, C., & Mergenthaler-Canseco, M. (2024). TimeGPT-1. 10.48550/arXiv.2310.03589
  2. Ansari, A. F., Stella, L., Turkmen, C., Zhang, X., Mercado, P., Shen, H., Shchur, O., Rangapuram, S. S., Arango, S. P., Kapoor, S., Zschiegner, J., Maddix, D. C., Wang, H., Mahoney, M. W., Torkkola, K., Wilson, A. G., Bohlke-Schneider, M., & Wang, Y. (2024). Chronos: Learning the Language of Time Series. 10.48550/arXiv.2403.07815
  3. Hyndman, R. J., & Athanasopoulos, G. (2021). 预测:方法与实践. OTexts. https://otexts.com/fpp3cn/