pandas时间序列索引和statsmodel中的频率

Posted

技术标签:

【中文标题】pandas时间序列索引和statsmodel中的频率【英文标题】:Frequency in pandas timeseries index and statsmodel 【发布时间】:2020-10-09 02:16:15 【问题描述】:

我有一个熊猫时间序列y,它不适用于statsmodel 函数。

import statsmodels.api as sm

y.tail(10)

2019-09-20     7.854
2019-10-01    44.559
2019-10-10    46.910
2019-10-20    49.053
2019-11-01    24.881
2019-11-10    52.882
2019-11-20    84.779
2019-12-01    56.215
2019-12-10    23.347
2019-12-20    31.051
Name: mean_rainfall, dtype: float64

我验证它确实是一个时间序列

type(y)
pandas.core.series.Series

type(y.index)
pandas.core.indexes.datetimes.DatetimeIndex

从这里,我可以毫无问题地通过自相关函数传递时间序列,从而产生预期的输出

plot_acf(y, lags=72, alpha=0.05)

但是,当我尝试将这个完全相同的对象 y 传递给 SARIMA 时

mod = sm.tsa.statespace.SARIMAX(y.mean_rainfall, order=pdq, seasonal_order=seasonal_pdq)
results = mod.fit()

我收到以下错误:

已提供日期索引,但它没有关联的频率信息,因此在例如预测。

问题是我的时间序列的频率不规则(它是每个月的 1 号、10 号和 20 号),所以我不能设置freq='m'freq='D'。在这种情况下,解决方法是什么?

我是使用时间序列的新手,任何关于如何在预测期间不忽略我的索引的建议都会有所帮助。这可以防止任何预测成为可能

【问题讨论】:

【参考方案1】:

首先,了解 datetime 列和目标列(rainfall)之间的关系是非常重要的。看你提供的sn-p,我能想到两种可能:

    y 表示在当前行日期和下一行日期之间的日期范围内发生的降雨量。如果是这种情况,则时间序列是一种聚合降雨序列,具有不相等的日期桶,即 1-10、10-20、20-(月末)。如果是这种情况,您有两种选择: 您可以使用相等的权重甚至更好的插值来分解数据,以创建连续且相对平滑的时间序列。然后,您可以在每日时间序列上拟合您的模型,并生成自然也是每天的预测。您可以将这些汇总回 1-10、10-20、20-(月末)存储桶,以获得您的预测。进行重采样的一种方法是使用下面的代码。
ts.Date = pd.to_datetime(ts.Date, format='%d/%m/%y')
ts['delta_time'] = (ts['Date'].shift(-1) - ts['Date']).dt.days
ts['delta_rain'] = ts['Rain'].shift(-1) - ts['Rain']
ts['timesteps'] = ts['Date']
ts['grad_rain'] = ts['delta_rain'] / ts['delta_time']
ts.set_index('timesteps', inplace=True )
ts = ts.resample('d').ffill()
ts

ts['daily_rain'] = ts['Rain'] + ts['grad_rain']*(ts.index - ts['Date']).dt.days
ts['daily_rain'] = ts['daily_rain']/ts['delta_time']
print(ts.head(50))

daily_rain 现在是目标列,indextimesteps时间戳

另一个选项是您估计 1-10、10-20、20-(EOM) 的日期范围大约为 10 天,因此这些确实是相等的时间步长。当然 statsmodel 不允许这样做,因此您需要将索引重置为您维护映射的模拟日期时间。以下是您在 statsmodel 中用作 y 的内容,但确实保留了与原始日期的映射。 Freq 将是“d”或“daily”,您还需要重新调整季节性,使其遵循新的日期比例。
y.tail(10)

2019-09-01    7.854
2019-09-02    44.559
2019-09-03    46.910
2019-09-04    49.053
2019-09-05    24.881
2019-09-06    52.882
2019-09-07    84.779
2019-09-08    56.215
2019-09-09    23.347
2019-09-10    31.051
Name: mean_rainfall, dtype: float64

我会推荐第一个选项,因为它本质上更准确。此外,您还可以在模型训练和预测期间尝试其他聚合级别。更多控制!

    第二种情况是数据仅代表日期本身的测量值,而不是范围的测量值。这意味着从技术上讲,您现在没有足够的信息来构建准确的时间序列 - 您的时间步长不是等距的,并且您没有足够的信息来了解时间步长之间发生的事情。但是,您仍然可以即兴创作并获得一些近似值。上面列出的第二种方法仍然可以按原样工作。对于第一种方法,您需要进行插值,但鉴于目标变量是降雨量并且降雨量有很多变化,我强烈反对这样做!!

【讨论】:

【参考方案2】:

正如我所见,包使用频率作为一切的前提,因为它是一个时间序列问题。 因此,您将无法将其与不同频率的数据一起使用。事实上,您必须为您的分析做出假设,以使您的数据充足以供使用。一些选项是:

1) 考虑 3 种不同的分析(分别为第 1 天、第 10 天、第 20 天)并使用 30 天的频率。

2) 由于您有约 10d 等分数据,您可以考虑使用某种插值,然后下采样到 1d 的频率。当然,此选项仅根据问题的性质和数据更改的速度才有意义。

无论哪种方式,我只想指出,在处理时间序列和一般数据科学时,如何建模问题和数据是关键。根据我作为数据科学家的经验,我可以说是在域(您的数据来自哪里)进行分析,您可以感觉到哪种方法会更好。

【讨论】:

以上是关于pandas时间序列索引和statsmodel中的频率的主要内容,如果未能解决你的问题,请参考以下文章

statsmodels 中的面板 OLS(因为它在 Pandas 中已被弃用?)

时间序列分析 - 不均匀间隔测量 - pandas + statsmodels

时间序列分析 - 不均匀间隔测量 - pandas + statsmodels

python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD)

Windows下Python安装numpy+mkl,Scipy和statsmodels

使用 statsmodels 忽略多个 OLS 回归中的缺失值