如何加载和探索家庭用电量数据

随着智能电表和太阳能电池板等发电技术的广泛应用,大量的用电数据可供使用。

该数据代表了电力相关变量的多变量时间序列,可用于建模甚至预测未来的电力消耗。

在本教程中,您将了解一个用于多步时间序列预测的家庭用电量数据集,以及如何使用探索性分析更好地理解原始数据。

完成本教程后,您将了解:

  • 家庭用电量数据集描述了一个家庭四年内的用电情况。
  • 如何使用一系列针对序列数据的线形图和针对数据分布的直方图来探索和理解数据集。
  • 如何利用对问题的新理解来考虑不同的预测问题框架、数据准备方式以及可能使用的建模方法。

通过我的新书《时间序列深度学习》启动您的项目,包括分步教程和所有示例的Python源代码文件。

让我们开始吧。

How to Load and Explore Household Electricity Usage Data

如何加载和探索家庭用电量数据
图片来源:Sheila Sund,保留部分权利。

教程概述

本教程分为五个部分;它们是:

  1. 用电量数据集
  2. 加载数据集
  3. 随时间变化的观测模式
  4. 时间序列数据分布
  5. 建模思路

家庭用电量数据集

家庭用电量数据集是一个多变量时间序列数据集,描述了一个家庭四年内的用电情况。

数据收集于 2006 年 12 月至 2010 年 11 月期间,每分钟收集一次家庭用电量的观测值。

它是一个多元序列,包含七个变量(除了日期和时间);它们是

  • global_active_power:家庭消耗的总有功功率(千瓦)。
  • global_reactive_power:家庭消耗的总无功功率(千瓦)。
  • voltage:平均电压(伏特)。
  • global_intensity:平均电流强度(安培)。
  • sub_metering_1:厨房的有功电能(瓦时有功电能)。
  • sub_metering_2:洗衣房的有功电能(瓦时有功电能)。
  • sub_metering_3:气候控制系统的有功电能(瓦时有功电能)。

有功电能和无功电能指的是交流电的技术细节。

一般来说,有功电能是家庭消耗的实际功率,而无功电能是线路中未使用的功率。

我们可以看到,数据集提供了有功功率以及房屋主电路中有功功率的一些划分,特别是厨房、洗衣房和气候控制。这些并非家庭中的所有电路。

剩余瓦时可以通过以下方式计算:首先将有功电能转换为瓦时,然后减去其他分表计量的有功电能(瓦时)。

该数据集似乎没有提供任何权威的参考文献。

尽管如此,该数据集已成为评估时间序列预测和机器学习方法进行多步预测的标准,特别是预测有功功率。此外,尚不清楚数据集中其他特征是否可能有助于模型预测有功功率。

时间序列深度学习需要帮助吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

加载数据集

该数据集可以从 UCI 机器学习仓库下载,为一个 20 兆字节的 .zip 文件

下载数据集并将其解压到当前工作目录。您现在将拥有文件“household_power_consumption.txt”,其大小约为127兆字节,包含所有观测值。

检查数据文件。

以下是原始数据文件的前五行数据(和标题)。

我们可以看到数据列由分号(';')分隔。

据报道,数据在时间段内每天有一行。

数据确实存在缺失值;例如,我们可以看到在2007年4月28日左右有2-3天的缺失数据。

我们可以通过将数据文件加载为Pandas DataFrame来开始,并总结加载的数据。

我们可以使用read_csv() 函数加载数据。

使用此函数加载数据很容易,但正确加载它有点棘手。

具体来说,我们需要做一些自定义的事情:

  • 将列之间的分隔符指定为分号 (sep=';')。
  • 指定第0行包含列名 (header=0)。
  • 指定我们有大量的内存,以避免因缺失数据使用“?”值而导致加载数据为对象数组而非数字数组的警告 (low_memory=False)。
  • 指定允许Pandas在解析日期时尝试推断日期时间格式,这样会快得多 (infer_datetime_format=True)。
  • 指定我们希望将日期和时间列一起解析为一个名为“datetime”的新列 (parse_dates={'datetime':[0,1]})。
  • 指定我们希望将新的“datetime”列作为DataFrame的索引 (index_col=['datetime'])。

将所有这些整合在一起,我们现在可以加载数据并总结加载后的形状和前几行。

接下来,我们可以将所有用“?”字符表示的缺失值标记为NaN值,这是一个浮点数。

这将使我们能够将数据作为一个浮点值数组而不是混合类型进行处理,后者效率较低。

现在我们可以创建一个新列,其中包含子计量的剩余部分,使用上一节中的计算。

现在我们可以将清理后的数据集保存到一个新文件中;在这种情况下,我们只需将文件扩展名更改为 .csv 并将数据集保存为“household_power_consumption.csv”。

为了确认我们没有弄错,我们可以重新加载数据集并总结前五行。

将所有这些串联起来,加载、清理和保存数据集的完整示例列在下面。

运行示例首先加载原始数据,并总结加载数据的形状和前五行。

数据集随后被清理并保存到一个新文件中。

我们加载这个新文件,并再次打印前五行,显示日期和时间列的移除以及新的分表列的添加。

我们可以查看新的“household_power_consumption.csv”文件,检查缺失的观测值是否用空列标记,Pandas会正确将其读取为NaN,例如在第190,499行附近。

现在我们已经有了数据集的清理版本,我们可以使用可视化来进一步研究它。

随时间变化的观测模式

数据是一个多元时间序列,理解时间序列的最佳方法是创建线图。

我们可以从为八个变量中的每一个创建一个单独的线图开始。

完整的示例如下所示。

运行该示例将创建一个包含八个子图的图像,每个变量一个。

这为我们提供了四年内每分钟观测值的一个非常高的水平。我们可以看到“Sub_metering_3”(环境控制)中发生了一些有趣的事情,这可能与热年或冷年没有直接关系。也许安装了新的系统。

有趣的是,“sub_metering_4”的贡献似乎随时间减少,或者呈现下降趋势,这可能与“Sub_metering_3”在系列末尾的稳步增长相吻合。

这些观察结果确实强调了在拟合和评估任何模型时,需要尊重此数据子序列的时间顺序。

我们或许能看到“全球有功功率”和其他一些变量中的季节性效应波。

有一些尖峰状的使用量,这可能与特定的时期(例如周末)相吻合。

Line Plots of Each Variable in the Power Consumption Dataset

用电量数据集中每个变量的线形图

让我们放大并关注“Global_active_power”,简称“有功功率”。

我们可以创建一张每年有功功率的新图,看看这些年是否有共同的模式。2006年(第一年)的数据不足一个月,所以我们将它从图中移除。

完整的示例如下所示。

运行该示例将创建一个包含四个线图的图像,数据集中的每个完整年份(或大部分完整年份)一个。

我们可以看到这些年有一些共同的总体模式,例如在2月至3月以及8月至9月,我们看到消费量明显下降。

我们似乎还看到夏季月份(北半球年中)呈下降趋势,冬季月份(接近图表边缘)的消费量可能更多。这些可能显示出消费的年度季节性模式。

我们还可以在至少第一、第三和第四个图中看到一些缺失数据块。

Line Plots of Active Power for Most Years

大多数年份有功功率的线形图

我们可以继续放大消费量,并查看2007年每个月的有功功率。

这可能有助于区分月份之间的总体结构,例如每日和每周模式。

完整的示例如下所示。

运行该示例会创建一个包含12个线图的图像,代表2007年每个月的情况。

我们可以看到每个月内每天用电量的正弦波。这很好,因为我们期望用电量存在某种每日模式。

我们可以看到有几天用电量非常少,例如八月和四月。这些可能代表假期,房子无人居住,用电量最小。

Line Plots for Active Power for All Months in One Year

一年中所有月份有功功率的线形图

最后,我们可以再深入一层,更仔细地查看每日的用电量。

我们预计每天的消费量会有一些模式,并且一周内不同日期的消费量也会有所不同。

完整的示例如下所示。

运行该示例将生成一张包含20个线形图的图像,分别代表2007年1月的前20天。

这些日子之间有共通之处;例如,许多日子的消费量从清晨(大约上午6-7点)开始。

有些日子显示出中午消费量下降,这在大多数居民外出时可能是有道理的。

我们确实看到有些日子夜间消费量很强,在北半球的一月份,这可能与取暖系统的使用相吻合。

一年中的时间,特别是季节及其带来的天气,将是建模这些数据的重要因素,这正如预期。

Line Plots for Active Power for 20 Days in One Month

某月20天有功功率的线形图

时间序列数据分布

另一个需要考虑的重要领域是变量的分布。

例如,了解观测值的分布是高斯分布还是其他分布可能很有趣。

我们可以通过查看直方图来研究数据的分布。

我们可以从为时间序列中的每个变量创建一个直方图开始。

完整的示例如下所示。

运行该示例将创建一个包含八个变量的独立直方图的图像。

我们可以看到有功功率和无功功率、电流以及分表计量的功率都向低瓦时或千瓦值倾斜分布。

我们还可以看到电压数据的分布是强高斯分布。

Histogram plots for Each Variable in the Power Consumption Dataset

用电量数据集中每个变量的直方图

有功功率的分布似乎是双峰的,这意味着它看起来有两个平均观测值组。

我们可以通过查看四年完整数据的有功功率消耗分布来进一步研究这个问题。

完整的示例如下所示。

运行该示例将创建一个包含四个图的单一图表,分别代表2007年至2010年中的每一年。

我们可以看到这些年有功功率消耗的分布非常相似。分布确实是双峰的,一个峰值在0.3千瓦左右,另一个可能在1.3千瓦左右。

在更高的千瓦值处,分布有一个长尾。这可能为数据离散化和将其分为峰值1、峰值2或长尾的概念打开了大门。这些每日或每小时使用量的组或簇可能有助于开发预测模型。

Histogram Plots of Active Power for Most Years

大多数年份有功功率的直方图

有可能已识别的组在一年中的不同季节会有所不同。

我们可以通过查看一年中每个月的有功功率分布来调查这一点。

完整的示例如下所示。

运行示例将创建一个包含12个图的图像,每个图代表2007年中的一个月。

我们大致可以看到每个月的数据分布是相同的。图表的轴线似乎对齐(考虑到相似的刻度),我们可以看到在北半球较温暖的月份,峰值向下移动,而在较冷的月份,峰值向上移动。

我们还可以看到,从12月到3月较冷的月份,向更大千瓦值方向的尾部更厚或更突出。

Histogram Plots for Active Power for All Months in One Year

一年中所有月份有功功率的直方图

建模思路

现在我们知道如何加载和探索数据集,我们可以提出一些关于如何建模数据集的思路。

在本节中,我们将更深入地探讨处理数据时的三个主要领域;它们是

  • 问题构建
  • 数据准备
  • 建模方法

问题构建

该数据集似乎没有权威的出版物来演示在预测建模问题中构建数据的预期方式。

因此,我们只能猜测这些数据可能有哪些有用的使用方式。

数据仅针对单个家庭,但有效的建模方法或许可以推广到类似的家庭。

也许最有用的是将数据集框定为预测未来有功功率消耗的一个区间。

四个例子包括

  • 预测次日的每小时消耗量。
  • 预测下周的每日消耗量。
  • 预测下个月的每日消耗量。
  • 预测明年的月度消费量。

通常,这些类型的预测问题被称为多步预测。利用所有变量的模型可能被称为多变量多步预测模型。

这些模型中的每一个都不限于预测分钟级数据,而是可以在所选预测分辨率或以下级别对问题进行建模。

反过来,大规模预测消费量可以帮助公用事业公司预测需求,这是一个被广泛研究且重要的问题。

数据准备

为建模准备这些数据具有很大的灵活性。

具体的数据准备方法及其益处实际上取决于所选择的问题框架和建模方法。尽管如此,下面列出了一些可能有用的通用数据准备方法:

  • 每日差分可能有助于调整数据的日周期。
  • 年度差分可能有助于调整数据中的任何年度周期。
  • 归一化可能有助于将具有不同单位的变量缩放到相同尺度。

有许多简单的人为因素可能有助于从数据中提取特征,反过来,这些特征可能使特定日期的预测更容易。

一些例子包括:

  • 指示一天中的时间,以考虑人们是否在家的可能性。
  • 指示某一天是工作日还是周末。
  • 指示某一天是否为北美公共假日。

这些因素对于预测月度数据可能不那么重要,对于每周数据可能也有一点影响。

更一般的特征可能包括

  • 指示季节,这可能导致使用的环境控制系统的类型或数量。

建模方法

或许有四类有趣的方法可以探索这个问题;它们是:

  • 朴素方法。
  • 经典线性方法。
  • 机器学习方法。
  • 深度学习方法。

朴素方法

朴素方法将包括那些做出非常简单但通常非常有效的假设的方法。

一些例子包括:

  • 明天将与今天相同。
  • 明天将与去年今天相同。
  • 明天将是过去几天的平均值。

经典线性方法

经典线性方法包括对单变量时间序列预测非常有效的技术。

两个重要的例子包括

  • SARIMA
  • ETS(三次指数平滑)

它们将要求舍弃附加变量,并根据数据集的具体框架配置或调整模型参数。与调整数据以适应每日和季节性结构相关的考虑也可以直接得到支持。

机器学习方法

机器学习方法要求将问题构建为监督学习问题。

这将需要将序列的滞后观测值作为输入特征,从而丢弃数据中的时间关系。

可以探索一系列非线性方法和集成方法,包括:

  • k近邻。
  • 支持向量机
  • 决策树
  • 随机森林
  • 梯度提升机

需要仔细注意,以确保这些模型的拟合和评估保留了数据中的时间结构。这很重要,这样该方法就不会通过利用未来观测值来“作弊”。

这些方法通常与大量变量无关,可能有助于弄清是否可以利用附加变量并为预测模型增加价值。

深度学习方法

一般来说,神经网络在自回归类型问题上尚未被证明非常有效。

然而,诸如卷积神经网络之类的技术能够自动从原始数据(包括一维信号数据)中学习复杂的特征。而循环神经网络,例如长短期记忆网络,能够直接学习多个并行输入数据序列。

此外,这些方法的组合,如CNN LSTM和ConvLSTM,已在时间序列分类任务上被证明有效。

这些方法有可能能够利用大量的基于分钟的数据和多个输入变量。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

总结

在本教程中,您学习了一个用于多步时间序列预测的家庭用电量数据集,以及如何使用探索性分析更好地理解原始数据。

具体来说,你学到了:

  • 家庭用电量数据集描述了一个家庭四年内的用电情况。
  • 如何使用一系列针对序列数据的线形图和针对数据分布的直方图来探索和理解数据集。
  • 如何利用对问题的新理解来考虑不同的预测问题框架、数据准备方式以及可能使用的建模方法。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发时间序列深度学习模型!

Deep Learning for Time Series Forecasting

在几分钟内开发您自己的预测模型

...只需几行python代码

在我的新电子书中探索如何实现
用于时间序列预测的深度学习

它提供关于以下主题的自学教程
CNNLSTM多元预测多步预测等等...

最终将深度学习应用于您的时间序列预测项目

跳过学术理论。只看结果。

查看内容

对《如何加载和探索家庭用电量数据》的42条回复

  1. Mars Cesaire Tchuya Famjo 2018年9月28日 上午5:22 #

    杰森,干得好!

  2. vinayak 2018年9月28日 上午5:36 #

    感谢您的帖子。它真的很有帮助。
    我一直在想如何构建输入数据,以便使用SVM、ANN和Randomforest预测下一天的每小时消耗量。

    有没有多步多变量时间序列预测的参考资料?
    另外,预测下一天的每小时消耗量会比预测下一周的每小时消耗量更准确吗?

  3. Franco 2018年9月29日 下午5:13 #

    如果标题中包含“IoT”,人们(包括我)会更快地认识到您的帖子/书籍的巨大价值。

  4. Ed Marotta 2019年2月15日 上午6:00 #

    机器学习方法
    机器学习方法要求将问题构建为监督学习问题。

    这将需要将序列的滞后观测值作为输入特征,从而丢弃数据中的时间关系。

    可以探索一系列非线性方法和集成方法,包括:

    k近邻。
    支持向量机
    决策树
    随机森林
    梯度提升机
    需要仔细注意,以确保这些模型的拟合和评估保留了数据中的时间结构。这很重要,这样该方法就不会通过利用未来观测值来“作弊”。

    这些方法通常与大量变量无关,可能有助于弄清是否可以利用附加变量并为预测模型增加价值。

    你能猜出一些参考文献作为如何进行这种预测分析的例子吗?你有没有例子?

  5. Rahul 2019年4月2日 上午10:38 #

    感谢您撰写这篇非常有启发性的帖子。与此相关的是,是否有数据集可用于分类电器消耗,即电器级别的消耗分解?

  6. Hala 2019年6月7日 下午7:34 #

    我使用了这个数据集,但它看起来很奇怪……在某些点,日期会改变其排列方式
    也就是说,它不是继续以年-月-日的形式,而是变成年-日-月
    我怎样才能保持相同的排列方式呢?

    • Jason Brownlee 2019年6月8日 上午6:51 #

      真的吗,你确定吗?

      如果是这样,数据可能需要仔细的手动处理(自定义代码)。

      • Hala 2019年6月9日 上午7:06 #

        数据太大,无法手动处理

        • Jason Brownlee 2019年6月10日 上午7:33 #

          也许可以尝试渐进式加载和一些if语句来使数据一致?

  7. Hala 2019年6月9日 上午7:33 #

    它还给了我一个消息,说一个列表超出了索引。我不得不拆分数据。

    • Jason Brownlee 2019年6月10日 上午7:33 #

      你具体指的是什么?

      • Hala 2019年6月12日 上午8:43 #

        错误已修复……抱歉打扰您。
        我不知道错误在哪里……我第二天只是重复了代码,就没有错误了。

  8. Darshittaa 2019年8月9日 上午1:05 #

    经典线性方法如何应用,可以给我代码吗?

  9. Darshittaa 2019年8月17日 上午2:21 #

    数据量超过了excel行容量。我该如何处理呢?

  10. franklin 2019年9月12日 上午8:52 #

    很棒的工作。我如何测试模型?

  11. Cristian 2020年7月14日 下午4:36 #

    干得漂亮!
    如果我有一个包含大量客户(500-1000个)的庞大数据集,每个客户的数据都存储在不同的“excel”(每个5天),如何用python处理这些数据以操作和识别消费模式?(对它们进行分组)

    例如,有什么代码吗?……谢谢!

    • Jason Brownlee 2020年7月15日 上午8:13 #

      保存为csv文件,并使用pandas的read_csv加载。

  12. Manjunath Hakki 2020年8月26日 上午1:38 #

    我将使用随机森林来训练这个模型,我可以知道可以包含哪些特征作为输入,以及输出可以是什么吗?
    这种方法效率高吗?
    如果可以的话,请提供代码。

  13. Amitesh Prakash 2020年12月13日 下午6:02 #

    嘿 Jason!干得漂亮。我正在做一个类似的项目,需要任何城市过去10年的电力消耗数据。你能帮我找到数据集吗?

  14. Shuaib Iqbal 2021年1月18日 晚上10:25 #

    我正在处理这个数据集。
    我尝试按照您的教程制作模型2-LSTM(在模型中使用2个LSTM)和CNN-LSTM(先CNN后LSTM),其中您解释了所有基于原始数据的模型。
    但是我的模型没有给出好的RMSE值。我想要这个数据集的代码(CNN_LSTM代码)。

    请帮帮我

    • Jason Brownlee 2021年1月19日 上午6:37 #

      这些教程将帮助诊断问题并提高模型性能
      https://machinelearning.org.cn/start-here/#better

      • shuaib iqbal 2021年1月19日 晚上8:17 #

        感谢分享这些有用的材料

        请为这个数据集使用 cnn-lstm 模型,推荐最佳参数(时间步、单元、核大小、迭代次数以及更多最佳参数)。

        拜托,我需要你的帮助
        等待您的回复

        • Jason Brownlee 2021年1月20日 上午5:41 #

          不客气。

          我们无法知道最佳超参数,相反,必须通过对给定数据集和模型进行仔细实验来发现它们。

  15. JG 2021年2月16日 上午3:27 #

    谢谢 Jason

    非常有用的关于时间序列数据准备和通过pandas Dataframe绘图的教程。

    快速绘图步骤以访问时间线特征绘图、直方图以及特征相关性以分析趋势/季节性、特征分布(与高斯分布相比)和特征相关性是受欢迎的!。

    无论如何,我做了一些更改,我将每分钟时间序列数据集转换为每日时间序列,以减少数据绘图。我还应用了“pd.DataFrame.corr()”方法来获取所有特征之间的相关标量系数(其中大多数高度正相关)。

  16. Dimas 2021年7月16日 上午1:59 #

    你好 Jason,感谢您提供的信息,但我有一个稍微不同的项目。我必须计算其中一个月份的值并按小时分组,即17:00 – 22:00是第一组,22:01 – 16:59是第二组。我尝试修改您提供的代码,但到目前为止我仍然没有找到解决方案。因此,您能帮助我找到解决方案吗?感谢您的关注 Jason

    • Jason Brownlee 2021年7月16日 上午5:28 #

      或许可以对上述示例进行一些小改动,以使用您的数据集?
      或许可以从一个更简单的项目开始,并将其调整为您的数据集?
      或许探索不同的数据集?
      或许聘请某人为您修改代码?

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。