在数据框中创建滚动聚合值 Pandas
Creating rolling aggregate values in data frames Pandas
我目前正在处理财务数据,但卡在了分析的最后一步。这些年来,我有一个包含许多不同公司及其 returns 的大型面板数据,并且未对同一公司多年来的值进行排序。类似于这样的东西:
year ticker return_y
0 1985 VLID -0.5838
1 1985 KO 0.3245
2 1994 CTL -0.3063
3 1996 DRYR -0.1607
.. ... ... ...
1356 2002 CHUX -0.2456
1357 1987 HRL -0.0233
1358 2015 KO 0.2343
.. ... ... ...
56798 2017 AFMXF 0.0558
56799 2014 TER 0.0134
我一直试图做的是创建一个单独的数据框,它在 3 年的滚动基础上对每家公司的 returns 求和,如果缺少一年(例如,我们有 1999 年和2001 但不是 2000) 从下一点重新开始滚动。因此像这样:
3_years ticker return_y
0 1985-1987 VLID -0.0245
1 1986-1988 VLID 0.0366
2 1987-1989 VLID -0.0421
3 1993-1995 VLID -0.1607
.. ... ... ...
12569 2008-2010 AFMXF 0.2349
12570 2012-2015 AFMXF 0.1112
提前致谢!
假设您的数据框名为 df
。
简而言之:
你会做这样的事情:
# ts stands for time on y-axis and security on x-axys
returns_ts = df.pivot(index='year', columns='ticker', values='return_y')
rolling_returns_ts = returns_ts.rolling(3).sum()
这将为您提供另一种格式的滚动 returns(我觉得使用起来更容易)。
要将它们恢复为您描述的格式,您可以:
old_format_rolling_returns = rolling_returns_ts.stack().reset_index()
请注意,这假设 years
轴需要是 datetime
格式。
另请注意,对于您想要的转换,您需要再次将 years
格式更改为您喜欢的格式。
我目前正在处理财务数据,但卡在了分析的最后一步。这些年来,我有一个包含许多不同公司及其 returns 的大型面板数据,并且未对同一公司多年来的值进行排序。类似于这样的东西:
year ticker return_y
0 1985 VLID -0.5838
1 1985 KO 0.3245
2 1994 CTL -0.3063
3 1996 DRYR -0.1607
.. ... ... ...
1356 2002 CHUX -0.2456
1357 1987 HRL -0.0233
1358 2015 KO 0.2343
.. ... ... ...
56798 2017 AFMXF 0.0558
56799 2014 TER 0.0134
我一直试图做的是创建一个单独的数据框,它在 3 年的滚动基础上对每家公司的 returns 求和,如果缺少一年(例如,我们有 1999 年和2001 但不是 2000) 从下一点重新开始滚动。因此像这样:
3_years ticker return_y
0 1985-1987 VLID -0.0245
1 1986-1988 VLID 0.0366
2 1987-1989 VLID -0.0421
3 1993-1995 VLID -0.1607
.. ... ... ...
12569 2008-2010 AFMXF 0.2349
12570 2012-2015 AFMXF 0.1112
提前致谢!
假设您的数据框名为 df
。
简而言之:
你会做这样的事情:
# ts stands for time on y-axis and security on x-axys
returns_ts = df.pivot(index='year', columns='ticker', values='return_y')
rolling_returns_ts = returns_ts.rolling(3).sum()
这将为您提供另一种格式的滚动 returns(我觉得使用起来更容易)。
要将它们恢复为您描述的格式,您可以:
old_format_rolling_returns = rolling_returns_ts.stack().reset_index()
请注意,这假设 years
轴需要是 datetime
格式。
另请注意,对于您想要的转换,您需要再次将 years
格式更改为您喜欢的格式。