pandas DataFrame滚动应用np.argmin和手动np.argin会得到不同的结果



编辑:简化为更简单的情况

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

最新更新