2016-07-22 13 views
4

Ich versuche, eine Version meines Programms mit so viel Pandas und Numpy wie möglich schneller zu machen. Ich bin neu bei Numpy, habe aber das meiste davon verstanden, aber ich habe Probleme mit der bedingten Formatierung einer Spalte mit dem Maximum eines Bereichs. Dies ist der Code, den ich zu verwenden Ich versuche, dies zu erreichen:Numpy Conditional Max des Bereichs

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

Grundsätzlich versuche ich, den Maximalwert in den letzten drei Einträge in eine Zelle bedingt zu setzen und die Spalte wiederholen unten. Jede und jede Hilfe wird geschätzt.

+2

Bitte fügen Sie einige Daten bei, mit denen Sie arbeiten. – Merlin

Antwort

5

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 
+1

danke für 'maximum_filter1d' - ich kannte diese Funktion nicht! – MaxU

+0

vielen dank! Es ist eine sehr wertvolle Funktion im Repertoire. hat die Leistung stark verbessert! – BROB1

3

Hier ist die Logik auf np.where

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

Ich glaube, Sie unten benötigen.

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 
+0

Merlin, Ihre Lösung funktioniert auch ganz gut. Mithilfe der Shift-Funktion konnte ich es in anderen Teilen meines Programms verwenden, um es zu beschleunigen. df ['Max'] = df.to.shift(). Rolling (Fenster = 3, min_periods = 1) .max() Dies änderte die max-Spalte, um die max der 3 vorherigen Einträge in einer Zeile anzuzeigen mit dem 4. Eintrag. Vielen Dank für die Einsicht! – BROB1