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小时):线性插值。前后两个有效值之间拉一条直线。
  2. 中等时间缺失(1-24小时):用同工况下的历史数据填充。比如同样风速区间、同样温度下的历史均值。
  3. 长时间缺失(> 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 知识体系总览

下面这张图,是我自己梳理的数据预处理流程。你照着这个框架走,基本不会漏掉关键步骤。

数据采集与预处理流程框架 SCADA数据 CMS数据 气象数据 数据清洗:去重 → 逻辑校验 → 格式统一 缺失值处理:线性插值 → 工况填充 → 标记无效 异常值检测:物理规则 → 3σ/IQR → DBSCAN聚类 高质量可用数据集 —— 数据预处理完成 ——

你看,整个流程就像一条流水线。数据从三个源头进来,经过清洗、缺失处理、异常检测三道工序,最后产出高质量的数据集。每一步都不能省,省了就是给自己挖坑。

最后说一句:数据预处理没有银弹。每个风场、每台机组都有自己的“脾气”。多花时间理解数据,比多花时间调模型有用得多。这是我从十年运维经验里悟出来的道理。


公众号:蓝海资料掘金营,微信deep3321