from pv_forecast.mspf_pv.inference import predict_selected_arrays
prediction_pu = predict_selected_arrays(
package_root, site, power_history, future_raw, elevation, device="cpu"
)
prediction_kw = prediction_pu * capacity_kw
package_root 为本包根目录;site 是 beiliu、jiangmen 或 qingyuan。power_history 形状为 [N,48,7],future_raw 为 [N,16,20],elevation 为 [N,16],返回 [N,16]。样本数和顺序必须一致,N必须大于0。推荐 float32。所有必需输入应为有限数值;上游缺失输入应跳过并记录,不应静默填成0。不要预先标准化 future_raw,模型会使用随权重保存的训练标准化器。
第 j 个输出对应 issue_time + (j+1)*15min,不是历史采样时间。所有输入都必须在 issue_time 已获得。输出时保留 issue_time、forecast_time 和 lead_time_min,不要把不同起报的同一目标时刻混合。
历史网格:issue_time-235min 至 issue_time,每5分钟一个点,共48点。原功率数据可带秒偏移。训练原规则:每个网格点只向前回查5分钟以内的功率;绝不读取晚于网格点的实测。
预处理参考 pv_forecast/deep/build.py:regular_power_history。它对每个历史窗口最多允许5%的缺点,使用该窗口内、起报之前已有历史点插值/端点填充;超过阈值则跳过。若业务要求完全禁止插值,可直接跳过有缺点的窗口,但应记录此接入规则与训练缺失处理的差异。该历史修补规则不是用未来实况填充。
| 列 | 字段 | 来源/计算 |
|---|---|---|
| 0 | power_pu | 实测功率kW / 场站归一化容量kW |
| 1 | delta_power_pu | 相邻5分钟标幺功率差,窗口第一点固定为0 |
| 2 | power_clear_ratio | clip(power_pu / max(clear_sky_ghi/1000,0.05),0,2) |
| 3 | clear_sky_ghi_div1000 | 历史网格对应晴空GHI / 1000 |
| 4 | solar_elevation_div90 | 历史网格对应太阳高度角 / 90 |
| 5 | hour_sin | sin(2π*北京时间日内小时/24) |
| 6 | hour_cos | cos(2π*北京时间日内小时/24) |
后五列由时间、场站经纬度、海拔和 pvlib 计算,原始功率源中不需要自带。solar_features 位于 pv_forecast/features.py,场站参数见 configs/sites.yaml。7列历史张量请严格按上表顺序拼接。
E10-A 使用00/12 UTC两个批次,每个起报选择满足 init_time+8h <= issue_time 的最新批次。8小时是实验中对发布时间和传输延迟的保守假设,不是已实测的接收时刻。生产必须同时检查该文件确实已接收,禁止使用事后才获得的批次;缺少所选批次或预报覆盖不足时应跳过并记录,回退策略不在本包内自动开启。
UTC的00/12时对应北京时间08/20时;在当前8小时可用性规则下,分别最早在北京时间16时/次日04时使用。文件名 YYYYMMDDHH.csv 中的HH是UTC起报小时。
已处理EC文件列:init_time,time,ssrd,tcc,lcc,mcc,hcc,2t,2d,10u,10v。时间字段带UTC时区,time是预报有效时刻。当前数据约定:ssrd为已处理的辐照度 W/m²,云量为0–100百分数,2t/2d为摄氏度,10u/10v为m/s。不能直接把EC原始GRIB累计辐射J/m²、温度K或0–1云量按此契约输入,需要先转换为与训练一致的processed数据。
pv_forecast/ec_latest.py:build_latest_ec_future 实现本模型的最新批次更新和插值。它需要已经含有太阳几何/时间列的 future_raw 模板;不要用未初始化数组调用。目标16个时刻的太阳几何列应先用 solar_features 建好,再调用该函数。
| 序号 | 字段 | 来源/单位 |
|---|---|---|
| 0 | ec_ghi_wm2 | EC辐照度先除以源时刻晴空GHI得到晴空指数,再将该指数插值到目标时刻并乘目标晴空GHI,W/m² |
| 1–4 | ec_tcc / ec_lcc / ec_mcc / ec_hcc | 对应EC云量插值,百分数0–100 |
| 5–6 | ec_t2m_c / ec_d2m_c | EC气温、露点温度插值,摄氏度 |
| 7 | ec_relative_humidity | 由气温T、露点Td计算RH,百分数 |
| 8–9 | ec_u10_ms / ec_v10_ms | EC风分量插值,m/s |
| 10 | ec_wind_speed | sqrt(u²+v²),m/s |
| 11 | ec_clear_sky_index | clip(ec_ghi/max(clear_sky_ghi,20),0,1.5),晴空GHI<1时为0 |
| 12 | ec_lead_hours | (目标有效时刻-init_time)的小时数 |
| 13–14 | solar_elevation / solar_zenith | pvlib计算的目标时刻太阳高度角/天顶角,度;此处不除以90 |
| 15 | clear_sky_ghi | pvlib计算的目标时刻晴空辐照度,W/m²;此处不除以1000 |
| 16–17 | hour_sin / hour_cos | 目标时刻北京时间日内周期编码 |
| 18–19 | dayofyear_sin / dayofyear_cos | 目标时刻北京时间年内周期编码,周期365.25天 |
RH公式:clip(100*exp(17.625*Td/(243.04+Td)-17.625*T/(243.04+T)),0,100)。源EC在其预报有效时间轴上插值是使用已发布预报,允许覆盖晚于issue的目标时间,不是读取未来实测。
elevation另传目标时刻的太阳高度角(度),须与future_raw第13列一致。既有后处理:高度角小于-3°时置0;每个分支及最终融合结果裁剪至[0,1.15]标幺。因此预测允许达到归一化容量的115%,不是100%硬上限。本次交付保留该正式规则。江门4050kW为归一化容量,配置中的4275kW交流额定值不是本模型的标幺分母,不可替换。
样例输出单位为kW,小数3位,北京时间带+08:00。如转MW需除1000,不能只改列名。实际功率不参与推理;评估时另外按目标时间与实测匹配。
本核心包已用三站真实样例验证输出与原E10-A一致,样例和测试资料不随核心包提供。接入时验证自有输入时区、字段顺序、功率/云量/温度/辐射单位和EC可用批次。禁止调用fit或重新拟合scaler。每站整套 .pt、.joblib、场站配置必须配对部署。