Python 熊猫:使用具有多索引的聚合

Python 熊猫:使用具有多索引的聚合,python,pandas,aggregate,finance,Python,Pandas,Aggregate,Finance,我有一个关于agg在pandas中正确使用的问题。我正在研究的具体问题是在金融领域,更具体地说,是从完整的限额订单簿计算流动性度量 我的数据包含订单簿的询问部分(代表人们在特定时刻想要卖出多少股票以及以什么价格卖出),我想计算在特定时刻买入50股的假设价格。例如,假设上午9点库存X的订单簿如下所示: example_data=pd.DataFrame({'price':[100.023,100.031,100.039,100.109,100.219 ],'avail_shares':

我有一个关于
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
def ctt\U ask(dfrm,级别=50):
dfrm['cumshares']=dfrm['avail_shares'].cumsum()
dfrm['indicator']=0

dfrm['indicator'].ix[dfrm.cumshareslevel)和(dfrm.cumshares.shift(1)在尝试访问您没有的列时获得
KeyError
,这对我来说似乎很直观。您希望发生什么?问题是自动传递给agg的第一个参数是一个系列(对于要聚合的数据帧中的每列)而不是数据帧本身。这意味着您不能引用要聚合的列以外的列。这就是为什么当您不使用groupby进行此操作时,is可以正常工作的原因。您可以尝试使用
transform
,因为传递给transform的对象是组中的整个数据帧。谢谢您的评论。@Paul H,如我所述在描述中,我的数据集中有一个名为avail_shares的列,所以这不是问题。@Woody Pride,你是对的,我现在明白了为什么我不能使用
agg
。但是,
apply
transform
也给了我一个错误:
异常:无法处理非唯一的多索引!
。所以一定有错误我想使用
ix
可能有问题,但我不知道为什么或者应该怎么解决。