4、数据采集与预处理:SCADA数据源、高频振动数据、数据清洗(缺失值、异常值)、时间戳对齐

好,咱们进入正题。数据采集和预处理,说白了就是给大模型「喂饭」。饭要是馊了,模型再厉害也白搭。我在风电现场摸爬滚打这些年,见过太多因为数据没处理好,导致诊断模型「睁眼瞎」的案例。这一节,我就把压箱底的经验掏出来,跟你聊聊怎么把这顿饭做干净、做标准。

4.1 SCADA数据源:变桨系统的「体检报告」

SCADA系统,你肯定不陌生。它每隔几秒或几分钟,就会记录下风机的各种状态。对于变桨系统,我重点关注这几个参数:

  • 桨叶角度:三支桨叶的实际角度和给定角度。偏差大了,说明有问题。
  • 变桨电机电流:电机干活累不累,看电流就知道。电流异常波动,往往是卡涩或电气故障的前兆。
  • 变桨速度:响应快不快,顺不顺畅。
  • 液压系统压力:对于液压变桨,压力是命根子。
  • 电池电压/超级电容电压:后备电源的健康状况,关键时刻能救命。

我个人习惯,拿到SCADA数据后,第一件事不是分析,而是先看一眼数据采集频率。有的风场是1秒采一次,有的是10秒。频率不同,能捕捉到的故障特征也不同。嗯,这里要注意,千万别把不同频率的数据直接混在一起用。

4.2 高频振动数据:捕捉「心跳」的细节

SCADA数据像心电图,能看出大问题。但想诊断早期故障,比如轴承磨损、齿轮裂纹,就得靠高频振动数据了。这玩意儿采样率动辄几千甚至上万赫兹,能捕捉到微米级的振动。

我建议,高频数据重点关注两个地方:

  • 变桨轴承的振动:安装在轴承座附近,直接感受桨叶传递过来的载荷变化。
  • 变桨齿轮箱的振动:齿轮啮合频率、边频带,都是故障的「指纹」。

你想想看,一个变桨轴承早期出现点蚀,SCADA数据可能完全正常,但高频振动数据里,已经能听到「咔哒咔哒」的冲击信号了。这就是高频数据的价值所在。

核心逻辑图:数据源与诊断层次

SCADA数据 (秒级/分钟级) 高频振动数据 (千赫兹级) 其他数据 (温度、扭矩、风速等) 数据清洗与对齐 大模型异常诊断

图4-1:多源数据融合诊断逻辑

4.3 数据清洗:剔除「脏数据」

数据清洗,是预处理里最磨人的活,但也是最关键的。我见过有人拿一堆「脏数据」直接喂给模型,结果模型学了一堆「如何报假警」。咱们得把好关。

4.3.1 缺失值处理

SCADA系统偶尔会抽风,比如通讯中断、传感器故障,导致数据出现空缺。处理方式有几种:

  • 直接删除:如果缺失比例很小(比如<1%),而且不是连续缺失,直接删掉那几行数据,省事。
  • 插值填充:对于连续变量,比如温度、角度,用前后时刻的平均值或线性插值补上。我常用 pandasinterpolate() 方法。
  • 模型预测填充:对于关键参数,可以用其他相关参数(比如风速、功率)建立回归模型来预测缺失值。这个方法精度高,但计算量大。

我的小技巧: 我曾经处理过一个风场的数据,发现变桨角度在凌晨3点到4点经常缺失。后来排查发现,是那个时间段在做系统维护。这种「有规律」的缺失,直接删除反而比插值更安全,因为插值会引入「假数据」。

4.3.2 异常值处理

异常值,就是那些明显「离谱」的数据。比如变桨角度突然跳到100度,或者电机电流变成负数。这些数据必须处理掉。

我常用的方法:

  1. 3σ原则:假设数据服从正态分布,超过均值±3倍标准差的数据,视为异常。简单粗暴,但有效。
  2. 箱线图法:用四分位数(Q1和Q3)和四分位距(IQR)来界定。超出Q1-1.5*IQR或Q3+1.5*IQR的数据,视为异常。这个方法对非正态分布的数据更鲁棒。
  3. 业务规则过滤:比如变桨角度不可能超过90度,风速不可能超过50m/s(除非是超级台风)。这些规则,比任何统计方法都可靠。

警告: 千万别把「异常值」和「故障特征」搞混了!比如变桨电机电流突然飙升,可能是传感器坏了(异常值),也可能是真的卡住了(故障特征)。我建议,先结合业务规则判断,再用统计方法辅助。拿不准的时候,保留原始数据,打上标签,让大模型自己去学。

4.4 时间戳对齐:让数据「同步」起来

SCADA数据是秒级的,高频振动数据是毫秒级的,甚至微秒级的。它们的时间戳往往对不上。这就好比两个人看表,一个看的是北京时间,一个看的是纽约时间,你说怎么聊?

对齐的方法,说白了就两步:

  • 统一时基:把所有数据的时间戳,都转换成同一个参考时间。我习惯用UTC时间,避免时区问题。
  • 重采样:以SCADA数据的时间点为基准,把高频振动数据「降采样」到同样的时间点。比如,取每个SCADA时间点前后10毫秒内的振动数据,计算其均方根值(RMS)或峰值,作为这个时刻的振动特征。

代码实现起来其实不复杂,我贴一段核心逻辑:

import pandas as pd

# 假设 scada_df 是SCADA数据,vibration_df 是高频振动数据
# 两者都有 'timestamp' 列

# 1. 确保时间戳是datetime类型
scada_df['timestamp'] = pd.to_datetime(scada_df['timestamp'])
vibration_df['timestamp'] = pd.to_datetime(vibration_df['timestamp'])

# 2. 设置时间戳为索引
scada_df.set_index('timestamp', inplace=True)
vibration_df.set_index('timestamp', inplace=True)

# 3. 重采样:将高频振动数据降采样到1秒间隔,取均方根值
vibration_resampled = vibration_df.resample('1S').apply(lambda x: np.sqrt(np.mean(x**2)))

# 4. 按时间戳对齐(左连接,以SCADA时间为准)
aligned_df = scada_df.join(vibration_resampled, how='left')

嗯,这里要注意,重采样的窗口大小和统计量(均值、RMS、峰值等)需要根据你的诊断目标来定。诊断轴承磨损,用RMS值比较合适;诊断齿轮裂纹,峰值因子可能更敏感。这个没有标准答案,得靠经验去试。

总结一下: 数据预处理,就是把「原材料」加工成「标准件」的过程。SCADA数据是基础,高频数据是细节,清洗是去杂质,对齐是统一规格。这一步做好了,后面的大模型才能发挥真正的威力。我曾经在一个项目里,光预处理就花了60%的时间,但模型上线后的准确率,比那些「赶时间」的项目高了整整20个百分点。值不值?你自己品。

专注资料整理