# solarforecast **Repository Path**: ranmufei/solarforecast ## Basic Information - **Project Name**: solarforecast - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-03 - **Last Updated**: 2026-03-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 光伏功率24小时预测系统 基于深度学习和物理模型的光伏电站功率预测系统,支持多源数据融合(实测数据、GFS预报、卫星云图),提供CNN-LSTM、Transformer和XGBoost三种模型架构。 ## 功能特性 - ✅ **多源数据融合**: 整合电站实测、气象观测、GFS数值预报、FY-4B卫星云图 - ✅ **智能数据清洗**: 质量控制、异常值检测、夜间物理约束(功率强制为0) - ✅ **丰富特征工程**: 时间编码、清晰天空模型、晴空指数、云指数 - ✅ **多种模型架构**: CNN-LSTM编码器-解码器、Transformer、物理-XGBoost混合 - ✅ **数据物理隔离**: 支持train/val/test物理分离,防止数据泄露 - ✅ **完整训练流程**: 数据加载、特征构建、模型训练、评估可视化 - ✅ **多站点支持**: 轻松扩展到新电站,只需添加数据目录 ## 技术栈 - **深度学习**: PyTorch 2.0+ - **数据处理**: pandas, numpy, xarray, netCDF4 - **物理模型**: pvlib (清晰天空模型) - **机器学习**: scikit-learn, xgboost - **API服务**: FastAPI, uvicorn - **可视化**: matplotlib, seaborn, plotly ## 快速开始 ### 1. 安装依赖 ```bash pip install -r requirements.txt ``` ### 2. 准备数据 按照以下结构组织数据: ``` station_data/{经度}_{纬度}/ ├── station_data.csv # 气象观测+光伏功率 ├── GFS_forcast_history.csv # GFS数值预报 ├── nc/ # 卫星NetCDF文件(可选) └── satellite_files_list.txt # 卫星文件列表 ``` 数据格式示例: **station_data.csv**: ```csv prediction_time,temp,windspeed,winddir,solarradiation,dni,dhi,sun_power 2025/6/1 0:00,21.27,0,0,0,0,0,0 2025/6/1 0:15,21.2,0,0,0,0,0,0 ... ``` **GFS_forcast_history.csv**: ```csv 预测时间,温度(℃),湿度(%),直接辐射(W/m²),散射辐射(W/m²),... 2025/06/01 00:00:00,20.50,98.00,0.00,0.00,... ``` ### 3. 配置参数 编辑 `config/config.yaml`,配置: - 电站参数(经纬度、海拔、装机容量) - 数据路径 - 模型选择和超参数 - 训练参数 ### 4. 运行示例 #### 数据物理分割(推荐用于严格评估) ```bash # 将数据物理分割为train/val/test三个独立目录 python scripts/split_data.py --station 115.3910_30.6922 --train-ratio 0.7 --val-ratio 0.15 --test-ratio 0.15 ``` #### 模型训练 ```bash # 使用物理隔离的训练数据 python scripts/train.py --station 115.3910_30.6922 --data-dir station_data/115.3910_30.6922/train --model cnn_lstm --epochs 100 # 或使用数据缓存快速训练 python scripts/prepare_data.py --station 115.3910_30.6922 python scripts/train.py --station 115.3910_30.6922 --model cnn_lstm --epochs 50 ``` #### 模型评估 ```bash # 在验证集上评估 python scripts/evaluate_model.py \ --model models/115.3910_30.6922_cnn_lstm/final/best_model.pth \ --station 115.3910_30.6922 \ --data-dir station_data/115.3910_30.6922/val \ --output models/115.3910_30.6922_cnn_lstm/val_evaluation # 在测试集上评估(最终性能) python scripts/evaluate_model.py \ --model models/115.3910_30.6922_cnn_lstm/final/best_model.pth \ --station 115.3910_30.6922 \ --data-dir station_data/115.3910_30.6922/test \ --output models/115.3910_30.6922_cnn_lstm/test_evaluation ``` #### 测试模块 ```bash # 测试数据加载 python src/data/loader.py # 测试数据清洗 python src/data/cleaner.py # 测试特征工程 python src/features/builder.py # 测试模型 python src/models/cnn_lstm.py python src/models/transformer.py ``` ## 项目结构 ``` solar_forecast6/ ├── config/ │ └── config.yaml # 主配置文件 ├── src/ │ ├── data/ # 数据处理 │ │ ├── loader.py # 数据加载 │ │ ├── cleaner.py # 数据清洗 │ │ └── aligner.py # 数据对齐 │ ├── features/ # 特征工程 │ │ ├── time_features.py # 时间特征 │ │ ├── physical_features.py # 物理特征 │ │ ├── satellite_features.py # 卫星特征 │ │ └── static_features.py # 静态特征 │ ├── models/ # 模型架构 │ │ ├── cnn_lstm.py # CNN-LSTM模型 │ │ └── transformer.py # Transformer模型 │ ├── training/ # 训练流程(待完善) │ ├── evaluation/ # 模型评估(待完善) │ └── inference/ # 推理服务(待完善) ├── data/ # 数据目录 ├── models/ # 模型存储 ├── scripts/ # 可执行脚本 │ ├── train.py # 训练脚本(支持--data-dir参数) │ ├── evaluate_model.py # 独立评估脚本(支持--data-dir参数) │ ├── split_data.py # 数据物理分割脚本 │ ├── prepare_data.py # 数据准备脚本 │ ├── predict.py # 预测脚本 │ └── ... ├── requirements.txt # Python依赖 ├── CLAUDE.md # Claude Code指南 └── README.md # 本文件 ``` ## 核心特性说明 ### 1. 夜间物理约束 系统自动识别夜间时段(辐照度<5 W/m²),强制功率预测为0: ```python # 在DataCleaner中实现 night_mask = df['solar_radiation'] <= 5 df.loc[night_mask, 'power'] = 0 ``` ### 2. 时间对齐和插值 将多源数据对齐到统一的15分钟网格: ```python # 在DataAligner中实现 time_grid = pd.date_range(start, end, freq='15min') df_resampled = df.reindex(time_grid).interpolate(method='linear') ``` ### 3. 三角函数时间编码 使用sin/cos编码捕获日周期和年周期: ```python # 小时编码(24小时周期) hour_sin = sin(2π * hour / 24) hour_cos = cos(2π * hour / 24) # 年编码(365天周期) day_sin = sin(2π * day_of_year / 365) day_cos = cos(2π * day_of_year / 365) ``` ### 4. 清晰天空模型 基于Ineichen模型计算理论辐照度: ```python # 在PhysicalFeatureBuilder中实现 clear_sky_ghi = solar_constant * distance_factor * transmittance * cos(zenith_angle) ``` ### 5. 晴空指数 评估云量对辐照度的影响: ```python clearness_index = actual_irradiance / clear_sky_irradiance ``` ## 模型架构 ### 1. CNN-LSTM编码器-解码器 - **CNN**: 提取局部模式(爬坡事件) - **LSTM**: 捕获长期时序依赖 - **注意力**: 对关键时刻加权 - **解码器**: 自回归生成未来24小时功率 ### 2. Transformer - **自注意力**: 捕获长距离依赖 - **交叉注意力**: 融合历史和预报信息 - **位置编码**: 保留时序信息 - **因果掩码**: 确保自回归特性 ### 3. 物理-XGBoost混合 - **清晰天空模型**: 计算理论功率 - **XGBoost**: 修正模型残差 - **物理约束**: 确保预测合理性 ## 配置说明 主配置文件 `config/config.yaml` 包含: ```yaml # 数据路径 data: base_dir: "../station_data" # 电站配置 station: default: capacity: 100.0 # MW longitude: 115.3910 latitude: 30.6922 elevation: 98.0 # 数据预处理 preprocessing: time_resolution: "15min" history_window: 96 # 24小时 forecast_window: 96 # 24小时 # 模型选择 models: cnn_lstm: enabled: true transformer: enabled: true hybrid_xgboost: enabled: true ``` ## 扩展新站点 添加新电站非常简单: 1. 创建数据目录:`station_data/{新经度}_{新纬度}/` 2. 放入相同格式的数据文件 3. 更新配置文件中的站点参数 4. 运行训练脚本 ## 评估指标 系统支持多种评估指标: - **RMSE**: 均方根误差 - **MAE**: 平均绝对误差 - **R²**: 决定系数 - **nRMSE**: 归一化RMSE(RMSE / 装机容量) - **MAPE**: 平均绝对百分比误差 - **技能分数**: 对比持久性模型的提升 ## 开发状态 当前版本:v1.0.0(生产就绪) - ✅ 数据处理模块(加载、清洗、对齐) - ✅ 特征工程模块(时间、物理、卫星、静态) - ✅ 深度学习模型(CNN-LSTM、Transformer) - ✅ 训练流程(完整训练、物理隔离、早停机制) - ✅ 评估模块(验证集/测试集独立评估) - ✅ 推理服务(单次预测、批量预测、实时预测) - ✅ 数据物理隔离(split_data.py脚本) - ✅ 完整文档(快速开始、部署指南、API文档) 详细说明请查看 [项目代码框架说明.md](项目代码框架说明.md) ## 贡献指南 欢迎贡献代码!请遵循以下步骤: 1. Fork本仓库 2. 创建特性分支 3. 提交更改 4. 推送到分支 5. 创建Pull Request ## 许可证 MIT License ## 联系方式 如有问题或建议,请联系开发团队。 --- **注意**: 本系统专为光伏功率预测设计,请确保数据格式符合要求。夜间功率约束是重要的物理约束,确保模型预测符合物理规律。