Python 熊猫:组内高级加工
我正在做一些股票投资组合统计。特别是我有一个交易日志,上面有几个买卖订单,我按股票进行分组。这为AAPL提供了这样的分组,例如:Python 熊猫:组内高级加工,python,pandas,group-by,Python,Pandas,Group By,我正在做一些股票投资组合统计。特别是我有一个交易日志,上面有几个买卖订单,我按股票进行分组。这为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 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提出的“扩展平均”函数作为平均买入价格,需要根据交易中的相应金额进行加权 我会做如下事情(我制作了另一只股票,以明确它的作用):
如果你想的话,只需填写Avg_BuyPrice缺少的值第三行是怎么来的?嗨,安迪,第三行是OUT交易,从现有的Cum_金额中减去10个PICE。此外,此交易不会影响平均购买价格,非常感谢。我非常喜欢你如何使用扩展的求和函数。
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