更多细节可见官网地址:https://facebook.github.io/prophet/docs/quick_start.html#python-api
一、模型介绍
Prophet 是facebook开源的的一个时间序列预测算法,特别适合于处理具有季节性和趋势的数据。主要思想是将数据分解为如下三个部分:趋势、季节性、节假日和特殊事件。
y(t)=g(t)+s(t)+h(t)+α
其中g(t)表示趋势项,s(t)表示季节项,h(t)表示节假日项,α表示残差项,通常是正态分布的。然后各项分别被拟合,最后的累加结果即是Prophet算法的预测结果。
二、Prophet 案例
Prophet 遵循sklearn模型 API。我们创建类的实例Prophet,然后调用它的fit方法predict。
Prophet 的输入始终是一个包含两列的数据框:ds和y。ds(日期戳)列应为 Pandas 所需的格式,理想情况下,日期为 YYYY-MM-DD,时间戳为 YYYY-MM-DD HH:MM:SS。该y列必须是数字,代表我们希望预测的测量值。
# python -m pip install prophet 安装
#从 v0.6 开始,不再支持 Python 2。
#从 v1.0 开始,PyPI 上的包名称为“prophet”;在 v1.0 之前它是“fbprophet”。
#从 v1.1 开始,支持的最低 Python 版本为 3.7。
import pandas as pd
from prophet import Prophet
#加载数据
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_peyton_manning.csv')
df.head()
通过实例化一个新对象来拟合模型Prophet。预测过程的任何设置都会传递到构造函数中。然后调用其fit方法并传入历史数据框
m = Prophet()
m.fit(df)
对数据框进行预测,其中有一列ds包含要进行预测的日期。可以使用辅助方法获取延伸到未来指定天数的合适数据框Prophet.make_future_dataframe。默认情况下,它还将包含历史记录中的日期,因此我们也将看到模型拟合。
future = m.make_future_dataframe(periods=365)
future.tail()
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
Prophet.plot可以通过调用该方法并传入预测数据框来绘制预测图。
fig1 = m.plot(forecast)
查看预测成分,可以使用Prophet.plot_components方法。默认情况下,看到时间序列的趋势、年度季节性和每周季节性
fig2 = m.plot_components(forecast)
可以使用 plotly 创建预测和组件的交互式图表。需要单独安装 plotly 4.0 或更高版本,因为它不会默认与 prophecy 一起安装。还需要安装notebook和ipywidgets包。
from prophet.plot import plot_plotly, plot_components_plotly
plot_plotly(m, forecast)
plot_components_plotly(m, forecast)
三、乘法季节性(Multiplicative Seasonality)
默认情况下,Prophet 会拟合附加季节性,这意味着季节性的影响会添加到趋势中以获得预测。下图这个时间序列具有明显的年度周期,但预测中的季节性在时间序列开始时太大,在结束时太小。在这个时间序列中,季节性不是 Prophet 假设的恒定加法因子,而是随着趋势而增长。这是乘法季节性。
import pandas as pd
from prophet import Prophet
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_air_passengers.csv')
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(50, freq='MS')
forecast = m.predict(future)
fig = m.plot(forecast)
seasonality_mode=‘multiplicative’ Prophet 可以通过设置输入参数来模拟乘法季节性
m = Prophet(seasonality_mode='multiplicative')
m.fit(df)
forecast = m.predict(future)
fig = m.plot(forecast)
fig = m.plot_components(forecast)
使用seasonality_mode=‘multiplicative’,假日效应也将被建模为乘法。同时存在加法和乘法季节性混合出现的可能性很小,因此通常只有在有理由预期会出现这种情况时才会使用。具体见官网https://facebook.github.io/prophet/docs/multiplicative_seasonality.html。
四、异常值
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_R_outliers1.csv')
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=1096)
forecast = m.predict(future)
fig = m.plot(forecast)
趋势预测似乎合理,但不确定性区间似乎太宽。Prophet 能够处理历史中的异常值,但只能通过将其与趋势变化相拟合。然后,不确定性模型会预期未来趋势变化的幅度相似。处理异常值的最佳方法是将其移除 - Prophet 不会处理缺失数据。处理方式将异常值设置为None。
df.loc[(df['ds'] > '2010-01-01') & (df['ds'] < '2011-01-01'), 'y'] = None
model = Prophet().fit(df)
fig = model.plot(model.predict(future))
标签:plot,df,Prophet,forecast,---,future,prophet,序列
From: https://blog.csdn.net/u012121721/article/details/143336699