热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习笔记六使用Prophet(时间序列模型)预测空气质量的数据的例程的笔记

一,源码及数据的下载链接https:github.commarcopeixair-quality二,源码解读2.1,读入原始数据原

一,源码及数据的下载链接

https://github.com/marcopeix/air-quality


二,源码解读


2.1,读入原始数据

原始数据大小【9471,17】

DATAPATH = '/home/kongxianglan/code/air-quality-master/data/AirQualityUCI.csv'
data = pd.read_csv(DATAPATH, sep=';')
data.head()
print(data)
# (9471, 17)
data.shape

存在的问题,数据的.是,号


2.2,数据清洗及关键数据的提取

1,删除全为空值的行或列,删除后数据变为【9357,15】

data.dropna(axis=1, how='all', inplace=True)
data.dropna(axis=0, how='all', inplace=True)
# (9357, 15)
data.shape
data.head()

2,将数据格式转换为Prophet预测模型需要的数据格式

主要是将数据转换为浮点数据,将数据的,号变为.号

# 数据加载,并将数据转换为浮点型同时将,替换成.
data['Date'] = pd.to_datetime(data['Date'])
for col in data.iloc[:, 2:].columns:if data[col].dtypes == object:data[col] = data[col].str.replace(',', '.').astype('float')

3,将粒度为小时的数据转换为粒度为天的数据

算法将一天内每个小时的气体的浓度求均值,作为一天的

def positive_average(num):return num[num > -200].mean()daily_data = data.drop('Time', axis=1).groupby('Date').apply(positive_average)

 4,检查每一列的NAN值是否是大于8个的

daily_data.isna().sum() > 8

 5,删除nan大于8个的气体浓度的列

daily_data &#61; daily_data.iloc[:,(daily_data.isna().sum() <&#61; 8).values]

经过该数据操作后&#xff0c;数据的个数变为&#xff1a; 【391, 9】

6&#xff0c; 再次删除全为空值的行或列,删除后数据变为【383&#xff0c;9】

daily_data &#61; daily_data.dropna()
daily_data.shape

7&#xff0c;将数据变为粒度为周的数据

weekly_data &#61; daily_data.resample(&#39;W&#39;).mean()

 6&#xff0c; 再次删除全为空值的行或列,删除后数据变为【73&#xff0c;9】

daily_data &#61; daily_data.dropna()
daily_data.shape

 7&#xff0c;显示剩余的9中气体的浓度含量的曲线图

def plot_data(col):plt.figure(figsize&#61;(17, 8))plt.plot(weekly_data[col])plt.xlabel(&#39;Time&#39;)plt.ylabel(col)plt.grid(False)plt.show()for col in weekly_data.columns:plot_data(col)

 8&#xff0c;提取空气质量预测的关键性数据

#让我们专注于预测氮氧化物的浓度。氮的氧化物会发生反应形成烟雾和酸雨&#xff0c;
# 而且是细颗粒物和地面臭氧形成的核心&#xff0c;这两种物质都与有害健康有关。
#只保留关键的氮氧化物的浓度
cols_to_drop &#61; [&#39;PT08.S1(CO)&#39;, &#39;C6H6(GT)&#39;, &#39;PT08.S2(NMHC)&#39;, &#39;PT08.S4(NO2)&#39;, &#39;PT08.S5(O3)&#39;, &#39;T&#39;, &#39;RH&#39;, &#39;AH&#39;]
weekly_data &#61; weekly_data.drop(cols_to_drop, axis&#61;1)
weekly_data.head()


 2.3 预测及验证

1&#xff0c; 将数据格式转换为模型需要的格式

df &#61; weekly_data.reset_index()
df.columns &#61; [&#39;ds&#39;, &#39;y&#39;]
df.head()

 2&#xff0c;定义要训练的数据的截止位置

prediction_size &#61; 30
train_df &#61; df[:-prediction_size]

 3&#xff0c;定义模型且进行拟合

m &#61; Prophet()
m.fit(train_df)

4&#xff0c;指定预测的时间段 

future &#61; m.make_future_dataframe(periods&#61;prediction_size)
forecast &#61; m.predict(future)
forecast.head()

 5&#xff0c;结果显示

m.plot(forecast)

 6&#xff0c;其他分量预测的显示

m.plot_components(forecast)

 7&#xff0c;从结果中抽取需要的数据

可以直观的看预测和真实值之间的对比

def make_comparison_dataframe(historical, forecast):return forecast.set_index(&#39;ds&#39;)[[&#39;yhat&#39;, &#39;yhat_lower&#39;, &#39;yhat_upper&#39;]].join(historical.set_index(&#39;ds&#39;))cmp_df &#61; make_comparison_dataframe(df, forecast)cmp_df.head()

 8&#xff0c;使用自己定义的误差计算算法计算预测的误差

def calculate_forecast_errors(df, prediction_size):df &#61; df.copy()df[&#39;e&#39;] &#61; df[&#39;y&#39;] - df[&#39;yhat&#39;]df[&#39;p&#39;] &#61; 100 * df[&#39;e&#39;] / df[&#39;y&#39;]predicted_part &#61; df[-prediction_size:]error_mean &#61; lambda error_name: np.mean(np.abs(predicted_part[error_name]))return {&#39;MAPE&#39;: error_mean(&#39;p&#39;), &#39;MAE&#39;: error_mean(&#39;e&#39;)}for err_name, err_value in calculate_forecast_errors(cmp_df, prediction_size).items():print(err_name, err_value)

 9&#xff0c;将想要的信息显示在一张图上

plt.figure(figsize&#61;(17, 8))
plt.plot(cmp_df[&#39;yhat&#39;])
plt.plot(cmp_df[&#39;yhat_lower&#39;])
plt.plot(cmp_df[&#39;yhat_upper&#39;])
plt.plot(cmp_df[&#39;y&#39;])
plt.xlabel(&#39;Time&#39;)
plt.ylabel(&#39;Average Weekly NOx Concentration&#39;)
plt.grid(False)
plt.show()


 三&#xff0c;总代码

import warnings
warnings.filterwarnings(&#39;ignore&#39;)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet
import loggingdef positive_average(num):return num[num > -200].mean()
#数据图像显示
def plot_data(col):plt.figure(figsize&#61;(17, 8))plt.plot(weekly_data[col])plt.xlabel(&#39;Time&#39;)plt.ylabel(col)plt.grid(False)plt.show()def make_comparison_dataframe(historical, forecast):return forecast.set_index(&#39;ds&#39;)[[&#39;yhat&#39;, &#39;yhat_lower&#39;, &#39;yhat_upper&#39;]].join(historical.set_index(&#39;ds&#39;))def calculate_forecast_errors(df, prediction_size):df &#61; df.copy()df[&#39;e&#39;] &#61; df[&#39;y&#39;] - df[&#39;yhat&#39;]df[&#39;p&#39;] &#61; 100 * df[&#39;e&#39;] / df[&#39;y&#39;]predicted_part &#61; df[-prediction_size:]error_mean &#61; lambda error_name: np.mean(np.abs(predicted_part[error_name]))return {&#39;MAPE&#39;: error_mean(&#39;p&#39;), &#39;MAE&#39;: error_mean(&#39;e&#39;)}DATAPATH &#61; &#39;/home/kongxianglan/code/air-quality-master/data/AirQualityUCI.csv&#39;
data &#61; pd.read_csv(DATAPATH, sep&#61;&#39;;&#39;)
data.head()
print(data)
# (9471, 17)
data.shape# 删除全为空值的行或列
data.dropna(axis&#61;1, how&#61;&#39;all&#39;, inplace&#61;True)
data.dropna(axis&#61;0, how&#61;&#39;all&#39;, inplace&#61;True)
# (9357, 15)
data.shape
data.head()
# 数据加载&#xff0c;并将数据转换为浮点型同时将,替换成.
data[&#39;Date&#39;] &#61; pd.to_datetime(data[&#39;Date&#39;])
for col in data.iloc[:, 2:].columns:if data[col].dtypes &#61;&#61; object:data[col] &#61; data[col].str.replace(&#39;,&#39;, &#39;.&#39;).astype(&#39;float&#39;)#通过取每个测量的平均值来按天汇总数据
daily_data &#61; data.drop(&#39;Time&#39;, axis&#61;1).groupby(&#39;Date&#39;).apply(positive_average)
daily_data.head()
print(daily_data)
#摆脱的NaN,如果需要查看有多少个NaN使用语句daily_data.isna().sum()
print("NaN的有")
daily_data.isna().sum()daily_data.isna().sum() > 8
daily_data &#61; daily_data.iloc[:,(daily_data.isna().sum() <&#61; 8).values]
daily_data.head()
print("去除NaN后有")
daily_data.shape#二次删除全为空值的行或列
daily_data &#61; daily_data.dropna()
print("二次删除全为空值的行或列")
daily_data.shape
#将数据按周进行重采样
weekly_data &#61; daily_data.resample(&#39;W&#39;).mean()
weekly_data.head()
print("数据按周进行重采样")
weekly_data
weekly_data &#61; weekly_data.dropna()
weekly_data.shape
#按周显示空气中各个气体含量的数据
for col in weekly_data.columns:plot_data(col)
#让我们专注于预测氮氧化物的浓度。氮的氧化物会发生反应形成烟雾和酸雨&#xff0c;
# 而且是细颗粒物和地面臭氧形成的核心&#xff0c;这两种物质都与有害健康有关。
#只保留关键的氮氧化物的浓度
cols_to_drop &#61; [&#39;PT08.S1(CO)&#39;, &#39;C6H6(GT)&#39;, &#39;PT08.S2(NMHC)&#39;, &#39;PT08.S4(NO2)&#39;, &#39;PT08.S5(O3)&#39;, &#39;T&#39;, &#39;RH&#39;, &#39;AH&#39;]
weekly_data &#61; weekly_data.drop(cols_to_drop, axis&#61;1)
weekly_data.head()logging.getLogger().setLevel(logging.ERROR)
#真正要预测的数据的加载
df &#61; weekly_data.reset_index()
df.columns &#61; [&#39;ds&#39;, &#39;y&#39;]
df.head()
#交叉验证的数据放后面30个数据
prediction_size &#61; 30
train_df &#61; df[:-prediction_size]
m &#61; Prophet()
m.fit(train_df)future &#61; m.make_future_dataframe(periods&#61;prediction_size)
forecast &#61; m.predict(future)
forecast.head()
m.plot(forecast)
m.plot_components(forecast)cmp_df &#61; make_comparison_dataframe(df, forecast)
cmp_df.head()for err_name, err_value in calculate_forecast_errors(cmp_df, prediction_size).items():print(err_name, err_value)plt.figure(figsize&#61;(17, 8))
plt.plot(cmp_df[&#39;yhat&#39;])
plt.plot(cmp_df[&#39;yhat_lower&#39;])
plt.plot(cmp_df[&#39;yhat_upper&#39;])
plt.plot(cmp_df[&#39;y&#39;])
plt.xlabel(&#39;Time&#39;)
plt.ylabel(&#39;Average Weekly NOx Concentration&#39;)
plt.grid(False)
plt.show()


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
author-avatar
想零的时候
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有