如何从每日价格数据计算每月收益?

时间:2018-07-30 13:59:34

标签: python pandas

In [27]: df 
Out[27]:   Date                  MSCI USA/CONSUMER DISCR
3958 2018-07-02                  325.810
3959 2018-07-03                  323.680
3960 2018-07-05                  325.550
3961 2018-07-06                  328.050
3962 2018-07-09                  331.890
3963 2018-07-10                  332.650
3964 2018-07-11                  331.740
3965 2018-07-12                  333.910
3966 2018-07-13                  334.850
3967 2018-07-16                  335.290
3968 2018-07-17                  335.990
3969 2018-07-18                  335.740
3970 2018-07-19                  334.870
3971 2018-07-20                  333.240
3972 2018-07-23                  332.690
3973 2018-07-24                  331.600
3974 2018-07-25                  333.930
3975 2018-07-26                  332.100

我有每日价格数据,想要计算月收益。使这个问题变得很难的原因是我的数据基于股市交易日,而不是实际日期。

数据中的月份的第一天不一定是月份的第一天(2018-07-02,而不是2018-07-01。)与月份的最后一天相同(不一定是实际的最后一天)每月的一天)。

我尝试过:

g = df.groupby(pd.Grouper(freq = 'M'))
g.sum()
2018-06-30    6884.610
2018-07-31    5973.580.
g_date = g.index

这不是我想要的,因为我的原始数据中不存在2018-07-31

如果有人可以分享他们的建议,我将不胜感激。

非常感谢您。

2 个答案:

答案 0 :(得分:0)

您可以使用agg做这样的事情:

g = df.groupby(pd.Grouper(freq='M', key='Date'))[['Date','MSCI USA/Consumer DISCR']]

g.agg({'Date':'max','MSCI USA/Consumer DISCR':'sum'}).reset_index(drop=True)

输出:

        Date  MSCI USA/Consumer DISCR
0 2018-07-26                  5973.58

答案 1 :(得分:0)

如果您想在每月的第一个工作日使用freq,也可以在BMS中使用BM,在最后一个工作日使用print (df.groupby(pd.Grouper(key='Date',freq = 'BMS')).sum()) MSCI Date 2018-07-02 5973.58 ,请选中Offset Aliases,例如:< / p>

library(dplyr)

df %>%
  group_by(X) %>%
  summarise(Y = mean(Y))