Mam poniższy kod, za pomocą którego mogę obliczyć średnią ważoną wolumenem cenę o trzy linie kodu Pandy.Panda Efektywna kalkulacja VWAP
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']
Staram się znaleźć sposób, aby kod tego bez użycia cumsum()
jako ćwiczenie. Próbuję znaleźć rozwiązanie, które daje jedną kolumnę VWAP
. Próbowałem poniżej linii, używając .apply()
. Ta logika istnieje, ale problem polega na tym, że nie mogę przechowywać wartości w wierszu n, aby użyć w wierszu (n + 1). Jak podejść do tego w pandas
- wystarczy użyć zewnętrznej tuplet lub słownika do tymczasowego przechowywania łącznych wartości?
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)
Czy istnieje jedno rozwiązanie rozwiązania powyższego problemu?
EDIT:
Moją główną motywacją jest, aby zrozumieć, co dzieje się pod maską. Jest to głównie ćwiczenie, niż jakikolwiek ważny powód. Wierzę, że każdy cumulus w serii o rozmiarze N ma złożoność czasu N (?). Zastanawiam się więc, czy zamiast obliczania dwóch oddzielnych kumulacji, możemy obliczyć oba w jednym przejściu - wzdłuż linii this. Bardzo chętnie przyjmuję odpowiedź na to - zamiast działającego kodu.
Korzystanie z aplikacji będzie znacznie wolniejsze niż twoja pierwsza metoda, przy okazji – EdChum
@EdChum, dziękuję, że masz alternatywne rozwiązanie bez użycia 'cumsum'? – Rhubarb
Nie w tej chwili, cuma jest metodą wektorowaną, aplikacja nie pokona tego. – EdChum