Python时间序列scikit-learn回归预测电力需求

时间序列是一系列按时间顺序排列的数据,这些数据以相等或不等的间隔间隔开。 预测过程包括预测时间序列的未来值,或者通过仅基于其过去行为(自回归)对序列进行建模,或者通过使用其他外部变量来进行建模。

在处理时间序列时,很少需要只预测序列中的下一个元素 ( 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} tn1,而 t n − 1 t_{n-1} tn1 是未知的,因此需要进行递归预测,其中每个新预测都基于前一个预测。
  • 直接多步预测:此方法涉及为每个步骤训练不同的模型。

本文档展示了如何使用预测方法来预测每小时电力需求的示例。提供从 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');

自相关图

递归自回归预测

预测训练

使用外生变量进行预测

直接多步预测

源代码

详情参阅 - 亚图跨际

你可能感兴趣的:(Python,机器学习,python,scikit-learn,回归,预测电力需求)