Numpy条件最大范围

时间:2016-07-22 17:57:36

标签: python numpy pandas

我尝试使用尽可能多的Pandas和Numpy来更快地制作我的程序版本。我是Numpy的新手但是已经掌握了大部分内容,但我遇到条件格式化一个范围最大的列的问题。这是我试图用来实现这个目的的代码:

x=3
df1['Max']=numpy.where(df1.index>=x,max(df1.High[-x:],0))

基本上,我试图有条件地将最后3个条目的最大值放入单元格并重复列。任何和所有的帮助表示赞赏。

2 个答案:

答案 0 :(得分:5)

使用Scipy's maximum_filter -

from scipy.ndimage.filters import maximum_filter1d

df['max'] = maximum_filter1d(df.High,size=3,origin=1,mode='nearest')

基本上,maximum_filter在滑动窗口中操作,在该窗口中查找最大值。现在,默认情况下,每个这样的max计算将在窗口以索引本身为中心的情况下执行。因为,我们希望在当前的三个元素之前和之前结束,我们需要使用参数origin更改居中。因此,我们将其设置为1

示例运行 -

In [21]: df
Out[21]: 
   High  max
0    13   13
1    77   77
2    16   77
3    30   77
4    25   30
5    98   98
6    79   98
7    58   98
8    51   79
9    23   58

运行时测试

让我有兴趣看看这款Scipy的滑动最大操作如何对抗Pandas的滚动最大方法对性能的影响。这是大数据化的一些结果 -

In [55]: df = pd.DataFrame(np.random.randint(0,99,(10000)),columns=['High'])

In [56]: %%timeit  # @Merlin's rolling based solution :
    ...: df['max'] = df.High.rolling(window=3, min_periods=1).max()
    ...: 
1000 loops, best of 3: 1.35 ms per loop

In [57]: %%timeit  # Using Scipy's max filter :
    ...: df['max1'] = maximum_filter1d(df.High,size=3,\
    ...: origin=1,mode='nearest')
    ...: 
1000 loops, best of 3: 487 µs per loop

答案 1 :(得分:3)

以下是np.where

的逻辑
 numpy.where('test something,if true ,if false)

我认为你需要在下面。

dd= {'to': [100, 200, 300, 400, -500, 600, 700,800, 900, 1000]}

df = pd.DataFrame(dd)
df

         to
0   100
1   200
2   300
3   400
4  -500
5   600
6   700
7   800
8   900
9  1000

df['Max'] =  df.rolling(window=3, min_periods=1).max()


   to     Max
0   100   100.0
1   200   200.0
2   300   300.0
3   400   400.0
4  -500   400.0
5   600   600.0
6   700   700.0
7   800   800.0
8   900   900.0
9  1000  1000.0