如何使用groupby计算vwap(批量加权平均价格)并应用?

2024-09-30 12:12:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我读了很多和我的问题类似的帖子,但还是想不出来。我有一只熊猫df,它看起来如下(连续几天):

Out[1]: 
                     price  quantity
time                                
2016-06-08 09:00:22  32.30    1960.0
2016-06-08 09:00:22  32.30     142.0
2016-06-08 09:00:22  32.30    3857.0
2016-06-08 09:00:22  32.30    1000.0
2016-06-08 09:00:22  32.35     991.0
2016-06-08 09:00:22  32.30     447.0
...

要计算vwap,我可以:

df['vwap'] = (np.cumsum(df.quantity * df.price) / np.cumsum(df.quantity))

然而,我想每天重新开始(groupby),但我不知道如何使它与a(lambda?)功能。

df['vwap_day'] = df.groupby(df.index.date)['vwap'].apply(lambda ...

速度至关重要。如果有任何帮助,我将不胜感激:)


Tags: lambda功能dfdateindextimenpout
1条回答
网友
1楼 · 发布于 2024-09-30 12:12:46

选项0
普通香草法

def vwap(df):
    q = df.quantity.values
    p = df.price.values
    return df.assign(vwap=(p * q).cumsum() / q.cumsum())

df = df.groupby(df.index.date, group_keys=False).apply(vwap)
df

                     price  quantity       vwap
time                                           
2016-06-08 09:00:22  32.30    1960.0  32.300000
2016-06-08 09:00:22  32.30     142.0  32.300000
2016-06-08 09:00:22  32.30    3857.0  32.300000
2016-06-08 09:00:22  32.30    1000.0  32.300000
2016-06-08 09:00:22  32.35     991.0  32.306233
2016-06-08 09:00:22  32.30     447.0  32.305901

选项1
投入一点eval

df = df.assign(
    vwap=df.eval(
        'wgtd = price * quantity', inplace=False
    ).groupby(df.index.date).cumsum().eval('wgtd / quantity')
)
df

                     price  quantity       vwap
time                                           
2016-06-08 09:00:22  32.30    1960.0  32.300000
2016-06-08 09:00:22  32.30     142.0  32.300000
2016-06-08 09:00:22  32.30    3857.0  32.300000
2016-06-08 09:00:22  32.30    1000.0  32.300000
2016-06-08 09:00:22  32.35     991.0  32.306233
2016-06-08 09:00:22  32.30     447.0  32.305901

相关问题 更多 >

    热门问题