机器学习笔记七-----------------使用Prophet(时间序列模型)预测家用电量的数据的笔记一------数据集解析

本文主要是介绍机器学习笔记七-----------------使用Prophet(时间序列模型)预测家用电量的数据的笔记一------数据集解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,数据集的下载

其实家庭用电量预测仅仅是个“引子”,如果有电网数据的话,可以开发适合业务需求的模型,比如通过预测各时段各区域的用电量来协助电网更好地实现电能调度;除此之外,还可以用于发电量预测,比如光伏电站、风力发电站、水电站发电量预测…等等。模型一般不是问题,关键在数据和数据处理。

    数据集名称为:Individual household electric power consumption Data Set,(下载地址UCI Machine Learning Repository: Individual household electric power consumption Data Set)该数据集是一个多变量时间序列数据集,采集了法国巴黎一个家庭近四年(2006年12月至2010年11月)的用电量,采样周期为1分钟。数据集的属性信息如下:

date:格式dd/mm/yyyy;
time:格式hh:mm:ss;
global_active_power:每分钟的有功功率(千瓦);
global_reactive_power:每分钟的无功功率(千瓦);
voltage:每分钟的平均电压(伏特);
global_intensity:每分钟的平均电流强度(安培);
sub_metering_1:厨房有功电能(瓦时),主要包含洗碗机,烤箱和微波炉;
sub_metering_2:于洗衣房有功电能(瓦时),包含洗衣机,滚筒式烘干机,冰箱和电灯;
sub_metering_3:电热水器和空调有功电能(瓦时)。

     以上九个属性中,可以作为特征的有七个,去掉的两个是日期和时间,因为序列化数据已经包含先后顺序了,所以不需要时间和日期数据,因此可以使用的数据为一个由七个变量(特征)组成的多元序列。

     最后三个属性统计的电能消耗并不是家里所有的电路电能消耗。其它的电能消耗可以通过下式计算:

 

      这里注意:有功功率单位为 KW,有功电能的单位为瓦时(w a t t − h o u r ),以上数据都是间隔一分钟测得的,因此公式的前半部分就是通过有功率乘以时间(1/60小时,也就是一分钟)计算得到总的有功电能消耗,单位是瓦时。减去公式的后半部分(后三个属性的加和),得到了家庭中其他电路的电能消耗。

     该数据集已成为评估时间序列预测和多步预测(特别是预测有功功率)的机器学习方法的标准,接下来我们来探究该数据集。
 

二,数据处理

下载后的数据是txt格式的文件。数据的展现形式如下图所示

2.1 读入数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dataset = pd.read_csv('household_power_consumption.txt', sep=';', header=0, low_memory=False, infer_datetime_format=True, engine='c'parse_dates={'datetime':[0,1]}, index_col=['datetime'])

read_csv() 参数说明:

seq 参数:指定列之间的分隔符为 ';',字符串格式,默认为 ‘,’;
header 参数:指定哪一行作为列名,header=0 表示第一行数据作为列名,而不是文件的第一行作为列名;
low_memory:在内部对文件进行分块处理,从而在解析时减少了内存使用,但可能是混合类型推断。默认为 True,设置为 False 确保没有混合类型;
infer_datetime_format:设置该参数为 True 和 parse_dates 参数,pandas会推断列中日期时间字符串的格式,如果可以推断出,则切换到更快方法来解析它们。在某些情况下,这可以使解析速度提高5-10倍;
engine:要使用的解析器引擎。C引擎速度更快,而python引擎当前功能更完善;
parse_dates:{'datetime':[0,1]}将原数据中的第1、2列作为新的列名为 ‘datatime’ 的列,即将原来的日期列、时间列合并为日期时间一列;
index_col:指定’datetime’列为索引列;

2.2 处理异常数据,并加入新的数据

1,读入数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt#加载数据
dataset = pd.read_csv('/home/kongxianglan/code/household_power_consumption.txt', sep=';', header=0,low_memory=False, infer_datetime_format=True, engine='c',parse_dates={'datetime':[0,1]}, index_col=['datetime'])dataset.shape

 2,查看前10行的数据

#查看数据前10行:
dataset.head(10)

 3,异常数据的处理

#查看缺失值
dataset.isna().sum()#查看有默认标记的异常值
dataset.iloc[dataset.values == '?'].count()#有默认标记的异常值处理
#为了提高数据处理效率,将所有标记为’?'的异常值用 np.nan 替换,将数据作为一个浮点值数组来处理。
dataset.replace('?', np.nan, inplace=True)#再查看异常值
dataset.iloc[dataset.values == '?'].count()#再查看缺失值:
dataset.isna().sum()

 

 4,新加入一列

#添加新列
values = dataset.values.astype('float32')
dataset['sub_metering_4'] = (values[:,0] * 1000 / 60) - (values[:,4] + values[:,5] + values[:,6])#查看新的数据shape
dataset.shape#查看数据前十行
dataset.head(10)

 5,保存数据成.csv格式

dataset.to_csv('household_power_consumption.csv')

 6,总的代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt#加载数据
dataset = pd.read_csv('/home/kongxianglan/code/household_power_consumption.txt', sep=';', header=0,low_memory=False, infer_datetime_format=True, engine='c',parse_dates={'datetime':[0,1]}, index_col=['datetime'])dataset.shape#查看数据前10行:
dataset.head(10)#查看缺失值
dataset.isna().sum()#查看有默认标记的异常值
dataset.iloc[dataset.values == '?'].count()#有默认标记的异常值处理
#为了提高数据处理效率,将所有标记为’?'的异常值用 np.nan 替换,将数据作为一个浮点值数组来处理。
dataset.replace('?', np.nan, inplace=True)#再查看异常值
dataset.iloc[dataset.values == '?'].count()#再查看缺失值:
dataset.isna().sum()#添加新列
values = dataset.values.astype('float32')
dataset['sub_metering_4'] = (values[:,0] * 1000 / 60) - (values[:,4] + values[:,5] + values[:,6])#查看新的数据shape
dataset.shape#查看数据前十行
dataset.head(10)dataset.to_csv('household_power_consumption.csv')

 三,数据可视化

 3.1 查看每一个分量的四年的趋势

def plot_features(dataset):plt.figure(figsize=(16,12), dpi=200)for i in range(len(dataset.columns)):plt.subplot(len(dataset.columns), 1, i+1)feature_name = dataset.columns[i]plt.plot(dataset[feature_name])plt.title(feature_name, y=0)plt.grid(linestyle='--', alpha=0.5)plt.tight_layout()plt.show()plot_features(dataset)

 3.2 查看每年指定分类数据的变化图

      该部分的功能,是看8列中的其中一列的数据的每年的趋势,主要可以分析4年的数据趋势是否相似

     为每一年创建一个有功功率图,观察是否有相同的模式。因为2006年只有不到一个月的数据,所以不绘制该年的子图。完整代码如下:

def plot_year_gap(dataset, years_list):plt.figure(figsize=(16,12), dpi=150)for i in range(len(years_list)):ax = plt.subplot(len(years_list), 1, i+1)ax.set_ylabel(r'$KW$')year = years_list[i]year_data = dataset[str(year)]plt.plot(year_data['Global_active_power'])plt.title(str(year), y=0, loc='left')plt.grid(linestyle='--', alpha=0.5)plt.xticks(rotation=0)plt.tight_layout()plt.show()years = ['2007', '2008', '2009', '2010']
plot_year_gap(dataset, years)

    因为设置了 infer_datetime_format 参数,所以可直接使用年份索引进行截取数据。通过对以上数据进行分析可知,每年2月和8月内的某段时间耗电量有明显下降。我们似乎也看到夏季(6、7、8月)的用电量呈下降趋势,我们还可以在第一、第三和第四个图中有一些缺失的数据。

在这里插入图片描述

 3.3  查看一年每个月的规律

        接下来,进一步查看每个月的用电情况。比如查看2008年每个月的有功功率,可能有助于梳理出12个月的变化规律,如每日和每周用电状况规律。完整代码如下:

 3.4 查看每日的用电量

 就是查看,每天一个月(30天),每天的用电量的分布图

def plot_day_gap(dataset, year, month, days_list):plt.figure(figsize=(20,24), dpi=150)for i in range(len(days_list)):ax = plt.subplot(len(days_list), 1, i+1)ax.set_ylabel(r'$KW$',size=6)day = str(year) + '-0' + str(month) + '-' + str(days_list[i])day_data = dataset[day]gcp_data = day_data['Global_active_power']plt.plot(gcp_data)plt.title(day, y=0, loc='left', size=6)plt.grid(linestyle='--', alpha=0.5)plt.xticks(rotation=0)plt.show()year = 2008
month = 8
days = [i for i in range(1, 32)]
plot_day_gap(dataset, year, month, days)

 在这里插入图片描述

3.5  查看时间序列数据分布

     另一个需要考虑的重要方面是变量的分布。例如,了解观测值的分布是高斯分布还是其他分布。可以通过为每个特征创建一个直方图来研究数据分布。完整代码如下:

def dataset_distribution(dataset):plt.figure(figsize=(16,12), dpi=150)for i in range(len(dataset.columns)):ax = plt.subplot(len(dataset.columns), 1, i+1)ax.set_ylabel(r'$numbers$',size=10)feature_name = dataset.columns[i]dataset[feature_name].hist(bins=100)plt.title(feature_name, y=0, loc='right', size=20)plt.grid(linestyle='--', alpha=0.5)plt.xticks(rotation=0)plt.tight_layout()plt.show()dataset_distribution(dataset)

 在这里插入图片描述

       可以看到有功和无功功率、强度以及分表功率都是向瓦时或千瓦倾斜的分布,电压数据呈高斯分布。有功功率的分布似乎是双峰的,这意味着它看起来有两组观测值。可以通过查看四年来的数据的有功功率分布来验证,完整代码如下:

def plot_year_dist(dataset, years_list):plt.figure(figsize=(16,12), dpi=150)for i in range(len(years_list)):ax = plt.subplot(len(years_list), 1, i+1)ax.set_ylabel(r'$numbers$')ax.set_xlim(0, 5) # 设置x轴显示限制,保证每个子图x刻度相同year = years_list[i]year_data = dataset[str(year)]year_data['Global_active_power'].hist(bins=100, histtype='bar')plt.title(str(year), y=0, loc='right', size=10)plt.grid(linestyle='--', alpha=0.5)plt.xticks(rotation=0)plt.tight_layout()plt.show()years = ['2007', '2008', '2009', '2010']
plot_year_dist(dataset, years)

在这里插入图片描述

 可以看到,有功功率分布看起来非常相似。这种分布确实是双峰的,一个峰值约为0.3kw,另一个峰值约为1.3kw。随着有功功率(x轴)的增加,高功率用电时间点的数量越来越少。

3.7 查看 一年中每个月的有功功率分布

所确定的群体可能在一年中的不同季节有所不同。可以通过查看一年中每个月的有功功率分布来对此进行调查。完整代码如下:

def plot_month_dist(dataset, year, months_list):plt.figure(figsize=(16,12), dpi=150)for i in range(len(months_list)):ax = plt.subplot(len(months_list), 1, i+1)ax.set_ylabel(r'$KW$')ax.set_xlim(0, 5)month = str(year) + '-' + str(months_list[i])month_data = dataset[month]month_data['Global_active_power'].hist(bins=100, histtype='bar')plt.title(month, y=0, loc='right', size=10)plt.grid(linestyle='--', alpha=0.5)plt.xticks(rotation=0)plt.tight_layout()plt.show()year = 2008
months = [i for i in range(1, 13)]
plot_month_dist(dataset, year, months)

在这里插入图片描述

4,数据满足的业务需求 

对于我们使用的家庭用电量数据集来说,可以提出很多建模问题,比如:

预测一天内每小时的耗电量;
预测一周内每天的耗电量;
预测一月内每天的耗电量;
预测一年内每天的耗电量。

    以上四类预测问题称为多步预测。利用所有特征进行预测的模型称为多变量多步预测模型。每个模型都不局限于日期的大小,还可以根据需求对更细粒度的问题进行建模,比如一天内某各时段每分钟的耗电量预测问题。这有助于电力公司进行电能调度,是一个广泛研究的重要问题。

参考博文:

时间序列预测11:用电量预测 01 数据分析与建模_Constant dripping wears the stone-CSDN博客_用电量预测模型

这篇关于机器学习笔记七-----------------使用Prophet(时间序列模型)预测家用电量的数据的笔记一------数据集解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233791

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo