3、SCADA数据采集与预处理:风速、功率、转速、温度等关键参数采集,数据清洗与缺失值处理

大家好,我是老张,干风电运维这行有十几年了。今天咱们聊聊SCADA数据采集与预处理。说实话,这是整个预警系统的基础,基础不牢,地动山摇。我见过太多项目,算法模型搞得花里胡哨,结果数据一塌糊涂,最后全白搭。

3.1 关键参数采集:你得知道抓什么

SCADA系统每时每刻都在记录数据,但咱们不是什么都存。我个人习惯,重点关注这四类参数:

  • 风速:机舱风速计测得,注意它受叶轮旋转影响,会有湍流干扰
  • 功率:发电机输出有功功率,直接反映发电能力
  • 转速:叶轮转速和发电机转速,双馈机组要特别注意两者关系
  • 温度:齿轮箱油温、发电机绕组温度、主轴轴承温度等

我在项目中遇到过,某风场连续三个月报警频繁,查了半天,原来是风速计结冰了。你想想看,风速数据都是错的,后面的分析能准吗?所以采集的第一步,是确认传感器本身没问题。

3.2 数据清洗:把垃圾扔出去

原始SCADA数据有多脏?我举个例子你就明白了。有一次我看到一条记录:风速0.5m/s,功率却显示1500kW。这明显不合理,风速这么低,风机早停机了。

清洗工作主要做三件事:

  1. 剔除停机数据:风速低于切入风速(通常3m/s)或高于切出风速(25m/s)时,功率应为0
  2. 过滤异常跳变:比如前一秒温度65℃,下一秒突然跳到120℃,这肯定是传感器故障
  3. 去除限功率数据:电网调度要求限功率运行时,数据不能用于性能分析

核心原则:宁可少要数据,也不要脏数据。我见过有人为了凑样本量,把异常数据也留着,结果模型训练出来完全不能用。

3.3 缺失值处理:别让空值毁了你的模型

SCADA系统偶尔会丢数据,原因很多:通讯中断、传感器故障、存储满等等。遇到缺失值怎么办?

我的处理策略分三种情况:

缺失比例 处理方法 适用场景
< 5% 线性插值 短时间缺失,如通讯闪断
5% - 20% 前向填充 + 限幅 传感器间歇性故障
> 20% 直接删除该段 长时间停机或传感器彻底损坏

嗯,这里要注意,线性插值不是万能的。我曾经处理过一段数据,温度缺失了2小时,用插值补上后,发现补出来的曲线完全不符合物理规律——温度不可能在停机状态下还缓慢上升。后来查出来,是加热器故障导致温度异常,插值反而掩盖了问题。

小技巧:补完缺失值后,一定要做物理合理性校验。比如功率不能为负,转速不能超过额定值1.2倍,温度变化率不能超过5℃/min。这些规则写死在代码里,能挡住90%的坑。

3.4 数据预处理流程总览

说了这么多,咱们把整个流程串起来。下面这张图是我自己画的,你看一眼就明白了:

SCADA数据采集与预处理流程 数据采集 风速/功率/转速/温度 数据清洗 剔除停机/异常/限功率 缺失值处理 插值/填充/删除 输出 原始SCADA数据 剔除无效数据 补全或删除 干净数据 物理合理性校验(温度变化率/功率范围等) 不通过则回退

说白了,整个流程就是:先采集,再清洗,然后处理缺失值,最后做物理校验。每一步都不能省。我见过有人图省事,直接把清洗步骤跳过了,结果模型训练出来,预测准确率不到40%。

3.5 实战代码片段

最后给一段我常用的Python代码,处理风速和功率的清洗:

import pandas as pd
import numpy as np

def clean_scada_data(df):
    """
    清洗SCADA数据
    df: 包含风速、功率、转速、温度的DataFrame
    """
    # 1. 剔除停机数据
    df = df[(df['风速'] >= 3) & (df['风速'] <= 25)]
    
    # 2. 过滤异常跳变(温度变化率不超过5℃/min)
    df['温度变化率'] = df['齿轮箱油温'].diff().abs()
    df = df[df['温度变化率'] <= 5]
    
    # 3. 缺失值处理(线性插值)
    df = df.interpolate(method='linear', limit=5)
    
    # 4. 物理合理性校验
    df = df[df['功率'] >= 0]
    df = df[df['转速'] <= df['额定转速'] * 1.2]
    
    return df

注意:这段代码只是示例,实际项目中要根据风机型号和现场情况调整阈值。比如有些老旧机组,温度变化率允许到8℃/min,你按5℃来,会把正常数据也删掉。

好了,关于SCADA数据采集与预处理,我就说这么多。记住一句话:数据质量决定了预警系统的上限。你花再多时间在算法上,都不如先把数据搞干净。


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