Verwendung Scipy's maximum_filter
-
from scipy.ndimage.filters import maximum_filter1d
df['max'] = maximum_filter1d(df.High,size=3,origin=1,mode='nearest')
Grundsätzlich arbeitet maximum_filter in einem gleitenden Fenster für maximale in diesem Fenster. Jetzt wird standardmäßig jede derartige max
Berechnung durchgeführt, wobei das Fenster auf den Index selbst zentriert wird. Da wir versuchen, drei Elemente vor und am aktuellen Ende zu gehen, müssen wir diese Zentriertheit mit dem Parameter origin
ändern. Daher haben wir es auf 1
festgelegt.
Probelauf -
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
Runtime Test
Sie haben mich interessiert zu sehen, wie dieses Gleiten des Scipy Max-Operation führt gegen Pandas des Roll max Methode auf die Leistung. Hier einige Ergebnisse auf großen datasizes -
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
Bitte fügen Sie einige Daten bei, mit denen Sie arbeiten. – Merlin