Zhu*_*arb 6 python numpy apply cumulative-sum pandas
我有以下代码,使用它我可以通过三行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']
Run Code Online (Sandbox Code Playgroud)
我试图找到一种方法来编码,而不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)
Run Code Online (Sandbox Code Playgroud)
对于上述问题是否存在一次性解决方案?
编辑:
我的主要动机是了解幕后发生的事情.因此,它主要是为了锻炼而不是任何有效的理由.我相信N系列的每个cumsum都有时间复杂度N(?).所以我想,而不是运行两个独立的cumsum的,我们可以一次同时计算-沿线的这.很高兴接受这个答案 - 而不是工作代码.
进入一个传球对一线开始变得有点语义.这有什么区别:你可以用1行熊猫,1行numpy或几行numba来做到这一点.
from numba import jit
df=pd.DataFrame( np.random.randn(10000,3), columns=['v','h','l'] )
df['vwap_pandas'] = (df.v*(df.h+df.l)/2).cumsum() / df.v.cumsum()
@jit
def vwap():
tmp1 = np.zeros_like(v)
tmp2 = np.zeros_like(v)
for i in range(0,len(v)):
tmp1[i] = tmp1[i-1] + v[i] * ( h[i] + l[i] ) / 2.
tmp2[i] = tmp2[i-1] + v[i]
return tmp1 / tmp2
v = df.v.values
h = df.h.values
l = df.l.values
df['vwap_numpy'] = np.cumsum(v*(h+l)/2) / np.cumsum(v)
df['vwap_numba'] = vwap()
Run Code Online (Sandbox Code Playgroud)
时序:
%timeit (df.v*(df.h+df.l)/2).cumsum() / df.v.cumsum() # pandas
1000 loops, best of 3: 829 µs per loop
%timeit np.cumsum(v*(h+l)/2) / np.cumsum(v) # numpy
10000 loops, best of 3: 165 µs per loop
%timeit vwap() # numba
10000 loops, best of 3: 87.4 µs per loop
Run Code Online (Sandbox Code Playgroud)
快速编辑:只是想感谢John的原帖:)
你可以通过@jiting ing numpy的版本获得更快的结果:
50.9 µs per loop
这让我74.5 µs per loop与50.9 µs per loop使用上面的vwap版本相反.
| 归档时间: |
|
| 查看次数: |
7425 次 |
| 最近记录: |