第二章 数据采集与预处理:SCADA系统数据解析、振动信号与温度数据采集、数据清洗与异常值处理、时间序列对齐与重采样
各位同行,大家好。我是老张,在风电运维这行摸爬滚打了十几年。今天咱们聊聊数据采集与预处理。说实话,很多运维团队把精力都花在算法模型上,却忽略了数据质量。我见过太多项目,模型跑得飞起,结果一查,输入的数据全是脏数据。嗯,这就像用烂砖头盖大楼,迟早要塌。
数据预处理,说白了就是给AI模型喂“干净饭”。你想想看,风机每天产生海量数据,SCADA系统、振动传感器、温度探头……这些数据格式不同、时间戳对不上、还有各种异常值。如果不处理,模型学到的全是噪音。我个人习惯,花在预处理上的时间,至少要占整个项目的40%。
核心观点:数据质量决定了AI模型的天花板。算法再牛,也救不了烂数据。
2.1 SCADA系统数据解析
SCADA系统是风机的“黑匣子”,记录着几乎所有运行参数。但问题来了——不同厂家、不同型号的SCADA,数据格式千差万别。有的用CSV,有的用二进制,还有的用自定义协议。我在项目中遇到过,某国产风机SCADA导出的数据,时间戳居然是“2024/3/15 14:30:25”这种格式,而另一台进口风机用的是Unix时间戳。你说头疼不头疼?
解析SCADA数据,我一般分三步走:
- 格式识别:先看文件头,判断是CSV、JSON还是专有格式。别上来就写解析代码,先花10分钟看看数据长什么样。
- 字段映射:把原始字段名映射成统一标准。比如“WindSpeed”、“风速”、“WS”都映射成“wind_speed”。
- 时间戳标准化:统一转为UTC时间,精确到秒。我习惯用ISO 8601格式,比如“2024-03-15T14:30:25Z”。
小技巧:解析SCADA时,先检查数据完整性。我曾经遇到一个风场,SCADA系统因为硬盘故障,连续丢失了3天的数据。如果不做完整性检查,模型会学到错误的模式。
2.2 振动信号与温度数据采集
振动信号和温度数据,是预测性维护的两大法宝。振动信号能告诉你轴承有没有磨损,温度数据能反映齿轮箱的健康状态。但这两类数据的采集方式完全不同。
振动信号:采样率通常很高,1024Hz甚至更高。数据量巨大,一台风机一天就能产生几个GB。我建议不要全部存储,而是提取特征值——比如有效值、峰值、峭度等。这样既保留了关键信息,又大幅压缩了数据量。
温度数据:变化相对缓慢,采样间隔可以设长一些,比如1分钟一次。但要注意传感器位置——我见过把温度探头装在散热器旁边的,测出来的温度比实际低20度,这数据根本不能用。
| 数据类型 | 典型采样率 | 存储建议 | 常见问题 |
|---|---|---|---|
| 振动信号 | 1024 Hz - 5120 Hz | 提取特征值后存储 | 传感器松动导致噪声 |
| 温度数据 | 0.1 Hz - 1 Hz | 直接存储原始值 | 传感器位置偏差 |
| SCADA参数 | 0.01 Hz - 0.1 Hz | 按时间戳存储 | 时间戳不一致 |
避坑指南:我曾经遇到一个项目,振动传感器安装位置不对,导致采集到的信号全是结构共振,而不是轴承的真实振动。后来花了整整一周重新安装传感器。记住:传感器安装质量,决定了数据质量的上限。
2.3 数据清洗与异常值处理
数据清洗,说白了就是“去伪存真”。风机运行环境恶劣,传感器故障、通信中断、雷击干扰……各种异常都会污染数据。我总结了一套“三步清洗法”:
- 第一步:范围检查——风速不可能超过35m/s,发电机温度不可能超过150°C。超出物理极限的,直接剔除。
- 第二步:变化率检查——风速1秒内从5m/s跳到25m/s?这明显是传感器故障。我一般设定最大变化率阈值,超过的标记为异常。
- 第三步:统计方法——用3σ原则或箱线图,找出统计意义上的离群点。但要注意,风机在极端工况下(比如切出风速附近)的数据,虽然统计上离群,但实际上是正常的。别一刀切。
# 数据清洗示例(Python伪代码)
def clean_wind_speed(data):
# 范围检查
data = data[(data['wind_speed'] >= 0) & (data['wind_speed'] <= 35)]
# 变化率检查
data['delta'] = data['wind_speed'].diff().abs()
data = data[data['delta'] < 10] # 每秒变化不超过10m/s
# 3σ原则
mean = data['wind_speed'].mean()
std = data['wind_speed'].std()
data = data[(data['wind_speed'] > mean - 3*std) &
(data['wind_speed'] < mean + 3*std)]
return data
重要提醒:异常值处理不是越多越好。过度清洗会丢失真实工况信息。我建议保留清洗前后的数据对比,方便回溯验证。
2.4 时间序列对齐与重采样
这是最容易被忽视的一步。SCADA数据每10秒一条,振动数据每毫秒一条,温度数据每分钟一条。时间戳对不上,怎么分析?
时间序列对齐,核心思路是“统一时间基准”。我通常的做法是:
- 确定目标采样率:根据分析需求,选择1分钟、10分钟或1小时。做故障诊断用高频,做寿命预测用低频。
- 重采样:把不同频率的数据,重采样到目标频率。高频数据用降采样(取平均或最大值),低频数据用插值(线性插值或前向填充)。
- 对齐时间戳:确保所有数据的时间戳完全一致。我习惯用Pandas的resample函数,配合groupby操作。
举个例子:振动数据是1024Hz,SCADA是0.1Hz。我想做1分钟级别的分析。那就把振动数据每60秒取一个有效值,SCADA数据每60秒取一个平均值。这样所有数据都变成了每分钟一条,时间戳对齐。
个人经验:重采样时,注意边界效应。比如用前向填充时,如果SCADA数据缺失超过30分钟,就别填充了,直接标记为缺失。否则模型会学到错误的时序关系。
好了,数据采集与预处理这部分就聊到这儿。记住:数据是AI模型的“燃料”,燃料不纯,发动机再牛也跑不远。下一章咱们聊聊特征工程,看看怎么从这些干净数据里挖出真正的价值。