我尝试使用尽可能多的Pandas和Numpy来更快地制作我的程序版本。我是Numpy的新手但是已经掌握了大部分内容,但我遇到条件格式化一个范围最大的列的问题。这是我试图用来实现这个目的的代码:
x=3
df1['Max']=numpy.where(df1.index>=x,max(df1.High[-x:],0))
基本上,我试图有条件地将最后3个条目的最大值放入单元格并重复列。任何和所有的帮助表示赞赏。
答案 0 :(得分:5)
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