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
现在是目标列,index
即timesteps
是时间戳。
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)