我对agg
中正确使用pandas
有疑问。我正在处理的具体问题是财务领域,更具体地说,是从完整限价订单簿中计算流动性指标。
我的数据包含订单簿的询问方(表示人们希望在特定时刻以及以何种价格出售的股票数量),我想计算在特定时刻购买50股的假设价格。例如,假设上午9点库存X的订单簿如下所示:
example_data=pd.DataFrame({'price':[100.023,100.031,100.039,100.109,100.219 ],'avail_shares': [40,1,20,23,15],'midpoint':[99.996 ,99.996 ,99.996 ,99.996,99.996 ]})
其中价格是出售股票的价格,avail_shares是每个价格可用的股票数量,中点是订单簿中最佳要价和出价的平均值。为了获得流动性指标,考虑到大订单可以同时达到多个价格水平(即“走书”),我定义了以下成本交易(ctt)功能:
def ctt_ask(dfrm,level=50):
dfrm['cumshares']=dfrm['avail_shares'].cumsum()
dfrm['indicator']=0
dfrm['indicator'].ix[dfrm.cumshares<level,]=dfrm.cumshares
dfrm['indicator'].ix[(dfrm.cumshares>level) & (dfrm.cumshares.shift(1)<level),]=(level- dfrm.cumshares.shift(1))
liquidity_measure=((dfrm.price-dfrm.midpoint)*dfrm.indicator).sum()
return liquidity_measure
对于上面的例子,这很好(即ctt_ask(example_data)
得到2.90),但我的真实数据集有几个股票和许多日期时间(它有一个MultiIndex
)。当我使用groupby
和agg
将此功能应用于每个股票日期时间组合(full_book_ask.groupby(level=[0,1]).agg(ctt_ask)
)时,我收到错误:KeyError: 'avail_shares'
。这很奇怪,因为我的实际数据集中有一个名为avail_shares的列。我也尝试使用apply
功能,但这会引发错误消息Exception: cannot handle a non-unique multi-index!
。我似乎无法弄清楚我在这里做错了什么。任何意见都会非常感激!