第4章:风电数据采集与预处理
各位同行,今天咱们聊聊风电运维里最基础、也最容易被忽视的一环——数据采集与预处理。
说实话,我刚开始干这行的时候,觉得数据采集不就是接几个传感器、跑个脚本的事吗?后来在海上风场蹲了三个月,才明白这活儿有多糙。你想想看,一台风机上几十个传感器,SCADA系统每秒钟吐几百条数据,振动监测仪高频采样,气象站还在旁边凑热闹……这些数据要是没处理好,后面的大模型训练就是空中楼阁。
我个人习惯,拿到数据第一件事不是建模,而是先搞清楚数据是怎么来的、有什么坑。今天咱们就掰开揉碎了讲清楚。
4.1 数据采集:三大数据源
风电运维的数据源,说白了就三大类:SCADA数据、振动数据、气象数据。这三兄弟各有各的脾气。
4.1.1 SCADA数据
SCADA系统是风机的"黑匣子"。它记录的是运行状态和电气参数,比如有功功率、桨距角、发电机转速、齿轮箱油温、机舱振动等等。
关键参数表
| 参数类别 | 典型参数 | 采样频率 | 数据量级 |
|---|---|---|---|
| 电气参数 | 有功功率、无功功率、三相电流、三相电压 | 1~10秒 | 中等 |
| 状态参数 | 桨距角、偏航角、发电机转速、叶轮转速 | 1~10秒 | 中等 |
| 温度参数 | 齿轮箱油温、发电机绕组温度、主轴轴承温度 | 1~10秒 | 中等 |
| 振动参数 | 机舱X/Y/Z轴振动、塔筒振动 | 0.1~1秒 | 较大 |
我在项目中遇到过,有些老旧风场的SCADA系统采样频率只有10秒一次。这种数据做故障预测,说实话,精度很难上去。所以后来我建议业主升级了采集卡,把采样频率提到1秒一次,效果立竿见影。
4.1.2 振动数据
振动数据是故障诊断的"听诊器"。它主要来自齿轮箱、发电机、主轴等关键部件的加速度传感器。
振动数据有两个特点:
- 高频采样:通常采样率在10kHz~50kHz,甚至更高。一台风机一天就能产生几十GB的原始数据。
- 非平稳性:风速变化、变桨动作都会让振动信号变得复杂。
嗯,这里要注意。振动数据虽然信息量大,但直接扔给大模型是不行的。我见过有人把原始振动波形直接塞进LSTM,结果训练了三天三夜,模型根本收敛不了。为什么?因为数据量太大、噪声太多,模型根本抓不住特征。
4.1.3 气象数据
气象数据是风机的"环境感知"。主要包括风速、风向、温度、湿度、气压、湍流强度等。
气象数据有个特点:空间相关性。比如,一台风机测到的风速,和隔壁风机测到的风速是有关系的。我建议在做数据融合时,把相邻风机的气象数据也考虑进来,这样预测会更准。
避坑指南:我曾经在某个项目中,直接用机舱风速计的数据做模型输入,结果发现模型预测偏差很大。后来排查才发现,机舱风速计受叶轮尾流影响,测到的风速比实际低了20%~30%。从那以后,我坚持用测风塔数据或者经过修正的机舱风速数据。
4.2 数据清洗:把垃圾倒掉
数据清洗,说白了就是"倒垃圾"。原始数据里什么妖魔鬼怪都有,不洗干净,模型学到的全是错误模式。
4.2.1 缺失值处理
SCADA系统偶尔会丢数据,原因可能是传感器故障、通信中断、存储溢出等。缺失值处理有三种常见方法:
- 删除法:直接删掉缺失的样本。适用于缺失比例小于5%的情况。
- 填充法:用均值、中位数、前向填充、后向填充等方式补全。我习惯用前向填充,因为风机数据通常是时序连续的,前一个值最有参考价值。
- 插值法:用线性插值或样条插值。适用于缺失段较短的情况。
经验之谈:如果某个传感器连续缺失超过10%的数据,我建议直接弃用这个传感器。强行填充只会引入噪声。
4.2.2 异常值检测
异常值分两种:一种是传感器故障导致的"野值",比如风速突然跳到100m/s;另一种是真实但罕见的工况,比如极端阵风。
我常用的方法:
- 3σ原则:超出均值±3倍标准差的数据视为异常。简单粗暴,但有效。
- IQR方法:四分位距法,对非正态分布的数据更鲁棒。
- DBSCAN聚类:对于高维数据,用密度聚类找出离群点。
你想想看,如果模型学到一个"风速100m/s时功率为0"的样本,它就会以为大风天风机不发电。这显然不对。所以异常值必须处理。
4.2.3 重复数据与噪声
SCADA系统有时会重复记录同一时刻的数据,或者记录时间戳错乱。我建议先按时间戳排序,然后去重。
噪声处理方面,我常用滑动平均滤波。比如对振动信号做5点滑动平均,能有效滤除高频噪声。
# 滑动平均滤波示例
import numpy as np
def moving_average(data, window_size=5):
return np.convolve(data, np.ones(window_size)/window_size, mode='same')
# 对振动信号做滤波
vibration_clean = moving_average(vibration_raw, window_size=5)
4.3 数据归一化:让数据"对齐"
归一化的目的,是让不同量纲的数据能放在一起比较。比如有功功率是千瓦级,而桨距角是度级,如果不归一化,模型会天然地更关注数值大的特征。
常用的归一化方法:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Min-Max归一化 | x' = (x - min) / (max - min) | 数据分布均匀,无极端值 |
| Z-score标准化 | x' = (x - μ) / σ | 数据近似正态分布 |
| Robust标准化 | x' = (x - median) / IQR | 数据存在异常值 |
我个人习惯,对于SCADA数据用Z-score标准化,因为大部分参数近似正态分布。对于振动数据,我更喜欢用Robust标准化,因为振动信号经常有冲击成分,用均值容易受影响。
小技巧:归一化的参数(均值、标准差等)一定要从训练集计算,然后应用到验证集和测试集。千万不要用全局数据计算,否则会造成数据泄露。
4.4 时序对齐:让数据"同步"
时序对齐是预处理中最头疼的一环。SCADA数据是秒级采样,振动数据是毫秒级采样,气象数据可能是分钟级采样。这三者时间戳不一致,怎么对齐?
我常用的方法:
- 降采样:把高频数据降到低频。比如把振动数据从10kHz降到1Hz,取每秒的均方根值(RMS)。
- 升采样:把低频数据插值到高频。比如把气象数据从1分钟插值到1秒,用线性插值即可。
- 时间窗口对齐:以SCADA数据的时间戳为基准,取前后一定时间窗口内的振动和气象数据做聚合。
举个例子,假设SCADA数据是每1秒一条,振动数据是每0.1秒一条。我通常的做法是:
- 以SCADA时间戳为基准。
- 取每个SCADA时间点前后0.5秒内的振动数据。
- 计算这些振动数据的RMS、峰值、峭度等统计特征。
- 把这些特征作为新的列,拼接到SCADA数据上。
# 时序对齐示例
import pandas as pd
# 假设scada_df和vibration_df都有'timestamp'列
# 将振动数据降采样到1秒
vibration_resampled = vibration_df.set_index('timestamp').resample('1S').agg({
'vibration_x': ['mean', 'std', 'max'],
'vibration_y': ['mean', 'std', 'max']
})
# 合并到SCADA数据
merged_df = scada_df.set_index('timestamp').join(vibration_resampled, how='left')
注意:时序对齐时,一定要考虑时间延迟。比如,风速变化后,功率响应会有几秒的延迟。我建议做互相关分析,找到最佳延迟时间,然后再对齐。
4.5 知识体系总览
说了这么多,咱们用一张图来总结本章的核心逻辑。数据从采集到预处理,再到模型训练,每一步都有坑,每一步都需要经验。
这张图把整个流程串起来了。从三大数据源出发,经过清洗、归一化、对齐,最终得到干净、整齐、可用的训练数据。每一步都不可或缺。
好了,这一章的内容就到这里。数据预处理虽然枯燥,但它是大模型部署的基石。地基打不牢,楼盖得再高也得塌。希望各位在实际项目中,能把这些方法用起来,少走一些我当年走过的弯路。