【发布时间】:2019-10-08 07:44:10
【问题描述】:
我正在尝试在我的 pandas 数据框上执行 seasonal_decompose,但遇到了一个我无法通过的错误。我的时间序列数据包含按时间顺序排列的差距,考虑到我的数据是股票价格(在市场交易时间后产生这些差距,以及不同的月份长度等),这是明智的。数据本身可以被认为是连续的,但是 pandas 似乎不想推断任何频率。
我的所有时间范围数据(1m、5m、15m ... 1D、1M)都已正确填充,但没有设置为频率。我的算法在实例化时创建一个空数据帧,并在算法运行期间数据到达时通过loc 向其添加值。所以也许这就是为什么频率最终是 None 的原因(因为 Pandas 通常在生成所有数据后使用)。
我已经尝试在 seasonal_decompose 之前明确设置频率,使用:
data.index.freq = data.index.freq or to_offset(timeframe.Timespan).freqstr
其中 timeframe.Timespan 是一个 python timedelta 对象。结果字符串是准确的(“D”,因为时间跨度恰好是每天)但出现以下错误:
ValueError: Inferred frequency None 从传递的值不符合传递的频率 D
所以我不能在我的索引上明确设置频率?我该如何解决这个问题?无论如何,频率整数(传递给seasonal_decompose)是如何从这些字符串派生的?我也不允许更改 data.index.inferred_freq 的值,所以这不是一个选项。
【问题讨论】:
-
你试过
data.asfreq吗?我想在这种情况下应该是data.asfreq(data.index.freq or to_offset(timeframe.Timespan).freqstr) -
这不会改变原始数据吗?我想保持我的时间戳不变。我必须将我的预测与原始数据集进行比较。或者我会先做 asfreq,然后再做 dropna?
-
“我的时间序列数据包含时间间隔” 那么你不能按原样设置频率,因为索引实际上不是给定的频率。要设置索引中的每个元素的频率,必须用
freq单位分隔,即,如果您的索引从'2018-01-01'跳转到'2018-01-03',则您不能将频率设置为'D',因为您错过了一天。 -
@JakeTheSnake 你需要有一个连续的范围,
freq才能工作。调用asfreq确实会调整您的索引并为任何缺失的时间段创建条目(使用None作为默认值)。如果你打电话给dropna,你会再次失去你的freq。 -
在这种情况下你会建议我做什么?我应该用一个值填写 NAs 吗?如果是这样,怎么做?起初认为有很多方法可以处理数据,所有这些都会影响预测。如果我保留 NA,我什至可以进行季节性分解吗?