3. 数据采集与治理:SCADA数据、CMS数据、气象数据的采集规范,数据清洗与质量管控方法
各位同行,咱们做风电后评估,最怕什么?不是算法不够先进,也不是模型不够复杂。我最怕的是——数据是脏的。你想想看,一堆垃圾数据喂进去,再牛的模型也白搭。今天这一章,我就把数据采集和治理这块硬骨头,掰开了揉碎了讲清楚。
3.1 三大数据源的采集规范
风电场的核心数据,说白了就三块:SCADA、CMS、气象。这三兄弟各有各的脾气,采集规范必须区别对待。
3.1.1 SCADA数据采集
SCADA系统是风电机组的“黑匣子”,记录着机组运行的所有状态。我个人习惯,采集时重点关注以下几个参数族:
- 电气参数:有功功率、无功功率、三相电压、三相电流、功率因数
- 机械参数:叶轮转速、发电机转速、桨距角、偏航角度
- 环境参数:机舱风速、机舱风向、环境温度、环境湿度
- 状态参数:运行状态代码、故障代码、累计发电量、累计运行时间
这里有个坑,我踩过。SCADA系统的采样频率,不同厂家差异很大。有的1秒采一次,有的10秒才采一次。做后评估时,如果要做高频振动分析,10秒的数据根本不够用。我建议:
核心原则:SCADA数据采集频率不低于1Hz(每秒1次),用于功率曲线分析的数据建议采用10分钟平均值,但原始高频数据必须保留。
3.1.2 CMS数据采集
CMS(状态监测系统)是机组的“听诊器”。我记得有一次去一个风场做评估,他们的CMS数据采集频率设成了1小时一次,结果齿轮箱故障前兆完全没捕捉到。嗯,这里要注意:
| 监测部件 | 推荐采样频率 | 关键参数 |
|---|---|---|
| 齿轮箱 | ≥10 kHz | 振动加速度、油液温度、颗粒计数 |
| 发电机轴承 | ≥5 kHz | 振动速度、轴承温度 |
| 主轴承 | ≥2 kHz | 低频振动、位移 |
| 塔筒 | ≥1 kHz | 固有频率、阻尼比 |
我曾经遇到过一个项目,CMS数据采集卡坏了三个月没人发现。为什么?因为运维人员只看温度,不看振动。温度没超限,他们就以为没事。结果齿轮箱挂了,损失惨重。所以,CMS数据采集必须做实时完整性校验,一旦数据中断,立即报警。
3.1.3 气象数据采集
气象数据是后评估的“参照系”。没有准确的气象数据,你根本没法判断机组到底发没发够电。我建议气象数据采集要满足:
- 测风塔:至少10m、50m、轮毂高度三层风速风向,采样频率1Hz,10分钟平均
- 激光雷达:如果条件允许,用激光雷达替代测风塔,数据精度更高,但要注意雨雪天气的干扰
- 数值天气预报:ECMWF或ERA5再分析数据,空间分辨率≤0.25°,时间分辨率≤1小时
个人经验:很多风场的气象数据只有机舱风速计的数据。但机舱风速计受叶轮尾流影响,测出来的风速偏低10%-20%。做功率曲线分析时,必须用测风塔或激光雷达的数据做修正,否则评估结果会严重失真。
3.2 数据清洗与质量管控方法
数据采集回来,只是第一步。真正的硬仗,是数据清洗。我见过太多项目,数据量很大,但能用的一成都不到。为什么会这样?因为脏数据太多了。
3.2.1 常见数据质量问题
根据我多年的经验,风电数据常见的“脏”类型有这几种:
- 缺失值:传感器故障、通信中断导致的数据空洞
- 异常值:传感器漂移、电磁干扰导致的离谱数据
- 重复值:数据采集系统重复记录
- 时间戳错乱:不同系统时间不同步,导致数据对不上
- 逻辑错误:比如风速为0但功率不为0,或者桨距角与风速不匹配
嗯,这里我分享一个我自己的清洗流程,你可以直接拿去用:
数据清洗五步法:
- 格式统一:将所有数据的时间戳统一为UTC+8,采样频率统一为10分钟
- 范围校验:剔除物理上不可能的数据(如风速>50m/s,功率>额定功率的1.2倍)
- 趋势校验:检查相邻数据点的变化率,剔除跳变数据(如1秒内风速从5m/s跳到25m/s)
- 逻辑校验:检查参数间的物理关系(如停机状态下功率应为0)
- 插值补全:对于短时间(<30分钟)的缺失数据,采用线性插值或样条插值
3.2.2 代码实现示例
光说不练假把式。我写了一段Python代码,专门处理SCADA数据清洗。你直接复制到你的环境里就能跑:
import pandas as pd
import numpy as np
def clean_scada_data(df):
"""
SCADA数据清洗函数
df: 包含'wind_speed', 'power', 'rotor_speed', 'pitch_angle'等列的DataFrame
"""
# 1. 删除完全重复的行
df = df.drop_duplicates()
# 2. 范围校验:风速0-50m/s,功率0-额定功率的1.1倍
df = df[(df['wind_speed'] >= 0) & (df['wind_speed'] <= 50)]
df = df[(df['power'] >= 0) & (df['power'] <= rated_power * 1.1)]
# 3. 逻辑校验:风速>3m/s且功率=0,可能是停机或故障
# 这里我保留这些数据,但标记出来
df['flag'] = 0
df.loc[(df['wind_speed'] > 3) & (df['power'] == 0), 'flag'] = 1
# 4. 趋势校验:功率变化率不超过额定功率的20%/10分钟
df['power_diff'] = df['power'].diff().abs()
df = df[df['power_diff'] <= rated_power * 0.2]
# 5. 插值补全缺失值(缺失不超过3个连续点)
df = df.interpolate(method='linear', limit=3)
return df
避坑指南:我曾经在清洗数据时,直接把所有标记为1的数据删掉了。结果发现,那些数据其实是机组在低风速下的正常停机。后来我学乖了——标记不等于删除,先分析原因,再决定处理方式。
3.2.3 质量管控指标体系
数据清洗完了,怎么知道质量好不好?我建议用这几个指标来量化:
| 指标名称 | 计算公式 | 合格标准 |
|---|---|---|
| 数据完整率 | 有效数据点数 / 理论数据点数 × 100% | ≥ 95% |
| 数据准确率 | 通过逻辑校验的数据点数 / 总数据点数 × 100% | ≥ 98% |
| 时间一致性 | 时间戳间隔标准差 / 理论间隔 × 100% | ≤ 5% |
| 异常值占比 | 异常数据点数 / 总数据点数 × 100% | ≤ 2% |
这些指标,我建议每个月统计一次,形成数据质量报告。如果某个指标连续三个月不达标,就要去查查是传感器问题还是采集系统问题了。
3.3 数据治理框架图
说了这么多,我画了一张图,把整个数据采集与治理的流程串起来。你看完应该就清楚了:
这张图从左到右,从上到下,就是数据从源头到最终可用的完整链路。你把它打印出来贴在工位上,每次做数据治理时对照着看,基本不会漏掉关键步骤。
好了,数据采集与治理这块,核心内容就这些。记住一句话:数据质量决定了后评估的天花板。你算法再牛,模型再准,数据不行,一切都是白搭。下一章咱们聊聊具体的评估指标怎么算,到时候你会感谢今天认真清洗数据的自己。