2. 数据采集与预处理:打好分析地基
大家好,我是老张。干风电性能衰减分析这么多年,我最大的体会就是——数据质量决定分析天花板。你算法再牛,模型再花哨,喂进去一堆垃圾数据,出来的结果也是垃圾。今天咱们就聊聊数据采集和预处理这档子事。
核心观点:数据预处理占整个分析工作量的60%-70%,别嫌烦,这是绕不开的坎。
2.1 三大数据源:SCADA、CMS、气象
做性能衰减分析,我们主要跟三类数据打交道。我习惯把它们比作人的三个感官系统。
SCADA数据——风机的“体检报告”
SCADA系统每时每刻都在记录风机的运行状态。说白了,它就是风机的黑匣子。主要包含:
- 电气参数:有功功率、无功功率、电压、电流、频率
- 机械参数:转速、桨距角、偏航角度、机舱振动
- 状态参数:运行状态、故障代码、停机时长
采样频率一般是10分钟一次。嗯,这里要注意,不同厂家的SCADA系统,字段命名可能天差地别。我遇到过一家用德语命名的,那叫一个头疼。
CMS数据——风机的“心电图”
CMS是状态监测系统,专门盯着关键部件的振动信号。它比SCADA精细得多,采样频率能到几千赫兹甚至更高。
- 振动加速度:齿轮箱、发电机、主轴轴承
- 温度趋势:轴承温度、油温、绕组温度
- 频谱特征:时域波形、FFT频谱、包络谱
我个人习惯把CMS数据当作早期预警信号。SCADA告诉你“已经出问题了”,CMS能告诉你“快要出问题了”。
气象数据——风机的“工作环境”
这个好理解。风机靠风吃饭,气象数据直接影响发电性能。
- 风速:轮毂高度风速、10分钟平均风速、最大风速
- 风向:平均风向、风向标准差
- 环境条件:温度、湿度、气压、空气密度
- 湍流强度:这个很多人忽略,其实对叶片性能衰减影响很大
小技巧:气象数据最好用机舱上的测风仪数据,而不是远处的测风塔。距离远了,相关性就差了。我曾经吃过这个亏,后来再也不敢偷懒了。
2.2 数据清洗:把脏东西筛出去
数据清洗,说白了就是“去伪存真”。原始数据里什么妖魔鬼怪都有。
常见的数据脏问题
| 问题类型 | 典型表现 | 产生原因 |
|---|---|---|
| 缺失值 | 字段为空、NaN | 传感器故障、通信中断 |
| 异常值 | 功率为负、风速100m/s | 传感器漂移、雷击干扰 |
| 重复值 | 同一时间戳多条记录 | 数据重传、系统bug |
| 逻辑错误 | 停机状态却有功率输出 | 状态码与数据不同步 |
我一般按这个顺序清洗:先去重,再处理逻辑错误,最后处理缺失值和异常值。顺序搞反了,后面会越洗越乱。
2.3 缺失值处理:别乱填,要讲道理
缺失值处理,很多人上来就填均值。你想想看,风速缺失了,你用全年的平均风速去填?那分析结果能准吗?
我的处理原则
- 短时间缺失(< 1小时):线性插值。前后两个有效值之间拉一条直线。
- 中等时间缺失(1-24小时):用同工况下的历史数据填充。比如同样风速区间、同样温度下的历史均值。
- 长时间缺失(> 24小时):直接标记为无效,不参与分析。强行填充只会引入噪声。
# 线性插值示例(Python)
import pandas as pd
# 假设df是SCADA数据,'wind_speed'列有缺失
df['wind_speed'] = df['wind_speed'].interpolate(method='linear', limit=6)
# limit=6 表示最多连续插值6个点(1小时)
注意:千万别对停机时段的数据做插值!停机时风速数据是真实的,但功率数据就是0。你插值了,反而把真实信息抹掉了。我曾经犯过这个错,后来被领导骂了一顿。
2.4 异常值检测:揪出“捣蛋鬼”
异常值检测,我把它分成两类:物理异常和统计异常。
物理异常——一眼就能看出来的
这类异常靠领域知识就能判断。比如:
- 风速超过切出风速(通常25m/s)还在发电?不可能。
- 功率系数超过贝茨极限(59.3%)?数据有问题。
- 发电机转速为负?传感器接反了。
我一般先做物理规则过滤,把明显不合理的数据剔除掉。这一步用简单的if-else就能搞定。
统计异常——藏在数据里的“老鼠屎”
物理规则过滤完,剩下的异常值就得靠统计方法了。
方法一:3σ原则
假设数据服从正态分布,超出均值±3倍标准差的值视为异常。这个方法简单,但对风电数据不太适用——风速分布是偏态的,不是正态的。
方法二:箱线图法(IQR)
这个更靠谱。用四分位距来判定:
# IQR异常值检测
Q1 = df['power'].quantile(0.25)
Q3 = df['power'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
anomalies = df[(df['power'] < lower_bound) | (df['power'] > upper_bound)]
方法三:DBSCAN聚类
对于多维数据(比如同时看风速、功率、桨距角),用聚类方法效果更好。DBSCAN能把离群点自动揪出来。
我的经验:别迷信任何一种方法。我通常把三种方法的结果做个交集,取“共识异常值”来处理。这样误判率低很多。
2.5 知识体系总览
下面这张图,是我自己梳理的数据预处理流程。你照着这个框架走,基本不会漏掉关键步骤。
你看,整个流程就像一条流水线。数据从三个源头进来,经过清洗、缺失处理、异常检测三道工序,最后产出高质量的数据集。每一步都不能省,省了就是给自己挖坑。
最后说一句:数据预处理没有银弹。每个风场、每台机组都有自己的“脾气”。多花时间理解数据,比多花时间调模型有用得多。这是我从十年运维经验里悟出来的道理。
公众号:蓝海资料掘金营,微信deep3321