第三届世界科学智能大赛新能源赛道:新能源发电功率预测-数据处理心得体会1
看懂数据
比赛数据说明:
文档(报名之后可以下载) | 大小 | 操作 |
---|---|---|
初赛测试集.zip | 94MB | 下载 |
初赛训练集.zip | 632MB | 下载 |
output.zip | 145KB | 下载 |
任务和主题
AI新能源功率预报:根据历史发电功率数据和对应时段多类别气象预测数据,实现次日零时起到未来24小时逐15分钟级新能源场站发电功率预测。
比赛数据
1.气象数据
比赛输入数据来自三个不同的气象预报数据,数据格式为nc,共8个变量,需要注意气象源NWP_2的变量与另外两个稍有不同。气象变量说明见下文。每个文件是第二天北京时间0点开始的未来24小时气象预报,时间间隔1小时,文件名的日期表示预报发布日期,如20240101.nc是2024年1月1日发布的,对1月2日的预报。每个输入文件有5个维度,time,channel,hour,lat,lon。
time表示数据第一个时刻,为世界时;channel为变量,共8维;hour为从起始时间到预报时间的时间间隔,数值为0~23;lat为纬度,数值从小到大为从北向南排列;lon为经度,数值从小到大为从西向东排列。这里经纬度数值仅代表相对关系,中心点为离场站最近的点。
参赛队伍可以不使用全部气象源的全部变量做为输入。
2.场站实发功率
比赛目标数据来自10个新能源场站的归一化处理后的实发功率,其中包含5个风电场站和5个光伏场站。编号1-5为风电场,6-10为光伏电场。数据时间为北京时间,数据时间间隔为15分钟。需要注意数据中偶有空值、死值等异常值。
气象变量说明:
气象源1(NWP_1)、气象源3(NWP_3): [u100
, v100
, t2m
, tp
, tcc
, sp
, poai
, ghi
], 气象源2(NWP_2): [u100
, v100
, t2m
, tp
, tcc
,msl
,poai
,ghi
]
变量 | 描述 | 单位 |
---|---|---|
u100 | 100米高度纬向风 | m/s(米/秒) |
v100 | 100米高度经向风 | m/s(米/秒) |
t2m | 2米气温 | K(开尔文) |
tp | 总降水量 | m(米) |
tcc | 总云量 | (0 - 1) |
sp | 地面气压 | Pa(帕斯卡) |
poai | 光伏面板辐照度 | W/m²(瓦/平方米) |
ghi | 水平面总辐照度 | W/m²(瓦/平方米) |
msl | 海平面气压 | Pa(帕斯卡) |
初赛训练集和测试集:
数据集 | 时间范围 | 空间范围 | 时间分辨率 |
---|---|---|---|
TrainA | 20240101 ~ 20241231 | 场站周边 11x11 个格点 | 1h |
TestA | 20250101 ~ 20250228 | 场站周边 11x11 个格点 | 1h |
复赛训练集和测试集:
数据集 | 时间范围 | 空间范围 | 时间分辨率 |
---|---|---|---|
TrainB | 20240101 ~ 20250228 | 场站周边 11x11 个格点 | 1h |
TestB | 20250301 ~ 20250430 | 场站周边 11x11 个格点 | 1h |
比赛数据分析
总体思想:结果时序模型输入一般都是 [B* T*feature]三维 ,但是这个拓展了两个维度,把多的这两维处理好就能顺利放入时序模型了 。
1.文件结构
Input/
├── 1/
│ ├── NWP_1/
│ │ ├── 20240101.nc
│ │ ├── 20240102.nc
│ │ └── ...
│ ├── NWP_2/
│ ├── NWP_3/
├── 2/
├── ...
Output/
├── output1.csv
├── output2.csv
3个气象源
1个站点 - 对应3个不同机构的气象源数据 NWP_1,NWP_2,NWP_3
baseline中只用了NWP_1
我们需要将3个气象源都利用起来
简单办法,把NWP_1,NWP_2,NWP_3 属性都连起来 一个NWP有8个气象特征,
连起来后我们的特征维度8*3=24
5个维度
每个输入文件有5个维度,time,channel,hour,lat,lon
from netCDF4 import Dataset
import numpy as np
import pandas as pdnc_path = "data/初赛训练集/nwp_data_train/1/NWP_1/20240101.nc"
dataset = Dataset(nc_path, mode='r')
dataset.variables.keys()
输出结果 dict_keys(['time', 'channel', 'data', 'lat', 'lon', 'lead_time'])
time表示数据第一个时刻,为世界时;channel为变量,共8维;hour为从起始时间到预报时间的时间间隔,数值为0~23;lat为纬度,数值从小到大为从北向南排列;lon为经度,数值从小到大为从西向东排列。这里经纬度数值仅代表相对关系,中心点为离场站最近的点。
需要通过
time 起始时间到预报时间间隔
hour = lead_time
data.shape == [1, 8, 24, lat, lon]
^ ^ ^
| | └── lead_time: 0~23 小时
| └── channel: 8 个变量(如 u100, v100...)
└── time: 通常只有 1(仅起始时间)
把channel 和11*11站点数据处理成 2维度
trick:
归一化 Y
对 Y 做归一化(通常归一到 [0, 1])在回归预测任务中是非常常见、有效且标准的做法,尤其是在风电/光伏功率预测这类 尺度不一、目标动态范围大的任务 中,它能带来诸多优势。
原因 | 说明 |
---|---|
🎯 稳定模型训练 | 避免目标值过大导致梯度爆炸或收敛缓慢 |
📏 对抗单位不一致 | 输入是归一化气象数据,Y 不归一会尺度失衡 |
📉 提高预测精度 | 模型学的是“相对变化”,更好拟合归一化目标 |
📐 通用性更强 | 方便多场站间 transfer(特别是单位不同的场站) |
实践中常用方法
1. 归一化到 [0, 1]:
y_max = fact_df["value"].max() y = y / y_max
✔️ 最常用!方便训练、预测后乘回来
2. 保存归一化参数用于反归一:
self.y_max = y_max # 推理时: y_pred * y_max
真实场景中是否有效?
以光伏/风电预测为例:
-
几乎所有 top 比赛/论文/产品系统都使用 Y 归一化策略
-
典型例子:阿里天池光伏预测挑战赛、SGCC 风电短期预测项目
总体流程
阶段 | 动作 |
---|---|
加载 Y | 清洗负值,小于阈值置零 |
拟合 Y | 归一化到 [0, 1],保存 y_max |
推理后 | 模型输出 * y_max,恢复原单位 |
归一化 Y 是“回归问题中”的行业标准做法,尤其在新能源功率预测任务中对收敛速度和泛化能力都有显著提升效果。