【问题标题】:Python pandas groupby returning all entries rather than grouped entriesPython pandas groupby 返回所有条目而不是分组条目
【发布时间】:2020-05-11 10:07:18
【问题描述】:

我在 pandas 数据框中有一个时间序列的返回,其日期索引和返回列标记为“TRI”,如下所示:

VALUE_DATE  TRI        
2007-06-26 -0.000727
2007-06-27  0.015004
2007-06-28  0.000758
2007-06-29 -0.006408
2007-07-02  0.013844
2007-07-03  0.003866

我正在尝试使用 pandas groupby 方法汇总不同时间间隔内的累积回报。我创建了一个自定义方法:

def cumRets(z):
        return np.exp(np.log(1 + z).cumsum()) - 1

但我无法在apply 通话中成功使用它。

作为参考,按预期分组(按年份),尽管总和很简单:

returns.groupby(returns.index.year).sum()

输出:

VALUE_DATE  TRI        
2007       -0.046283
2008       -0.240282
2009        0.259417
2010        0.268445
2011        0.054842
2012        0.162453
2013        0.331585
2014        0.063425
2015       -0.009367
2016        0.242511
2017        0.132732
2018       -0.099919
2019        0.233057
2020       -0.002414

但应用我的cumRets 方法,我得到所有 行而不是汇总的年份总数。此调用在每个月的最后一天返回正确的值,但返回之前的每一行,而不仅仅是按值指定的分组:

returns.groupby(returns.index.year).apply(cumRets) 

输出:

VALUE_DATE  TRI
2019-12-26  0.250672
2019-12-27  0.247278
2019-12-30  0.246734
2019-12-31  0.248562
2020-01-02  0.000143
2020-01-03 -0.002414

所需的输出如下所示(删节):

VALUE_DATE  TRI        
...
...
2019        0.248562
2020       -0.002414

问题 1a,我将如何在每月和每周的时间间隔内执行相同的操作,所需的输出分别如下所示(仅格式,值是占位符):

每月产出:

VALUE_DATE  TRI
...
...
    2019-12  0.066746
    2020-01 -0.002414

每周输出:

VALUE_DATE  TRI
...
...
    2019-12-w3  0.013228
    2019-12-w4  0.022367
    2020-01-w1 -0.002414

【问题讨论】:

  • 我注意到您的函数返回值数组而不是标量值。我错过了什么吗?
  • 它计算一个累积总和......在这种情况下,一个滚动产品没有独立的 python 产品功能。
  • 所以np.exp(np.log(1 + z).cumsum()) - 1 应该是sum(np.exp(np.log(1 + z).cumsum()) - 1) ?
  • 除非自定义函数返回标量值,否则您将获得给定年份的多行。
  • 你能检查这是否有效(给出预期值):(np.exp(np.log(1 + df.TRI).cumsum()) - 1).prod()

标签: python pandas pandas-groupby pandas-apply


【解决方案1】:

您可以尝试使用resample

def cumRets(z):
        return z.add(1).prod().sub(1)


# yearly
df.resample('Y', kind='period').apply(cumRets)

# monthly
df.resample('M', kind='period').apply(cumRets)

【讨论】:

  • 如上,原生 pandas prod() 成功了。最终在cumRets 方法中使用了return (1 + z).prod() - 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多