【问题标题】:Pandas DatetimeIndex + seasonal_decompose = missing frequencyPandas DatetimeIndex +season_decompose = 缺失频率
【发布时间】: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,我什至可以进行季节性分解吗?

标签: python pandas


【解决方案1】:

听起来你需要的是DataFrame.asfreq

data = data.asfreq(data.index.freq or to_offset(timeframe.Timespan).freqstr)

【讨论】:

  • inplace 在这种情况下会做什么?我在链接中的任何地方都找不到它。
  • 糟糕,这个没有inplace。我猜你必须在调用asfreq后重新分配
  • 鉴于我还没有做出预测,我不能说以下解决方案会产生准确的结果;除了您的解决方案之外,我还使用 data.interpolate(inplace=True) 插入了丢失的数据,并且一切正常。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2017-08-16
相关资源
最近更新 更多