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]:
由图可见,电热水器和空调的用电量占比最高,近60%的功率都是由电热水器和空调消耗的,洗衣房、厨房和其他电器的用电量相差不大,近乎是三等份。
6.2 家庭用电量的趋势分析
通过对时间序列可视化的方式对家庭用电趋势进行分析:
Out[13]:
<matplotlib.legend.Legend at 0x7fb3d9656fd0>
从可视化结果上来看,该家庭在二月末三月初时用电量较低,在这之后洗衣房的用电量激增,在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.1的结论相似,看起来电热水器和空调的用电量对总用电量的影响最大。除以之外,从以上图像中可以更清晰地看到各类家庭用电量的峰值时间段和谷值时间段:在三月末四月初时,该家庭的总用电量达到了最高峰值,在二月末该家庭的总用电量达到了最低谷,并在四月中上旬和四月末有两个用电量低谷期。
6.3 家庭用电量的时段分析
家庭用电量应该会有周期性的规律,从以上时序图像来看并不明显,尝试将分解序列所提取的周期特征进行可视化分析:
Out[16]:
<matplotlib.legend.Legend at 0x7fb3d9268c70>
由图可见,周日是一周中总用电量最大的一天(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>
由图可见,一天之中,晚上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点。














![表情[nanguo]-寻找资源网](http://www.seekresource.com/wp-content/themes/zibll/img/smilies/nanguo.gif)
![表情[haobang]-寻找资源网](http://www.seekresource.com/wp-content/themes/zibll/img/smilies/haobang.gif)
![表情[shuai]-寻找资源网](http://www.seekresource.com/wp-content/themes/zibll/img/smilies/shuai.gif)
![表情[deyi]-寻找资源网](http://www.seekresource.com/wp-content/themes/zibll/img/smilies/deyi.gif)
![表情[chi]-寻找资源网](http://www.seekresource.com/wp-content/themes/zibll/img/smilies/chi.gif)



暂无评论内容