我想获得Pandas系列的每个滚动窗口中元素的索引。
对我有效的解决方案是从这个对现有问题的回答:我从回答中描述的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
方法只接受返回基于每个窗口的数字的函数。函数不能返回其他类型的对象。
我可以使用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]]