第1章:数据来源与探索——公开数据集介绍与字段说明

做风电功率预测,第一步不是调模型,而是搞清楚数据从哪来、长什么样。我见过不少新手,上来就怼LSTM,结果数据质量一塌糊涂,折腾半天全是白费功夫。今天咱们就聊聊数据这个地基。

1.1 公开数据集:ELIA与GEFCom2014

业内最常用的两个公开数据集,一个是ELIA,一个是GEFCom2014。我个人习惯把ELIA当作入门首选,GEFCom2014则更适合做算法对比。

ELIA数据集

ELIA是比利时输电系统运营商,他们公开了2015年至今的风电数据。采样频率是15分钟一次,一天96个点。数据量大概在几十万条级别,足够做各种实验了。

核心特点:

  • 时间跨度长:从2015年到现在,覆盖了完整的季节变化
  • 字段完整:风速、风向、温度、气压、实际功率都有
  • 采样稳定:15分钟间隔,几乎没有缺失

GEFCom2014数据集

这是2014年全球能源预测竞赛的数据。采样频率是1小时一次,一天24个点。数据量相对小一些,但胜在标准化程度高,很多论文都用它做基准测试。

我在项目中遇到过一个问题:GEFCom2014的数据只有风速和功率,没有风向和温度。这就导致模型精度上不去。后来我补了ERA5再分析数据,效果才明显提升。所以啊,数据字段的完整性,直接决定了你的天花板。

1.2 数据字段说明

咱们来看看每个字段到底代表什么,以及为什么重要。

字段名 单位 说明 重要性
风速 m/s 轮毂高度处的平均风速 ★★★★★
风向 0-360°,正北为0 ★★★★
温度 环境温度 ★★★
气压 hPa 大气压强 ★★
实际功率 MW 风电场实际输出功率 ★★★★★

你想想看,风速和功率的关系是最直接的。但风向呢?它决定了风机是否处于尾流区。温度会影响空气密度,进而影响功率输出。气压也是同样的道理。

我的小技巧:风向这个字段,千万别直接用0-360的数值喂给模型。我建议拆成sin和cos两个分量,这样能避免0°和360°其实是同一个方向的问题。具体代码:

df['wind_dir_sin'] = np.sin(df['wind_dir'] * np.pi / 180)
df['wind_dir_cos'] = np.cos(df['wind_dir'] * np.pi / 180)

1.3 数据量级与采样频率

数据量级决定了你能用多复杂的模型。采样频率则决定了你能捕捉到多快的变化。

采样频率的影响

ELIA是15分钟采样,GEFCom2014是1小时采样。15分钟的数据能捕捉到湍流和阵风,1小时的数据则更平滑。我建议做短期预测(0-4小时)用15分钟数据,做中期预测(4-24小时)用1小时数据。

为什么会这样?因为风的变化尺度不同。15分钟内的风速变化,主要是湍流引起的。1小时以上的变化,则更多是天气系统驱动的。你想想看,用1小时数据去预测15分钟后的功率,那肯定不准。

数据量级

ELIA数据集大概有30万条记录,GEFCom2014大概有5万条。30万条数据,足够训练一个中等规模的深度学习模型了。但如果你要做超长序列预测,比如用过去72小时的数据预测未来24小时,那数据量可能就不太够。

注意:我曾经在ELIA数据集上踩过一个坑。它的数据虽然连续,但有些时间段因为风机检修,功率会突然降到0。这些异常点如果不处理,模型会学到一个错误的映射关系。所以拿到数据后,第一件事就是做数据清洗。

1.4 知识体系结构图

下面这张图,是我梳理的数据探索核心逻辑。你可以把它当作一个检查清单,每次拿到新数据都过一遍。

风电功率预测数据探索核心流程 数据来源 字段说明:风速、风向、温度、气压、功率 数据量级与采样频率 数据清洗与预处理 特征工程与模型构建 ELIA GEFCom2014 15分钟/1小时 5万-30万条 异常值处理 风向分解

嗯,这张图其实就概括了咱们这一章的核心。从数据来源开始,搞清楚字段含义,再评估数据量级和采样频率,最后才是清洗和特征工程。每一步都踩实了,后面的模型才能跑得稳。

我记得刚入行那会儿,拿到ELIA数据就直接开干,结果模型死活不收敛。后来才发现,数据里有几个月的功率值全是0,因为那段时间风场在升级改造。从那以后,我每次拿到数据都会先画个时间序列图,看一眼全局。

一句话总结:数据探索不是走过场,它决定了你后续所有工作的上限。花80%的时间在数据上,模型只需要20%的时间。

专注资料整理