import numpy as np
import pandas as pd
检测需求峰值
在这个示例中,我们将展示如何在ERCOT(德克萨斯州)市场上进行电力负荷预测,以检测每日峰值。
介绍
预测不同市场的高峰是非常有用的。在电力市场中,峰值需求时消费电力会被处以更高的费用。个人或公司在电力需求最高时消费电力,监管机构称之为同时峰值(CP)。
在德克萨斯电力市场(ERCOT),峰值是每月15分钟间隔内ERCOT电网处于最高容量的时刻。峰值是所有消费者对电网的组合需求造成的。同时峰值需求是ERCOT用于确定最终电力消费账单的重要因素。ERCOT记录每个客户的CP需求4个月,从6月到9月,并利用这些数据来调整电价。因此,客户可以通过减少同时峰值需求来节省电费。
在这个示例中,我们将使用历史负载数据训练一个MSTL
(使用LOESS的多季节趋势分解)模型,以预测2022年9月的次日峰值。低采样电力数据中通常存在多重季节性。需求表现出每日和每周的季节性,特定时间段(例如下午6点与凌晨3点)或特定日期(例如周日与周五)具有明显的模式。
首先,我们将加载ERCOT历史需求数据,然后将使用StatsForecast.cross_validation
方法拟合MSTL模型并预测9月份的每日负载。最后,我们展示如何使用预测结果来检测同时峰值。
大纲
- 安装库
- 加载和探索数据
- 拟合MSTL模型并进行预测
- 峰值检测
库
我们假设您已经安装了StatsForecast。请查看此指南以获取如何安装StatsForecast的说明。
使用 pip install statsforecast
安装必要的包。
加载数据
StatsForecast 的输入总是一个具有三列的 长格式 数据框:unique_id
、ds
和 y
:
unique_id
(字符串、整数或类别)代表系列的标识符。ds
(日期戳或整数)列应为一个整数索引时间或理想情况下类似于 YYYY-MM-DD 的日期戳或 YYYY-MM-DD HH:MM:SS 的时间戳。y
(数值)表示我们希望预测的测量值。
= pd.read_csv('https://datasets-nixtla.s3.amazonaws.com/ERCOT-clean.csv', parse_dates=['ds']) Y_df
使用 StatsForecast
类的 plot
方法绘制系列。该方法从数据集中随机打印最多 8 个系列,并且对基本的探索性数据分析(EDA)很有用。
StatsForecast.plot
方法默认使用 Plotly 作为引擎。您可以通过设置 engine="matplotlib"
来更改为 MatPlotLib。
from statsforecast import StatsForecast
StatsForecast.plot(Y_df)
/Users/cchallu/NIXTLA/statsforecast/statsforecast/core.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
from tqdm.autonotebook import tqdm
我们观察到时间序列呈现季节性模式。此外,时间序列包含 6,552
个观察值,因此有必要使用计算效率高的方法来在生产中部署它们。
拟合和预测MSTL模型
MSTL(多重季节-趋势分解使用LOESS)模型使用局部多项式回归(LOESS)将时间序列分解为多个季节性成分。然后,它使用自定义的非季节性模型预测趋势,并使用季节性天真模型预测每一个季节性成分。
请查看我们关于MSTL的详细解释和教程 这里
导入 StatsForecast
类和您需要的模型。
from statsforecast import StatsForecast
from statsforecast.models import MSTL, AutoARIMA
首先,实例化模型并定义参数。电力负荷在每24小时(每小时)和每24 * 7小时(每日)上呈现季节性。因此,我们将使用 [24, 24 * 7]
作为季节性。有关如何设置季节长度的详细说明,请参见此链接。在这个例子中,我们使用 AutoARIMA
模型作为趋势成分,但是可以使用任何 StatsForecast 模型。可用模型的完整列表可以在这里找到。
= [MSTL(
models =[24, 24 * 7], # 时间序列的季节性
season_length=AutoARIMA(nmodels=10) # 用于预测趋势的模型
trend_forecaster
) ]
AutoARIMA 的参数 nmodels
控制逐步搜索中考虑的模型数量。默认值为 94,可以减少该值以缩短训练时间!
我们通过实例化一个 StatsForecast
对象来拟合模型,所需的参数如下:
models
: 模型列表。选择您想要的模型,从 models 中导入它们。freq
: 一个指示数据频率的字符串。(请参见 pandas 可用的频率。)
# 实例化 StatsForecast 类为 sf
= StatsForecast(
sf =models,
models='H',
freq )
StatsForecast 还支持此可选参数。
n_jobs
: n_jobs: int,用于并行处理的工作数量,使用 -1 表示所有核心。 (默认值:1)fallback_model
: 如果模型失败时使用的模型。 (默认值:无)
cross_validation
方法允许用户模拟多个历史预测,通过用 fit
和 predict
方法替换 for 循环,大大简化了管道。该方法重新训练模型并预测每个窗口。请参见 本教程 以获取窗口如何定义的动画。
使用 cross_validation
方法生成9月份的所有每日预测。要生成每日预测,将预测视野 h
设置为24。在这个例子中,我们模拟在9月份部署管道,因此将窗口数量设置为30(每一天一个)。最后,将窗口间隔设置为24,以便每天只生成一个预测。
%%capture
= sf.cross_validation(
crossvalidation_df =Y_df,
df=24,
h=24,
step_size=30
n_windows )
crossvalidation_df.head()
ds | cutoff | y | MSTL | |
---|---|---|---|---|
unique_id | ||||
ERCOT | 2022-09-01 00:00:00 | 2022-08-31 23:00:00 | 45482.468750 | 47126.179688 |
ERCOT | 2022-09-01 01:00:00 | 2022-08-31 23:00:00 | 43602.660156 | 45088.542969 |
ERCOT | 2022-09-01 02:00:00 | 2022-08-31 23:00:00 | 42284.820312 | 43897.175781 |
ERCOT | 2022-09-01 03:00:00 | 2022-08-31 23:00:00 | 41663.160156 | 43187.812500 |
ERCOT | 2022-09-01 04:00:00 | 2022-08-31 23:00:00 | 41710.621094 | 43369.859375 |
使用 cross_validation
时,请确保在所需的时间戳上生成预测。检查 cutoff
列,该列指定了预测窗口之前的最后一个时间戳。
峰值检测
最后,我们使用crossvaldation_df
中的预测来检测每日的需求峰值。对于每一天,我们将检测到的峰值设定为最高的预测值。在这种情况下,我们希望预测一个峰值(npeaks
);根据您的设置和目标,这个参数可能会有所变化。例如,峰值的数量可以对应于电池可以放电以减少需求的小时数。
= 1 # 峰值数量 npeaks
对于ERCOT 4CP检测任务,我们关注的是正确预测每月最高负荷。接下来,我们筛选出9月份需求最高的那一天,并预测峰值。
= crossvalidation_df.reset_index()[['ds','y','MSTL']]
crossvalidation_df = crossvalidation_df.iloc[crossvalidation_df['y'].argmax()].ds.day # 负荷最大日
max_day = crossvalidation_df.query('ds.dt.day == @max_day')
cv_df_day = cv_df_day['y'].argmax()
max_hour = cv_df_day['MSTL'].argsort().iloc[-npeaks:].values # 预测峰值 peaks
在以下图中,我们可以看到MSTL模型能够正确地检测到2022年9月的重合峰值。
import matplotlib.pyplot as plt
=(10, 5))
plt.figure(figsize'ds'], color='black', label='True Peak')
plt.axvline(cv_df_day.iloc[max_hour]['ds'], cv_df_day.iloc[peaks]['MSTL'], color='green', label=f'Predicted Top-{npeaks}')
plt.scatter(cv_df_day.iloc[peaks]['ds'], cv_df_day['y'], label='y', color='blue')
plt.plot(cv_df_day['ds'], cv_df_day['MSTL'], label='Forecast', color='red')
plt.plot(cv_df_day['Time')
plt.xlabel('Load (MW)')
plt.ylabel(
plt.grid() plt.legend()
在这个例子中,我们只包含了九月份。然而,MSTL可以正确预测2022年4个月的峰值。您可以通过增加cross_validation
的nwindows
参数或过滤Y_df
数据集来进行尝试。对于所有月份的完整运行仅需10分钟。
下一步
StatsForecast 和 MSTL 特别适合作为峰值检测的基准模型。然而,探索进一步的新型预测算法也许是有益的。我们在 Nixtla 的 NeuralForecast 库中使用 N-HiTS 这个深度学习模型时,取得了特别好的效果。
在 本教程 中了解如何使用我们的深度学习 N-HiTS 模型和 NeuralForecast 库来预测 ERCOT 的需求峰值。
参考文献
Give us a ⭐ on Github