Ci sono alcuni approcci. Utilizzando apply
:
>>> df = pd.read_csv("bondstack.csv")
>>> df["shift"] = df["open"].shift(-1)
>>> df["b"] = df.apply(lambda row: row["shift"] if row["MA10"] > row["MA100"] else np.nan, axis=1)
che produce
>>> df[["MA10", "MA100", "shift", "b"]][:10]
MA10 MA100 shift b
0 16.915625 17.405625 16.734375 NaN
1 16.871875 17.358750 17.171875 NaN
2 16.893750 17.317187 17.359375 NaN
3 16.950000 17.279062 17.359375 NaN
4 17.137500 17.254062 18.640625 NaN
5 17.365625 17.229063 18.921875 18.921875
6 17.550000 17.200312 18.296875 18.296875
7 17.681250 17.177500 18.640625 18.640625
8 17.812500 17.159375 18.609375 18.609375
9 17.943750 17.142813 18.234375 18.234375
Per un approccio più vectorized, è possibile utilizzare
>>> df = pd.read_csv("bondstack.csv")
>>> df["b"] = np.nan
>>> df["b"][df["MA10"] > df["MA100"]] = df["open"].shift(-1)
o il mio approccio preferito:
>>> df = pd.read_csv("bondstack.csv")
>>> df["b"] = df["open"].shift(-1).where(df["MA10"] > df["MA100"])
Se si desidera utilizzare il risultato di di lista come un indice, è necessario utilizzare: 'df [[x per x in df ['shift'] se df ["MA10"]> df ["MA100"]]] ', ma penso che questo sollevi qualche eccezione. Si prega di inviare i vostri dati di esempio e il risultato desiderato. – HYRY
@HYRY Grazie per il tuo commento. Ho pubblicato un link ai miei dati di esempio. Ho usato il tuo suggerimento prima di postare e ho ricevuto l'errore "sintassi non valida" come ho detto. –
@ user1374969: conta il numero di parentesi nel suggerimento di HYRY, quindi conta il numero nel tuo. – DSM