3、数据采集与预处理:SCADA数据字段解析、数据清洗与标准化

大家好,我是老张。在风电行业摸爬滚打了十几年,今天咱们聊聊数据预处理这个环节。说实话,很多刚入行的朋友觉得这步枯燥,总想跳过直接上模型。我年轻时也犯过这毛病,结果模型跑出来全是垃圾——嗯,后来就学乖了。

数据预处理,说白了就是给风机做体检前的准备。你想想看,如果体检报告上数据都是错的,那诊断结果能准吗?所以这一步,咱们得踏踏实实做好。

3.1 SCADA数据字段解析

SCADA系统每10分钟记录一次数据,一天下来就是144条记录。一台风机一年能产生5万多条数据。这么多数据,哪些有用?哪些是噪音?

我个人习惯把SCADA字段分成三类:

  • 状态量:风机运行状态、故障代码、停机原因等。这些是定性描述,告诉你风机在干嘛。
  • 模拟量:风速、转速、功率、温度、振动等。这些是定量数据,是健康评估的核心。
  • 累计量:发电量、运行时间、启停次数等。这些反映风机的历史负荷。

我在项目中遇到过最头疼的事,就是现场工程师把字段名起得五花八门。同一个风速,有的叫"WindSpeed",有的叫"WS_Avg",还有的叫"风速_10min"。所以第一步,先统一字段命名规范。

下面这张图是我常用的SCADA字段解析框架:

SCADA数据字段解析框架 SCADA原始数据 状态量 模拟量 累计量 运行状态 故障代码 停机原因 维护标记 风速/风向 转速/功率 温度/振动 桨距角/偏航 发电量 运行时长 启停次数 电网波动
我的小技巧:拿到SCADA数据后,先花半小时做字段映射表。把现场字段名、标准字段名、单位、数据类型、取值范围都列出来。这半小时,能帮你后面省下半天时间。

3.2 数据清洗——缺失值处理

数据缺失是家常便饭。传感器坏了、通信断了、存储满了,都可能导致数据缺失。我见过最夸张的一次,某风场连续3天的数据全是NaN——后来发现是采集服务器硬盘满了。

缺失值处理,我一般按这个优先级来:

  1. 直接删除:如果缺失比例小于5%,且是随机缺失,直接删掉这行数据。简单粗暴,但有效。
  2. 均值/中位数填充:对于温度、压力等变化平缓的参数,用前后10分钟的平均值填充。我习惯用中位数,因为它不受极端值影响。
  3. 插值法:对于风速、功率等变化较快的参数,用线性插值或样条插值。注意,插值只适合短时间缺失(比如连续缺失不超过3个点)。
  4. 模型预测填充:如果缺失时间较长,我会用同一风场其他风机的数据做回归预测。但这招慎用,搞不好会引入偏差。
注意:千万不要用全局均值填充!我曾经见过有人把-40℃到50℃的温度数据,全用20℃填充——结果模型把低温停机误判为正常状态,差点出大事。

3.3 数据清洗——异常值处理

异常值比缺失值更隐蔽。有些异常一眼就能看出来,比如风速500m/s——这明显是传感器抽风了。但有些异常很狡猾,比如功率曲线上的离群点,你得结合物理规律才能判断。

我常用的异常值检测方法:

  • 3σ原则:数据服从正态分布时,超过均值±3倍标准差的值视为异常。简单,但要求数据分布不能太偏。
  • 箱线图法:用四分位距(IQR)判断。Q1-1.5×IQR以下或Q3+1.5×IQR以上的值视为异常。这个方法对偏态分布更友好。
  • 物理约束法:这是我最推荐的方法。比如风速不能超过切出风速(通常25m/s),功率不能超过额定功率的1.2倍。这些边界值,比任何统计方法都靠谱。

举个例子,下面这段代码是我常用的异常值处理流程:

# 风速异常值处理
def clean_wind_speed(df):
    # 物理约束:风速范围 0-30 m/s
    df = df[(df['wind_speed'] >= 0) & (df['wind_speed'] <= 30)]
    
    # 3σ原则:剔除极端异常
    mean = df['wind_speed'].mean()
    std = df['wind_speed'].std()
    df = df[(df['wind_speed'] >= mean - 3*std) & 
            (df['wind_speed'] <= mean + 3*std)]
    
    return df
避坑指南:我曾经在西北某风场处理数据时,发现凌晨3-5点的风速数据总是偏低。排查后发现是传感器结冰了。所以异常值处理不能只看统计,还得结合现场工况。

3.4 数据标准化与归一化

标准化和归一化,说白了就是把不同量纲的数据拉到同一个尺度上。你想想看,风速是0-30m/s,温度是-40-50℃,振动是0-10mm/s——这些数据直接放一起,模型会优先关注数值大的特征。

我常用的两种方法:

方法 公式 适用场景
Min-Max归一化 X' = (X - Xmin) / (Xmax - Xmin) 数据有明确边界时,比如风速、温度。输出范围[0,1]
Z-score标准化 X' = (X - μ) / σ 数据分布近似正态时,比如振动、功率。输出均值为0,标准差为1

我个人习惯:对于有物理边界的参数(风速、温度、桨距角),用Min-Max归一化。对于统计特征明显的参数(振动、功率波动),用Z-score标准化。

这里有个细节要注意:标准化和归一化的参数(最小值、最大值、均值、标准差)必须从训练数据中计算,然后应用到测试数据上。千万别把测试数据混进来一起算——那叫数据泄露,模型评估结果会虚高。

核心要点:数据预处理不是一次性工作。每次模型迭代后,都要回头检查预处理是否合理。我见过太多人把90%的时间花在调模型上,却忽略了数据质量——结果模型越调越差。

好了,数据采集与预处理这部分就聊到这儿。记住一句话:垃圾进,垃圾出。数据质量决定了模型的天花板,后面的算法只是在逼近这个天花板。所以,踏踏实实把数据洗干净,比什么都重要。


专注资料整理