Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:组内高级加工_Python_Pandas_Group By - Fatal编程技术网

Python 熊猫:组内高级加工

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 有没有可能,我可以为这个

我正在做一些股票投资组合统计。特别是我有一个交易日志,上面有几个买卖订单,我按股票进行分组。这为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提出的“扩展平均”函数作为平均买入价格,需要根据交易中的相应金额进行加权

我会做如下事情(我制作了另一只股票,以明确它的作用):


如果你想的话,只需填写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