2017-04-17 7 views
1

Ich lerne Python & Pandas und üben mit verschiedenen Aktienberechnungen. Ich habe versucht, Hilfe mit diesem zu suchen, aber habe nur eine Antwort nicht ähnlich genug gefunden oder dann nicht verstanden, wie man den richtigen Ansatz basierend auf den vorherigen Antworten ableitet.Versuchen, eine neue Dataframe-Spalte in Pandas basierend auf einem Dataframe bezogen zu erstellen, wenn Anweisung

Ich habe Bestandsdaten eines bestimmten Zeitrahmens mit Datenreader in Dataframe df gelesen. In df habe ich Datumsvolumen und Adj Schließen Spalten, die ich verwenden möchte, um eine neue Spalte "OBV" basierend auf bestimmten Kriterien zu erstellen. OBV ist ein kumulativer Wert, der den Wert des heutigen Volumens in Abhängigkeit vom angepassten Schlusskurs zum vorherigen Tages-OBV addiert oder subtrahiert.

Die Berechnung der OBV ist einfach:

Wenn Adj Close heute höher als Adj Schließen von gestern dann die Band von heute an das (kumulativ) Volumen von gestern hinzufügen.

Wenn Adj Close heute niedriger ist als Adj Close von gestern, subtrahiere das Volumen von heute vom (kumulativen) Volumen von gestern.

Am Tag 1 der OBV = 0

Diese dann entlang der Zeitrahmen wiederholt wird und OBV angesammelt wird.

Hier ist der Grund Importe und

import numpy as np 
import pandas as pd 
import pandas_datareader 

import datetime 
from pandas_datareader import data, wb 

start = datetime.date(2012, 4, 16) 
end = datetime.date(2017, 4, 13) 

# Reading in Yahoo Finance data with DataReader 
df = data.DataReader('GOOG', 'yahoo', start, end) 

import matplotlib 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 

#This is what I cannot get to work, and I've tried two different ways. 

#ATTEMPT1 

def obv1(column): 
    if column["Adj Close"] > column["Adj close"].shift(-1): 
     val = column["Volume"].shift(-1) + column["Volume"] 
    else: 
     val = column["Volume"].shift(-1) - column["Volume"] 
    return val 

df["OBV"] = df.apply(obv1, axis=1) 

#ATTEMPT 2 

def obv1(df): 
    if df["Adj Close"] > df["Adj close"].shift(-1): 
     val = df["Volume"].shift(-1) + df["Volume"] 
    else: 
     val = df["Volume"].shift(-1) - df["Volume"] 
    return val 

df["OBV"] = df.apply(obv1, axis=1) 

Beide geben mir einen Fehler starten.

+1

Was passiert, wenn AdjClose für den Tag unverändert ist? – piRSquared

+0

Das ist sehr selten, da der Kurs in Yahoos Daten auf die sechste Dezimalstelle bewertet wird, aber theoretisch in der Praxis. Für die meisten OBVs verstehe ich, dass, wenn Adj Close heute höher als ** Adj Close von gestern ist, das Volumen von heute zum (kumulativen) Volumen von gestern addiert wird. –

Antwort

1

Betrachten Sie die Datenrahmen df

np.random.seed([3,1415]) 
df = pd.DataFrame(dict(
     Volume=np.random.randint(100, 200, 10), 
     AdjClose=np.random.rand(10) 
    )) 

print(df) 

    AdjClose Volume 
0 0.951710  111 
1 0.346711  198 
2 0.289758  174 
3 0.662151  190 
4 0.171633  115 
5 0.018571  155 
6 0.182415  113 
7 0.332961  111 
8 0.150202  113 
9 0.810506  126 

Multiplizieren Sie die Volume mit -1, wenn eine Veränderung in AdjClose negativ ist. Dann cumsum

(df.Volume * (~df.AdjClose.diff().le(0) * 2 - 1)).cumsum() 

0 111 
1 -87 
2 -261 
3 -71 
4 -186 
5 -341 
6 -228 
7 -117 
8 -230 
9 -104 
dtype: int64 

Fügen Sie diese Seite entlang der Rest der df

df.assign(new=(df.Volume * (~df.AdjClose.diff().le(0) * 2 - 1)).cumsum()) 

    AdjClose Volume new 
0 0.951710  111 111 
1 0.346711  198 -87 
2 0.289758  174 -261 
3 0.662151  190 -71 
4 0.171633  115 -186 
5 0.018571  155 -341 
6 0.182415  113 -228 
7 0.332961  111 -117 
8 0.150202  113 -230 
9 0.810506  126 -104 
+0

Danke! Das funktioniert. Ich musste die Daten von Yahoo ein wenig anpassen, um dies zu erreichen, aber das hat mir geholfen, dies zu erreichen. –

Verwandte Themen