时间序列是一系列按时间顺序排列的数据,这些数据以相等或不等的间隔间隔开。 预测过程包括预测时间序列的未来值,或者通过仅基于其过去行为(自回归)对序列进行建模,或者通过使用其他外部变量来进行建模。
在处理时间序列时,很少需要只预测序列中的下一个元素 ( t + 1 ) \left(t_{+1}\right) (t+1)。 相反,最常见的目标是预测整个未来区间 ( ( t + 1 ) , … , ( t + n ) ) \left(\left(t_{+1}\right), \ldots,\left(t_{+n}\right)\right) ((t+1),…,(t+n)) 或远时间点 ( t + n ) \left(t_{+n}\right) (t+n)。 有几种策略允许生成这种类型的预测,实现了以下内容:
- 递归多步预测:由于预测 t n t_{n} tn 需要值 t n − 1 t_{n-1} tn−1,而 t n − 1 t_{n-1} tn−1 是未知的,因此需要进行递归预测,其中每个新预测都基于前一个预测。
- 直接多步预测:此方法涉及为每个步骤训练不同的模型。
本文档展示了如何使用预测方法来预测每小时电力需求的示例。提供从 2011 年 12 月 31 日到 2014 年 12 月 31 日的电力需求 (MW) 时间序列。它旨在生成一个能够以小时为单位预测第二天能源需求的预测模型。
数据集
本文档中使用的数据来自包。该数据集包含 5 列和 52,608 条完整记录。每一列的信息是:
- 时间:记录的日期和时间。
- 日期:记录的日期。
- 需求:电力需求(MW)。
- 气温:当地的气温。
- 假期:指示当天是否为公共假期。
# Data preparation
# ==============================================================================
data = data.copy()
data['Time'] = pd.to_datetime(data['Time'], format='%Y-%m-%dT%H:%M:%SZ')
data = data.set_index('Time')
data = data.asfreq('30min')
data = data.sort_index()
data.head(2)
使用时间序列时首先要执行的分析之一是验证序列是否完整。
# Verify that a temporary index is complete
# ==============================================================================
(data.index == pd.date_range(start=data.index.min(),
end=data.index.max(),
freq=data.index.freq)).all()
图形趋势
当需要生成预测模型时,绘制时间序列值可能很有用。这允许识别趋势和季节性等模式。
# Time series plot
# ==============================================================================
fig, ax = plt.subplots(figsize=(12, 4))
data_train.Demand.plot(ax=ax, label='train', linewidth=1)
data_val.Demand.plot(ax=ax, label='validation', linewidth=1)
data_test.Demand.plot(ax=ax, label='test', linewidth=1)
ax.set_title('Electricity demand')
ax.legend();
时间序列的部分
年度、每周和每日季节性
节假日和非节假日
# Violinplot
# ==============================================================================
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(7, 3.5))
sns.violinplot(
x = 'Demand',
y = 'Holiday',
data = data.assign(Holiday = data.Holiday.astype(str)),
palette = 'tab10',
ax = ax
)
ax.set_title('between holidays and non-holidays')
ax.set_xlabel('Demand')
ax.set_ylabel('Holiday');
自相关图
递归自回归预测
预测训练
使用外生变量进行预测
直接多步预测
源代码
详情参阅 - 亚图跨际