[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

prophet使用
Prophet 模型的常见用法和功能:
- 时间序列预测:
- Prophet 可以预测未来的时间点。例如,你可以使用它来预测销售额、网站流量等。
- 处理季节性数据:
- Prophet 可以识别和建模周期性季节性。它允许你定义年季节性、周季节性和日季节性,还可以添加自定义季节性组件。
- 节假日效应建模:
- 你可以将假期或特殊事件添加到模型中,以便模型可以考虑这些假期对数据的影响。
- 异常值检测和处理:
- Prophet 可以处理数据中的异常值。它能够识别并对异常数据点进行调整,从而提高预测的准确性。
- 趋势变化点检测:
- Prophet 可以自动检测时间序列数据中的趋势变化点,并允许用户自定义这些变化点。
- 灵活的模型调整:
- 用户可以通过设置模型参数(如趋势、季节性)来调整模型,以更好地适应特定的数据集和需求。
时间序列预测
以下是使用 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' 表示月初,即每个月的第一天。'''
'''Predict()函数==的计算结果是一个包含多个列的DataFrame,
其中最重要的列或许是被预测的日期时间(“ds”列)、预测值(“yhat”列)以及预测值的上下限(“yhat_lower”列和“yhat_upper”列)——为预测的不确定性提供区间估计。 '''

调整模型参数
下面是一个使用 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 模型以适应不同的数据集和预测需求