【问题标题】:Pandas: advanced processing within groupsPandas:组内的高级处理
【发布时间】:2014-04-03 07:26:36
【问题描述】:

我正在做一些股票投资组合统计。特别是,我有一个交易日志,其中包含几个按股票分组的买卖订单。这为 AAPL 提供了这样一个分组,例如:

    Date        Form        Amount     Price
0   2013-12-01  IN          10          10
1   2013-12-02  IN          10          5
2   2013-05-01  OUT         10          7

有没有可能我可以为这组计算第二条和第三条线的累积金额和平均购买价格。这样我得到以下结果。

    Date                Cum_Amount  Avg_Buy_Price
0   2013-12-01          10          10
1   2013-12-02          20          7.5
2   2013-05-01          10          7.5

感谢您的帮助。

谢谢

更新

不幸的是,joris 提出的“expanding_mean”函数作为 Avg_Buy_Price 需要由相应的 IN 交易金额加权。

【问题讨论】:

  • 第三行怎么来的?
  • 嗨,Andy,第三行是 OUT 交易,从现有 Cum_Amount 中减去 10 pices。此 OUT 交易也不影响 Avg_Buy_Price

标签: python pandas group-by


【解决方案1】:

我会做如下的事情(我编造了另一只股票来说明它的作用):

print df

  Ticker        Date Form  Amount  Price
0   AAPL  2013-12-01   IN      10     10
1   AAPL  2013-12-02   IN      10      5
2   AAPL  2014-01-05  OUT      10      7
3    KKD  2013-12-22   IN      20     30
4    KKD  2013-12-29   IN      20     35
5    KKD  2014-01-15  OUT       5     40
6    KKD  2013-01-22  OUT       5     45

def cum_amount(x):
    x.ix[x['Form'] == 'OUT','Amount'] =  -x.ix[x['Form'] == 'OUT','Amount'] 
    return pd.DataFrame(pd.expanding_sum(x.Amount))

def weighted_avg(g):
    x = g[g['Form'] == 'IN']
    avg = pd.expanding_sum(x.Amount*x.Price)/pd.expanding_sum(x.Amount)
    g['avg'] = avg
    return g[['avg']]

df['Cum_Amount'] = df.groupby('Ticker').apply(cum_amount)
df['Avg_BuyPrice'] = df.groupby('Ticker').apply(weighted_avg)
print df

 Ticker        Date Form  Amount  Price  Cum_Amount  Avg_BuyPrice
0   AAPL  2013-12-01   IN      10     10          10          10.0
1   AAPL  2013-12-02   IN      10      5          20           7.5
2   AAPL  2014-01-05  OUT      10      7          10           NaN
3    KKD  2013-12-22   IN      20     30          20          30.0
4    KKD  2013-12-29   IN      20     35          40          32.5
5    KKD  2014-01-15  OUT       5     40          35           NaN
6    KKD  2013-01-22  OUT       5     45          30           NaN

如果需要,只需填写 Avg_BuyPrice 的缺失值

【讨论】:

  • 酷,非常感谢。我非常喜欢你如何使用 expand_sum 函数的想法。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 2014-12-20
  • 2011-05-27
  • 2019-10-24
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多