2017-07-11 4 views
1

Hier ist mein Datensatz mit Index als Daten und Preis Spalte. Ich möchte hier eine Spalte Parameter (param) erstellen, die wie in der Kommentarspalte folgt:Berechnen High Low in Pandas

Index   Price | param   Comments (P is Price) 
1989-01-24  68.800  0    P < P-1 (P-1 doesnt exist so 0) 
              param = 0 , 

1989-01-25  68.620  -2    P < P-1 check P<P-2(P-2 doesnt 
              exist so P is a 2 day low and 
              param = -2 

1989-01-26  68.930  3    P > P-1, P>P-2, P-3(doesnt exist 
              So P is a 3 day high, param =3 


1989-01-27  68.9900  4    P > P-1 > P-2 > P -3 and hence a 
              4 day high, param = 4            

1989-01-30  69.11  5    P > P-1> P-2 > P-3 > P-4 and 
              hence a 5 day high, param = 5 

1989-01-31  69.070  -2    P < P-1 > P-2 and hence a 2 day 
              low, param = -2 

Kann jemand bitte sagen Sie mir eine elegante Möglichkeit, dies in Pandas zu erreichen?

+0

Was ist die Grundlage für die Bildung der 'Param'-Spalte? – CodeHunter

+0

@piRSquared können Sie mir helfen? – Wolverine

Antwort

1

Was Sie hier suchen, wie in Ihrem Kommentarabschnitt, mein Verständnis ist, dass param Spalte ist eigentlich der Rang des Werts, den wir Price Spalte bekommen. Dies ist ähnlich dem Finden des Rangs eines bestimmten Werts in einem Strom von ganzen Zahlen, die als eine Eingabe kommen. Dies könnte mit PriorityQueue erreicht werden. Sie müssen eine Prioritätswarteschlange mit einem Vergleicher erstellen, der die Elemente in der Reihenfolge ihrer Werte in der Prioritätswarteschlange speichert. Um den Rang zu finden, müssen Sie nur über die Warteschlange iterieren und den Index des kürzlichen Elements in Ihrer Spalte finden. Dies würde jedoch eine Zeit von O (n) benötigen, um den Elementindex zu finden. Unten finden Sie Python-Dokumentation, wie heapq oder Prioritätswarteschlange in Python zu erstellen:

HeapQ in python

Wenn Sie dies in O (log n) tun wollen, können Sie sich selbst ausgleich BST wie AVL oder Rot Schwarz Baum verwenden. Der Rang des Wertes für das kürzlich eingegebene Element wäre dann sein Index von der linken Seite. Dies kann im schlechtesten Fall in O (logn) Zeit erfolgen. Details für AVL in Python:

AVL tree using python

+0

Ich versuche immer noch zu verstehen, was das bedeutet! Würde mich über mehr Hilfe freuen – Wolverine

0

IIUC, Was Sie wollen, ist zu gruppieren und Rang mit Offset. Pandas hat all das inklusive.

Hier eine effektive lineare Lösung zu tun, dass:

df=pd.DataFrame({'price':rand(15)}) 
df['ascending']=df.price<df.price.shift() 
df['slope']=(-1)**df.ascending 
df['group']=df.ascending.diff().abs().cumsum() 
df['pseudorank']=df.slope.cumsum() 
offset=df.groupby('group',sort=False).pseudorank.first() 
df['param']=(df.pseudorank-df.join(offset,'group',lsuffix='old').pseudorank+2*df.slope) 
df.param=df.param.fillna(0).astype(int) 

Für:

 price ascending slope group pseudorank param 
0 0.160806  False  1 NaN   1  0 
1 0.068664  True  -1  1   0  -2 
2 0.663227  False  1  2   1  2 
3 0.273134  True  -1  3   0  -2 
4 0.610329  False  1  4   1  2 
5 0.595016  True  -1  5   0  -2 
6 0.975163  False  1  6   1  2 
7 0.692874  True  -1  7   0  -2 
8 0.682642  True  -1  7   -1  -3 
9 0.337418  True  -1  7   -2  -4 
10 0.307546  True  -1  7   -3  -5 
11 0.462594  False  1  8   -2  2 
12 0.304216  True  -1  9   -3  -2 
13 0.189434  True  -1  9   -4  -3 
14 0.865468  False  1 10   -3  2 

ich viele Spalten, um Erläuterungen zu erstellen, können Sie sie löschen, wenn Sie möchten.

Verwandte Themen