时间序列预测神器Prophet【入门教程1】

2024-08-07 10:32:46 浏览数 (2)

公众号:尤而小屋 编辑:Peter 作者:Peter

大家好,我是Peter~

今天给大家分享一个时间序列预测神器Prophet的简易入门教程。

什么是Prophet

Prophet是一种基于加法模型的时间序列预测工具,由Facebook的数据科学团队开发。它可以处理时间序列数据中的多种复杂性,包括趋势变化、季节性变化以及节假日效应等。

官网地址:https://facebook.github.io/prophet/docs/quick_start.html#python-api

在Prophet中,时间序列被分解为多个组成部分,包括趋势、季节性、节假日效应和误差项。这些组成部分可以分别进行建模和预测,然后将它们组合起来得到最终的预测结果。

Prophet的主要优点是易于使用和可解释性强。它提供了一种简单的接口,可以通过几行代码来训练和预测时间序列模型。同时,它还提供了丰富的可视化工具,可以帮助用户理解模型的行为和性能。

Prophet安装

Github官方地址:https://github.com/facebook/prophet

先安装prophet包:

代码语言:python代码运行次数:0复制
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple prophet

Windows系统中一次性安装成功。如果有安装失败,需要自行百度下。

导入库

代码语言:python代码运行次数:0复制
import numpy as np
import pandas as pd
import os
import datetime 
import time
import re
np.random.seed(42)   

import plotly_express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import matplotlib.pyplot as plt
%matplotlib inline
# 设置支持中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] 
# 设置图像标题字体
plt.rcParams['axes.unicode_minus'] = False
import seaborn as sns
sns.set_theme(style="darkgrid")

import statsmodels.api as sm
import statsmodels.formula.api as smf
from statsmodels.tsa.stattools import adfuller
from sklearn.metrics import r2_score,mean_squared_error,mean_squared_log_error

from prophet import Prophet 

import warnings
warnings.filterwarnings('ignore')

读取数据

代码语言:python代码运行次数:0复制
df = pd.read_csv("https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_peyton_manning.csv")
# df.to_csv("data.csv",index=False)  # 保存到本地
df.head()

该数据是佩顿.曼宁(美式橄榄球运动员)的维基百科的每日访问量的时间序列数据。

Prophet的输入数据一般都是两列:ds和y。其中,ds表示时间数据,y是我们希望预测的数值变量。

数据基本信息

代码语言:python代码运行次数:0复制
df["ds"].min(),df["ds"].max()

('2007-12-10', '2016-01-20')

代码语言:python代码运行次数:0复制
df["y"].min(),df["y"].max()

(5.26269018890489, 12.846746888829)

原数据可视化

代码语言:python代码运行次数:0复制
fig = px.scatter(df,x="ds",y="y")

fig.show()

从图像中能够观察到,该数据有良好的周期性(季节性),y值在不断地变化。

数据对数转换

对数据进行对数转换:np.log

代码语言:python代码运行次数:0复制
df["y"] = np.log(df["y"])

Prophet简易预测

Prophet遵循了sklearn的接口方式,在实例化Prophet对象的基础上可以使用fit方法进行训练,predict进行预测。

fit过程

代码语言:python代码运行次数:0复制
p = Prophet()  
p.fit(df)

<prophet.forecaster.Prophet at 0x78c63111acb0>

构建预测数据

使用辅助的方法 Prophet.make_future_dataframe构建待预测的数据:

代码语言:python代码运行次数:0复制
future = p.make_future_dataframe(periods=365)  # 指定预测一年的数据
future

predict过程

代码语言:python代码运行次数:0复制
forecast = p.predict(future)
forecast.head()
代码语言:python代码运行次数:0复制
forecast.columns  # 生成预测数据的全部字段信息

Index(['ds', 'trend', 'yhat_lower', 'yhat_upper', 'trend_lower', 'trend_upper',
           'additive_terms', 'additive_terms_lower', 'additive_terms_upper',
           'weekly', 'weekly_lower', 'weekly_upper', 'yearly', 'yearly_lower',
           'yearly_upper', 'multiplicative_terms', 'multiplicative_terms_lower',
           'multiplicative_terms_upper', 'yhat'],
          dtype='object')

选取部分我们关注的字段:原始ds、预测值yhat、预测最低值yhat_lower、预测最高值yhat_upper

代码语言:python代码运行次数:0复制
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

预测可视化

调用plot方法进行预测结果的可视化:

代码语言:python代码运行次数:0复制
p.plot(forecast)
plt.show()

预测成分分析

调用plot_components方法

代码语言:python代码运行次数:0复制
forecast.columns

Index(['ds', 'trend', 'yhat_lower', 'yhat_upper', 'trend_lower', 'trend_upper',
           'additive_terms', 'additive_terms_lower', 'additive_terms_upper',
           'weekly', 'weekly_lower', 'weekly_upper', 'yearly', 'yearly_lower',
           'yearly_upper', 'multiplicative_terms', 'multiplicative_terms_lower',
           'multiplicative_terms_upper', 'yhat'],
          dtype='object')
代码语言:python代码运行次数:0复制
p.plot_components(forecast)
plt.show()

可以看到每个成分的变化趋势。图1是根据trend画出来的,图2是根据weekly画出来的,图3是根据yearly画出来的。

在加法模型中,有如下关系式:

代码语言:python代码运行次数:0复制
forecast['additive_terms'] = forecast['weekly']   forecast['yearly']
forecast['yhat']  = forecast['trend']    forecast['additive_terms'] 
forecast['yhat']  = forecast['trend']  forecast['weekly']   forecast['yearly']

如果存在假期因素holidays,则有:

代码语言:python代码运行次数:0复制
forecast['yhat']  = forecast['trend']  forecast['weekly']   forecast['yearly']   forecast['holidays']

0 人点赞