ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LSTM光伏功率预测实战:Python源码与储能调度全流程解析

LSTM光伏功率预测实战:Python源码与储能调度全流程解析 简介本资源为基于LSTM的短期光伏预测算法Python实现包面向计算机、人工智能、通信工程、自动化等专业的在校学生、教师及企业员工也适合作为毕设、课程设计或项目立项的参考方案帮助解决光伏出力短期预测这一典型时序建模问题。压缩包共11个文件约3.89MB以6个ipynb交互式笔记本为核心配合1个py脚本、1个xlsx数据集、1个txt使用说明及png、jpg图示覆盖数据读取、模型搭建、训练与预测的完整流程。内容围绕园区实际数据展开包含光伏预测单变量与多变量实验、负荷预测LSTM对比、规则集与储能框架模拟等模块便于读者理解LSTM在新能源预测中的建模思路与调参方法。目前已有248人学习下载适合希望快速上手时序预测、在此基础上修改扩展功能的进阶学习者。1. 光伏功率预测的 LSTM 落地这份源码包到底能跑出什么园区光伏最头疼的不是发电效率而是「下一小时能发多少」——报多了被考核报少了储能白充。这套基于 LSTM 的短期光伏预测算法 python 源码加数据集解决的就是把历史发电、气象、负荷数据喂进 LSTM输出未来一段时间的功率预测值。包里既有单变量版本也有多变量版本还额外带了一套基于规则集的储能调度 notebook等于把「预测」和「预测完怎么用」两件事都摆出来了。适合计算机、人工智能、自动化方向的在校生做课程设计或毕设也适合刚接触 lstm 时间序列预测 python 实现的工程师拿来当可运行基线。它不是论文复现级别的 SOTA而是一份能跑通、能改、能当脚手架用的工程代码。2. 拆包看结构哪些 notebook 是主线哪些是配菜2.1 文件清单与职责划分拿到压缩包先别急着跑把目录过一遍能省掉后面一半的返工。这个包的文件命名比较随意但按功能能分成四类文件类型作用用园区的数据测试光伏预测-Copy1.ipynb主线多变量光伏预测含完整训练与评估用园区的数据测试光伏预测-单变量.ipynb主线单变量光伏预测适合入门对照用园区的数据测试负荷预测LSTM.ipynb主线负荷侧预测与光伏预测互为参照基于规则集的.ipynb配菜规则集储能调度依赖预测结果模拟程序.ipynb / 模拟程序-Copy1.ipynb配菜整体流程模拟串联预测与调度clearoutside_url.py工具气象数据抓取脚本SOC_1101-1107.xlsx数据储能荷电状态一周粒度规则集-第一版.png / 储能框架 / 0.jpg参考规则集与储能框架的图示说明使用说明.txt文档环境与运行提示主线是三个预测 notebook配菜是储能调度和模拟程序。如果你的目标只是「跑通一个 LSTM 光伏预测」盯住用园区的数据测试光伏预测-Copy1.ipynb就够了如果要做完整的光储联合调度演示才需要把规则集和模拟程序一起拉进来。2.2 环境依赖与版本对齐这类 notebook 最常见的翻车不是算法错而是环境版本对不上。包里没有 requirements.txt得自己根据 import 反推。常见做法是先建一个干净的虚拟环境再按下面这套装# 建虚拟环境python 3.8~3.10 兼容性最好 python -m venv pv_lstm source pv_lstm/bin/activate # Windows 用 pv_lstm\Scripts\activate # 核心依赖版本区间是踩坑后比较稳的组合 pip install numpy1.23.5 pip install pandas1.5.3 pip install scikit-learn1.2.2 pip install tensorflow2.11.0 # 若 notebook 用的是 keras 独立包改装 keras pip install matplotlib3.7.1 pip install openpyxl3.1.2 # 读 xlsx 必需 pip install jupyter逻辑说明numpy 和 pandas 锁在 1.23/1.5 是因为再高的版本对 tensorflow 2.11 有 ABI 冲突openpyxl 必须装否则pd.read_excel读 SOC 文件会直接报错。参数上tensorflow 选 2.11 是因为它同时支持 CPU 和较老的 CUDA如果你机器没有独显CPU 版跑这份数据量完全够。装完先python -c import tensorflow as tf; print(tf.__version__)验证一下别等到 notebook 跑到一半才发现 import 失败。2.3 数据读取与字段确认打开主线 notebook第一个 cell 通常是读数据。园区的数据一般长这样时间戳、辐照度、温度、湿度、历史功率。读进来之后先别急着建模做三件事——看时间列是不是 datetime、看有没有缺失值、看功率列的量纲。import pandas as pd import numpy as np # 读园区数据注意时间列解析 df pd.read_excel(园区数据.xlsx, parse_dates[时间]) df df.sort_values(时间).reset_index(dropTrue) # 缺失值检查与简单前向填充 print(df.isnull().sum()) df df.fillna(methodffill).fillna(methodbfill) # 确认功率列范围判断是否需要归一化 print(df[功率].describe())逻辑说明parse_dates把时间列转成 datetime后面做滑动窗口才不会有类型错误ffill前向填充是光伏数据的常规操作因为夜间功率本来就是 0用均值填反而会污染。参数上describe()看的是功率的 min/max如果最大值到几千而辐照度只有几百说明量纲差异大必须归一化否则 LSTM 会被大数值主导。这一步做完数据才算真正可用。3. LSTM 建模全流程从滑动窗口到训练收敛3.1 滑动窗口构造与归一化LSTM 吃的是序列不是单点。短期光伏预测的核心是把过去 N 个时刻的特征拼成一个窗口预测下一个时刻的功率。窗口长度是这份代码里最需要调的参数之一。from sklearn.preprocessing import MinMaxScaler # 选特征列单变量只留功率多变量加上辐照度温度 features [功率, 辐照度, 温度] data df[features].values # 归一化到 0-1LSTM 对量纲敏感 scaler MinMaxScaler() data_scaled scaler.fit_transform(data) # 构造滑动窗口look_back 是回看步数 def create_dataset(data, look_back24): X, y [], [] for i in range(len(data) - look_back): X.append(data[i:ilook_back, :]) y.append(data[ilook_back, 0]) # 预测功率列 return np.array(X), np.array(y) look_back 24 # 24 步若 15 分钟粒度即 6 小时 X, y create_dataset(data_scaled, look_back) print(X.shape, y.shape)逻辑说明look_back24是这份代码的默认回看长度对应 15 分钟采样下的 6 小时历史。参数怎么改——如果你的数据是小时粒度24 就是一天比较合理如果是分钟粒度24 太短建议拉到 96 或 144。y只取第 0 列功率是因为预测目标就是功率其他特征只作为输入。归一化必须用fit_transform在训练集上拟合测试集要用同一个 scaler 的transform否则会数据泄漏这是新手最容易忽略的坑。3.2 网络结构与编译参数这份代码用的是标准 Keras Sequential 堆 LSTM结构不复杂但每层的参数都有讲究。from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout model Sequential() # 第一层 LSTMreturn_sequencesTrue 才能接下一层 LSTM model.add(LSTM(64, return_sequencesTrue, input_shape(look_back, X.shape[2]))) model.add(Dropout(0.2)) # 第二层 LSTM只输出最后时刻 model.add(LSTM(32, return_sequencesFalse)) model.add(Dropout(0.2)) # 全连接输出单值 model.add(Dense(1)) model.compile(optimizeradam, lossmse, metrics[mae]) model.summary()逻辑说明第一层return_sequencesTrue是关键不设的话第二层 LSTM 会因为维度不匹配直接报错。input_shape是(look_back, 特征数)特征数由前面的 features 决定单变量就是 1。Dropout 0.2 是防过拟合的常规值光伏数据噪声大不加 Dropout 训练集 loss 会掉得很快但验证集不降。优化器用 adam学习率默认 0.001如果 loss 震荡厉害可以降到 0.0005。lossmse对应回归任务评估指标加个 mae 方便看平均绝对误差。3.3 训练、早停与预测还原训练阶段要加 EarlyStopping不然容易过拟合到深夜的零功率段。from tensorflow.keras.callbacks import EarlyStopping # 按 8:2 切训练测试时间序列不能 shuffle split int(len(X) * 0.8) X_train, X_test X[:split], X[split:] y_train, y_test y[:split], y[split:] early_stop EarlyStopping(monitorval_loss, patience10, restore_best_weightsTrue) history model.fit( X_train, y_train, epochs100, batch_size32, validation_split0.1, callbacks[early_stop], verbose1 ) # 预测并反归一化 pred model.predict(X_test) # 因为 scaler 是对多列拟合的反归一化要拼回原维度 pred_inv scaler.inverse_transform( np.concatenate([pred, np.zeros((len(pred), X.shape[2]-1))], axis1) )[:, 0]逻辑说明时间序列切分绝对不能 shuffleX[:split]保证训练集在前、测试集在后符合真实预测场景。patience10表示验证 loss 连续 10 轮不降就停restore_best_weightsTrue保证拿到的是最优轮次的权重而不是最后一轮。反归一化这里有个细节——scaler 是对多列拟合的直接inverse_transform(pred)会维度不匹配所以要拼回原特征数再取第 0 列。这一步不做预测值全是 0 到 1 之间的小数画出来跟真实功率差几个数量级。4. 避坑与排查跑不通时先看这几条4.1 现象notebook 一运行就报 shape 不匹配原因input_shape里的特征数和实际数据列数对不上或者return_sequences设错。常见于单变量和多变量 notebook 混着改的时候。解决在create_dataset后打印X.shape确认第三维等于你选的 features 数量第一层 LSTM 必须return_sequencesTrue最后一层 LSTM 必须return_sequencesFalse中间层随意但要保证维度连贯。4.2 现象loss 一直是 nan原因数据里有 inf 或极端异常值归一化后仍然溢出或者学习率太高。解决读数据后加一句df df.replace([np.inf, -np.inf], np.nan).dropna()学习率从 0.001 降到 0.0005 试检查功率列有没有负值光伏功率不该为负负值可能是传感器错误。4.3 现象预测曲线整体平移形状对但数值偏原因反归一化时用了错误的 scaler或者测试集归一化时重新 fit 了。解决确认测试集用的是训练集的 scaler即scaler.transform而不是fit_transform反归一化时拼回的零列数量要等于特征数-1多一列少一列都会错位。4.4 现象读 xlsx 报 openpyxl 缺失原因pandas 读 Excel 依赖 openpyxl环境里没装。解决pip install openpyxl版本 3.1 以上如果还报错检查文件是不是真的 xlsx 而不是改了后缀的 xls。4.5 现象训练极慢或内存爆掉原因look_back设太大或者 batch_size 太小导致 step 数暴涨。解决look_back先设 24 跑通再往上加batch_size 从 32 起显存/内存够可以到 64数据量不大时用 CPU 反而比 GPU 稳避免 CUDA 版本折腾。5. 从预测到调度规则集与储能框架怎么接5.1 规则集 notebook 的输入输出基于规则集的.ipynb不是预测模型而是拿预测结果做储能充放电决策。它的输入是预测功率和 SOC 数据SOC_1101-1107.xlsx输出是充放电指令。规则集的核心逻辑通常是预测功率高于阈值就充电低于阈值就放电SOC 到上下限就停。这份代码的价值在于把「预测」和「决策」串成了一条链你可以只改预测部分调度逻辑不动。5.2 把预测结果喂给调度# 假设 pred_inv 是反归一化后的预测功率序列 # 读 SOC 数据对齐时间索引 soc pd.read_excel(SOC_1101-1107.xlsx, parse_dates[时间]) soc soc.set_index(时间).reindex(pd.date_range(soc[时间].min(), soc[时间].max(), freq15min)) # 简单规则预测高于均值充电低于均值放电 threshold np.mean(pred_inv) commands [] for p in pred_inv: if p threshold and soc_current 0.9: commands.append(charge) elif p threshold and soc_current 0.1: commands.append(discharge) else: commands.append(idle)逻辑说明reindex是为了把 SOC 和预测序列对齐到同一时间轴不对齐的话后面按索引取 SOC 会错位。阈值用预测均值是最朴素的规则实际项目里会换成峰谷电价或调度计划。SOC 上下限 0.9/0.1 是保护电池的常规设置别设成 1.0/0.0过充过放会伤储能。这段代码的意义是让你看到预测值怎么变成可执行指令而不是停在画曲线。5.3 模拟程序的作用模拟程序.ipynb是把预测、规则集、SOC 更新串起来的闭环。它一般按时间步循环预测当前步功率 → 规则集出指令 → 更新 SOC → 进入下一步。跑通这个 notebook你就能得到一个完整的光储联合运行演示适合答辩或立项时展示。注意它的时间步长要和预测的粒度一致预测是 15 分钟模拟也得 15 分钟一步否则 SOC 变化速率对不上。6. 让预测更稳的几个实操技巧6.1 用误差指标定位问题时段光看 loss 不够要分时段看误差。光伏预测的误差集中在日出日落和云层突变时段把这些时段的 MAE 单独算出来才知道模型是真不行还是特定场景不行。from sklearn.metrics import mean_absolute_error # 分时段误差按小时分组 test_times df[时间].iloc[splitlook_back:].reset_index(dropTrue) err_df pd.DataFrame({time: test_times, true: y_test_inv, pred: pred_inv}) err_df[hour] err_df[time].dt.hour hourly_mae err_df.groupby(hour).apply(lambda g: mean_absolute_error(g[true], g[pred])) print(hourly_mae)逻辑说明splitlook_back是因为测试集的起点被滑动窗口吃掉了 look_back 个点时间索引要对应上。按小时分组后如果 6-8 点和 17-19 点 MAE 明显高说明模型对爬坡段拟合不足可以考虑加辐照度变化率作为特征或者对这两个时段单独建模。这个技巧比盲目调网络结构有用得多。6.2 特征工程的优先级多变量版本里特征不是越多越好。按对光伏预测的贡献排序辐照度 温度 湿度 历史功率。辐照度是最强相关变量如果数据里有一定要放进去温度影响组件效率次之湿度相关性弱加了可能引入噪声。我一般会先跑一版只用辐照度和功率的再逐步加特征每加一个看验证集 MAE 有没有降降了才留。6.3 模型保存与复现训练完记得存模型和 scaler不然下次预测还得重训。import joblib model.save(pv_lstm.h5) joblib.dump(scaler, pv_scaler.pkl) # 复现时 from tensorflow.keras.models import load_model model load_model(pv_lstm.h5) scaler joblib.load(pv_scaler.pkl)逻辑说明model.save存结构和权重joblib.dump存 scaler两个必须成对保存缺一个都没法复现预测。h5 格式在 Keras 里通用如果报错可以改用model.save(pv_lstm)存 SavedModel 格式。从那以后我每次跑完训练都强制存这两个文件命名带上日期避免版本混乱。希望这份拆解帮到你拿到包先跑单变量版本通了再上多变量和调度别一上来就全开。本文还有配套的精品资源点击获取
返回列表