You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用groupby计算月度分组的成交量加权平均价(VWAP)?

解决月度分组VWAP计算中的AttributeError问题

嘿,我看到你在计算按年-月分组的成交量加权平均价(VWAP)时碰到了AttributeError,咱们一步步把问题解决掉。

首先,先拆解下你代码里的关键问题和错误来源:

错误原因分析

  1. 语法错误导致逻辑偏差
    你写的VWAP计算行有明显的语法问题:

    data['VWAP'] = (np.cumsum(data['Close Price' * data['Total Traded Quantity']) / np.cumsum(data['Total Traded Quantity']))
    

    这里你把收盘价列的引用写错了:'Close Price' * data['Total Traded Quantity'] 是用字符串和Series做乘法,完全不符合逻辑,还漏写了闭合的引号。正确的写法应该是取data['Close Price']列和data['Total Traded Quantity']列做元素级乘法,也就是data['Close Price'] * data['Total Traded Quantity']。

  2. 未实现分组计算逻辑
    你的需求是计算每个月度分组的VWAP,但原代码是对整个DataFrame计算累计VWAP,没有结合之前的groupby操作,这完全不符合你的需求。

  3. AttributeError的触发点
    错误提示AttributeError: 'DataFrame' object has no attribute 'quantity',大概率是你在代码某处误把列名'Total Traded Quantity'简写为quantity(比如写成data.quantity而不是data['Total Traded Quantity']),因为你的DataFrame里没有名为quantity的列,所以触发了这个错误。

修正后的代码

下面是实现按年-月分组计算累计VWAP的完整代码:

import pandas as pd
import numpy as np

# 假设你的data包含Date、Close Price、Total Traded Quantity这几列
# 第一步:提取日期中的年和月
data['Month'] = pd.DatetimeIndex(data['Date']).month
data['Year'] = pd.DatetimeIndex(data['Date']).year

# 第二步:定义分组内计算VWAP的函数
def calculate_group_vwap(group):
    # 计算累计成交额:收盘价 × 成交量,逐行累加
    cumulative_value = np.cumsum(group['Close Price'] * group['Total Traded Quantity'])
    # 计算累计成交量
    cumulative_volume = np.cumsum(group['Total Traded Quantity'])
    # 计算VWAP,同时处理成交量为0的极端情况(避免除以0报错)
    group['VWAP'] = np.where(cumulative_volume == 0, np.nan, cumulative_value / cumulative_volume)
    return group

# 第三步:按年和月分组,应用函数计算每个分组内的VWAP
data = data.groupby(['Year', 'Month']).apply(calculate_group_vwap)

# 查看结果
data.head()

如果你需要的是每个月度的整体VWAP(即整个月度的总成交额除以总成交量,不是逐天的累计值),可以用这段代码:

monthly_overall_vwap = data.groupby(['Year', 'Month']).apply(
    lambda g: (g['Close Price'] * g['Total Traded Quantity']).sum() / g['Total Traded Quantity'].sum()
).reset_index(name='Monthly Overall VWAP')

print(monthly_overall_vwap)

验证结果

运行完修正后的代码后,你可以通过data[['Date', 'Year', 'Month', 'Close Price', 'Total Traded Quantity', 'VWAP']].head()来查看逐天的分组累计VWAP,确认计算是否符合预期。

内容的提问来源于stack exchange,提问作者user11671222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:20:49