相关矩阵的滚动均值

时间:2017-07-04 22:45:24

标签: python pandas numpy dataframe

我必须计算相关矩阵的滚动均值。我这样做了

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
...

我评估右上矩阵的平均值(不包括对角线)。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:2)

这里需要的是在每个日期对相关矩阵应用掩码,如下所示:

enter image description here

您可以将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