4、风电场数据采集与预处理:SCADA系统架构、数据采集频率与类型、数据清洗(异常值、缺失值处理)、数据归一化与标准化
各位同行,咱们今天聊聊风电场数据采集与预处理。说实话,这一章是整个风功率预测的基石。你想想看,模型再牛,算法再先进,喂进去的数据是垃圾,出来的结果只能是垃圾。我在多个风电场项目里都验证过这个道理——数据质量决定了预测精度的天花板。
4.1 SCADA系统架构:风电场的数据中枢
SCADA系统,全称是数据采集与监视控制系统。说白了,它就是风电场的“神经中枢”。我习惯把它分成三层来看:
- 现场层:风机上的传感器、PLC、智能电表等。负责采集原始数据。
- 通信层:光纤、环网、4G/5G。负责把数据传回来。
- 监控层:服务器、工作站、数据库。负责存储、展示和分析。
嗯,这里要注意。很多风电场在建设初期,通信层容易出问题。我曾经遇到过一个项目,光纤环网断了一根,结果整个场区的数据都丢了半天。所以,我建议大家在设计SCADA架构时,一定要考虑冗余。
核心要点:SCADA系统不仅要“采得到”,还要“传得稳”、“存得下”。
下面这张图,是我自己总结的SCADA数据流逻辑,你可以参考一下:
4.2 数据采集频率与类型:别让数据“饿着”
数据采集频率,直接决定了你能看到多细的“颗粒度”。我个人习惯把数据分成两类:
| 数据类型 | 典型频率 | 示例字段 | 用途 |
|---|---|---|---|
| 秒级数据 | 1秒 ~ 10秒 | 瞬时风速、瞬时功率、发电机转速 | 实时监控、故障诊断 |
| 分钟级数据 | 1分钟 ~ 10分钟 | 平均风速、平均功率、桨距角 | 功率预测、性能评估 |
| 小时级数据 | 1小时 | 发电量、停机时长、故障次数 | 运营分析、月度报告 |
你想想看,如果做超短期预测(未来4小时),用分钟级数据就够了。但如果是做短期预测(未来1-3天),小时级数据反而更稳定。我在一个项目中,发现有人用秒级数据做日预测,结果模型过拟合得一塌糊涂。说白了,频率不是越高越好,要匹配你的预测目标。
我的经验:做风功率预测,建议至少保留1分钟和10分钟两套数据。1分钟数据用于模型训练,10分钟数据用于模型验证。这样能有效避免数据噪声的干扰。
4.3 数据清洗:把“脏数据”揪出来
数据清洗,是预处理里最耗时、最磨人的环节。我经常跟团队说,80%的时间花在数据清洗上,20%的时间花在建模上。一点都不夸张。
4.3.1 异常值处理
异常值,就是那些明显不合理的数据。比如风速显示-5m/s,或者功率超过额定功率的2倍。为什么会这样?传感器故障、通信干扰、PLC死机,都可能导致。
我常用的方法有三种:
- 阈值法:设定物理上下限。比如风速0~40m/s,功率0~1.5倍额定功率。超出就标记为异常。
- 3σ原则:计算均值和标准差,超出均值±3σ的视为异常。这个方法适合正态分布的数据。
- 箱线图法:用四分位数判断。超出Q1-1.5IQR或Q3+1.5IQR的视为异常。这个方法更稳健,不受极端值影响。
避坑指南:我曾经遇到过一个项目,用3σ原则清洗风速数据,结果把正常的大风数据也删掉了。后来发现,风速本身是偏态分布,不适合用正态假设。所以,一定要先看数据分布,再选方法。
4.3.2 缺失值处理
缺失值,在风电场数据里太常见了。通信中断、传感器掉线、存储故障,都会导致数据缺失。我一般按缺失比例来处理:
- 缺失率 < 5%:用插值法填充。线性插值、样条插值都行。我习惯用前向填充+后向填充的平均值。
- 缺失率 5% ~ 20%:用同类均值填充。比如同一台风机、相同风速区间下的历史均值。
- 缺失率 > 20%:直接删除该时段数据。别心疼,强行填充只会引入噪声。
嗯,这里有个小技巧。如果缺失的是连续时段(比如连续2小时没数据),我建议直接删除。因为插值出来的数据,在时序上会显得很“假”,模型学不到真实规律。
4.4 数据归一化与标准化:让模型“看懂”数据
归一化和标准化,说白了就是把不同量纲的数据拉到同一个尺度上。风速是0~30m/s,功率是0~2000kW,温度是-20~40℃。如果不处理,模型会天然地“偏爱”数值大的特征。
我常用的两种方法:
| 方法 | 公式 | 适用场景 | 注意事项 |
|---|---|---|---|
| Min-Max归一化 | X' = (X - Xmin) / (Xmax - Xmin) | 数据有明确边界,如风速、功率 | 对异常值敏感,需先清洗 |
| Z-score标准化 | X' = (X - μ) / σ | 数据近似正态分布,如温度、湿度 | 不改变数据分布形态 |
我个人习惯,对于风功率预测,风速和功率用Min-Max归一化,温度和气压用Z-score标准化。为什么?因为风速和功率的物理边界很清晰,而温度和气压的分布更接近正态。
重要提醒:归一化和标准化的参数(最小值、最大值、均值、标准差),一定要用训练集计算,然后应用到验证集和测试集。千万别用全量数据计算,否则会造成数据泄露,模型评估结果会虚高。
最后,给你一个简单的代码示例,展示数据预处理的完整流程:
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# 1. 加载数据
df = pd.read_csv('wind_farm_data.csv')
# 2. 异常值处理:风速阈值
df = df[(df['wind_speed'] >= 0) & (df['wind_speed'] <= 40)]
# 3. 缺失值处理:前向填充
df['power'].fillna(method='ffill', inplace=True)
# 4. 归一化:风速和功率
scaler_minmax = MinMaxScaler()
df[['wind_speed', 'power']] = scaler_minmax.fit_transform(df[['wind_speed', 'power']])
# 5. 标准化:温度和气压
scaler_zscore = StandardScaler()
df[['temperature', 'pressure']] = scaler_zscore.fit_transform(df[['temperature', 'pressure']])
print('数据预处理完成!')
好了,这一章的内容就到这里。数据预处理看似基础,但做扎实了,后面的模型训练会事半功倍。记住,好的数据是成功预测的一半。