第3章:数据采集与预处理
各位同学,今天咱们聊聊风电预测里最基础、也最容易被忽视的一环——数据采集与预处理。
说实话,我见过太多人一上来就调模型、跑算法,结果数据质量一塌糊涂,最后模型效果惨不忍睹。嗯,这就像盖房子不打地基,直接砌墙,早晚要塌。
我个人习惯,拿到一个风电预测项目,至少花40%的时间在数据准备上。别嫌多,这钱花得值。
3.1 SCADA系统介绍
SCADA,全称是Supervisory Control And Data Acquisition,翻译过来就是「监控与数据采集系统」。说白了,它就是风电场的「黑匣子」,记录着风机的一举一动。
我在项目中遇到过,有些同事把SCADA当成一个简单的数据存储工具,其实它远不止如此。SCADA系统通常包含三个层级:
- 现场层:传感器、PLC(可编程逻辑控制器),负责采集原始信号
- 通信层:光纤、4G/5G网络,把数据传回中控室
- 应用层:数据服务器、人机界面,展示和存储数据
你想想看,一台2MW的风机,上面至少有上百个传感器。风速、风向、转速、温度、振动、功率……每秒钟都在产生数据。SCADA系统就是把这些零散的数据整合起来,形成我们可以分析的「数字资产」。
核心要点:SCADA不仅是数据仓库,更是风机的「体检报告」。读懂它,你就能预判风机什么时候会「生病」。
下面这张图,是我自己整理的SCADA数据采集与预处理的知识体系,你可以对照着看:
3.2 数据采集频率与字段
说到采集频率,这里有个常见的坑。很多风场的SCADA系统默认配置是10分钟一条记录。对于功率预测来说,这个频率基本够用。但如果你要做故障诊断或者短期波动分析,10分钟的数据就太「粗糙」了。
我曾经在一个项目中,客户要求做15分钟超短期预测。我一看数据,全是10分钟均值,根本捕捉不到风速的快速变化。后来我建议他们加装高频采集模块,把风速和功率的采样频率提高到1秒一次,模型效果直接提升了15%。
下面这张表,是我整理的风电预测常用数据字段,你可以直接拿来用:
| 字段名称 | 单位 | 采集频率 | 说明 |
|---|---|---|---|
| 风速 | m/s | 1s / 10min | 机舱风速仪测量值 |
| 风向 | ° | 1s / 10min | 0-360度,注意北向校准 |
| 有功功率 | kW | 1s / 10min | 并网点功率输出 |
| 桨距角 | ° | 1s | 叶片角度,0-90度 |
| 发电机转速 | rpm | 1s | 高速轴转速 |
| 齿轮箱油温 | ℃ | 10min | 反映机械状态 |
| 环境温度 | ℃ | 10min | 气象站数据 |
| 空气密度 | kg/m³ | 10min | 由温度和气压计算 |
小提示:如果你做的是功率曲线分析,风速和功率的采集时间戳必须严格对齐。我见过不少案例,因为时间戳偏差导致功率曲线「胖」了一圈,根本没法用。
3.3 数据清洗
数据清洗,说白了就是「去伪存真」。SCADA系统采集的数据,质量参差不齐。我见过最夸张的一次,一个风场的数据缺失率高达30%,原因是通信光纤被老鼠咬断了。
3.3.1 缺失值处理
缺失值怎么处理?这得看情况:
- 连续缺失不超过3个点:用线性插值,简单有效
- 连续缺失超过10个点:建议直接删除这段数据,别硬补
- 关键字段缺失:比如风速缺失,可以用相邻风机的数据做相关性插补
我曾经在西北一个风场,遇到风速传感器结冰导致连续12小时数据缺失。这种情况插值就是自欺欺人,我直接把这12小时的数据标记为「不可用」,模型训练时跳过。
3.3.2 异常值检测
异常值检测,我常用的方法有三种:
- 3σ原则:超出均值±3倍标准差的数据,视为异常
- 箱线图法:超出1.5倍IQR(四分位距)的数据,视为异常
- 物理约束法:风速不可能为负,功率不可能超过额定值,这些是硬边界
举个例子,风速出现-5m/s,这明显是传感器故障。功率出现2000kW而额定只有1500kW,这要么是数据标定错误,要么是风机在超发(这种情况很少见)。
注意:别把「正常波动」当成异常。比如风速的瞬时尖峰,可能是阵风造成的,不是数据错误。我曾经有个同事,把台风天的数据全当异常删了,结果模型在极端天气下完全失效。
3.3.3 重复值处理
重复值相对简单。SCADA系统偶尔会因为通信重传导致重复记录。我的做法是:
- 按时间戳排序,检查是否有完全相同的记录
- 如果有,保留第一条,删除后续重复
- 注意:时间戳相同但数值不同,可能是数据冲突,需要人工判断
3.4 数据标准化与归一化
这一步,很多新手容易忽略。你想想看,风速是0-30m/s,功率是0-2000kW,温度是-20到50℃。这些量纲完全不同,直接扔进模型,数值大的特征会「吃掉」数值小的特征。
常用的方法有两种:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Z-score标准化 | x' = (x - μ) / σ | 数据近似正态分布,有异常值 |
| Min-Max归一化 | x' = (x - min) / (max - min) | 数据有明确边界,如功率、角度 |
我个人习惯,风速和功率用Min-Max归一化,因为它们的物理边界很清晰。温度和振动信号用Z-score标准化,因为这些数据经常有离群点。
下面是一个简单的Python代码示例,你可以直接拿去用:
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 读取数据
df = pd.read_csv('wind_turbine_data.csv')
# Z-score标准化(适用于温度、振动)
scaler_std = StandardScaler()
df['temp_scaled'] = scaler_std.fit_transform(df[['gear_oil_temp']])
# Min-Max归一化(适用于风速、功率)
scaler_mm = MinMaxScaler(feature_range=(0, 1))
df['wind_scaled'] = scaler_mm.fit_transform(df[['wind_speed']])
df['power_scaled'] = scaler_mm.fit_transform(df[['active_power']])
print('预处理完成,数据范围:[0, 1]')
避坑指南:标准化和归一化的参数(均值、标准差、最小值、最大值)一定要用训练集计算,然后应用到测试集。我曾经见过有人对整个数据集做标准化,结果模型在线上部署时完全跑偏,因为新数据的分布和整体分布不一样。
好了,这一章的内容就到这里。数据预处理是风电预测的「基本功」,看似简单,但细节决定成败。下一章我们会聊特征工程,到时候你会感谢今天认真清洗数据的自己。
公众号:蓝海资料掘金营,微信deep3321