【Python】家庭用电数据的时序分析

Household Electricity Consumption | 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': '电压',
    'Global_intensity': '电流',
    'Sub_metering_1': '厨房的有功功率',
    'Sub_metering_2': '洗衣房的有功功率',
    'Sub_metering_3': '电热水器和空调的有功功率',
    },inplace=1)
# 再次预览前5行数据
df.head()  

查看数据信息

复制代码
df.info()

查看数据类型

复制代码
df.dtypes

在Python中,object 是所有类的基类(或称为"超类"),这意味着所有的数据类型(如整数、浮点数、列表、字典等)以及用户自定义的类都是 object 类的直接或间接子类。因此,当在Python中创建一个变量或对象时,它本质上都是 object 类型的一个实例,尽管它的具体类型(如 intlistdict 等)会提供额外的属性和方法。

数据清洗

查看数据是否重复,0即为没有重复

复制代码
df.duplicated().sum()

处理异常值,同一替换为空值NAN

复制代码
df = df.replace('?',np.NAN)

将除日期、时间、电热水器和空调的有功功率之外的数据替换为数值型

复制代码
for i in list(df.columns)[2:-1]:
    df[i] = df[i].astype(float)

查看替换结果

复制代码
df.dtypes

对缺失值进行插值处理,插值是一种通过已知数据点来估计未知数据点的方法,常用于填补数据中的缺失值。

复制代码
df = df.interpolate()

将日期、时间结合作为数据索引

复制代码
# 替换日期列数据形式
df['日期'] = df['日期'].str.replace('/07','/2007')
# 将日期、时间转换为str类型
df['日期'] = df['日期'].astype(str)
df['时间'] = df['时间'].astype(str)
# 重构index数据为包含年月日时分秒的完整时间
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日为周一作为参照)是一周中总用电量达到峰值的日子,紧随其后的是周六和周三,显示出相对较高的用电需求。相比之下,周二和周五则呈现出较低的总用电量水平,成为一周中用电较少的两天。这一趋势揭示了居民用电行为的周期性特征,可能与不同日间的活动模式及生活习惯紧密相关。

周期分解

以24小时为周期对用电量序列进行分解

复制代码
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点两个时段内展现出较高的使用频率,这既满足了早晨洗漱的即时需求,也确保了晚间居家的舒适度。

相关推荐
a程序小傲2 小时前
蚂蚁Java面试被问:注解的工作原理及如何自定义注解
java·开发语言·python·面试
love530love2 小时前
【笔记】ComfyUI “OSError: [WinError 38] 已到文件结尾” 报错解决方案
人工智能·windows·python·aigc·comfyui·winerror 38
lcreek3 小时前
LeetCode215. 数组中的第K个最大元素、LeetCode912. 排序数组
python·算法·leetcode
可观测性用观测云3 小时前
华为云 LTS 日志上报到观测云最佳实践
数据分析
cqbzcsq3 小时前
蛋白质功能预测模型DAMPE论文阅读报告
论文阅读·人工智能·python·深度学习·生物信息学
转转技术团队3 小时前
回收团队基于Cursor集成MCP的智能代码修复提示词生成实践
人工智能·python·程序员
石头dhf3 小时前
大模型配置
开发语言·python
南科1号3 小时前
Tushare数据来源分析一例
python
API技术员3 小时前
京东API接口:如何高效获取商品详情与SKU信息
python