我一直在阅读有关时间序列分解的内容,并且非常清楚它如何在简单的示例中工作,但在扩展这些概念时遇到了困难。
例如,我正在使用一些简单的合成数据:
因此,没有与该数据相关的实际时间。可以每秒或每年采样一次。无论采样频率如何,周期大约为 160 个时间步长,使用它作为period参数会产生预期结果:
# seasonal=13 based on example in the statsmodels user guide
decomp = STL(synth.value, period=160, seasonal=13).fit()
fig, ax = plt.subplots(3,1, figsize=(12,6))
decomp.trend.plot(title='Trend', ax=ax[0])
decomp.seasonal.plot(title='Seasonal', ax=ax[1])
decomp.resid.plot(title='Residual', ax=ax[2])
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)
但看看其他数据集,要看到季节性周期并不是那么容易,所以这让我想到了几个问题:
如何在现实世界的混乱数据中找到正确的论点,尤其是period论点,还有其他论点?这只是您执行的参数搜索,直到分解看起来很正常吗?
参数
endog : array_like 要分解的数据。必须可压缩至 1-d。
period:序列的周期性。如果 None 且 endog 是 pandas Series 或 DataFrame,则尝试从 endog 进行确定。如果 endog 是 ndarray,则必须提供句点。
季节性:季节性的长度更平滑。必须是奇数,通常应 >= 7(默认)。
趋势:趋势的长度更平滑。必须是奇数。如果未提供,则使用大于 1.5 * period / (1 - 1.5 / season) 的最小奇整数,遵循原始实现中的建议。
在拟合统计模型时,我收到有关日期频率的警告。
首先,我导入一个数据集:
import statsmodels as sm
df = sm.datasets.get_rdataset(package='datasets', dataname='airquality').data
df['Year'] = 1973
df['Date'] = pd.to_datetime(df[['Year', 'Month', 'Day']])
df.drop(columns=['Year', 'Month', 'Day'], inplace=True)
df.set_index('Date', inplace=True, drop=True)
Run Code Online (Sandbox Code Playgroud)
接下来我尝试拟合一个 SES 模型:
fit = sm.tsa.api.SimpleExpSmoothing(df['Wind']).fit()
Run Code Online (Sandbox Code Playgroud)
返回此警告:
/anaconda3/lib/python3.6/site-packages/statsmodels/tsa/base/tsa_model.py:171:ValueWarning:未提供频率信息,因此将使用推断频率 D。% 频率,值警告)
我的数据集是每天,所以推断“D”是可以的,但我想知道如何手动设置频率。
请注意, DatetimeIndex 没有频率(最后一行)...
DatetimeIndex(['1973-05-01', '1973-05-02', '1973-05-03', '1973-05-04',
'1973-05-05', '1973-05-06', '1973-05-07', '1973-05-08',
'1973-05-09', '1973-05-10',
...
'1973-09-21', '1973-09-22', '1973-09-23', '1973-09-24',
'1973-09-25', '1973-09-26', '1973-09-27', '1973-09-28',
'1973-09-29', '1973-09-30'],
dtype='datetime64[ns]', name='Date', length=153, freq=None)
Run Code Online (Sandbox Code Playgroud)
根据这个答案,我检查了缺少的日期,但似乎没有:
pd.date_range(start = '1973-05-01', end = '1973-09-30').difference(df.index)
Run Code Online (Sandbox Code Playgroud)
DatetimeIndex([], dtype='datetime64[ns]', freq='D')
我应该如何设置索引的频率?