第3章:风速预测入门
各位同学,欢迎来到风速预测的第一课。
说实话,风电行业里最让人头疼的就是风速的不确定性。你想想看,风一会儿大一会儿小,电网那边又要求稳定供电,怎么办?唯一的出路就是——预测。今天我们就从最基础的时间序列概念讲起,一步步带你用ARIMA模型做风速预测。
3.1 时间序列的基本概念
什么是时间序列?说白了,就是按时间顺序排列的数据点。比如你每10分钟记录一次风速,把这些数据按时间排好,就是一个时间序列。
我个人习惯把时间序列拆成三个部分来看:
- 趋势(Trend):长期上升或下降的走向。比如某个季节风速整体偏高。
- 季节性(Seasonality):固定周期内的波动。比如每天下午风速较大。
- 残差(Residual):去掉趋势和季节后剩下的随机波动。
我在项目中遇到过一件事:有次做风速预测,模型效果一直不好,后来发现是数据里有个明显的日周期模式没处理。嗯,这里要注意——识别季节性是时间序列分析的第一步。
核心要点:时间序列分析的目标,就是从历史数据中提取出规律,然后用这些规律去预测未来。
3.2 ARIMA模型原理
ARIMA,全称是自回归积分滑动平均模型。名字挺长,但别怕,我们拆开看。
ARIMA模型由三个部分组成:
| 参数 | 含义 | 通俗理解 |
|---|---|---|
| AR(p) | 自回归项 | 用过去p个时刻的值预测当前值 |
| I(d) | 差分阶数 | 让非平稳数据变得平稳 |
| MA(q) | 滑动平均项 | 用过去q个时刻的预测误差来修正当前预测 |
为什么会用到差分?因为很多风速数据是非平稳的——均值在变、方差在变。差分就是让数据“老实”下来。我曾经遇到一个案例,原始风速数据波动剧烈,差分一次后,数据就平稳多了,模型效果直接提升30%。
避坑指南:我曾经在项目里直接拿原始数据跑ARIMA,结果预测值全是直线。后来才发现,数据不平稳时,模型根本学不到有效信息。记住:先平稳,再建模。
3.3 Python实现风速预测
好了,理论讲完了,我们直接上代码。下面是一个完整的ARIMA风速预测流程。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller
# 1. 加载数据(假设风速数据每10分钟一条)
data = pd.read_csv('wind_speed.csv', parse_dates=['timestamp'], index_col='timestamp')
wind_speed = data['speed']
# 2. 平稳性检验(ADF检验)
result = adfuller(wind_speed)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
if result[1] > 0.05:
print('数据非平稳,需要进行差分')
wind_speed_diff = wind_speed.diff().dropna()
else:
print('数据平稳,可以直接建模')
# 3. 确定p和q(看ACF和PACF图)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(wind_speed_diff, ax=ax1, lags=20)
plot_pacf(wind_speed_diff, ax=ax2, lags=20)
plt.show()
# 4. 训练ARIMA模型(这里p=2, d=1, q=2是示例)
model = ARIMA(wind_speed, order=(2, 1, 2))
model_fit = model.fit()
print(model_fit.summary())
# 5. 预测未来24小时(144个10分钟)
forecast = model_fit.forecast(steps=144)
print('预测结果(前10个):', forecast[:10].values)
这段代码我建议你亲手跑一遍。我个人习惯是先看ACF和PACF图,初步判断p和q的范围,然后再用AIC/BIC准则去选最优参数。别一上来就瞎猜参数,那样容易翻车。
注意:ARIMA模型对异常值非常敏感。如果数据里有传感器故障导致的异常风速(比如突然跳到100m/s),一定要先做数据清洗。我曾经因为一个异常点没处理,模型预测直接崩了三天。
3.4 模型评估指标
模型建好了,怎么知道它好不好?我们需要一些量化指标。常用的有这几个:
| 指标 | 公式 | 说明 |
|---|---|---|
| MAE | 平均绝对误差 | 预测值与真实值的绝对差值的平均值 |
| RMSE | 均方根误差 | 对大误差惩罚更重,适合风速这种波动大的场景 |
| MAPE | 平均绝对百分比误差 | 用百分比表示误差,直观易懂 |
我个人最常用的是RMSE。为什么?因为风速预测里,一个大的预测偏差可能导致电网调度失误,RMSE对大误差更敏感,能逼着模型把极端情况也预测好。
下面是一个计算评估指标的代码示例:
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np
# 假设y_true是真实风速,y_pred是预测风速
y_true = [5.2, 6.1, 7.3, 8.0, 6.5]
y_pred = [5.0, 6.3, 7.0, 8.2, 6.8]
mae = mean_absolute_error(y_true, y_pred)
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
mape = np.mean(np.abs((np.array(y_true) - np.array(y_pred)) / np.array(y_true))) * 100
print(f'MAE: {mae:.2f} m/s')
print(f'RMSE: {rmse:.2f} m/s')
print(f'MAPE: {mape:.2f}%')
经验之谈:风速预测的RMSE如果能控制在1.5m/s以内,对于大多数风电场来说已经算不错了。如果超过2.5m/s,建议回头检查数据质量或者模型参数。
3.5 本章知识体系
下面这张图帮你梳理了本章的核心逻辑,从数据到模型再到评估,一条线走下来:
这张图把本章的四个核心模块串起来了。你从时间序列概念出发,理解数据特性;然后学习ARIMA原理,知道模型怎么工作;接着用Python实现,把理论变成代码;最后用评估指标检验效果。如果效果不好,就回到前面调整参数或清洗数据——这就是一个完整的闭环。
好了,风速预测入门就讲到这里。记住:模型不是越复杂越好,ARIMA虽然经典,但用好了照样能解决实际问题。下一章我们会讲更高级的预测方法,但今天的内容是基础中的基础,建议你多练几遍。