第1章:数据预处理实战——数据清洗、重采样、时间对齐与特征工程基础

各位同行,大家好。我是老张,在风电运维这行摸爬滚打了十几年,后来又啃了几年AI算法。今天咱们聊点实在的——数据预处理。

说实话,很多刚入行的朋友,一上来就急着调模型、跑算法。我见过太多人,数据都没洗干净,就跑出个“漂亮”的结果,结果一到现场就翻车。嗯,这坑我踩过,所以今天咱们把地基打牢。

1.1 数据清洗:把“脏数据”揪出来

风电数据有多脏?我举个例子。有一次,某风场一台机组的振动传感器,连续三天报出“超高频振动”,吓得运维团队差点要停机换轴承。结果我一查原始数据——好家伙,传感器线缆被老鼠咬断了,信号全是噪声。

数据清洗,说白了就是三件事:剔除异常值、处理缺失值、去噪

1.1.1 异常值剔除

我个人习惯用3σ原则箱线图法。3σ原则适合正态分布的数据,比如风速、功率。箱线图法更鲁棒,适合偏态分布,比如振动信号。

举个代码例子:

import pandas as pd
import numpy as np

# 假设df是原始数据,'wind_speed'是风速列
def remove_outliers_3sigma(df, col):
    mean = df[col].mean()
    std = df[col].std()
    return df[(df[col] >= mean - 3*std) & (df[col] <= mean + 3*std)]

# 箱线图法
def remove_outliers_iqr(df, col):
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    lower = Q1 - 1.5 * IQR
    upper = Q3 + 1.5 * IQR
    return df[(df[col] >= lower) & (df[col] <= upper)]
⚠️ 注意: 千万别一刀切!我曾经在某个项目里,把风速大于25m/s的数据全删了,结果发现那是台风过境时的真实数据。异常值不一定是错误,可能是极端工况。一定要结合运维日志判断。

1.1.2 缺失值处理

风电数据缺失太常见了。通讯中断、传感器故障、存储异常……我见过最夸张的,一个风场连续7天数据全丢。

处理方式分三种:

  • 直接删除:缺失比例小于5%,且随机分布
  • 插值填充:线性插值、前向填充、后向填充
  • 模型预测:用其他相关变量预测缺失值(比如用风速预测功率)

我个人习惯:先看缺失模式。如果是连续缺失,用插值;如果是随机缺失,用前向填充。但记住——千万别用均值填充时间序列数据,那会破坏时序特性。

1.2 重采样:把数据“对齐”到同一时间尺度

风电数据采集频率五花八门。SCADA系统通常是1秒或10秒一条,振动监测可能是每秒几千次,气象数据可能是10分钟一次。你想想看,这些数据不统一,怎么一起分析?

重采样,就是把不同频率的数据,统一到同一个时间间隔上。常用的有:

  • 降采样:高频转低频(比如10Hz转1Hz),用均值、最大值、最小值聚合
  • 升采样:低频转高频(比如10分钟转1分钟),用插值或前向填充

代码示例:

# 降采样:10秒数据 -> 1分钟数据
df_resampled = df.set_index('timestamp').resample('1T').mean()

# 升采样:10分钟数据 -> 1分钟数据(线性插值)
df_resampled = df.set_index('timestamp').resample('1T').interpolate(method='linear')
💡 小技巧: 降采样时,别只用均值。比如风速,用均值会抹掉阵风特征。我一般会同时保留均值、最大值、最小值,甚至标准差。这样信息更丰富。

1.3 时间对齐:让不同传感器“同步说话”

时间对齐,说白了就是让不同来源的数据,在时间轴上“对上号”。

我遇到过最头疼的情况:SCADA系统用的是UTC时间,振动监测用的是本地时间,气象数据用的是北京时。三个时间戳,三个时区,你说乱不乱?

时间对齐的步骤:

  1. 统一时区:全部转成UTC或北京时
  2. 统一精度:全部转成毫秒或秒级时间戳
  3. 最近邻匹配:对于非对齐的时间点,找最近的时间戳匹配

代码示例:

# 统一时区
df['timestamp'] = pd.to_datetime(df['timestamp'], utc=True)

# 最近邻匹配
df_aligned = pd.merge_asof(df_scada, df_vibration, 
                           on='timestamp', direction='nearest')
⚠️ 注意: 时间对齐时,方向参数很重要。'nearest'是最近邻,'forward'是向前匹配,'backward'是向后匹配。选错了,数据就错位了。我曾经因为用了'forward',导致振动数据比SCADA数据晚了整整5分钟,分析结果完全不对。

1.4 特征工程基础:从原始数据中“挖”出有用信息

特征工程,就是把原始数据变成模型能理解的语言。说白了,就是从数据里提炼出能反映设备状态的特征

今天咱们讲四个最基础的特征:均值、方差、峰值因子

1.4.1 均值(Mean)

均值反映数据的“中心趋势”。比如,某台机组过去1小时的平均功率,能反映它的出力水平。

但注意:均值对异常值敏感。一个坏点就能把均值拉偏。所以,计算均值前,一定要先清洗数据

1.4.2 方差(Variance)

方差反映数据的“波动程度”。比如,风速方差大,说明风况不稳定;振动方差大,说明可能存在故障。

我个人习惯用标准差(方差的平方根),因为它的单位和原始数据一致,更容易理解。

1.4.3 峰值因子(Crest Factor)

峰值因子 = 峰值 / 有效值(RMS)。它反映信号的“冲击程度”。

这个特征在振动分析中特别有用。比如,轴承出现早期故障时,会产生冲击信号,峰值因子会明显升高。我曾在一次巡检中,通过峰值因子提前3个月发现了齿轮箱的裂纹。

计算公式:

import numpy as np

def crest_factor(signal):
    peak = np.max(np.abs(signal))
    rms = np.sqrt(np.mean(signal**2))
    return peak / rms
💡 实战经验: 峰值因子对早期故障敏感,但它也容易受噪声干扰。我一般会先做带通滤波,只保留感兴趣的频段,再计算峰值因子。这样能滤掉无关的噪声,提高信噪比。

1.5 本章知识体系总览

下面这张图,是我自己总结的数据预处理流程。你把它打印出来贴在工位上,每次做数据预处理前看一眼,保证不跑偏。

数据预处理实战知识体系 原始风电数据 数据清洗 异常值剔除(3σ/箱线图) 缺失值处理(插值/填充) 去噪(滤波/平滑) 重采样 + 时间对齐 降采样(均值/最大值) 升采样(插值/前向填充) 时间对齐(最近邻匹配) 特征工程(均值/方差/峰值因子)

这张图展示了数据预处理的完整流程:从原始数据出发,经过数据清洗、重采样与时间对齐,最后到特征工程。每一步都有对应的技术方法,咱们今天都讲到了。

核心要点回顾:

  • 数据清洗:异常值剔除用3σ或箱线图,缺失值处理看缺失模式
  • 重采样:降采样保留统计特征,升采样用插值
  • 时间对齐:统一时区、统一精度、最近邻匹配
  • 特征工程:均值反映中心趋势,方差反映波动,峰值因子反映冲击

好了,这一章的内容就到这儿。数据预处理是风电AI运维的基石,基础打牢了,后面建模、预测、优化才能站得住脚。咱们下一章见。


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