【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析

【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析

【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析-寻找资源网
【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析
此内容为付费阅读,请付费后查看
5
立即购买
您当前未登录!建议登陆后购买,可保存购买订单
seekresource@163.com
1919588043
QQ1919588043
寻找资源网
微信小店:活生好美
付费阅读
商城已上线,快去看看吧!

1、数据说明

本项目所用数据集包含了一个家庭6个月的用电数据,收集于2007年1月至2007年6月。
这些数据包括有功功率、无功功率、电压、电流强度、分项计量1(厨房)、分项计量2(洗衣房)和分项计量3(电热水器和空调)等信息。该数据集共有260,640个测量值,可以为了解家庭用电情况提供重要的见解。

我们要感谢databeats团队提供这个数据集。如果你在你的研究中使用这个数据集,请注明原作者:Georges Hébrail 和 Alice Bérard。

字段含义对照表:

列名 说明
Date 日期
Time 时间
Globalactivepower 除分项计量外所消耗的总有功功率(千瓦)
Globalreactivepower 该家庭消耗的总无功功率(千瓦)
Voltage 向家庭输送电力的电压(伏特)
Global_intensity 输送到家庭的平均电流强度(安培)
Submetering1 厨房消耗的有功功率(千瓦)
Submetering2 洗衣房所消耗的有功功率(千瓦)
Submetering3 电热水器和空调所消耗的有功功率(千瓦)

2、数据来源

3、其他说明

有功功率是保持用电设备正常运行所需的电功率,也就是将电能转换为其他形式能量(机械能、光能、热能)的电功率。比如:5.5千瓦的电动机就是把5.5千瓦的电能转换为机械能,带动水泵抽水或脱粒机脱粒;各种照明设备将电能转换为光能,供人们生活和工作照明。无功功率比较抽象,它是用于电路内电场与磁场的交换,并用来在电气设备中建立和维持磁场的电功率。它不对外作功,而是转变为其他形式的能量。凡是有电磁线圈的电气设备,要建立磁场,就要消耗无功功率。比如40瓦的日光灯,除需40多瓦有功功率(镇流器也需消耗一部分有功功率)来发光外,还需80乏左右的无功功率供镇流器的线圈建立交变磁场用。由于它不对外做功,才被称之为“无功”。

4、前期工作

4.1 导包

import numpy as np
import pandas as pd
from pyecharts.charts import *
import pyecharts.options as opts
from statsmodels.tsa.seasonal import seasonal_decompose
import matplotlib.pyplot as plt
# plt.rcParams['axes.unicode_minus']=False
# plt.rcParams['font.sans-serif'] = ['SimHei']

4.2 读取数据

# 数据路径
data_path = r'/home/mw/input/Household_Electricity4767/household_power_consumption.csv'
# 读取数据
df = pd.read_csv(data_path,index_col='index')
# 预览数据
df.head()
  Date Time Global_active_power Global_reactive_power Voltage Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3
index                  
0 1/1/07 0:00:00 2.58 0.136 241.97 10.6 0 0 0.0
1 1/1/07 0:01:00 2.552 0.1 241.75 10.4 0 0 0.0
2 1/1/07 0:0200 2.55 0.1 241.64 10.4 0 0 0.0
3 1/1/07 0:03:00 2.55 0.1 241.71 10.4 0 0 0.0
4 1/1/07 0:04:00 2.554 0.1 241.98 10.4 0 0 0.0

5、数据处理

5.1 数据预览

In[3]:

# 将列名替换为中文
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()  # 列名改成中文顺眼多了

Out[3]:

日期 时间 有功功率 无功功率 电压 电流 厨房的有功功率 洗衣房的有功功率 电热水器和空调的有功功率
index                  
0 1/1/07 0:00:00 2.58 0.136 241.97 10.6 0 0 0.0
1 1/1/07 0:01:00 2.552 0.1 241.75 10.4 0 0 0.0
2 1/1/07 0:0200 2.55 0.1 241.64 10.4 0 0 0.0
3 1/1/07 0:03:00 2.55 0.1 241.71 10.4 0 0 0.0
4 1/1/07 0:04:00 2.554 0.1 241.98 10.4 0 0 0.0

In[4]:

# 查看数据基本信息
df.info()  # 共计260640条数据,可以看到各列非空数据的数量

Out[4]:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 260640 entries, 0 to 260639
Data columns (total 9 columns):
 #   Column        Non-Null Count   Dtype  
---  ------        --------------   -----  
 0   日期            260640 non-null  object 
 1   时间            260640 non-null  object 
 2   有功功率          260640 non-null  object 
 3   无功功率          260640 non-null  object 
 4   电压            260640 non-null  object 
 5   电流            260640 non-null  object 
 6   厨房的有功功率       260640 non-null  object 
 7   洗衣房的有功功率      260640 non-null  object 
 8   电热水器和空调的有功功率  256869 non-null  float64
dtypes: float64(1), object(8)
memory usage: 19.9+ MB

In[5]:

# 查看各列数据类型
df.dtypes  # object类型数据应转换为数值型数据

Out[5]:

日期               object
时间               object
有功功率             object
无功功率             object
电压               object
电流               object
厨房的有功功率          object
洗衣房的有功功率         object
电热水器和空调的有功功率    float64
dtype: object

In[6]:

# 查看数据是否有重复值
df.duplicated().sum()  # 没有

Out[6]:

0

5.2 数据清洗

在尝试将object类型数据转换为数值型数据时发现有的数据为’?’,故将包含’?’的数据进行异常值处理:

In[7]:

# 将异常值替换为空值
df = df.replace('?',np.NAN)
# 将有功功率、无功功率、电压、电流、厨房的有功功率、洗衣房的有功功率object类型数据都转换为数值型数据
for i in list(df.columns)[2:-1]:
    df[i] = df[i].astype(float)
# 进行缺失值填充
df = df.interpolate()

将日期、时间列结合后作为数据集的索引:

In[8]:

# 统一日期列数据形式
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()

有功功率

无功功率 电压 电流 厨房的有功功率 洗衣房的有功功率 电热水器和空调的有功功率
2007-01-01 00:00:00 2.580 0.136 241.97 10.6 0.0 0.0
2007-01-01 00:01:00 2.552 0.100 241.75 10.4 0.0 0.0
2007-01-01 00:02:00 2.550 0.100 241.64 10.4 0.0 0.0
2007-01-01 00:03:00 2.550 0.100 241.71 10.4 0.0 0.0
2007-01-01 00:04:00 2.554 0.100 241.98 10.4 0.0 0.0

新建一列总有功功率数据:

In[9]:

df['总有功功率'] = df['有功功率']+df['厨房的有功功率']+df['洗衣房的有功功率']+df['电热水器和空调的有功功率']
df.head()

Out[9]:

有功功率 无功功率 电压 电流 厨房的有功功率 洗衣房的有功功率 电热水器和空调的有功功率 总有功功率
2007-01-01 00:00:00 2.580 0.136 241.97 10.6 0.0 0.0 2.580
2007-01-01 00:01:00 2.552 0.100 241.75 10.4 0.0 0.0 2.552
2007-01-01 00:02:00 2.550 0.100 241.64 10.4 0.0 0.0 2.550
2007-01-01 00:03:00 2.550 0.100 241.71 10.4 0.0 0.0 2.550
2007-01-01 00:04:00 2.554 0.100 241.98 10.4 0.0 0.0 2.554

In[10]:

# 按小时进行数据重采样
df_h = df.resample('H').sum()
df_h.head()

Out[10]:

有功功率 无功功率 电压 电流 厨房的有功功率 洗衣房的有功功率 电热水器和空调的有功功率 总有功功率
2007-01-01 00:00:00 153.038 6.768 14481.68 631.8 0.0 35.0 188.038
2007-01-01 01:00:00 151.404 4.298 14465.79 626.6 0.0 0.0 151.404
2007-01-01 02:00:00 154.940 6.400 14592.01 632.4 0.0 20.0 174.940
2007-01-01 03:00:00 152.500 5.406 14595.94 624.0 16.0 0.0 168.500
2007-01-01 04:00:00 148.544 5.290 14547.37 606.6 0.0 0.0 148.544

In[11]:

# 按天进行数据重采样
df_d = df.resample('D').sum()
df_d.head()

Out[12]:

有功功率 无功功率 电压 电流 厨房的有功功率 洗衣房的有功功率 电热水器和空调的有功功率 总有功功率
2007-01-01 2749.004 148.166 345785.73 11400.4 0.0 352.0 5880.0 8981.004
2007-01-02 1269.236 190.342 348399.04 5348.2 0.0 348.0 6562.0 8179.236
2007-01-03 1014.054 196.728 350722.21 4340.2 0.0 344.0 4765.0 6123.054
2007-01-04 3259.412 202.302 345240.43 13648.6 1051.0 7597.0 10896.0 22803.412
2007-01-05 2713.364 173.154 346313.90 11354.6 1483.0 379.0 7602.0 12177.364

6、 数据分析

以分析家庭用电量的角度来说,数据集中的无功功率、电压和电流的分析意义不大,故选取其他特征进行数据的分析和挖掘。

6.1 不同类型的家庭用电量与总用电量的关系

首先看一下不同类型的家庭用电量在总用电量中的占比:

Out[12]:

图片[1]-【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析-寻找资源网

由图可见,电热水器和空调的用电量占比最高,近60%的功率都是由电热水器和空调消耗的,洗衣房、厨房和其他电器的用电量相差不大,近乎是三等份。

6.2 家庭用电量的趋势分析

通过对时间序列可视化的方式对家庭用电趋势进行分析:

Out[13]:

<matplotlib.legend.Legend at 0x7fb3d9656fd0>

图片[2]-【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析-寻找资源网

从可视化结果上来看,该家庭在二月末三月初时用电量较低,在这之后洗衣房的用电量激增,在4月末某一天总用电量达到了一个最谷底,除此之外整体的时序信息还是比较杂乱的。
尝试通过序列分解的方式挖掘数据中的信息,考虑到工作日和周末对用电量的影响,对时间序列按照7天一个周期的方式进行分解,并对分解后的趋势序列进行可视化:

In [14]:

# 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)

Out[15]:

<matplotlib.legend.Legend at 0x7fb3d93fb5b0>

图片[3]-【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析-寻找资源网

看起来电热水器和空调的用电量与总用电量的时序图像最为相似,与3.1的结论相似,看起来电热水器和空调的用电量对总用电量的影响最大。除以之外,从以上图像中可以更清晰地看到各类家庭用电量的峰值时间段和谷值时间段:在三月末四月初时,该家庭的总用电量达到了最高峰值,在二月末该家庭的总用电量达到了最低谷,并在四月中上旬和四月末有两个用电量低谷期。

6.3 家庭用电量的时段分析

家庭用电量应该会有周期性的规律,从以上时序图像来看并不明显,尝试将分解序列所提取的周期特征进行可视化分析:

Out[16]:

<matplotlib.legend.Legend at 0x7fb3d9268c70>

图片[4]-【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析-寻找资源网

由图可见,周日是一周中总用电量最大的一天(2007-01-01是周一),其次是周六和周三,周二和周五是一周中总用电量最少的两天。

In [17]:

# 以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)

Out[18]:

<matplotlib.legend.Legend at 0x7fb3d9054520>

图片[5]-【Python数据分析案例(2025)】29——针对家庭用电数据进行时序分析-寻找资源网

由图可见,一天之中,晚上8点到10点是该家庭的用电高峰,其次是上午9点到10点,后半夜4点至6点用电量最低;厨房电器和洗衣房电器在晚上8点到10点是使用高峰期,电热水器和空调在上午8点到10点是使用高峰期,其次是晚上8点到10点。

7、分析结论

通过上述分析可以得到以下结论:

  • 该家庭近60%的功率都是由电热水器和空调所消耗的;
  • 在三月末四月初时,该家庭的总用电量达到了最高峰值,在二月末该家庭的总用电量达到了最低谷,并在四月中上旬和四月末有两个用电量低谷期;
  • 周日是该家庭一周中总用电量最大的一天,其次是周六和周三,周二和周五是一周中总用电量最少的两天;
  • 一天之中,晚上8点到10点是该家庭的用电高峰,其次是上午9点到10点,后半夜4点至6点用电量最低;
  • 厨房电器和洗衣房电器晚上8点到10点是使用高峰期,电热水器和空调在上午8点到10点是使用高峰期,其次是晚上8点到10点。
看完不过瘾,那就自己发一篇吧!
© 版权声明
THE END
喜欢就支持一下吧
点赞10赞赏 分享
相关推荐
评论 抢沙发

请登录后发表评论

    暂无评论内容