2、数据采集与治理基础:SCADA数据、振动数据、气象数据、数据清洗与标准化流程
各位同行,大家好。我是老张,在风电运维这行摸爬滚打了十几年。今天咱们聊点实在的——数据采集与治理。说白了,就是搞清楚我们手头到底有哪些数据,怎么把它们收拾利索了,才能喂给AI模型吃。
很多刚入行的朋友问我:“老张,AI运维是不是特别玄乎?”我通常回答:“不玄乎,但数据要是脏了,AI就是个傻子。” 嗯,这话糙理不糙。我见过太多项目,模型算法再牛,数据一塌糊涂,最后全白搭。
核心观点:数据治理是AI运维的“地基”。地基不稳,楼盖得再高也得塌。我们花80%的精力在数据上,一点都不夸张。
2.1 三大数据源:我们到底在采集什么?
风电场的AI运维,数据来源主要有三个。我习惯把它们比作“人体的三大系统”:
- SCADA数据(神经系统): 风机的大脑和神经。记录着每台风机的运行状态、发电量、转速、温度、电压、电流等等。采样频率一般是秒级或分钟级。
- 振动数据(心跳监测): 专门盯着齿轮箱、轴承、发电机这些旋转部件。采样频率高,通常是kHz级别。说白了,就是听声音判断有没有“心脏病”。
- 气象数据(天气预报): 风速、风向、温度、湿度、气压。这些决定了风机“吃风”的效率,也是预测发电量的关键。
我的经验: 很多项目只盯着SCADA,忽略了振动和气象。其实三者结合,才能做真正的预测性维护。比如,气温骤降时,振动数据异常往往预示着齿轮箱润滑油出问题。
2.2 SCADA数据:最基础,也最“脏”
SCADA数据是每个风电场都有的。但说实话,我见过太多“脏数据”。
常见问题:
- 通信中断: 风机和主控室“失联”了,数据直接断档。
- 传感器漂移: 温度传感器测出来50度,实际只有30度。我遇到过一台风机,连续三个月报“齿轮箱超温”,结果换了个传感器就好了。
- 人为置零: 有些运维人员为了省事,停机时直接把功率置零,但转速还在转。这种数据喂给AI,模型会学坏的。
SCADA数据字段示例(我常用的):
| 字段名 | 说明 | 单位 | 常见问题 |
|---|---|---|---|
| timestamp | 时间戳 | yyyy-mm-dd HH:MM:SS | 时区不一致、跳变 |
| wind_speed | 风速 | m/s | 负值、超出量程 |
| active_power | 有功功率 | kW | 停机时非零 |
| generator_rpm | 发电机转速 | rpm | 突变、跳变 |
| gearbox_oil_temp | 齿轮箱油温 | ℃ | 传感器漂移 |
2.3 振动数据:高频的“心电图”
振动数据是预测性维护的宝贝。但采集起来麻烦,处理起来更麻烦。
为什么?因为采样频率太高了。一个振动传感器,每秒采集几千甚至几万个点。一台风机装好几个传感器,一天下来数据量就是几个GB。
我个人习惯: 振动数据不直接存原始波形,而是提取特征值。比如:
- 有效值(RMS): 反映振动能量大小。
- 峰值(Peak): 看有没有冲击信号。
- 峭度(Kurtosis): 判断有没有早期故障。
避坑指南: 我曾经在一个项目里,直接拿原始振动波形去训练模型,结果模型又大又慢,还容易过拟合。后来改成提取特征值,效果好了不止一个档次。记住,AI不是万能的,别给它喂太多“生肉”。
2.4 气象数据:别信“天气预报”
气象数据看起来简单,但坑也不少。
风电场的气象数据通常来自机舱顶部的气象站。但问题来了:
- 塔影效应: 机舱上的风速仪,测的是被叶片搅乱后的风,不是自然风。
- 冰冻问题: 北方冬天,风速仪结冰,数据直接卡死。
- 数据粒度: 气象局的数据是小时级的,但风机响应是秒级的。直接拿来用,时间对不上。
我的做法: 气象数据一定要做“空间校正”和“时间插值”。说白了,就是把机舱上的风速换算成轮毂高度处的自由风速。这个换算公式,每个机型都不一样,得看厂家手册。
2.5 数据清洗与标准化流程:把“脏活”干漂亮
好了,数据采回来了,接下来就是“洗菜”环节。我总结了一套四步法:
- 缺失值处理: 连续缺失超过5%的数据段,直接扔掉。零星缺失,用前后均值或插值法补上。
- 异常值检测: 用3σ原则或箱线图。比如风速超过30m/s,功率超过额定值1.2倍,这些明显是错的。
- 时间对齐: SCADA是秒级,振动是毫秒级,气象是分钟级。统一重采样到1分钟或10分钟。
- 标准化输出: 所有数据归一化到[0,1]或[-1,1]区间。不然风速和温度的量纲不一样,模型会“偏科”。
代码示例(Python,我常用的清洗片段):
import pandas as pd
import numpy as np
# 读取SCADA数据
df = pd.read_csv('scada_data.csv', parse_dates=['timestamp'])
# 1. 缺失值处理:删除缺失超过5%的列
df = df.dropna(thresh=len(df)*0.95, axis=1)
# 2. 异常值检测:风速不能为负,功率不能超过额定1.2倍
df = df[(df['wind_speed'] >= 0) & (df['wind_speed'] <= 30)]
df = df[(df['active_power'] >= 0) & (df['active_power'] <= 1.2 * rated_power)]
# 3. 时间对齐:重采样到10分钟
df.set_index('timestamp', inplace=True)
df_resampled = df.resample('10T').mean()
# 4. 标准化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df_resampled),
columns=df_resampled.columns,
index=df_resampled.index)
小技巧: 清洗完的数据,我习惯存一份“原始清洗日志”。哪天模型效果不好了,回头查查是不是清洗规则出了问题。这招帮我省了不少排查时间。
2.6 标准化:让不同风机“说同一种语言”
标准化不只是数值归一化。更重要的是“业务标准化”。
举个例子:A风机和B风机,型号不同,额定功率不同。A的80%功率和B的80%功率,绝对值不一样,但相对状态是一样的。所以,我建议把功率、转速等参数都换算成“标幺值”(实际值/额定值)。
标准化前后对比:
| 参数 | 原始值(A风机) | 原始值(B风机) | 标幺值 |
|---|---|---|---|
| 有功功率 | 1500 kW | 2000 kW | 0.75 p.u. |
| 发电机转速 | 1200 rpm | 1500 rpm | 0.80 p.u. |
你看,标幺化之后,不同风机之间的数据就能直接对比了。AI模型学起来也轻松得多。
好了,这一章的内容就到这儿。数据采集和治理是苦活、累活,但也是最有价值的活。把这一步做扎实了,后面的AI模型才能发挥真正的威力。