第4章:风电项目数据采集与清洗

4.1 数据源识别:你得知道风从哪来

做风电投资决策,第一步不是算账,而是找数据。我见过太多项目,模型建得漂漂亮亮,结果数据源一塌糊涂,最后全白干。

数据源主要分三类:气象、地理、电网。咱们一个一个说。

4.1.1 气象数据

这是最核心的。风速、风向、温度、气压、湿度,缺一不可。我个人习惯优先用中尺度气象数据,比如ERA5、MERRA-2。为什么?因为免费、时间长、覆盖广。

但注意,这些数据分辨率低,大概10-30公里一个格点。你想想看,一个风电场可能就几平方公里,直接用肯定不行。需要降尺度处理,或者结合测风塔数据。

我的经验: 测风塔数据虽然准,但往往只有1-2年。我建议用测风塔数据校准中尺度数据,这样既有精度又有长度。

4.1.2 地理数据

地形、海拔、地表粗糙度、土地利用类型。这些决定了风能不能吹到风机面前。我记得有个项目,选址在丘陵地带,结果实际风速比预测低了15%。后来一查,是地形数据用了30米分辨率,但实际地形变化在10米尺度。

所以,地理数据尽量用高分辨率。SRTM 30米是底线,能用ASTER GDEM或者LiDAR更好。

4.1.3 电网数据

接入点位置、电压等级、线路容量、限电历史。这些直接决定你的电能不能卖出去。我曾经遇到一个项目,风资源极好,但电网接入容量只有50MW,项目规划了100MW。结果?只能弃风。

电网数据可以从当地电网公司公开信息获取,或者用全球电网数据库。但注意,公开数据往往滞后,最好找当地合作伙伴核实。

4.2 缺失值处理:别让数据坑了你

数据采集回来,你会发现总有缺失。测风塔坏了、传感器故障、传输中断,原因很多。怎么处理?

4.2.1 识别缺失模式

先看缺失是随机的还是系统的。随机缺失好办,系统缺失要小心。比如,某个风向传感器只在特定风速下失效,那缺失值就不是随机的。

我一般用pandas的isnull()heatmap可视化缺失模式。代码很简单:

import pandas as pd
import seaborn as sns

df = pd.read_csv('wind_data.csv')
sns.heatmap(df.isnull(), cbar=False)

嗯,这里要注意,如果缺失超过30%,我建议直接放弃这个数据源。补出来的也不可信。

4.2.2 插值方法

对于短时间缺失(比如几小时),线性插值就够了。长时间缺失(几天以上),我推荐用时间序列方法,比如ARIMA或者Prophet。

缺失时长 推荐方法 注意事项
< 6小时 线性插值 简单快速,但可能忽略波动
6小时 - 3天 三次样条插值 平滑性好,适合风速数据
> 3天 ARIMA / Prophet 需要历史数据训练模型
避坑指南: 我曾经用线性插值补了一个月的风速数据,结果模型预测偏差巨大。后来发现那一个月正好是季节转换期,风速变化剧烈。所以,长时间缺失一定要用模型,别偷懒。

4.3 异常值检测:揪出捣乱的数据点

异常值比缺失值更隐蔽。它看起来有数据,但其实是错的。比如,风速突然跳到100m/s,或者温度变成-50°C。这些明显不合理。

4.3.1 物理阈值法

最简单的办法。风速不可能超过60m/s(台风除外),温度不可能超出-40°C到50°C(除非在极端地区)。设定上下限,超出就标记。

我习惯先看数据分布,再定阈值。比如:

# 风速合理范围:0-50 m/s
df = df[(df['wind_speed'] >= 0) & (df['wind_speed'] <= 50)]

4.3.2 统计方法

Z-score和IQR是常用方法。Z-score适合正态分布数据,风速数据往往偏态,所以IQR更常用。

Q1 = df['wind_speed'].quantile(0.25)
Q3 = df['wind_speed'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
df = df[(df['wind_speed'] >= lower) & (df['wind_speed'] <= upper)]

但注意,IQR方法可能把正常的高风速点误判为异常。比如,一个强风天气,风速达到25m/s,这在IQR方法里可能被剔除。所以,我建议结合物理阈值一起用。

4.3.3 机器学习方法

如果数据量大,可以用孤立森林(Isolation Forest)或LOF。我一般在处理多变量异常时用,比如风速、风向、温度一起看。

from sklearn.ensemble import IsolationForest

model = IsolationForest(contamination=0.05)
df['anomaly'] = model.fit_predict(df[['wind_speed', 'wind_dir', 'temp']])
df = df[df['anomaly'] == 1]
核心逻辑: 数据清洗不是越多越好。我见过有人把10%的数据都剔除了,结果模型反而更差。记住,清洗的目的是去除错误,不是减少数据量。

4.4 知识体系总览

下面这张图,是我自己总结的数据采集与清洗流程。你照着做,基本不会出大问题。

风电数据采集与清洗流程 数据源识别 气象 · 地理 · 电网 数据采集 测风塔 · 遥感 · 再分析 缺失值处理 插值 · 模型 · 删除 异常值检测 阈值 · 统计 · ML 数据质量评估 完整性 · 准确性 · 一致性 最终数据集 可用于投资决策分析 反馈修正 图:风电数据采集与清洗核心流程 注意:缺失值和异常值处理可能需要多次迭代

这张图里,我特意加了一个反馈循环。为什么?因为数据清洗不是一次性的。你处理完异常值,可能发现新的缺失模式;补完缺失值,可能又暴露新的异常。所以,多迭代几次,直到数据质量达标。

我的习惯: 每次清洗完,我都会生成一份数据质量报告。包括缺失率、异常率、分布变化等。这样后续分析出了问题,能快速定位是数据问题还是模型问题。

好了,数据采集与清洗就讲到这里。记住,数据是投资决策的基石。你花80%的时间在数据上,剩下20%做模型,结果往往比反过来好得多。


专注资料整理