Ho il codice seguente, con il quale posso calcolare il prezzo medio ponderato per il volume di tre righe di codice Panda.Pandas Calcolo VWAP efficiente
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']
Sto cercando di trovare un modo per codificare questo senza usare cumsum()
come un esercizio. Sto cercando di trovare una soluzione che dia la colonna VWAP
in un unico passaggio. Ho provato la riga sottostante, usando .apply()
. La logica è lì, ma il problema è che non sono in grado di memorizzare i valori nella riga n per poterli utilizzare nella riga (n + 1). Come ci si avvicina a questo in pandas
- basta usare un gruppo o un dizionario esterno per la memorizzazione temporanea di valori cumulativi?
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)
Esiste una soluzione a un passaggio per il problema precedente?
EDIT:
La mia motivazione principale è quello di capire cosa sta succedendo sotto il cofano. Quindi, è principalmente per l'esercizio di qualsiasi motivo valido. Credo che ogni cumsum su una serie di dimensioni N abbia una complessità temporale N (?). Quindi mi stavo chiedendo, invece di eseguire due cumsum separati, possiamo calcolare entrambi in un solo passaggio - lungo le linee di this. Molto felice di accettare una risposta a questo - piuttosto che un codice funzionante.
L'utilizzo di apply sarà notevolmente più lento del primo metodo dal modo in cui – EdChum
@EdChum, grazie hai una soluzione alternativa senza usare 'cumsum'? – Rhubarb
Non al momento, cumsum è un metodo vettorizzato applicato non batterà questo. – EdChum