同一天的求和和平均

时间:2018-12-08 12:33:08

标签: python pandas dataframe finance

我有在excel中按天数排序的数据,现在我想要做的是获取每天的日收益之和。这里的问题是我最近有多次输入。因此,我可能只有一个2018-12-05的每日回报条目,但有五个2018-12-06的条目。我希望我在2018年12月6日只收到一份条目,其中包含每日累计收益(因此所有累计收益加在一起)和平均每日收益(因此累计收益除以当天的条目数量)。 2018-12-06这将被5除以。

所以我现在拥有的数据如下:

git reflog show
git reset HEAD@{2} // i.e where HEAD used to be two moves ago - may be different for your case

最终的数据框应如下图所示

HEAD@{2}

到目前为止,我具有以下代码来汇总每日收益。但是,它不能正确求和。而且我不知道如何实现平均每日收益。

            Dates  Last.Price  Daily.Return
19788  2018-11-23       75.18     -0.001199
19789  2018-11-23      129.04     -0.026490
19790  2018-11-26       77.84     -0.035382
19791  2018-11-26      127.98      0.008215
19792  2018-11-27       79.50     -0.021326
19793  2018-11-27      122.68      0.041413
19794  2018-11-28       80.27     -0.009686
19795  2018-11-29       80.00      0.003364

如前所述,此代码不能正确汇总每日收益。而且我不知道如何获得这几天的平均回报。

1 个答案:

答案 0 :(得分:1)

我认为您需要使用aggfirstsum函数通过mean进行聚合:

由于列Daily.Return由列表中定义的多个函数聚合,因此在输出中获得MultiIndex。因此有必要将其展平-最简单的做法是将mapjoin一起使用。

df = df.groupby('Dates').agg({'Last.Price':'first', 'Daily.Return':['mean','sum']})

print (df)
           Last.Price Daily.Return          
                first         mean       sum
Dates                                       
2018-11-23      75.18    -0.013844 -0.027689
2018-11-26      77.84    -0.013583 -0.027167
2018-11-27      79.50     0.010044  0.020087
2018-11-28      80.27    -0.009686 -0.009686
2018-11-29      80.00     0.003364  0.003364

print (df.columns)
MultiIndex(levels=[['Last.Price', 'Daily.Return'], ['first', 'mean', 'sum']],
           labels=[[0, 1, 1], [0, 1, 2]])

df.columns = df.columns.map('_'.join)
print (df)
           Last.Price_first  Daily.Return_mean  Daily.Return_sum
Dates                                                            
2018-11-23             75.18          -0.013844         -0.027689
2018-11-26             77.84          -0.013583         -0.027167
2018-11-27             79.50           0.010044          0.020087
2018-11-28             80.27          -0.009686         -0.009686
2018-11-29             80.00           0.003364          0.003364

最后rename个列:

d = {'Last.Price_first':'Last.Price',
     'Daily.Return_sum': 'Cum.Return',
     'Daily.Return_mean': 'Average.Return'}

df = df.rename(columns=d)
print (df)
            Last.Price  Average.Return  Cum.Return
Dates                                             
2018-11-23       75.18       -0.013844   -0.027689
2018-11-26       77.84       -0.013583   -0.027167
2018-11-27       79.50        0.010044    0.020087
2018-11-28       80.27       -0.009686   -0.009686
2018-11-29       80.00        0.003364    0.003364