获取Pandas滚动窗口的索引



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

对我有效的解决方案是从这个对现有问题的回答:我从回答中描述的rolling函数中获得每个windowwindow.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方法只接受返回基于每个窗口的数字的函数。函数不能返回其他类型的对象。

我可以使用PandasRolling类的其他方法吗?甚至是私人方法。

或者有没有其他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],
]

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]]

最新更新