我有下面的代码,用它可以通过三行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的Series上每个cumsum的时间复杂度都为N(?)。所以我想知道,是否可以在一次通行中计算两者 - 沿着这条路线。很高兴接受对此的答案 - 而不是工作代码。
cumsum
的替代方案? - Zhubarbcumsum
的时间复杂度为N。所以我想知道,是否可以在一次遍历中计算两个独立的cumsum而不是运行两个单独的cumsum
- 类似于这个。非常乐意接受回答 - 而不是工作代码。 - Zhubarb