考虑pd.Series
s
import pandas as pd
import numpy as np
np.random.seed([3,1415])
s = pd.Series(np.random.randint(0, 10, 10), list('abcdefghij'))
s
a 0
b 2
c 7
d 3
e 8
f 7
g 0
h 6
i 8
j 6
dtype: int64
我想获取滚动窗口 3 的最大值的索引
s.rolling(3).max()
a NaN
b NaN
c 7.0
d 7.0
e 8.0
f 8.0
g 8.0
h 7.0
i 8.0
j 8.0
dtype: float64
我想要的是
a None
b None
c c
d c
e e
f e
g e
h f
i i
j i
dtype: object
我做了什么
s.rolling(3).apply(np.argmax)
a NaN
b NaN
c 2.0
d 1.0
e 2.0
f 1.0
g 0.0
h 0.0
i 2.0
j 1.0
dtype: float64
这显然不是我想要的
没有简单的方法可以做到这一点,因为传递给滚动应用函数的参数是一个普通的 numpy 数组,而不是 pandas Series,所以它不知道索引。此外,滚动函数必须返回浮点数结果,因此如果不是浮点数,它们就不能直接返回索引值。
这是一种方法:
>>> s.index[s.rolling(3).apply(np.argmax)[2:].astype(int)+np.arange(len(s)-2)]
Index([u'c', u'c', u'e', u'e', u'e', u'f', u'i', u'i'], dtype='object')
这个想法是获取 argmax 值,并通过添加一个指示我们在系列中的位置的值来将它们与系列对齐。 (也就是说,对于第一个 argmax 值,我们添加零,因为它为我们提供了从原始序列中索引 0 开始的子序列的索引;对于第二个 argmax 值,我们添加了 1,因为它为我们提供了原始系列中从索引 1 开始的子序列;等等)
这给出了正确的结果,但不包括开头的两个“None”值;如果您需要的话,您必须手动将它们添加回来。
有一个开放的 pandas 问题 https://github.com/pandas-dev/pandas/issues/9481添加滚动 idxmax。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)