编辑:简化为更简单的情况
In [1]: np.argmin(pd.Series([-6.0, 7.0, np.NaN]))
Out[2]: 0
In [2]: pd.Series([-6.0, 7.0, np.NaN]).rolling(3).apply(np.argmin)
Out[2]:
0 NaN
1 NaN
2 NaN
dtype: float64
In [3]: pd.Series([-6.0, 7.0, np.NaN]).rolling(3).apply(np.argmin)[2]
Out[3]: nan
为什么这两种计算结果不同?
原始案例
为了改进我的滚动idxmin/max
的解决方案,我遇到了以下问题。
In [1]: index = map(chr, range(ord('a'), ord('a') + 10))
In [2]: df = pd.DataFrame((10 * np.random.randn(10, 3)).astype(int), index=index)
In [3]: df[0][3:4] = np.NaN
In [4]: df
Out[4]:
0 1 2
a 0.0 -2 -7
b -6.0 7 7
c 7.0 -23 -13
d NaN 4 -6
e 7.0 19 10
f -3.0 4 -2
g 9.0 -16 -2
h 13.0 15 -2
i 6.0 8 0
j -9.0 -10 11
In [5]: df.rolling(3).apply(np.argmin)
Out[5]:
0 1 2
a NaN NaN NaN
b NaN NaN NaN
c 1.0 2.0 2.0
d NaN 1.0 1.0
e NaN 0.0 0.0
f NaN 0.0 0.0
g 1.0 2.0 1.0
h 0.0 1.0 0.0
i 2.0 0.0 0.0
j 2.0 2.0 0.0
In [6]: np.argmin(pd.Series([-6.0, 7.0, np.NaN])) # for index 'd', col 0
Out[6]: 0
手动应用np.argmin
(对于索引'd'
,第0列(不应该给出与相应滚动应用相同的结果吗?为什么滚动应用程序给我的是NaN
而不是0
?
当然,这是一个RTF案例。。。
对于DataFrame.rolling:
min_periods(int,默认为None(:窗口中具有值所需的最小观察数(否则结果为NA(。对于由偏移指定的窗口,min_periods将默认为1。否则,min_periods将默认为窗口的大小。
所以:
In [1]: np.argmin(pd.Series([-6.0, 7.0, np.NaN]))
Out[1]: 0
In [2]: pd.Series([-6.0, 7.0, np.NaN]).rolling(3, min_periods=0).apply(np.argmin)[2]
Out[2]: 0.0