Ich habe den folgenden Code, mit dem ich den volumengewichteten Durchschnittspreis durch drei Zeilen Pandas-Code berechnen kann.Pandas Efficient VWAP Berechnung
import numpy as np
import pandas as pd
from pandas.io.data import DataReader
import datetime as dt
df = DataReader(['AAPL'], 'yahoo', dt.datetime(2013, 12, 30), dt.datetime(2014, 12, 30))
df['Cum_Vol'] = df['Volume'].cumsum()
df['Cum_Vol_Price'] = (df['Volume'] * (df['High'] + df['Low'] + df['Close']) /3).cumsum()
df['VWAP'] = df['Cum_Vol_Price']/df['Cum_Vol']
Ich versuche, einen Weg zu finden, dies als eine Übung ohne cumsum()
zu codieren. Ich versuche, eine Lösung zu finden, die die VWAP
Spalte in einem Durchgang gibt. Ich habe die untere Zeile mit .apply()
versucht. Die Logik ist da, aber das Problem ist, dass ich keine Werte in Zeile n speichern kann, um in Zeile (n + 1) zu verwenden. Wie geht man das in pandas
an - verwenden Sie einfach eine externe Tuplete oder ein Wörterbuch für temporäre Speicherung von kumulativen Werten?
df['Cum_Vol']= np.nan
df['Cum_Vol_Price'] = np.nan
# calculate running cumulatives by apply - assume df row index is 0 to N
df['Cum_Vol'] = df.apply(lambda x: df.iloc[x.name-1]['Cum_Vol'] + x['Volume'] if int(x.name)>0 else x['Volume'], axis=1)
Gibt es eine One-Pass-Lösung für das oben genannte Problem?
EDIT:
Meine Hauptmotivation ist zu verstehen, was unter der Haube geschieht. Also, es ist hauptsächlich für Übung als irgendeinen gültigen Grund. Ich glaube, jeder Cumsum auf einer Serie der Größe N hat eine Zeitkomplexität N (?). Also habe ich mich gefragt, anstatt zwei separate Cumsums zu fahren, können wir beide in einem Durchgang berechnen - in der Richtung von this. Sehr gerne eine Antwort darauf zu akzeptieren - anstatt Code zu arbeiten.
Verwenden Sie anwenden wird wesentlich langsamer als Ihre erste Methode übrigens – EdChum
@EdChum, danke, haben Sie eine alternative Lösung ohne Verwendung von 'Cumsum'? – Rhubarb
Nicht im Moment, Cumsum ist eine vektorisierte Methode anwenden wird dies nicht schlagen. – EdChum