4. 数据清洗与预处理实战

SCADA 原始数据在进入故障诊断模型之前,必须先经过一轮系统化的清洗与预处理。原因很直接:风电场 SCADA 系统通常以 1 秒到 10 分钟不等的采样周期长期运行,数据在采集、传输、存储、时钟同步等环节都可能引入缺陷。如果直接把这些数据喂给诊断算法,模型学到的可能是“传感器坏了”而不是“机组坏了”。本节围绕四类最常见的数据质量问题展开:缺失值、重复记录、异常值,以及停机与限功率状态标记。

一、先建立数据质量画像

动手清洗之前,建议先对原始数据做一次质量画像,明确“脏在哪里、脏了多少”。以一台 2 MW 机组、10 分钟采样、一年约 52560 条记录为例,可先统计以下指标:

  • 各测点缺失率:如风速、有功功率、发电机转速、齿轮箱油温、机舱振动等;
  • 时间戳重复条数与重复率;
  • 越限值比例:如功率为负、风速超过切出值、温度超出物理量程;
  • 状态字分布:并网、停机、限功率、维护、故障等状态占比。

这一步的价值在于决定后续策略。若某测点缺失率超过 30%,填补意义有限,更合理的做法是标记为不可用并排除该测点参与建模;若缺失率在 5% 以内,则适合用插值或模型填补。

二、缺失值填补:按缺失机制选方法

缺失不是一种情况,要区分三类机制。完全随机缺失(MCAR)指缺失与任何变量无关,例如通信偶发丢包;随机缺失(MAR)指缺失与其他可观测变量有关,例如低风速时某些温度测点不刷新;非随机缺失(MNAR)指缺失与缺失值本身有关,例如故障时传感器被强制置空。方法选择要与机制匹配:

  • 短时连续缺失(≤3 个采样点):优先线性插值或三次样条插值,保持时间序列的连续性;
  • 中等长度缺失(4~12 个点):可用同工况回归填补,例如用“风速—功率”曲线或同机组相邻测点做估计;
  • 长时缺失或整段停机:不做数值填补,直接标记为无效区间,避免制造虚假数据;
  • MNAR 场景:保留缺失标记位,让模型知道“这里本来就没有值”,而不是填一个看似合理的数。

实操中建议为每个关键测点增加一列 xxx_is_missing 标志位,填补值只写入数值列,标志位保留原始缺失信息。这样既保证模型输入完整,又不丢失“曾经缺失”这一事实。

三、重复记录处理:先判重,再判留

重复记录通常来自两种情形:一是采集端重传导致时间戳完全相同的重复行;二是时钟回拨或时区处理错误导致同一时刻出现多条记录。处理顺序应为:

  1. 按 timestamp 排序,识别完全重复行;
  2. 对同一时间戳的多条记录,比较各测点数值,若完全一致则保留一条;
  3. 若数值不一致,说明存在采集冲突,应优先保留状态字更完整、质量码更高的记录,或按“后到覆盖先到”的规则处理,并在日志中记录冲突次数;
  4. 对时间戳重复但间隔异常的记录,检查是否存在时区偏移,统一转换为 UTC 后再判重。

需要强调的是,重复记录不能简单用 drop_duplicates() 一删了之。若重复行中有一条是故障状态、另一条是正常运行状态,直接删除可能丢掉关键故障样本。建议保留冲突记录到单独的审计表中,便于回溯。

四、异常值识别:物理规则 + 统计规则双轨

异常值识别建议采用“物理规则优先、统计规则补充”的双轨策略。物理规则基于机组设计参数,例如:

  • 有功功率应在 [-额定功率×5%, 额定功率×110%] 之间,明显负值且持续存在可能是变流器或计量问题;
  • 风速应在 [0, 40] m/s 之间,超过切出风速后仍持续发电需核查;
  • 齿轮箱油温通常低于 90 ℃,发电机绕组温度低于 150 ℃,超出量程多为传感器故障;
  • 转速、桨距角等应满足机组控制逻辑的物理约束。

统计规则可用四分位距(IQR)或 3σ 方法,但要注意风速、功率本身分布偏斜,直接套用 3σ 会误杀大量正常高风速样本。更稳妥的做法是分工况统计:先按风速分箱(如 1 m/s 一档),再在每一档内计算功率的 IQR 上下界,超出者标记为疑似异常。识别出的异常值不建议直接删除,而应标记为 outlier_flag,并区分“传感器异常”和“机组真实异常”——前者应剔除,后者恰恰是故障诊断要保留的样本。

五、停机与限功率数据标记

停机与限功率是风电机组最常见的两类非故障状态,但它们的功率表现与故障降容非常相似,若不标记,诊断模型极易混淆。标记依据主要来自状态字、功率曲线和调度指令:

  • 停机:状态字为停机/待机,且有功功率接近 0、转速接近 0、桨距角处于顺桨位置;
  • 限功率:状态字为并网,但实际功率持续低于同风速下参考功率曲线的某一比例(如 80%),且持续时间超过设定阈值(如 30 分钟),同时可结合调度限功率指令或场级 AGC 信号确认;
  • 故障降容:功率偏低但状态字含故障码,或关键温度、振动测点越限,这类样本应保留并单独标注。

标记结果建议写入独立的状态列,取值如 normal / stop / curtail / fault_derate / invalid。后续建模时,stop 与 curtail 样本通常不参与故障诊断训练,但可用于功率预测或可用率统计;fault_derate 则是诊断模型的重点学习对象。

SCADA 数据清洗与预处理流程 原始 SCADA 数据 时间戳 · 测点值 · 状态字 数据质量画像 缺失率 · 重复率 · 越限率 ① 缺失值填补 短缺失→插值 长缺失→标记无效 ② 重复记录处理 时间戳判重 冲突记录审计 ③ 异常值识别 物理规则 + IQR 分风速箱统计 ④ 停机/限功率标记 状态字 + 功率曲线 调度指令确认 统一状态标记输出 normal / stop / curtail / fault_derate / invalid 故障诊断建模 保留 fault_derate 样本 功率预测 / 可用率 stop / curtail 单独统计 数据审计追溯 冲突与填补日志 关键原则 先标记,后处理 保留原始缺失信息

六、一个可复用的处理顺序

综合以上四类问题,推荐的处理顺序是:时间对齐 → 重复记录处理 → 缺失值标记与填补 → 异常值标记 → 停机/限功率状态标记 → 输出清洗后数据集与审计日志。顺序不能随意调换:如果先填补再判重,重复行会被填补成不同值,判重失效;如果先标记停机再填补,停机期间的零功率会被插值成非零值,状态标记失真。

清洗后的数据集建议同时保留三份内容:清洗后的数值表、每个测点的缺失/异常标志位、以及一份处理日志(记录填补方法、判重条数、异常标记数量、状态标记分布)。这样在后续诊断结果异常时,可以快速回溯是数据问题还是模型问题。
不要为了“数据好看”而过度填补或删除异常值。风电机组的故障样本本身稀少,一次误删可能就丢掉了唯一的早期故障征兆。清洗的目标是让数据可信,而不是让数据完美。

完成本节处理后,得到的数据应满足:时间戳唯一且单调递增、关键测点无长段空洞、异常值有明确标记、每一条记录都有明确的状态归属。这是后续特征工程与故障诊断建模能够成立的前提。