【问题标题】:Get indexes of Pandas Rolling window获取 Pandas 滚动窗口的索引
【发布时间】:2022-01-11 16:21:48
【问题描述】:

我想获取 Pandas 系列的每个滚动窗口中元素的索引。

对我有用的解决方案是this 对现有问题的回答:对于从答案中描述的rolling 函数获得的每个window,我得到window.index。对于上述功能,我只对step=1 感兴趣。

但是这个函数并不特定于 DataFrames 和 Series,它适用于基本的 Python 列表。 是不是有一些利用 Pandas 滚动操作的功能?

我试过Rolling.apply方法:

s = pd.Series([1, 2, 3, 4, 5, 6, 7])

rolling = s.rolling(window=3)
indexes = rolling.apply(lambda x: x.index)

但它会导致TypeError: must be real number, not RangeIndex。显然,Rolling.apply 方法只接受基于每个窗口返回一个数字的函数。函数不能返回其他类型的对象。

我可以使用 Pandas Rolling 类的其他方法吗?甚至是私有方法。

或者是否有任何其他 Pandas 特定的功能来获取重叠滚动窗口的索引?

预期输出

作为输出,我期望某种列表对象。每个内部列表都应该计算每个窗口的索引值。 原来的s 系列有[0, 1, 2, 3, 4, 5, 6] 作为索引。 因此,使用window=3 滚动,我希望结果类似于:

[
    [0, 1, 2],
    [1, 2, 3],
    [2, 3, 4],
    [3, 4, 5],
    [4, 5, 6],
]

【问题讨论】:

    标签: python pandas rolling-computation


    【解决方案1】:

    rolling 之后的apply 函数必须为每个窗口返回一个数值。一种可能的解决方法是使用列表推导来遍历每个窗口并根据需要应用自定义转换:

    [[*l.index] for l in s.rolling(3) if len(l) == 3]
    

    您也可以使用sliding_window_view 来完成同样的操作:

    np.lib.stride_tricks.sliding_window_view(s.index, 3)
    

    甚至列表推导也能很好地完成这项工作:

    w = 3
    [[*s.index[i : i + w]] for i in range(len(s) - w + 1)]
    

    结果

    [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
    

    【讨论】:

    • 谢谢!它对我来说很好用!出于我的目的,我并不真正需要内部列表实际上是列表:这只是预期输出的示例。出于我的目的,内部对象可以是 Pandas 索引。所以,我只是使用:[l.index for l in s.rolling(3) if len(l) == 3].
    猜你喜欢
    • 2018-10-15
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2013-11-12
    • 2018-12-17
    • 2020-07-13
    相关资源
    最近更新 更多