如何使用groupby计算月度分组的成交量加权平均价(VWAP)?
嘿,我看到你在计算按年-月分组的成交量加权平均价(VWAP)时碰到了AttributeError,咱们一步步把问题解决掉。
首先,先拆解下你代码里的关键问题和错误来源:
错误原因分析
语法错误导致逻辑偏差
你写的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']。未实现分组计算逻辑
你的需求是计算每个月度分组的VWAP,但原代码是对整个DataFrame计算累计VWAP,没有结合之前的groupby操作,这完全不符合你的需求。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

