跳到主要内容Python 家庭用电数据的时序分析 | 极客日志PythonAI算法
Python 家庭用电数据的时序分析
基于 Kaggle 家庭用电数据集,使用 Python 进行时间序列分析。通过数据清洗处理缺失值与异常值,利用 Pandas 和 Matplotlib 进行可视化探索。采用 Statsmodels 库对数据进行趋势分解与周期分析(周度与日度)。结果显示电热水器和空调占用电量近 60%,周日为周用电高峰,晚间 8 至 10 点为日内用电高峰。结论明确了家庭用电的季节性波动及具体设备使用时段特征,为节能管理提供数据支持。
FrontendX1 浏览
数据来源:Kaggle 家庭用电数据集
数据简介
240000-household-electricity-consumption-records 数据集包含了一个家庭 6 个月的用电数据,收集于 2007 年 1 月至 2007 年 6 月。这些数据包括总有功功率、总无功功率、电压、全球强度、分项计量 1(厨房)、分项计量 2(洗衣房)和分项计量 3(电热水器和空调)等信息。该数据集共有 260,640 个测量值。
| 列名 | 说明 |
|---|
| Date | 日期 |
| Time | 时间 |
| Globalactivepower | 该家庭所消耗的总有功功率(千瓦) |
| Globalreactivepower | 该家庭消耗的总无功功率(千瓦) |
| Voltage | 向家庭输送电力的电压(伏特) |
| Global_intensity | 输送到家庭的平均电流强度(安培) |
| Submetering1 | 厨房消耗的有功功率(千瓦) |
| Submetering2 | 洗衣房所消耗的有功功率(千瓦) |
| Submetering3 | 电热水器和空调所消耗的有功功率(千瓦) |
有功功率:对外做功,保持用电设备正常运行的电功率。
无功功率:不对外做功,形成和维持设备磁场的电功率。
探索分析
导入数据集并读取头部
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data_path = "./household_power_consumption.csv"
df = pd.read_csv(data_path, index_col='index')
df.head()

列名替换为中文
df.rename(columns={
'Date': '日期',
'Time': '时间',
'Global_active_power': '有功功率',
'Global_reactive_power': '无功功率',
'Voltage': ,
: ,
: ,
: ,
: ,
}, inplace=)
df.head()
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
'电压'
'Global_intensity'
'电流'
'Sub_metering_1'
'厨房的有功功率'
'Sub_metering_2'
'洗衣房的有功功率'
'Sub_metering_3'
'电热水器和空调的有功功率'
True
在 Python 中,object 是所有类的基类(或称为'超类'),这意味着所有的数据类型(如整数、浮点数、列表、字典等)以及用户自定义的类都是 object 类的直接或间接子类。因此,当在 Python 中创建一个变量或对象时,它本质上都是 object 类型的一个实例,尽管它的具体类型(如 int、list、dict 等)会提供额外的属性和方法。
数据清洗
df = df.replace('?', np.NAN)
将除日期、时间、电热水器和空调的有功功率之外的数据替换为数值型
for i in list(df.columns)[2:-1]:
df[i] = df[i].astype(float)
对缺失值进行插值处理,插值是一种通过已知数据点来估计未知数据点的方法,常用于填补数据中的缺失值。
df['日期'] = df['日期'].str.replace('/07','/2007')
df['日期'] = df['日期'].astype(str)
df['时间'] = df['时间'].astype(str)
df.index = pd.to_datetime(df['日期']+ ' ' + df['时间'], format='%d/%m/%Y %H:%M:%S')
df=df.drop(['日期','时间'],axis=1)
df.head()
df['有功功率总和'] = df['有功功率']+df['厨房的有功功率']+df['洗衣房的有功功率']+df['电热水器和空调的有功功率']
df.head()
df_h = df.resample('H').sum()
df_h.head()
df_d = df.resample('D').sum()
df_d.head()
用电占比
from pyecharts.charts import *
import pyecharts.options as opts
c = ( Pie(init_opts=opts.InitOpts(theme='chalk'))
.add("用电量", [['厨房用电量',df['厨房的有功功率'].sum()],
['洗衣房用电量',df['洗衣房的有功功率'].sum()],
['电热水器和空调的用电量',df['电热水器和空调的有功功率'].sum()],
['其他电器用电量',df['有功功率'].sum()]])
.set_global_opts(title_opts=opts.TitleOpts(title="不同类型用电量占比",pos_right='center'),legend_opts=opts.LegendOpts(pos_top="5%"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
)
c.render_notebook()
由可视化图像容易发现,电热水器和空调的用电量占比最高,近 60% 的功率都是电热水器和空调消耗的,而洗衣房、厨房和其他电器的用电量相差不大。
趋势分析
通过时间序列可视化方法,对家庭用电量变化进行趋势分析
plt.figure( figsize=(15,10) )
plt.subplot(321)
plt.title('Total Power')
plt.plot(df_d['有功功率总和'])
plt.subplot(322)
plt.title('Kitchen Power')
plt.plot(df_d['厨房的有功功率'])
plt.subplot(323)
plt.title('Laundry Power')
plt.plot(df_d['洗衣房的有功功率'])
plt.subplot(324)
plt.title('Conditioner Power')
plt.plot(df_d['电热水器和空调的有功功率'])
plt.subplot(313)
plt.title('Power Compare')
plt.plot(df_d['有功功率总和'],label='Total Power')
plt.plot(df_d['厨房的有功功率'],label='Kitchen Power')
plt.plot(df_d['洗衣房的有功功率'],label='Laundry Power')
plt.plot(df_d['电热水器和空调的有功功率'],label='Conditioner Power')
plt.legend()
可视化结果可见,在二月末至三月初期间,用电量呈现相对较低的态势。然而,随后洗衣房的用电量出现显著增长。然而,到了四月末,总用电量却意外地降至最低点。从整体趋势来看,时间序列信息显得较为纷乱,缺乏清晰的规律性。为了深入洞察这些数据背后的模式与趋势,考虑通过序列分解来进行数据挖掘,以期能够提炼出更为明确、有意义的用电行为特征。
序列分解
考虑周末的用电特殊性,对序列以七天为周期的方式进行分解,通过 seasonal_decompose 函数将时序数据中的趋势特征、周期特征和残差项分解出来,并进行趋势可视化
from statsmodels.tsa.seasonal import seasonal_decompose
total_decomposition_d = seasonal_decompose(df_d['有功功率总和'],period=7)
kitchen_decomposition_d = seasonal_decompose(df_d['厨房的有功功率'],period=7)
laundry_decomposition_d = seasonal_decompose(df_d['洗衣房的有功功率'],period=7)
conditioner_decomposition_d = seasonal_decompose(df_d['电热水器和空调的有功功率'],period=7)
plt.figure( figsize=(15,10) )
plt.subplot(321)
plt.title('Total Power')
plt.plot(total_decomposition_d.trend)
plt.subplot(322)
plt.title('Kitchen Power')
plt.plot(kitchen_decomposition_d.trend)
plt.subplot(323)
plt.title('Laundry Power')
plt.plot(laundry_decomposition_d.trend)
plt.subplot(324)
plt.title('Conditioner Power')
plt.plot(conditioner_decomposition_d.trend)
plt.subplot(313)
plt.title('Power Compare')
plt.plot(total_decomposition_d.trend,label='Total Power')
plt.plot(kitchen_decomposition_d.trend,label='Kitchen Power')
plt.plot(laundry_decomposition_d.trend,label='Laundry Power')
plt.plot(conditioner_decomposition_d.trend,label='Conditioner Power')
plt.legend()
趋势分析结果说明,电热水器与空调的电能消耗模式与总体电能消耗量的时间序列图表展现出高度的相似性,这一结果与用电占比分析结论不谋而合,进一步印证了电热水器和空调设备对家庭总电能消耗具有显著影响。此外,通过对上述图表的细致分析,我们能够更加明确地识别出各类家用电器能耗的峰值与谷值时段:具体而言,在每年三月末至四月初期间,该户家庭的总电能消耗量达到了年度最高峰值;相比之下,二月末则记录下了全年最低的电能消耗谷值;值得注意的是,在四月的中上旬以及四月末,还分别出现了两个较为明显的电能消耗低谷时段。
周期分析
通常而言,用电量数据预期会展现出一定的周期性规律,但根据目前提供的时序图像分析,这种周期性特征并不显著。为了更清晰地识别潜在的周期模式,计划将分解序列过程中提取的周期特征进行可视化处理。通过直观展示这些周期特征,希望能够更准确地把握用电量数据中的周期性变化规律,从而为后续的分析和决策提供有力支持。
plt.figure( figsize=(15,10) )
plt.subplot(321)
plt.title('Total Power')
plt.plot(total_decomposition_d.seasonal[:7])
plt.subplot(322)
plt.title('Kitchen Power')
plt.plot(kitchen_decomposition_d.seasonal[:7])
plt.subplot(323)
plt.title('Laundry Power')
plt.plot(laundry_decomposition_d.seasonal[:7])
plt.subplot(324)
plt.title('Conditioner Power')
plt.plot(conditioner_decomposition_d.seasonal[:7])
plt.subplot(313)
plt.title('Power Compare')
plt.plot(total_decomposition_d.seasonal[:7],label='Total Power')
plt.plot(kitchen_decomposition_d.seasonal[:7],label='Kitchen Power')
plt.plot(laundry_decomposition_d.seasonal[:7],label='Laundry Power')
plt.plot(conditioner_decomposition_d.seasonal[:7],label='Conditioner Power')
plt.legend()
由可视化结果,从图表中可以明显观察到,周日(以 2007 年 1 月 1 日为周一作为参照)是一周中总用电量达到峰值的日子,紧随其后的是周六和周三,显示出相对较高的用电需求。相比之下,周二和周五则呈现出较低的总用电量水平,成为一周中用电较少的两天。这一趋势揭示了居民用电行为的周期性特征,可能与不同日间的活动模式及生活习惯紧密相关。
周期分解
total_decomposition_h = seasonal_decompose(df_h['有功功率总和'],period=24)
kitchen_decomposition_h = seasonal_decompose(df_h['厨房的有功功率'],period=24)
laundry_decomposition_h = seasonal_decompose(df_h['洗衣房的有功功率'],period=24)
conditioner_decomposition_h = seasonal_decompose(df_h['电热水器和空调的有功功率'],period=24)
plt.figure( figsize=(15,10) )
plt.subplot(321)
plt.title('Total Power')
plt.plot(range(1,25),total_decomposition_h.seasonal[:24])
plt.subplot(322)
plt.title('Kitchen Power')
plt.plot(range(1,25),kitchen_decomposition_h.seasonal[:24])
plt.subplot(323)
plt.title('Laundry Power')
plt.plot(range(1,25),laundry_decomposition_h.seasonal[:24])
plt.subplot(324)
plt.title('Conditioner Power')
plt.plot(range(1,25),conditioner_decomposition_h.seasonal[:24])
plt.subplot(313)
plt.title('Power Compare')
plt.plot(range(1,25),total_decomposition_h.seasonal[:24],label='Total Power')
plt.plot(range(1,25),kitchen_decomposition_h.seasonal[:24],label='Kitchen Power')
plt.plot(range(1,25),laundry_decomposition_h.seasonal[:24],label='Laundry Power')
plt.plot(range(1,25),conditioner_decomposition_h.seasonal[:24],label='Conditioner Power')
plt.legend()

从图表分析中可以看出,该家庭在一天之内存在明显的用电高峰时段。具体而言,晚上 8 点至 10 点期间是用电量最大的时段,反映了家庭成员在此时间段内的高强度用电活动。紧接着的是上午 9 点至 10 点,也呈现出较高的用电量。相反,在后半夜的 4 点至 6 点之间,用电量降至最低,显示出这一时段内家庭活动的减少。
进一步观察各类电器的使用模式,厨房电器和洗衣房电器在晚上 8 点至 10 点达到了使用的高峰期,这可能与晚餐准备、清洁衣物等晚间家务活动相关。而电热水器和空调则在上午 8 点至 10 点迎来了使用的高峰,可能是为了应对早晨洗漱和准备工作的需求,随后在晚上 8 点至 10 点再次迎来一个使用高峰,这可能是由于家庭成员在晚间回归后,对热水和舒适温度的需求增加。
分析小结
这份用电量数据中家庭电力消耗模式呈现出以下几个显著且系统的特征。
高能耗设备占比:电热水器与空调作为家庭中的主要高能耗设备,其电力消耗合计占据了家庭总用电量的近 60%,这充分表明这两类设备在家庭能源使用中的主导地位。
季节性用电波动:在家庭用电量的季节性变化上,我们观察到三月末至四月初期间,家庭总用电量达到年度峰值,而二月末则呈现出全年最低谷。此外,四月中上旬及四月末还出现了两个较为显著的用电低谷期,这些变化揭示了季节性因素及外部条件对家庭用电量的显著影响。
周用电模式:就周用电模式而言,周日成为一周中家庭总用电量最大的日子,其次是周六和周三,这反映了周末及部分工作日晚间家庭活动的增加对用电量的积极影响。而周二和周五则表现为一周中的用电低谷日,表明这些日子内家庭活动相对较少或用电行为更为节约。
日内用电高峰:在日内的用电分布上,注意到晚上 8 点至 10 点是家庭用电的显著高峰时段,这主要归因于家庭成员在此时间段内的多样化用电需求。同时,上午 9 点至 10 点也呈现出较高的用电量,这可能与早晨的洗漱、准备等活动相关。此外,后半夜 4 点至 6 点期间的用电量则降至最低,体现了家庭活动的显著减少。
设备使用时段分析:进一步细化至具体设备的使用情况,厨房电器与洗衣房电器在晚上 8 点至 10 点期间的使用率最高,这符合家庭成员晚餐准备和清洁工作的常规时间。而电热水器和空调则在上午 8 点至 10 点及晚上 8 点至 10 点两个时段内展现出较高的使用频率,这既满足了早晨洗漱的即时需求,也确保了晚间居家的舒适度。