🫐Python时间序列scikit-learn回归预测电力需求
Python | scikit-learn | 电力需求 | 回归预测 | NumPy | Matplotlib | Pandas | seaborn | 时间序列 | 外生变量 | 多步预测
时间序列是一系列按时间顺序排列的数据,这些数据以相等或不等的间隔间隔开。 预测过程包括预测时间序列的未来值,或者通过仅基于其过去行为(自回归)对序列进行建模,或者通过使用其他外部变量来进行建模。
在处理时间序列时,很少需要只预测序列中的下一个元素 $\left(t_{+1}\right)$。 相反,最常见的目标是预测整个未来区间 $\left(\left(t_{+1}\right), \ldots,\left(t_{+n}\right)\right)$ 或远时间点 $\left(t_{+n}\right)$。 有几种策略允许生成这种类型的预测,实现了以下内容:
递归多步预测:由于预测 $t_{n}$ 需要值 $t_{n-1}$,而 $t_{n-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)
输出:
$$ \begin{array}{rrrrr} & \text { Demand } & \text { Temperature } & \text { Date } & \text { Holiday } \\\text { Time } & & & & \\\hline \text { 2011-12-31 13:00:00 } & 4382.825174 & 21.40 & 2012-01-01 & \text { True } \\2011-12-3113: 30: 00 & 4263.365526 & 21.05 & 2012-01-01 & \text { True }\end{array} $$
使用时间序列时首先要执行的分析之一是验证序列是否完整。
# 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');
自相关图
递归自回归预测
预测训练
使用外生变量进行预测
直接多步预测
源代码
Last updated