2017-04-08 12 views
-1

Ich versuche, die Trading-Logik aus Spaß zu testen, aber ich kann nachvollziehen, wie man numpy benutzt, um Entscheidungen zu treffen. Zum Beispiel möchte ich df ['position'] = 1 oder -1 basierend darauf setzen, ob die Daten unterhalb oder oberhalb der oberen und unteren Zeilen liegen. Wenn die Daten < = die untere Zeile ist, möchte ich die Position = 1 setzen und sie auf 1 halten, bis Data> = die obere Zeile ist. Sobald Daten> = die obere Zeile ist, möchte ich Position = -1 setzen und bei -1 bleiben und dann wiederholen.Pandas DataFrame Logic - Python

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

data = np.random.standard_normal((5, 100)).flatten() 
data = data.cumsum() 

df = pd.DataFrame({'Data': data}) 
df['std'] = df['Data'].rolling(50).std() 
df['SMA'] = df['Data'].rolling(50).mean() 
df['upper'] = df['SMA'] + (2 * df['std']) 
df['lower'] = df['SMA'] - (2 * df['std']) 

df[['Data', 'SMA', 'upper', 'lower']].plot(figsize=(10, 6)) 

df['position'] = 0 
plt.show() 

enter image description here

Hier versuche ich, genau das aber nicht zu tun, weil ich weiß nicht, wie diese richtig zu machen.

df['islower'] = np.where(df['Data'] < df['lower'], 1, 0) 
df['isupper'] = np.where(df['Data'] > df['upper'], 1, 0) 
df['position'] = np.where(df['isupper']==1, -1, 0) | np.where(df['islower']==1, 1, 0) 
+0

Was meinen Sie, dass Sie scheitern? Was ist der Fehler, den Sie bekommen? Oder möchten Sie die Daten zeigen, die Sie erhalten? – splinter

+0

Ich kann nicht herausfinden, wie man df ['position'] = 1 setzt, wenn df ['Data'] df ['oben']. Ich kann dies mit Zustandslogik ohne Pandas machen, aber das Ziel ist, dies mit einem Datenrahmen zu tun. – BillyRay

+0

Ist nicht die Antwort unten, was Sie suchen? Wenn nicht, schlage ich vor, dass Sie die Ausgabe zeigen, die Sie gegen die Ausgabe erhalten möchten, die Sie tatsächlich bekommen – splinter

Antwort

1

Ich denke, was Sie tun möchten, ist:

df['islower'] = df['islower'].where(df['Data'] < df['lower'], 1, 0)  
df['isupper'] = df['isupper'].where(df['Data'] < df['upper'], 1, 0)  
+0

Ja, das zeigt, wie man richtig erkennt, ob Daten unter oder über den Linien liegen, aber wie setze ich Position = 1 oder -1, wenn wir die untere/obere Linie berührten? – BillyRay

+0

Ist das nicht das wonach Sie suchen? – splinter

+0

Ich möchte herausfinden, wie man df ['position'] = np.where (df ['isupper'] == 1, -1, 0) | np.where (df ['islower'] == 1, 1, 0) Der Code, den ich verwende, ist nicht korrekt, wenn Sie df [['position']]. plot (figsize = (10, 6)) und see die Ergebnisse – BillyRay

Verwandte Themen