4、数据预处理:质量控制、异常值检测、空间插值方法
各位同事,咱们直接进入正题。数值预报产品拿到手,第一件事不是急着用,而是先「洗数据」。我见过太多人直接把预报数据扔进调度模型,结果跑出来的功率曲线跟心电图似的——全是毛刺。说白了,原始数据就像刚从地里挖出来的土豆,你得先削皮、去烂、再切块,才能下锅。
4.1 质量控制——给数据做体检
质量控制,我习惯叫它「数据体检」。不是所有预报数据都值得信任。你想想看,一个测风塔在零下30度的冬天冻了一宿,传感器都可能结冰,传回来的数据能准吗?
质量控制主要做三件事:
- 范围检查:风速不可能为负,也不可能超过60m/s(台风除外)。温度在-40℃到50℃之间。超出这个范围,直接标记为无效。
- 时间一致性检查:相邻时刻的风速变化不会太离谱。比如上一小时风速5m/s,下一小时突然跳到25m/s,这大概率是仪器故障。我遇到过某风场连续三天风速恒定在8.2m/s,后来发现是传感器卡死了。
- 空间一致性检查:相邻测风塔的数据应该相互印证。如果A塔报10m/s,B塔报2m/s,而两塔只隔了500米,那肯定有一个出了问题。
核心原则:宁可漏掉一些可疑数据,也不要让坏数据混进来。坏数据对调度决策的误导,比没有数据更可怕。
4.2 异常值检测——揪出那些「捣乱分子」
异常值检测,说白了就是找那些「不合群」的数据点。我常用的方法有三种:
4.2.1 统计方法
最基础的是3σ原则。假设数据服从正态分布,超过均值±3倍标准差的值就是异常。但实际风电数据往往不服从正态分布,所以我更推荐使用箱线图法——把低于Q1-1.5×IQR或高于Q3+1.5×IQR的数据标出来。
# 箱线图法检测异常值(Python示例)
import numpy as np
def detect_outliers_iqr(data):
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = (data < lower_bound) | (data > upper_bound)
return outliers
4.2.2 物理约束法
这个方法更实用。比如风速-功率曲线,理论上风速在切入风速以下时功率应为0。如果预报风速3m/s却报了50%的额定功率,这明显不合理。我曾经在西北某风场排查过一批数据,发现连续三天夜间功率异常偏高,后来查出是SCADA系统时间戳错位了。
4.2.3 机器学习方法
对于大规模数据,可以用孤立森林或LOF(局部异常因子)算法。但说实话,在工程应用中,我建议先用简单方法筛一遍,再用机器学习做精细检测。别一上来就上复杂模型,容易过拟合。
注意:异常值不一定要直接删除。有些异常值其实是极端天气事件(如寒潮、台风)的真实反映。我建议先标记,再根据业务场景决定是保留还是剔除。
4.3 空间插值方法——把「点」变成「面」
数值预报产品通常是网格数据,但风电场的位置往往不在网格点上。空间插值就是解决这个问题的——用已知网格点的值,估算出目标点的值。
4.3.1 最邻近插值
最简单粗暴的方法。直接取离目标点最近的网格点数值。优点是快,缺点是精度低。如果网格分辨率是10km,那误差可能达到几公里,对于地形复杂的风场,这个方法基本不能用。
4.3.2 双线性插值
这是工程中最常用的方法。用目标点周围的四个网格点,按距离加权平均。我做过对比测试,在平坦地形下,双线性插值的误差比最邻近法小30%左右。
# 双线性插值示例
def bilinear_interp(x, y, grid_x, grid_y, grid_val):
# x, y: 目标点坐标
# grid_x, grid_y: 网格坐标
# grid_val: 网格上的数值
# 找到四个邻近网格点
# 按距离加权计算
# 返回插值结果
pass # 具体实现略
4.3.3 克里金插值
这个方法考虑了空间相关性。说白了,就是认为「距离越近的点,数值越相似」。克里金法会计算一个半变异函数,描述不同距离下数据之间的相关性。精度最高,但计算量也最大。我一般只在风电场微观选址时用,日常调度用双线性就够了。
我的经验:对于海上风电场,由于海面平坦,双线性插值效果就很好。但对于山地风场,地形起伏大,我建议用克里金法,或者结合数字高程模型(DEM)做地形修正。
知识体系框架
下面这张图概括了数据预处理的完整流程,你可以把它当作操作手册来看:
嗯,这张图把整个流程串起来了。从原始数据到可用数据,中间必须经过质量控制、异常值检测、空间插值这三道关卡。少一道都不行。
实际应用中的避坑指南
最后,分享几个我踩过的坑:
- 别盲目相信插值结果:有一次我用双线性插值估算一个山谷风场的风速,结果比实测值高了40%。后来发现山谷地形导致局地风场与网格平均风场差异巨大。对于复杂地形,插值后一定要用实测数据验证。
- 注意时间对齐:数值预报的起报时间和风场实测数据的时间戳可能不一致。我曾经因为时区设置错误,把UTC时间当成了北京时间,导致功率预测偏差了8个小时。
- 保留原始数据:预处理后的数据不要覆盖原始数据。我习惯在文件名上加后缀,比如
wind_20240101_raw.nc和wind_20240101_qc.nc。万一处理流程有问题,还能回退。
数据预处理这件事,看起来琐碎,但决定了后续所有工作的质量。你想想看,如果输入的数据都是错的,那后面的功率预测、调度决策能对吗?所以,花时间把数据洗干净,绝对值得。
公众号:蓝海资料掘金营,微信deep3321