Python:计算需要从数据框中分组的值的 5 年滚动 CAGR

Posted

技术标签:

【中文标题】Python:计算需要从数据框中分组的值的 5 年滚动 CAGR【英文标题】:Python: Calculate 5-year rolling CAGR of values that need to be grouped from a dataframe 【发布时间】:2020-01-28 01:48:02 【问题描述】:

我有一个包含历史市值的数据框,我需要计算它们的 5 年复合年增长率 (CAGR)。然而,数据框有数百家公司,每家公司都有 20 年的价值,所以我需要能够隔离每家公司的数据来计算它们的复合年增长率。我该怎么做呢?

计算 CAGR 的函数是:(end/start)^(1/# years)-1。我从来没有用过.groupby().apply(),所以我不知道如何实现滚动值的CAGR方程。

这是部分数据框的屏幕截图,因此您可以直观地看到我正在尝试使用的内容: Screeshot of dataframe.

任何指导将不胜感激!

【问题讨论】:

我假设每家公司每年有 1 个价值?将日期减少到只有年份是否安全? 【参考方案1】:

设置一个玩具示例:

import numpy as np
import pandas as pd

idx_level_0 = np.repeat(["company1", "company2", "company3"], 5)
idx_level_1 = np.tile([2015, 2016, 2017, 2018, 2019], 3)
values = np.random.randint(low=1, high=100, size=15)

df = pd.DataFrame("values": values, index=[idx_level_0, idx_level_1])
df.index.names = ["company", "year"]
print(df)

               values
company  year        
company1 2015      19
         2016      61
         2017      87
         2018      55
         2019      46
company2 2015       1
         2016      68
         2017      50
         2018      93
         2019      84
company3 2015      11
         2016      84
         2017      54
         2018      21
         2019      55

我建议使用groupby 按个别公司分组。然后,您可以通过 lambda 函数应用您的计算。结果基本上是一条线。

# actual computation for a two-year period
cagr_period = 2
df["cagr"] = df.groupby("company").apply(lambda x, period: ((x.pct_change(period) + 1) ** (1/period)) - 1, cagr_period)
print(df)


               values      cagr
company  year                  
company1 2015      19       NaN
         2016      61       NaN
         2017      87  1.139848
         2018      55 -0.050453
         2019      46 -0.272858
company2 2015       1       NaN
         2016      68       NaN
         2017      50  6.071068
         2018      93  0.169464
         2019      84  0.296148
company3 2015      11       NaN
         2016      84       NaN
         2017      54  1.215647
         2018      21 -0.500000
         2019      55  0.009217

【讨论】:

【参考方案2】:

假设每家公司每年有 1 个价值。您可以将日期减少到年份。这要简单得多。无需 groupby 或 apply。

假设您的数据框名称为 df。首先,将日期减少到年份:

df['year'] = df['Date'].dt.year

第二,加年+5

df['year+5'] = df['year'] + 5

第三,将'df'与自身合并:

df_new = pandas.merge(df, df, how='inner', left_on=['Instrument', 'year'], right_on=['Instrument','year+5'], suffixes=['_start', '_end'])

最后,计算滚动CAGR

df_new['CAGR'] = (df_new['Company Market Cap_end']/df_new['Company Market Cap_start'])**(0.2)-1

【讨论】:

以上是关于Python:计算需要从数据框中分组的值的 5 年滚动 CAGR的主要内容,如果未能解决你的问题,请参考以下文章

计算火花数据框中所有列(300 列)的每个不同值的出现次数

数据框中现有值的 Python 条件 NaN 值替换

如何计算包含一组列中的值和 Pandas 数据框中另一列中的另一个值的行数?

Pandas 从分组数据框中计算连续相等值的长度

对 pandas 数据框中的连续值进行分组

在python中的数据框中计算与引用可变值的条件相匹配的行