
简介这份资源面向计算机、人工智能、数据科学及电子信息等相关专业的学生与从业者提供一套基于LSTM的短期光伏预测完整实现方案可用于课程设计、毕业设计、大作业或初期项目立项演示。压缩包共11个文件约3.89MB以6个ipynb交互式笔记本为核心配合1个py脚本、1个xlsx数据集、1个md说明文档及jpg、png图片覆盖数据处理、模型搭建、训练与预测全流程。内容围绕园区光伏与负荷预测展开包含单变量与多变量实验、规则集与储能框架探索、SOC数据样例及模拟程序便于读者理解LSTM在时间序列预测中的建模思路与调参方法。代码均经测试运行成功功能正常可直接复现并在此基础上修改扩展。目前已有1022人学习下载适合希望快速上手光伏预测实战、积累算法项目经验的读者参考借鉴。1. 从一份园区光伏数据说起这套 LSTM 源码到底能跑出什么如果你手头正好有一批园区光伏出力数据想做个短期功率预测又不想从零搭 LSTM 的输入输出管道这份「基于 LSTM 的短期光伏预测算法 python 源码 数据集」大概率能省掉你两三天搭骨架的时间。它不是一篇讲 LSTM 原理的科普而是一个已经跑通的工程包里面有用园区的数据测试光伏预测-Copy1.ipynb、用园区的数据测试光伏预测-单变量.ipynb、用园区的数据测试负荷预测LSTM.ipynb三个主 notebook还有clearoutside_url.py这种取数脚本、SOC_1101-1107.xlsx这类储能侧数据以及模拟程序.ipynb、储能框架 基于规则集的.ipynb组成的规则集调度演示。换句话说它把「光伏预测」和「储能规则调度」放在同一个园区场景里预测结果能直接喂给后面的规则集逻辑这对做课程设计、大作业或者初期项目立项演示的人来说比一个孤零零的模型文件有用得多。适合谁计算机、数据科学、人工智能、电气电子方向的同学拿它当 LSTM 时间序列预测的实战样本也适合企业里刚接触光伏功率预测的工程师用它验证自己手上的数据能不能套进这套流程。不适合谁想直接拿去做生产级功率预测、要求多变量气象耦合和高精度误差指标的人——这套代码的定位是学习和演示不是工业级预测系统。下面我按「数据长什么样 → 怎么跑起来 → 参数怎么调 → 坑在哪」的顺序拆一遍你照着复现基本不会卡在环境上。2. 拆开压缩包数据文件、notebook 与规则集的分工2.1 文件清单与各自职责先把包里的东西按功能分个类不然你打开一堆 ipynb 会不知道从哪下手。从项目正文列出的文件看大致是三条线光伏预测线、负荷预测线、储能规则线。文件类型作用用园区的数据测试光伏预测-Copy1.ipynbnotebook光伏预测主流程多变量版本用园区的数据测试光伏预测-单变量.ipynbnotebook光伏预测单变量对照版用园区的数据测试负荷预测LSTM.ipynbnotebook负荷侧 LSTM 预测和光伏对照clearoutside_url.py脚本外部数据获取/清洗的辅助脚本SOC_1101-1107.xlsx数据储能荷电状态一周粒度模拟程序.ipynb/模拟程序-Copy1.ipynbnotebook整体模拟运行入口储能框架 基于规则集的.ipynbnotebook规则集调度逻辑规则集-第一版.png图规则集结构示意0.jpg图辅助说明图README.md文档项目说明这里有个容易忽略的点SOC_1101-1107.xlsx是储能荷电状态数据文件名里的日期范围说明它是一周的数据。这意味着整套演示的时间跨度不大做短期预测够用但你想拉长到月度、季度得自己补数据。规则集-第一版.png和储能框架 基于规则集的.ipynb是配套的看图再读代码能少走弯路。2.2 环境准备Python 版本与依赖这类 notebook 项目最常见的翻车点就是环境。我一般会先建独立虚拟环境避免和系统里的包打架。Python 建议 3.83.10太新的版本3.12有时会让老版本 TensorFlow/Keras 装不上。# 建虚拟环境python 版本按你本机可用的 3.8~3.10 选 python -m venv pv_lstm_env # 激活Windows pv_lstm_env\Scripts\activate # 激活macOS / Linux source pv_lstm_env/bin/activate # 装核心依赖版本按 notebook 实际 import 调整 pip install numpy pandas matplotlib scikit-learn pip install tensorflow2.10.0 pip install jupyter notebook openpyxl逻辑说明openpyxl是读.xlsx必需的很多人只装 pandas 然后读 Excel 报错就是缺它。tensorflow2.10.0是个相对稳的版本Keras 已内置不用单独装。参数说明如果你用的是 PyTorch 版 LSTM热搜里 pytorch lstm 源码 也很热把 tensorflow 换成torch但这份源码的 notebook 大概率是 Keras 写法先按 TensorFlow 走跑通再考虑迁移。提示装完先python -c import tensorflow as tf; print(tf.__version__)验证一下别等 notebook 跑到建模那一步才发现没装上。2.3 数据加载与字段确认打开用园区的数据测试光伏预测-Copy1.ipynb第一件事不是跑模型是看它读了哪些列。光伏预测的输入通常是历史功率、时间戳可能还有辐照、温度。单变量版本只用历史功率多变量版本会加气象列。import pandas as pd # 读光伏数据具体文件名按你包里的实际数据文件替换 df pd.read_excel(你的光伏数据文件.xlsx) # 看前几行和字段类型 print(df.head()) print(df.dtypes) print(df.shape) # 时间列转 datetime后面做滑动窗口要用 df[时间] pd.to_datetime(df[时间]) df df.sort_values(时间).reset_index(dropTrue)逻辑说明pd.to_datetime把时间列转成真正的时间类型不转的话后面按时间排序、重采样都会出问题。sort_values保证时序不乱LSTM 对顺序敏感顺序错了预测结果就是玄学。参数说明列名「时间」要换成你数据里真实的列名别照抄。如果数据里有缺失值先df.isnull().sum()看一眼缺失多的列考虑插值或直接弃用。3. 把 LSTM 跑起来滑动窗口、归一化与训练循环3.1 滑动窗口构造LSTM 的输入到底怎么切LSTM 吃的是序列不是单点。短期光伏预测的常见做法是用过去 N 个时刻的功率预测下一个时刻这个 N 就是时间步timestep。这一步是整套代码的核心也是最容易切错的地方。import numpy as np from sklearn.preprocessing import MinMaxScaler # 取功率列 values df[功率].values.reshape(-1, 1) # 归一化LSTM 对量纲敏感不归一化收敛很慢甚至不收敛 scaler MinMaxScaler(feature_range(0, 1)) scaled scaler.fit_transform(values) def make_sequences(data, look_back24): X, y [], [] for i in range(len(data) - look_back): X.append(data[i:i look_back, 0]) y.append(data[i look_back, 0]) return np.array(X), np.array(y) look_back 24 # 假设 1 小时一个点就是看过去 24 小时 X, y make_sequences(scaled, look_back) # LSTM 输入要求 [样本数, 时间步, 特征数] X X.reshape((X.shape[0], X.shape[1], 1)) print(X.shape, y.shape)逻辑说明make_sequences把一维序列切成「过去 look_back 个点 → 下一个点」的样本对。reshape那一步是关键Keras 的 LSTM 层要求三维输入少这一维会直接报维度错误。参数说明look_back24是假设数据是小时粒度如果你的数据是 15 分钟一个点24 就只代表 6 小时得按业务调整。归一化用MinMaxScaler把值压到 01预测完记得用scaler.inverse_transform还原回真实功率不然你看到的误差全是归一化尺度下的没意义。3.2 建模与训练层数、单元数、epoch 怎么定源码里的 LSTM 结构一般是「LSTM 层 Dense 层」的简单堆叠。别一上来就堆很深短期光伏预测这种任务一两层 LSTM 往往就够堆多了过拟合还慢。from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout model Sequential() model.add(LSTM(50, return_sequencesFalse, input_shape(look_back, 1))) model.add(Dropout(0.2)) model.add(Dense(1)) model.compile(optimizeradam, lossmse) model.summary() history model.fit( X, y, epochs50, batch_size32, validation_split0.2, verbose1 )逻辑说明LSTM(50)里的 50 是隐藏单元数太小欠拟合太大过拟合且慢50 是个常见起点。return_sequencesFalse表示只取最后一个时间步的输出因为我们只要预测一个值如果你要做多步预测这里得改成 True 再接别的层。Dropout(0.2)抑制过拟合。参数说明epochs50配合validation_split0.2能看验证损失走势如果验证损失早早回升就是过拟合减层或加 Dropoutbatch_size32是通用值数据量小可以降到 16。3.3 预测与还原别被归一化后的曲线骗了训练完直接model.predict(X)得到的是 01 区间的值必须还原。# 预测 pred model.predict(X) # 还原到真实功率尺度 pred_real scaler.inverse_transform(pred) y_real scaler.inverse_transform(y.reshape(-1, 1)) # 算误差 from sklearn.metrics import mean_absolute_error, mean_squared_error mae mean_absolute_error(y_real, pred_real) rmse np.sqrt(mean_squared_error(y_real, pred_real)) print(MAE:, mae, RMSE:, rmse)逻辑说明inverse_transform把预测值和真实值都拉回原始量纲这样 MAE、RMSE 才有物理意义。参数说明MAE 反映平均绝对偏差RMSE 对大误差更敏感光伏预测里两者都看别只看一个。如果 RMSE 大得离谱先检查是不是忘了还原或者滑动窗口切错了位置。4. 单变量 vs 多变量两种 notebook 的选型与对照4.1 单变量版本适合什么场景用园区的数据测试光伏预测-单变量.ipynb只用历史功率一个特征。它的好处是数据要求低你只要有一列功率就能跑坏处是遇到天气突变云层遮挡、阴转晴时预测会滞后因为模型看不到辐照、温度这些外因。我一般把单变量版本当基线先跑通它确认数据管道没问题再上多变量。4.2 多变量版本怎么加特征多变量版本会在输入里拼上气象列。做法是把多个特征一起归一化然后滑动窗口的每个时间步带上所有特征。# 假设有功率、辐照、温度三列 features df[[功率, 辐照, 温度]].values scaler_mv MinMaxScaler(feature_range(0, 1)) scaled_mv scaler_mv.fit_transform(features) def make_sequences_mv(data, look_back24): X, y [], [] for i in range(len(data) - look_back): X.append(data[i:i look_back, :]) # 所有特征 y.append(data[i look_back, 0]) # 只预测功率 return np.array(X), np.array(y) X_mv, y_mv make_sequences_mv(scaled_mv, look_back) print(X_mv.shape) # [样本数, 时间步, 特征数]逻辑说明和单变量的区别在data[i:ilook_back, :]取了所有特征列而y只取功率那一列索引 0。这样模型输入是多维的输出还是一维功率。参数说明特征列的顺序要和后面inverse_transform时一致否则还原出来的功率是错的。多变量不一定比单变量好如果气象数据和功率相关性弱加了反而引入噪声建议先算一下相关系数再决定加哪些列。4.3 负荷预测 notebook 的复用价值用园区的数据测试负荷预测LSTM.ipynb是负荷侧预测结构和光伏预测几乎一样只是目标列换成负荷。它的价值在于你可以用同一套滑动窗口和建模代码把光伏和负荷都预测出来再一起喂给储能规则集。园区场景里光伏出力预测和负荷预测是储能调度的两个输入缺一个规则集就跑不完整。5. 避坑与排查跑这套源码最常见的五个问题5.1 现象notebook 一跑就报找不到文件原因notebook 里的路径是作者本机的相对路径换到你机器上对不上。解决把所有pd.read_excel(...)、pd.read_csv(...)的路径改成你解压后的实际路径或者统一放到 notebook 同目录下用文件名读。别用绝对路径写死换机器又得改。5.2 现象LSTM 输入维度报错提示 expected 3D原因忘了reshape成[样本数, 时间步, 特征数]。解决在make_sequences之后加X X.reshape((X.shape[0], X.shape[1], 1))多变量则是X.shape[2]个特征。这个错新手几乎必踩记住 LSTM 要三维。5.3 现象损失是 nan训练几轮就崩原因数据里有缺失值或异常大值归一化后仍受影响或者学习率过高。解决先df.isnull().sum()查缺失用插值补再检查有没有异常值必要时截断。学习率默认 adam 一般没事如果还 nan把数据打印出来看有没有 inf。5.4 现象预测曲线整体平移误差稳定偏大原因滑动窗口的预测目标和输入错位或者归一化用了全量数据导致信息泄漏。解决确认y取的是data[ilook_back]不是data[i]归一化严格来说应该只用训练集 fit再 transform 测试集全量 fit 会让评估偏乐观。5.5 现象SOC 数据和预测结果对不上时间轴原因SOC_1101-1107.xlsx是一周数据光伏预测的时间范围如果和它对不齐规则集调度就会错位。解决先把两份数据的时间列都转成 datetime按时间对齐后再喂给规则集别假设它们天然对齐。6. 进阶把预测结果接进储能规则集跑通园区闭环跑通光伏预测只是第一步这套源码真正的价值在于它把预测和储能规则集串起来了。储能框架 基于规则集的.ipynb配合规则集-第一版.png逻辑是根据光伏预测出力和负荷预测决定储能充放电。你要做的是把预测输出接到规则集的输入上。# 假设 pred_real 是光伏预测功率load_real 是负荷预测 # 规则集简化示例光伏大于负荷就充电否则放电 soc 0.5 # 初始荷电状态 soc_list [] for pv, load in zip(pred_real.flatten(), load_real.flatten()): net pv - load if net 0: soc min(1.0, soc net * 0.01) # 充电系数按容量折算 else: soc max(0.0, soc net * 0.01) # 放电 soc_list.append(soc)逻辑说明这段是规则集的极简版真实规则看规则集-第一版.png里的分支。net是净功率正为充电、负为放电0.01是功率到 SOC 的折算系数实际要按电池容量和步长算。参数说明SOC 上下限卡在 01防止过充过放。验证方法把算出的soc_list和SOC_1101-1107.xlsx里的真实 SOC 对比看趋势是否一致偏差大就调折算系数。我自己的习惯是每次拿到这种预测调度的包先把预测误差和 SOC 偏差分开看预测 RMSE 大是模型问题SOC 偏差大是规则折算问题别混在一起调。从那以后我每次接这类园区项目都强制先把时间轴对齐再谈模型时间错位是黑匣子错误的头号来源。希望帮到你。本文还有配套的精品资源点击获取