我必须计算相关矩阵的滚动均值。我这样做了
df_corr = df.rolling(window=3).corr()
但现在我想要
2017-06-05 00:00:00+02:00 NaN
2017-06-06 00:00:00+02:00 NaN
2017-06-07 00:00:00+02:00 0.86
...
我评估右上矩阵的平均值(不包括对角线)。
答案 0 :(得分:2)
这里需要的是在每个日期对相关矩阵应用掩码,如下所示:
您可以将numpy.triu_indices
与参数k=1
一起使用。这将返回(n,m)数组的上三角形的索引;设置k=1
忽略对角线。所以,要创建一个掩码:
import numpy as np
mask = np.triu_indices(df_corr.shape[1], k=1)
# .shape[1] = 4; each correl. matrix is 4x4
现在计算每个时期的平均值,忽略屏蔽值:
import pandas as pd
dates = df_corr.index.get_level_values(0)
avgs = [df_corr.loc[date].values[mask].mean()
for date in dates]
s = pd.Series(avgs, index=dates) # may want to dropna
print(s.tail())
Date
2017-07-03 0.72991
2017-07-04 0.73963
2017-07-04 0.73963
2017-07-04 0.73963
2017-07-04 0.73963
dtype: float64
要手动确认以上内容,您可以使用以下方式进行检查:
df_corr.loc['2017-07-04'].values[mask]
Out[108]:
array([ 0.72585007, 0.93792149, 0.79828102, 0.4422102 , 0.99371595,
0.53982374])
df_corr.loc['2017-07-04'].values[mask].mean()
Out[109]: 0.73963374659063508