У меня есть приведенный ниже код, с помощью которого я могу рассчитать средневзвешенную цену по объему с помощью трех строк кода Pandas.
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']
Я пытаюсь найти способ закодировать это, не используя cumsum()
в качестве упражнения. Я пытаюсь найти решение, которое дает столбец VWAP
за один проход. Я пробовал следующую строку, используя .apply()
. Логика есть, но проблема в том, что я не могу хранить значения в строке n, чтобы использовать их в строке (n+1). Как вы подходите к этому в pandas
- просто используете внешний туплет или словарь для временного хранения кумулятивных значений?
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)
Есть ли однопроходное решение вышеуказанной проблемы?
ИЗМЕНИТЬ:
Моя главная мотивация — понять, что происходит под капотом. Таким образом, это в основном для упражнений, чем по какой-либо уважительной причине. Я считаю, что каждая сумма в серии размера N имеет временную сложность N (?). Поэтому мне было интересно, вместо того, чтобы запускать два отдельных cumsum, можем ли мы вычислить оба за один проход - в соответствии с этим а>. Очень рад принять ответ на этот вопрос, а не рабочий код.
cumsum
? - person Zhubarb   schedule 27.03.2015cumsum
в серии размера N имеет временную сложность N. Поэтому мне было интересно, вместо запуска двух отдельныхcumsum
, можем ли мы вычислить оба за один проход - по строкам это. Очень рад принять ответ на этот вопрос, а не рабочий код. - person Zhubarb   schedule 27.03.2015