[TOC]

Prophet介绍

Prophet 是由 Facebook 开发的一个开源时间序列预测工具,专门用于预测时间序列数据,特别是具有季节性、节假日效应的数据

prophet安装

安装 fb之前需要安装前置依赖

安装 fbprophet之前需要安装前置依赖 创建虚拟环境使用conda安装

conda create -n py37 python=3.7

启动虚拟环境

conda activate py37

安装prophet

conda install -c conda-forge prophet Description

prophet使用

Prophet 模型的常见用法和功能:

  1. 时间序列预测
    • Prophet 可以预测未来的时间点。例如,你可以使用它来预测销售额、网站流量等。
  2. 处理季节性数据
    • Prophet 可以识别和建模周期性季节性。它允许你定义年季节性、周季节性和日季节性,还可以添加自定义季节性组件。
  3. 节假日效应建模
    • 你可以将假期或特殊事件添加到模型中,以便模型可以考虑这些假期对数据的影响。
  4. 异常值检测和处理
    • Prophet 可以处理数据中的异常值。它能够识别并对异常数据点进行调整,从而提高预测的准确性。
  5. 趋势变化点检测
    • Prophet 可以自动检测时间序列数据中的趋势变化点,并允许用户自定义这些变化点。
  6. 灵活的模型调整
    • 用户可以通过设置模型参数(如趋势、季节性)来调整模型,以更好地适应特定的数据集和需求。

时间序列预测

以下是使用 prophet 进行时间序列预测的基本示例:

# Python
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
 
# 创建示例数据 ds列 即时间序列 y列即 数值序列 序列个数必须相同
data = pd.DataFrame({
    'ds': pd.date_range(start='2023-01-01', periods=50, freq='D'),
    'y': range(50)
})
 
print(data)
# 创建并训练模型
model = Prophet()
model.fit(data)
# fit()函数接受时间序列数据以DataFrame的形式被传入,同时对这个DataFrame也有特殊的格式要求:第一列必须被命名为“ds”并包含日期信息;第二列必须被命名为“y”并包含观测结果 这就意味着我们需要修改原数据集中的列名,同时把第一列转为日期时间对象
# 进行预测
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
 
# 绘制预测结果 加载数据并进行图表绘制
fig = model.plot(forecast)
plt.show()

在这个示例中,我们创建了一些示例数据,并使用 Prophet 进行时间序列预测。make_future_dataframe 方法生成预测所需的未来日期,然后 predict 方法对这些日期进行预测,最后我们绘制了预测结果图。

'''在使用model.make_future_dataframe(periods=12,freq='MS') 函数生成未来日期时,使用 freq='M' 表示按月计算。在Pandas中,频率参数 'M' 表示月末(MonthEnd),因此生成的日期将会是每个月的最后一天。 如果希望生成每个月的第一天作为日期,可以使用 freq='MS',其中 'MS' 表示月初,即每个月的第一天。''' Description '''Predict()函数==的计算结果是一个包含多个列的DataFrame, 其中最重要的列或许是被预测的日期时间(“ds”列)、预测值(“yhat”列)以及预测值的上下限(“yhat_lower”列和“yhat_upper”列)——为预测的不确定性提供区间估计。 ''' Description

调整模型参数

下面是一个使用 prophet 灵活调整模型参数的示例。我们可以设置趋势、季节性、假期等参数,以适应特定的数据集和需求

from prophet import Prophet
import matplotlib.pyplot as plt

# 创建示例数据
data = pd.DataFrame({
   'ds': pd.date_range(start='2023-01-01', periods=365, freq='D'),
   'y': range(365)  # 假设这是一年的数据
})

# 创建并配置模型
model = Prophet(
   growth='linear',  # 或 'logistic' 进行对数增长
   yearly_seasonality=True,  # 自动设置年度季节性
   weekly_seasonality=True,  # 自动设置周季节性
   daily_seasonality=False,  # 可选择启用或禁用日季节性
   changepoint_prior_scale=0.1,  # 趋势变化点的灵活性
   seasonality_prior_scale=10.0  # 季节性变化的灵活性
)

# 添加自定义假期
holidays = pd.DataFrame({
   'holiday': 'holiday_name',
   'ds': pd.to_datetime(['2023-12-25', '2023-01-01']),
   'lower_window': 0,
   'upper_window': 1,
})
model.add_country_holidays(country_name='US')  # 可以添加特定国家的假期

# 训练模型
model.fit(data)

# 进行预测
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)

# 绘制预测结果
fig = model.plot(forecast)
plt.show() 

growth 用于选择趋势类型,可以是线性(linear)或对数(logistic)。 changepoint_prior_scale 控制趋势变化点的灵活性,值越大模型对趋势变化越敏感。 seasonality_prior_scale 控制季节性变化的灵活性,值越大季节性变化越明显。 add_country_holidays 用于添加特定国家的假期影响。 通过这些设置,你可以灵活地调整 prophet 模型以适应不同的数据集和预测需求