季节性
季节性和假日效应
建模季节性
季节周期
给定一个 Polars 偏移别名 freq,使用 functime.offsets.freq_to_sp 返回一个季节性周期的列表。
seasonal_periods = {
"1s": [60, 3_600, 86_400, 604_800, 31_557_600],
"1m": [60, 1_440, 10_080, 525_960],
"30m": [48, 336, 17_532],
"1h": [24, 168, 8_766],
"1d": [7, 365],
"1w": [52],
"1mo": [12],
"3mo": [4],
"1y": [1],
}
方法 1. 虚拟变量 / 类别
使用 add_calendar_effects 生成日期时间和日历效应。 functime 支持两种策略来将季节性建模为离散特征:通过分类列(对于具有本机分类特征支持的预测器非常有用,例如 lightgbm)或多个二进制列(即独热编码)。查看 第 7.4 章:季节性虚拟变量 以获取快速入门。
如果您选择哑变量策略,请注意“哑变量陷阱”(即如果您决定包含所有哑变量列,请记得设置 fit_intercept=False)。
- 分钟:1, 2, ..., 60(在一天内)
- 小时: 1, 2, ..., 24 (在一天中)
- 天: 1, 2, ..., 31 (在一个月中)
- 星期几: 1, 2, ..., 7 (一周中的天数)
- 周: 1, 2,..., 52 (一年中)
- 季度:1, 2, ..., 4(在一年中)
- 年份: 1999, 2000, ..., 2023 (任何年份)
from functime.seasonality import add_calendar_effects
# Returns X with one categorical column "month" with values 1,2,...,12
X_new = X.pipe(add_calendar_effects(["month"])).collect()
# Returns X with one-hot encoded calendar effects
# i.e. binary columns "month_1", "month_2", ..., "month_12"
X_new = X.pipe(add_calendar_effects(["month"]), as_dummies=True).collect()
方法 2. 傅里叶项
傅里叶项是建模多个季节周期和复杂季节性的一种常见方式(例如,长期季节周期 365.25 / 7 ≈ 52.179 用于每周时间序列)。对于每个季节周期 sp 和傅里叶项 k=1,..,K 的组合,有 2 个傅里叶项 sin_sp_k 和 cos_sp_k。
傅里叶项可以用来近似一个连续的周期信号,然后可以用作外生回归量来建模季节性。 第12.1章:复杂季节性来自Hyndman的教科书《预测:原理与实践》,包含了这个主题的一个很好的实际介绍。
add_fourier_terms 返回原始的 X DataFrame,并将傅里叶项作为额外的列。
例如,如果 sp=12 和 K=3,则 X_new 将包含列 sin_12_1、cos_12_1、sin_12_2、cos_12_2、sin_12_3 和 cos_12_3。
from functime.offsets import freq_to_sp
from functime.seasonality import add_fourier_terms
sp = freq_to_sp("1mo")[0]
X_new = X.pipe(add_fourier_terms(sp=sp, K=3)).collect()
假期/特殊事件建模
functime 是一个围绕 holidays Python 包的包装函数,用于为特殊事件生成分类特征。没有假期的日期用空值填充。
from functime.seasonality import add_holiday_effects
# Returns X with two categorical columns "holiday__US" and "holiday__CA"
north_america_holidays = add_holiday_effects(country_codes=["US", "CA"])
X_new = X.pipe(north_america_holidays).collect()
# Returns X with one-hot encoded holidays (e.g. "holiday__US_christmas)
north_america_holidays = add_holiday_effects(country_codes=["US", "CA"], as_dummies=True)
X_new = X.pipe(north_america_holidays).collect()
自定义事件
如果您有自己的自定义特殊事件(例如特殊促销),您可以始终创建自己的 dummy variables 作为 Polars boolean series。