
简介面向制造业用电量预测的 LSTM 项目资源聚焦电力消耗数据中典型的周期性、趋势性特征并针对时间序列建模长期依赖问题给出解决方案资源覆盖数据预处理、模型构建、训练评估与预测结果对比等完整流程适合时间序列分析初学者、制造业能源管理从业者以及正在开展电力负荷预测课题或竞赛的学生使用。压缩包共 106 个文件以 CSV 预测结果文件、Python 脚本和 JPG 可视化图表为主体另有 XML 工程配置、运行日志、PyTorch 模型权重 pth 及记录训练损失变化的 Excel 表格总大小仅 4.57MB目录结构清晰便于按需查阅。资源提供了不同时间步长2/4/6与多种损失函数MSE、SmoothL1Loss下的用电量预测结果并通过训练损失记录帮助判断模型收敛和过拟合情况读者可通过主程序快速复现实验直观观察各参数对预测精度的影响进而掌握 LSTM 在能耗数据分析中的调参方法。目前已有 1517 人学习下载是一份兼顾代码、数据与训练记录面向实际问题且容易上手的轻量级参考。 去年夏天我收到电费账单时愣了一下——比前一个月多出接近一倍可我明明没添什么大功率电器。翻出历史账单逐月对比发现用电量像坐过山车一样忽上忽下却又说不出具体是哪儿在耗电。后来我把智能电表里的历史数据导出来用 Python 做了一遍完整的清洗、分析和可视化才真正看清自己家里的用电规律。这个用电量数据分享项目本质上是教你把手里的用电量数据变成能指导行动的结论哪些电器是耗电大头、峰谷时段怎么分布、电费异常是哪里出了问题。我当时做完之后把分析图表分享到业主群不少邻居照着排查还真找到了自家待机功耗过高的问题。这篇博文会把整个项目的思路、数据获取方式、处理代码、可视化和常见坑都写清楚适合手里有智能电表数据或想自己统计家庭能耗的朋友参考也适合刚接触 pandas 时间序列分析的新手拿来练手。1. 为什么要做用电量数据分析1.1 一次电费异常引发的需求数据分析最忌讳的就是没有明确目的。我这次做用电量分析起因非常朴素——想知道钱花在哪了。家庭用电不像打车、网购那样每笔都有明细账单它只有一个总数字家里电器又多洗衣机、热水器、空调、冰箱各自贡献了多少基本靠猜。把用电量数据从月度粒度细化到当天甚至每15分钟一个点之后很多问题一眼就能看出答案。比如我分析后发现自己家的电费大头是电热水器它在凌晨保温加热的耗电量比我白天开6小时电脑还多。这个结论在月账单上根本看不出来但把逐日数据按小时聚合后凌晨那个稳定存在的小高峰直接暴露了真相。1.2 这个分析适合谁、能解决什么问题这套分析思路既适合家庭用户也适合小区物业、小型商户做能耗摸底。对于个人来说能解决三个具体问题找到电费异常波动的真实原因而不是靠感觉猜识别出峰谷用电时段配合分时电价调整用电习惯发现待机功耗和老化电器做到有的放矢地更换或断电如果你是刚学数据分析的开发者这个项目更是极佳的练手素材。它的数据量不大一年也就365条到几万条不需要分布式计算一张 Excel 表或 SQLite 数据库就够用但完整覆盖了数据清洗、重采样、聚合、可视化这一套核心流程比看着教程敲示例代码有感觉得多。2. 数据从哪来三类典型来源2.1 智能电表的线上查询现在很多地区的智能电表已经支持高频采集用电数据会定时上传到供电企业的后台。普通用户最常见的获取途径是官方App或小程序一般能查到最近一年到两年的每日用电量部分区域甚至支持查询每15分钟一个点的负荷曲线。我用的就是这类渠道导出的 CSV 文件字段通常包含时间、正向有功电量等需要自己在导出时留意时间粒度和单位kWh 还是 Wh。如果你所在区域的线上渠道查不到日数据还有个笨办法每天固定时间抄一次电表读数记录到表格里。虽然麻烦但攒上两三个月也能看出规律。参与过家庭能源管理系统项目的朋友还可以考虑加装支持 Modbus 或 Wi-Fi 的智能电表模块把数据自动采集到本机数据库这样连手动导出都省了。2.2 智能插座与独立电表实测遇到单个电器耗电多少这种问题时总表数据帮不上忙需要用智能插座做支路测量。我买了一台带功率统计的 Wi-Fi 插座接在电热水器前面用厂商 App 导出它一周的逐小时功率曲线。这个数据的好处是干净、和具体设备强绑定缺点是覆盖面小不适合做全家用电的整体分析。所以我的做法是总表数据负责看全貌插座数据负责定位具体设备两者配合使用。2.3 公共数据集与工具准备如果你手上没有自己的数据想直接练手可以用一些学术用途的公开数据集比如某些机构发布的住宅用电数据这些数据通常是 CSV 格式时间跨度为一年以上字段比家庭导出的更规范包括时间戳、总用电量、分项用电量等。不过要注意这类数据集大多以教学和科研为目的分享时需注明出处。工具方面我的推荐比较固定Python pandas 做数据处理matplotlib 做静态图pyecharts 或 Plotly 做交互式图表。项目做大了想长期保存数据的话可以加一个 SQLite几百兆以内的用电记录它都能轻松应对。开发环境装 Anaconda 或直接pip install pandas matplotlib pyecharts都行不复杂。3. 数据预处理拿到手先别急着画图3.1 时间字段的清洗大部分人拿到电表导出的数据第一件事就是直接plt.plot结果画出来往往是一团乱麻。原因多半出在时间字段上时间列是字符串、时区不对、采样间隔不均匀、有重复时间戳。我处理原始 CSV 的第一步永远是统一时间格式import pandas as pd df pd.read_csv(elec_raw.csv, encodingutf-8-sig) df[time] pd.to_datetime(df[time], format%Y-%m-%d %H:%M:%S) df df.set_index(time).sort_index() print(df.head())需要注意编码问题。供电企业导出的 CSV 在 Windows 下经常是 GBK 编码直接用 pandas 读取会报错我一般先试utf-8-sig不行就换gbk。时间格式也要以实际为准有的是2023/07/01 08:15有的是2023-07-01 08:15:00最好显式指定format否则 pandas 自动推断在几万条数据上会慢得让人怀疑人生。3.2 缺失值与异常值处理真实用电数据几乎没有完全干净的。通信故障、电表重启、偶尔上传失败都会造成数据缺失或异常。我最常遇到的异常值有两种用电量出现负值以及单点数值突然跳到平时的几十倍。负值一般是电表重启或现场校准造成的处理方式是直接剔除# 剔除负值和超过99.9%分位数的离谱值 df df[df[value] 0] upper_limit df[value].quantile(0.999) df df[df[value] upper_limit]缺失值要不要补、怎么补取决于分析目的。如果是画年趋势图少量缺失点完全不影响直接跳过即可。如果是做日用电量汇总比如把15分钟数据重采样成每日总量可以先用前向填充把短时间缺口补上再聚合。我个人的经验是超过3个小时的连续缺失就不要再强行插值了宁可让它空着也不要制造出看似平滑实则虚构的曲线。这个项目里我试过用线性插值补一个长达两天的缺口结果画出来的曲线在缺口段出现明显的凹陷极易误导判断。3.3 数据入库与统一单位清洗完的数据我会存一份副本格式统一为 Parquet 或 SQLite字段统一为time、value、unit。单位统一很关键有的电表导出的是 kWh有的是 Wh如果混着计算差了1000倍后面的分析全白做。我的做法是在读入时强制转成 kWhdf[value] df[value] / 1000.0 # 如果原始单位是Wh df df.rename(columns{value: kwh})另外建议建一张meta表记录数据来源、时间跨度、单位、异常处理说明。这个小习惯在数据量变大、来源变多之后特别有用不然过上两个月回头再看很容易忘记某列到底代表什么。4. 核心分析把用电规律挖出来4.1 整体趋势与周期规律分析的第一步是看整体趋势。把清洗好的数据按天重采样得到逐日用电量曲线daily df[kwh].resample(D).sum() daily.plot(figsize(12, 4))从这条曲线上能直观看到季节变化、周末和工作日的差异以及某个时间段的异常抬升。以我的数据为例6月到8月的日均用电量明显高出春秋季一倍多这个结论符合直觉但真正让我意外的是1月的数据——因为冬天开电暖器用电量竟然和7月开空调时相差无几。有了整体曲线后进一步叠加星期维度看周期性。方法很简单把数据按星期几分组求平均日用电量daily_avg_by_weekday daily.groupby(daily.index.dayofweek).mean() daily_avg_by_weekday.index [周一, 周二, 周三, 周四, 周五, 周六, 周日] print(daily_avg_by_weekday)我实测下来工作日的用电形态差异不大但周六会出现一个明显的高峰原因是周末在家时间长、做饭次数多热水器和抽油烟机使用频率上升。而且周日用电量比周六略微回落估计是不少家庭周日选择外出。4.2 峰谷时段拆解比周几用电多更实用的是一天之内的高峰时段分布。配合峰谷分时电价能直接帮你省钱。如果电表数据是15分钟或1小时一个点就可以按小时做聚合看一天24小时的负荷曲线hourly df[kwh].resample(H).sum() hourly_avg_by_hour hourly.groupby(hourly.index.hour).mean() # 找出最高和最低的三个时段 print(hourly_avg_by_hour.sort_values(ascendingFalse).head(3)) print(hourly_avg_by_hour.sort_values(ascendingTrue).head(3))我的分析结果很清晰晚高峰集中在18点到21点峰值出现在20点左右早高峰则小得多只有晚高峰的一半不到。凌晨1点到5点是用电低谷主要负荷基本只有冰箱和待机设备。知道了这个规律之后我把热水器的加热时间调到凌晨的低谷时段一个月电费下降了约12%这就是数据分析直接兑换成钱的例子。4.3 电量与外部因素的关联用电量不是孤立的数据和温度、天气、生活习惯都有关系。尽管我没有温度传感器的数据但用本地气象站的历史数据做了粗略关联分析。做法不复杂把日用电量和当天的最高气温放进同一个 DataFrame画散点图、计算相关系数。merged pd.merge(daily, temp_daily, ondate) corr merged[kwh].corr(merged[temp_max]) print(corr)在气温跨度为-5℃到35℃的全年数据里相关系数大约是0.73说明用电量受气温影响非常显著。而且这个关系不是线性的低于5℃和高于28℃后用电量都会快速上涨中间舒适区则维持低位。这种非线性特征如果只看月账单很难察觉但把逐日数据一画图就非常直观。5. 可视化呈现与分享要点5.1 用 matplotlib 快速出图分析过程中我大量依赖 matplotlib因为它在探索阶段最灵活改图成本低。常用的图有三类:第一类是逐日用电量折线图过滤掉局部抖动后用滚动平均rolling(window7).mean()画出平滑趋势线一眼锁定季节变化。第二类是24小时负荷曲线把全年按工作日和休息日分成两拨分别画平均曲线色差明显适合放在数据分析报告里说明行为差异。第三类是月度用电量柱状图把所有年份的同一个月做对比看是否出现同比异常增长。贴一段我当时画24小时负荷曲线的核心代码包含平滑处理效果比直接画原始折线好很多import matplotlib.pyplot as plt fig, ax plt.subplots(figsize(10, 5)) hourly_avg_by_hour.plot(axax, markero, label小时平均, lw2) ax.fill_between( hourly_avg_by_hour.index, hourly_avg_by_hour - hourly_avg_by_hour.std(), hourly_avg_by_hour hourly_avg_by_hour.std(), alpha0.2, label±1σ ) ax.set_xlabel(小时) ax.set_ylabel(平均用电量(kWh)) ax.set_title(工作日/休息日 24小时负荷曲线) ax.legend()5.2 用 pyecharts 做可交互图表如果只是在本地自用matplotlib 足够。但数据分享意味着要把结果发到群里或嵌到网页上静态图不方便读者自己查看细节这时候我会用 pyecharts 做可交互的 HTML 图表鼠标悬停能看到具体值还可以缩放平移。pyecharts 的 API 和 ECharts 保持一致画一个交互式折线图的核心代码很短from pyecharts.charts import Line from pyecharts import options as opts line ( Line() .add_xaxis([d.strftime(%m-%d) for d in daily.index]) .add_yaxis(日用电量, [round(v, 2) for v in daily.values], is_smoothTrue) .set_global_opts( title_optsopts.TitleOpts(title家庭日用电量趋势), datazoom_opts[opts.DataZoomOpts()], ) ) line.render(daily_line.html)这段代码生成的 HTML 文件可以直接用浏览器打开也可以嵌入博客或企业内部系统。我在邻居群分享时用的就是这种交互图有几个人反馈第一次直观看到家里每个小时耗电这么多比发 PDF 报告有效得多。5.3 分享数据时的注意事项既然叫数据分享脱敏问题不能忽视。家庭用电数据虽然不像身份证号那么敏感但高频用电曲线其实能反推出家里作息、是否有人、用什么电器私密性并不低。我分享的做法是把时间精度降到日不分享15分钟级别的原始曲线小区、楼栋、表号等字段一律不出现别人需要原数据时只提供已经聚合好的统计结果比如工作日日均8.5kWh、休息日日均10.2kWh。如果是分享代码也要顺手把数据路径、电表表号、真实地址等写进代码或 README 的占位符里。这既是保护自己也是保护看你代码的人万一他拿到的是别人的隐私数据知道如何处理才正规。6. 常见问题与排查技巧实录6.1 时间序列索引的坑时间序列分析最常见的报错就是KeyError或TypeError原因多半是索引没有正确设置。pd.to_datetime之后一定要记得set_index(time)否则后面resample会直接报错。另外如果导出的时间戳带时区后缀比如08:00to_datetime解析出来的是带时区对象和本地时区的日期做比较时容易差8个小时我习惯在读入后直接强制tz_localize(None)去掉时区信息。6.2 缺失数据怎么补才合理我在第3节提过不要强行补长缺口这里补充一下具体判断标准。15分钟粒度的数据连续缺失1-2个采集点即15-30分钟用前向填充或者interpolate线性插值都能接受。缺失超过两个小时最好直接在重采样时跳过因为补出来的数据可能抹掉了一个真实的用电行为比如临时停电后冰箱重新制冷的高功率段。如果缺失的是整天电表通信完全中断那天就让它空着画图时dropna()掉就行不会对月度汇总造成太大偏差。6.3 几个能直接抄作业的小函数最后分享几个几乎每次分析都会用的函数算是这个项目沉淀下来的小工具def resample_daily(df): 15分钟/小时粒度数据转日汇总 return df[kwh].resample(D).sum().dropna() def rolling_padded(series, window7): 滚动平均并保留前n-1个点的原始值 smoothed series.rolling(window).mean() return smoothed.fillna(series) def peak_hours(df, top_n3): 返回一天中用电最高的N个小时 h df[kwh].resample(H).sum() h h.groupby(h.index.hour).mean() return h.sort_values(ascendingFalse).head(top_n).index.tolist()这些函数不依赖特定数据格式只要你的 DataFrame 有timeDatetimeIndex和kwh两列就能直接套用。做这个用电量数据分享项目前后花了我大概一周的业余时间最花力气的不是写代码而是把脑子里那些模糊的感觉电费好高变成清晰的量化结论。分析做完后我不光找出了电费异常的元凶——一台老化严重、保温性能变差的电热水器还摸清了自己家的用电习惯顺手把热水器加热时段调整到了低谷电价区间。后来又把这个过程写成带交互图表的分享帖发到小区群不少邻居照着方法排查出自家待机功耗异常的设备。个人体会是数据分析本身没有多玄乎真正有价值的是那份愿意花时间把生活细节数字化的耐心。如果你手头也有一份积灰的用电数据不妨按上面的流程走一遍大概率会收获几个原来如此的瞬间。本文还有配套的精品资源点击获取