Python:计算需要从数据框中分组的值的 5 年滚动 CAGR
Python: Calculate 5-year rolling CAGR of values that need to be grouped from a dataframe
我有一个包含历史市值的数据框,我需要计算它们的 5 年复合年增长率 (CAGR)。但是,数据框有数百家公司,每家公司的价值都为 20 年,因此我需要能够隔离每家公司的数据以计算它们的 CAGR。我该怎么做呢?
计算CAGR的函数是:(end/start)^(1/# years)-1
。我从未使用过 .groupby()
或 .apply()
,所以我不知道如何实现滚动值的 CAGR 方程。
这是部分数据框的屏幕截图,因此您可以直观地了解我正在尝试使用的内容:
Screeshot of dataframe.
任何指导将不胜感激!
假设每个公司每年有 1 个值。您可以将日期减少到年份。这要简单得多。无需 groupby 或申请。
假设您的数据框是名称 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'])
最后,计算滚动复合年增长率
df_new['CAGR'] = (df_new['Company Market Cap_end']/df_new['Company Market Cap_start'])**(0.2)-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
我有一个包含历史市值的数据框,我需要计算它们的 5 年复合年增长率 (CAGR)。但是,数据框有数百家公司,每家公司的价值都为 20 年,因此我需要能够隔离每家公司的数据以计算它们的 CAGR。我该怎么做呢?
计算CAGR的函数是:(end/start)^(1/# years)-1
。我从未使用过 .groupby()
或 .apply()
,所以我不知道如何实现滚动值的 CAGR 方程。
这是部分数据框的屏幕截图,因此您可以直观地了解我正在尝试使用的内容: Screeshot of dataframe.
任何指导将不胜感激!
假设每个公司每年有 1 个值。您可以将日期减少到年份。这要简单得多。无需 groupby 或申请。
假设您的数据框是名称 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'])
最后,计算滚动复合年增长率
df_new['CAGR'] = (df_new['Company Market Cap_end']/df_new['Company Market Cap_start'])**(0.2)-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