4、数据采集与预处理:SCADA数据源、高频振动数据、数据清洗(缺失值、异常值)、时间戳对齐
好,咱们进入正题。数据采集和预处理,说白了就是给大模型「喂饭」。饭要是馊了,模型再厉害也白搭。我在风电现场摸爬滚打这些年,见过太多因为数据没处理好,导致诊断模型「睁眼瞎」的案例。这一节,我就把压箱底的经验掏出来,跟你聊聊怎么把这顿饭做干净、做标准。
4.1 SCADA数据源:变桨系统的「体检报告」
SCADA系统,你肯定不陌生。它每隔几秒或几分钟,就会记录下风机的各种状态。对于变桨系统,我重点关注这几个参数:
- 桨叶角度:三支桨叶的实际角度和给定角度。偏差大了,说明有问题。
- 变桨电机电流:电机干活累不累,看电流就知道。电流异常波动,往往是卡涩或电气故障的前兆。
- 变桨速度:响应快不快,顺不顺畅。
- 液压系统压力:对于液压变桨,压力是命根子。
- 电池电压/超级电容电压:后备电源的健康状况,关键时刻能救命。
我个人习惯,拿到SCADA数据后,第一件事不是分析,而是先看一眼数据采集频率。有的风场是1秒采一次,有的是10秒。频率不同,能捕捉到的故障特征也不同。嗯,这里要注意,千万别把不同频率的数据直接混在一起用。
4.2 高频振动数据:捕捉「心跳」的细节
SCADA数据像心电图,能看出大问题。但想诊断早期故障,比如轴承磨损、齿轮裂纹,就得靠高频振动数据了。这玩意儿采样率动辄几千甚至上万赫兹,能捕捉到微米级的振动。
我建议,高频数据重点关注两个地方:
- 变桨轴承的振动:安装在轴承座附近,直接感受桨叶传递过来的载荷变化。
- 变桨齿轮箱的振动:齿轮啮合频率、边频带,都是故障的「指纹」。
你想想看,一个变桨轴承早期出现点蚀,SCADA数据可能完全正常,但高频振动数据里,已经能听到「咔哒咔哒」的冲击信号了。这就是高频数据的价值所在。
核心逻辑图:数据源与诊断层次
图4-1:多源数据融合诊断逻辑
4.3 数据清洗:剔除「脏数据」
数据清洗,是预处理里最磨人的活,但也是最关键的。我见过有人拿一堆「脏数据」直接喂给模型,结果模型学了一堆「如何报假警」。咱们得把好关。
4.3.1 缺失值处理
SCADA系统偶尔会抽风,比如通讯中断、传感器故障,导致数据出现空缺。处理方式有几种:
- 直接删除:如果缺失比例很小(比如<1%),而且不是连续缺失,直接删掉那几行数据,省事。
- 插值填充:对于连续变量,比如温度、角度,用前后时刻的平均值或线性插值补上。我常用
pandas的interpolate()方法。 - 模型预测填充:对于关键参数,可以用其他相关参数(比如风速、功率)建立回归模型来预测缺失值。这个方法精度高,但计算量大。
我的小技巧: 我曾经处理过一个风场的数据,发现变桨角度在凌晨3点到4点经常缺失。后来排查发现,是那个时间段在做系统维护。这种「有规律」的缺失,直接删除反而比插值更安全,因为插值会引入「假数据」。
4.3.2 异常值处理
异常值,就是那些明显「离谱」的数据。比如变桨角度突然跳到100度,或者电机电流变成负数。这些数据必须处理掉。
我常用的方法:
- 3σ原则:假设数据服从正态分布,超过均值±3倍标准差的数据,视为异常。简单粗暴,但有效。
- 箱线图法:用四分位数(Q1和Q3)和四分位距(IQR)来界定。超出Q1-1.5*IQR或Q3+1.5*IQR的数据,视为异常。这个方法对非正态分布的数据更鲁棒。
- 业务规则过滤:比如变桨角度不可能超过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个百分点。值不值?你自己品。