在时间序列分析中,季节性是一个常见的模式,即数据中存在按固定周期重复的波动。Prophet 模型通过傅里叶级数(Fourier Series)来处理和建模这种季节性。
### 傅里叶级数简介
傅里叶级数是一种将周期函数分解为一组正弦和余弦函数的数学方法。这些正弦和余弦函数的频率是周期函数的整数倍。通过这种方式,傅里叶级数能够近似任何周期性函数。它可以用以下公式表示:
\[ f(t) = a_0 + \sum_{n=1}^{N} \left( a_n \cos \left( \frac{2 \pi n t}{P} \right) + b_n \sin \left( \frac{2 \pi n t}{P} \right) \right) \]
其中:
- \( f(t) \) 是时间 \( t \) 上的值
- \( a_0 \) 是常数项
- \( a_n \) 和 \( b_n \) 是傅里叶系数
- \( N \) 是级数的项数(即傅里叶项的数量)
- \( P \) 是周期
### Prophet 中的傅里叶级数
Prophet 使用傅里叶级数来捕捉数据中的季节性成分。季节性成分是数据中按周期变化的部分,比如每年的季节性变化(如销售高峰和低谷),每周的变化(如周末的模式)等。
在 Prophet 中,可以通过以下参数来控制傅里叶级数的使用:
- `seasonality_mode`:可以设置为 `'additive'`(加法模型)或 `'multiplicative'`(乘法模型)。
- `seasonality_prior_scale`:控制季节性成分的强度。数值越大,季节性成分对模型的影响越大。
- `yearly_seasonality`、`weekly_seasonality`、`daily_seasonality`:控制年、周、日季节性的使用。可以是布尔值或整数。整数表示傅里叶项的数量。
- `fourier_order`:傅里叶级数的项数,越高表示可以捕捉更复杂的季节性模式。
### 使用示例
下面是一个简单的示例,展示如何在 Prophet 中使用傅里叶级数建模季节性:
```python
from fbprophet import Prophet
import pandas as pd
# 创建一个包含历史数据的示例数据框
data = {
'ds': pd.date_range(start='2023-01-01', periods=365, freq='D'),
'y': [i + 0.5*i**0.5 for i in range(365)]
}
df = pd.DataFrame(data)
# 初始化并配置Prophet模型
model = Prophet(
yearly_seasonality=True, # 启用年度季节性
weekly_seasonality=True, # 启用周季节性
daily_seasonality=False, # 禁用日季节性
seasonality_mode='additive', # 使用加法模式
seasonality_prior_scale=10.0 # 设置季节性强度
)
# 拟合模型
model.fit(df)
# 创建一个包含未来30天的日期数据框
future = model.make_future_dataframe(periods=30)
# 使用模型进行预测
forecast = model.predict(future)
# 查看预测结果
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
```
### 总结
通过傅里叶级数,Prophet 能够捕捉和建模时间序列数据中的复杂季节性模式。这使得 Prophet 成为一个强大且灵活的时间序列分析工具,适用于各种具有季节性特征的数据集。