拓端tecdat|Prophet在R语言中进行时间序列数据预测

程昱
• 阅读 1705

原文链接:http://tecdat.cn/?p=7327

[](http://tecdat.cn/?p=7327) 

您将学习如何使用Prophet(在R中)解决一个常见问题:预测公司明年的每日订单。 

 

数据准备与探索

先知最适合每日定期数据以及至少一年的历史数据。 我们将使用SQL处理每天要预测的数据:

`**select**``date,**value****from**modeanalytics.daily_orders**order****by**date`

现在,我们每天都有数据,我们可以将SQL查询结果集通过管道传递到R笔记本中的R数据框对象中。首先,将您的SQL查询重命名为Daily Orders。然后,在R 中,我们可以使用以下语句将查询结果集传递到数据帧df中:

**df**<- datasets[["Daily Orders"]]

为了快速了解您的数据框包含多少个观测值,可以运行以下语句:

# Retreive dimension of object**dim**(df)

Prophet总是希望输入DataFrame中有两列:ds,分别y,包含日期和数值。 

# Inspect variables**str**(df)

在此示例中,您将需要进行一些手动的类转换:

# Parse date column**df**<- mutate ( df, date = ymd_hms(date)# parse date column using lubridate ymd_hms function)

一旦确认数据框中的列是正确的类,就可以ds在数据框中创建一个新列,该列是date列的精确副本,一个新列y是value列的精确副本:

df <- mutate ( df, ds = date,# Create new ds column from date using mutatey =**value**# Create new y column from value using mutate)

然后,您可以重新调整该date列的用途,以用作数据框 :

现在您已经准备好要与Prophet一起使用的数据,在将数据输入到Prophet中之前,将其作图并检查数据的外观是个好习惯。 

拓端tecdat|Prophet在R语言中进行时间序列数据预测

 

  1. 2017年5月左右,趋势轨迹发生了明显变化。默认情况下,Prophet自动检测到此类“ 趋势变化点 ”,并允许趋势进行适当调整。先知还允许对这些趋势变化点的识别进行更细粒度的控制。
  2. 每周和每年都有明显的季节性。如果时间序列长于两个周期以上,则先知将自动适应每周和每年的季节性。
  3. 我们的观察结果的均值和方差随时间增加。 

Box-Cox变换

通常在预测中,您会明确选择一种特定类型的幂变换,以将其应用于数据以消除噪声,然后再将数据输入到预测模型中(例如,对数变换或平方根变换等)。但是,有时可能难以确定哪种功率变换适合您的数据。 

Box-Cox变换是一种数据变换,用于评估一组Lambda系数(λ)并选择可实现最佳正态性近似值的值。

 

如果我们将新转换的数据与未转换的数据一起绘制,则可以看到Box-Cox转换能够消除随着时间变化而观察到的许多增加的方差:

拓端tecdat|Prophet在R语言中进行时间序列数据预测

预测

使用Prophet通过Box-Cox转换的数据集拟合模型后,现在就可以开始对未来日期进行预测。 
现在,我们可以使用该predict()函数对未来数据帧中的每一行进行预测。

**forecast**<- predict(m, future)

此时,Prophet将创建一个分配给预测变量的新数据框,其中包含名为的列下的未来日期的预测值yhat以及不确定性间隔和预测的组成部分。 :

plot(m, forecast)

在我们的示例中,我们的预测如下所示:

拓端tecdat|Prophet在R语言中进行时间序列数据预测

如果要可视化各个预测组件,则可以使用Prophet的内置plot_components功能:
plot_components在我们的示例数据上运行将返回以下一组组件可视化:

拓端tecdat|Prophet在R语言中进行时间序列数据预测

拓端tecdat|Prophet在R语言中进行时间序列数据预测

预测和组件可视化显示,Prophet能够准确地建模数据中的潜在趋势,同时还可以精确地建模每周和每年的季节性(例如,周末和节假日的订单量较低)。

逆Box-Cox变换

由于先知用于Box-Cox转换后的数据,因此您需要将预测值转换回其原始单位。要将新的预测值转换回其原始单位,您将需要执行Box-Cox逆转换。

现在,您已将预测值转换回其原始单位,现在可以将预测值与历史值一起可视化:

拓端tecdat|Prophet在R语言中进行时间序列数据预测

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
R和python语言如何求平均值,中位数和众数
均值是通过取数值的总和并除以数据序列中的值的数量来计算。R语言平均值公式:mean(x,trim0,na.rmFALSE,...)\x<c(22,13,2,45,56,73,21,44,NA)\result.mean<mean(x,rim0.2,na.rmTRUE)rim0
Stella981 Stella981
3年前
Prometheus监控学习笔记之PromQL简单示例
0x00简单的时间序列选择返回度量指标http_requests_total的所有时间序列样本数据:http_requests_total返回度量指标名称为http_requests_total,标签分别是job"apiserver",handler"/api/comments"
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
PHP+jQuery寥寥几行代码轻松实现百度搜索那样的无刷新PJAX的分页列表和导航链接
!(https://static.oschina.net/uploads/space/2016/1208/171419_U00R_561214.png)PHP寥寥几行代码轻松实现百度搜索那样的分页列表和导航链接,某些语言的拥趸哭晕在厕所.<?php$apparray('db_prefix''
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这