Python pandas groupby 返回所有条目而不是分组条目
Python pandas groupby returning all entries rather than grouped entries
我在 pandas 数据框中有一个 return 的时间序列,带有日期索引和 return 列标记为 '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
方法在不同的时间间隔内累计累计 return。我创建了一个自定义方法:
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 在每个月的最后一天调用正确的值,但 returns 指向它的每一行而不是仅按值指定的组:
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
您可以尝试使用以下方法 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 数据框中有一个 return 的时间序列,带有日期索引和 return 列标记为 '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
方法在不同的时间间隔内累计累计 return。我创建了一个自定义方法:
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 在每个月的最后一天调用正确的值,但 returns 指向它的每一行而不是仅按值指定的组:
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
您可以尝试使用以下方法 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)