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.
Was passiert, wenn AdjClose für den Tag unverändert ist? – piRSquared
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. –