3、数据采集与预处理基础
大家好,我是老张,在风电这行摸爬滚打了十几年。今天咱们聊聊数据采集和预处理。说实话,很多运维兄弟觉得这活儿就是“跑脚本、填表格”,没啥技术含量。但我告诉你,数据预处理做不好,后面AI模型再牛也是白搭。我见过太多项目,模型训练出来效果差,最后查来查去,发现是原始数据里一堆脏数据。
说白了,数据预处理就是给AI模型“喂饭”。饭要是馊的,AI肯定拉肚子。咱们一步步来。
3.1 数据采集方式:SCADA、振动、油液、温度
风电场的核心数据源,我归纳为四大类。每一类采集方式都不一样,坑也不一样。
3.1.1 SCADA系统数据
SCADA是风机的“黑匣子”。它记录着风速、功率、转速、桨距角、发电机温度、电网参数等等。采集频率通常是秒级或分钟级。
- 采集方式:通过OPC UA、Modbus TCP等工业协议,从风机主控PLC读取。
- 数据特点:结构化、时间序列、量大。但经常有缺失和异常。
- 我的经验:有一次,某风场SCADA数据里风速一直显示0,但功率却有500kW。我一看就知道是风速仪冻住了。这种数据如果不处理,模型会以为“无风也能发电”,后果很严重。
3.1.2 振动数据
振动数据是判断齿轮箱、轴承、发电机健康状态的关键。采集频率很高,通常在kHz级别。
- 采集方式:加速度传感器(ICP/IEPE类型)安装在轴承座、齿轮箱壳体上。通过数据采集卡(DAQ)或专用CMS系统采集。
- 数据特点:非结构化、高频、数据量大。一个传感器1小时就能产生几百MB数据。
- 避坑指南:我曾经遇到一个项目,振动传感器安装位置不对,导致采集到的信号全是机舱共振,根本不是齿轮箱的真实振动。后来重新打孔安装才解决。所以,传感器安装位置一定要按厂家规范来。
3.1.3 油液数据
油液分析是“血液检测”。通过检测油液中的金属颗粒、水分、粘度等指标,判断齿轮箱磨损程度。
- 采集方式:离线取样送检(传统方式),或者在线油液传感器(实时监测)。
- 数据特点:数据量小,但维度多。常见指标有:铁磁颗粒数、非铁磁颗粒数、水分含量、酸值、粘度等。
- 我的建议:离线取样一定要规范。我见过有人用矿泉水瓶装油样,结果瓶子里有残留水,导致检测结果严重偏差。一定要用专用取样瓶。
3.1.4 温度数据
温度数据看似简单,但能反映很多问题。比如齿轮箱油温异常升高,可能是散热器堵塞或轴承磨损。
- 采集方式:PT100热电阻或热电偶,安装在齿轮箱、发电机、主轴、环境等位置。通过PLC或独立采集模块读取。
- 数据特点:变化缓慢,但容易受环境温度影响。需要做环境补偿。
- 注意:温度传感器容易漂移。我遇到过一台风机,齿轮箱油温一直比同型号其他风机高5度,换了传感器后恢复正常。所以,定期校准传感器很重要。
3.2 数据预处理方法
数据采集回来,不能直接用。预处理是让数据“干净”起来。我常用的方法就三个:缺失值处理、异常值检测、数据归一化。
3.2.1 缺失值处理
SCADA数据里,缺失值很常见。原因可能是通信中断、传感器故障、PLC死机等。
处理方法:
- 删除法:如果缺失比例很小(比如<1%),直接删除该行数据。简单粗暴,但有效。
- 填充法:用均值、中位数、前向填充(用上一个有效值填充)或插值法(线性插值、样条插值)。
- 模型预测法:用其他相关变量预测缺失值。比如用风速和功率的关系,预测缺失的功率值。
3.2.2 异常值检测
异常值就是“离群点”。比如风速突然跳到100m/s,或者功率突然变成负值。这些数据必须剔除。
常用方法:
- 3σ原则:假设数据服从正态分布,超过均值±3倍标准差的数据视为异常。
- 箱线图法:用四分位数(Q1和Q3)计算IQR,超出Q1-1.5IQR或Q3+1.5IQR的数据视为异常。
- 领域知识法:比如风速不可能超过切出风速(通常25m/s),功率不可能超过额定功率的1.2倍。这些硬性阈值最可靠。
3.2.3 数据归一化
归一化就是把不同量纲的数据缩放到同一范围。比如风速是0-25m/s,温度是-20-60℃,如果不归一化,AI模型会认为温度变化不重要。
常用方法:
- Min-Max归一化:将数据缩放到[0,1]区间。公式:x' = (x - min) / (max - min)。
- Z-score标准化:将数据转换为均值为0、标准差为1的分布。公式:x' = (x - μ) / σ。
- Robust标准化:用中位数和IQR代替均值和标准差,对异常值更鲁棒。
代码示例(Python):
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
# 假设df是包含风速、温度、功率的DataFrame
scaler = MinMaxScaler()
df_normalized = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
# 或者用Z-score
scaler = StandardScaler()
df_standardized = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
3.3 知识体系总览
下面这张图,是我自己画的。它把数据采集和预处理的整个流程串起来了。你一看就明白。
嗯,这张图把整个流程讲清楚了。从四种数据源,到预处理三大方法,再到具体实现。你写代码的时候,就照着这个框架来。
最后说一句,数据预处理没有“万能公式”。不同风场、不同机型、不同传感器,坑都不一样。多积累经验,多看看数据分布,慢慢就有感觉了。