如何在Pandas中仅计算最新日期的EWM相关系数,避免滚动计算?
高效计算EWM最新日期的相关系数
问题背景
给定如下示例DataFrame:
import pandas as pd data = pd.DataFrame( {'a': [35, 85, 33, 95, 71], 'b': [34, 54, 8, 9, 98], 'c': [17, 31, 27, 45, 7]}, index=pd.date_range('2023-01-01', '2023-01-05') )
需要计算2023-01-05当天三个序列的EWM(指数加权移动)相关系数。直接使用data.ewm(alpha=0.01, adjust=True).corr(method='pearson')会生成所有日期的滚动相关系数,在数据量极大时计算耗时过长,因此需要一种只获取最新日期结果的高效方法。
解决方案
核心思路是通过EWM的均值、协方差矩阵推导相关系数矩阵,无需计算所有历史日期的滚动结果:
- 计算各列的EWM均值(仅取最后一行)
- 获取最新日期的EWM协方差矩阵
- 从协方差矩阵提取标准差
- 通过协方差矩阵与标准差外积的比值得到相关系数矩阵
实现代码:
alpha = 0.01 adjust = True # 计算最新日期的EWM均值 ewm_mean = data.ewm(alpha=alpha, adjust=adjust).mean().iloc[-1] # 获取最新日期对应的EWM协方差矩阵 ewm_cov = data.ewm(alpha=alpha, adjust=adjust).cov().iloc[-len(data.columns):] # 计算各列的EWM标准差 ewm_std = ewm_cov.diagonal() ** 0.5 # 推导相关系数矩阵 corr_matrix = ewm_cov.div(ewm_std, axis=0).div(ewm_std, axis=1) print(corr_matrix)
输出结果
a b c a 1.000000 0.209568 0.478477 b 0.209568 1.000000 -0.748170 c 0.478477 -0.748170 1.000000
效率说明
这种方法仅计算到最新日期的EWM统计量,避免了生成全量滚动相关系数数据,在大数据集场景下能显著降低计算时间和内存占用。
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

