第3章:数据采集与预处理

各位同学,今天咱们聊聊风电预测里最基础、也最容易被忽视的一环——数据采集与预处理。

说实话,我见过太多人一上来就调模型、跑算法,结果数据质量一塌糊涂,最后模型效果惨不忍睹。嗯,这就像盖房子不打地基,直接砌墙,早晚要塌。

我个人习惯,拿到一个风电预测项目,至少花40%的时间在数据准备上。别嫌多,这钱花得值。

3.1 SCADA系统介绍

SCADA,全称是Supervisory Control And Data Acquisition,翻译过来就是「监控与数据采集系统」。说白了,它就是风电场的「黑匣子」,记录着风机的一举一动。

我在项目中遇到过,有些同事把SCADA当成一个简单的数据存储工具,其实它远不止如此。SCADA系统通常包含三个层级:

  • 现场层:传感器、PLC(可编程逻辑控制器),负责采集原始信号
  • 通信层:光纤、4G/5G网络,把数据传回中控室
  • 应用层:数据服务器、人机界面,展示和存储数据

你想想看,一台2MW的风机,上面至少有上百个传感器。风速、风向、转速、温度、振动、功率……每秒钟都在产生数据。SCADA系统就是把这些零散的数据整合起来,形成我们可以分析的「数字资产」。

核心要点:SCADA不仅是数据仓库,更是风机的「体检报告」。读懂它,你就能预判风机什么时候会「生病」。

下面这张图,是我自己整理的SCADA数据采集与预处理的知识体系,你可以对照着看:

SCADA数据采集与预处理知识体系 SCADA数据采集 数据采集频率 10分钟均值(标准) 1秒高频(振动分析) 事件触发(报警/停机) 核心数据字段 风速、风向、有功功率 桨距角、偏航角、转速 温度(齿轮箱/发电机/轴承) 数据预处理 缺失值处理 异常值检测与修正 重复值去重 标准化与归一化 Z-score标准化 / Min-Max归一化

3.2 数据采集频率与字段

说到采集频率,这里有个常见的坑。很多风场的SCADA系统默认配置是10分钟一条记录。对于功率预测来说,这个频率基本够用。但如果你要做故障诊断或者短期波动分析,10分钟的数据就太「粗糙」了。

我曾经在一个项目中,客户要求做15分钟超短期预测。我一看数据,全是10分钟均值,根本捕捉不到风速的快速变化。后来我建议他们加装高频采集模块,把风速和功率的采样频率提高到1秒一次,模型效果直接提升了15%。

下面这张表,是我整理的风电预测常用数据字段,你可以直接拿来用:

字段名称 单位 采集频率 说明
风速 m/s 1s / 10min 机舱风速仪测量值
风向 ° 1s / 10min 0-360度,注意北向校准
有功功率 kW 1s / 10min 并网点功率输出
桨距角 ° 1s 叶片角度,0-90度
发电机转速 rpm 1s 高速轴转速
齿轮箱油温 10min 反映机械状态
环境温度 10min 气象站数据
空气密度 kg/m³ 10min 由温度和气压计算

小提示:如果你做的是功率曲线分析,风速和功率的采集时间戳必须严格对齐。我见过不少案例,因为时间戳偏差导致功率曲线「胖」了一圈,根本没法用。

3.3 数据清洗

数据清洗,说白了就是「去伪存真」。SCADA系统采集的数据,质量参差不齐。我见过最夸张的一次,一个风场的数据缺失率高达30%,原因是通信光纤被老鼠咬断了。

3.3.1 缺失值处理

缺失值怎么处理?这得看情况:

  • 连续缺失不超过3个点:用线性插值,简单有效
  • 连续缺失超过10个点:建议直接删除这段数据,别硬补
  • 关键字段缺失:比如风速缺失,可以用相邻风机的数据做相关性插补

我曾经在西北一个风场,遇到风速传感器结冰导致连续12小时数据缺失。这种情况插值就是自欺欺人,我直接把这12小时的数据标记为「不可用」,模型训练时跳过。

3.3.2 异常值检测

异常值检测,我常用的方法有三种:

  1. 3σ原则:超出均值±3倍标准差的数据,视为异常
  2. 箱线图法:超出1.5倍IQR(四分位距)的数据,视为异常
  3. 物理约束法:风速不可能为负,功率不可能超过额定值,这些是硬边界

举个例子,风速出现-5m/s,这明显是传感器故障。功率出现2000kW而额定只有1500kW,这要么是数据标定错误,要么是风机在超发(这种情况很少见)。

注意:别把「正常波动」当成异常。比如风速的瞬时尖峰,可能是阵风造成的,不是数据错误。我曾经有个同事,把台风天的数据全当异常删了,结果模型在极端天气下完全失效。

3.3.3 重复值处理

重复值相对简单。SCADA系统偶尔会因为通信重传导致重复记录。我的做法是:

  • 按时间戳排序,检查是否有完全相同的记录
  • 如果有,保留第一条,删除后续重复
  • 注意:时间戳相同但数值不同,可能是数据冲突,需要人工判断

3.4 数据标准化与归一化

这一步,很多新手容易忽略。你想想看,风速是0-30m/s,功率是0-2000kW,温度是-20到50℃。这些量纲完全不同,直接扔进模型,数值大的特征会「吃掉」数值小的特征。

常用的方法有两种:

方法 公式 适用场景
Z-score标准化 x' = (x - μ) / σ 数据近似正态分布,有异常值
Min-Max归一化 x' = (x - min) / (max - min) 数据有明确边界,如功率、角度

我个人习惯,风速和功率用Min-Max归一化,因为它们的物理边界很清晰。温度和振动信号用Z-score标准化,因为这些数据经常有离群点。

下面是一个简单的Python代码示例,你可以直接拿去用:

import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 读取数据
df = pd.read_csv('wind_turbine_data.csv')

# Z-score标准化(适用于温度、振动)
scaler_std = StandardScaler()
df['temp_scaled'] = scaler_std.fit_transform(df[['gear_oil_temp']])

# Min-Max归一化(适用于风速、功率)
scaler_mm = MinMaxScaler(feature_range=(0, 1))
df['wind_scaled'] = scaler_mm.fit_transform(df[['wind_speed']])
df['power_scaled'] = scaler_mm.fit_transform(df[['active_power']])

print('预处理完成,数据范围:[0, 1]')

避坑指南:标准化和归一化的参数(均值、标准差、最小值、最大值)一定要用训练集计算,然后应用到测试集。我曾经见过有人对整个数据集做标准化,结果模型在线上部署时完全跑偏,因为新数据的分布和整体分布不一样。

好了,这一章的内容就到这里。数据预处理是风电预测的「基本功」,看似简单,但细节决定成败。下一章我们会聊特征工程,到时候你会感谢今天认真清洗数据的自己。


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