如何从相关矩阵和波动性向量创建协方差矩阵?

2024-05-23 19:15:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个数据帧中有这个相关矩阵df_corr

ticker     CNP         F        GE      TSLA       WMT                                                  
CNP     1.000000  0.302712  0.408604  0.205812  0.289421
F       0.302712  1.000000  0.510077  0.302415  0.280815
GE      0.408604  0.510077  1.000000  0.288827  0.326106
TSLA    0.205812  0.302415  0.288827  1.000000  0.166978
WMT     0.289421  0.280815  0.326106  0.166978  1.000000

{cd2>在这个数据框中有波动性:

^{pr2}$

我想要协方差矩阵。我不能在我的实际例子中使用numpy-cov,因为波动性和相关性不是来自同一个表。在

以下是预期结果:

ticker     CNP        F        GE       TSLA       WMT    
CNP     0.000164  0.000056  0.000061  0.000070  0.000042
F       0.000056  0.000211  0.000086  0.000117  0.000046
GE      0.000061  0.000086  0.000134  0.000089  0.000043
TSLA    0.000070  0.000117  0.000089  0.000707  0.000051
WMT     0.000042  0.000046  0.000043  0.000051  0.000129

Tags: 数据numpydf矩阵例子ticker波动性协方差
2条回答

IIUC,考虑到你有以下设置

Setup

z = io.StringIO("""
ticker     CNP         F        GE      TSLA       WMT                                                  
CNP     1.000000  0.302712  0.408604  0.205812  0.289421
F       0.302712  1.000000  0.510077  0.302415  0.280815
GE      0.408604  0.510077  1.000000  0.288827  0.326106
TSLA    0.205812  0.302415  0.288827  1.000000  0.166978
WMT     0.289421  0.280815  0.326106  0.166978  1.000000""")

df = pd.read_table(z, delim_whitespace=True)

z2= io.StringIO("""
ticker vol
CNP       0.012789
F         0.014525
GE        0.011579
TSLA      0.026573
WMT       0.011369""")

df2 = pd.read_table(z2, delim_whitespace=True)

您可以stack这些值,并使用map来检索vol值。那就乘过去

{cd2>第一个

^{pr2}$

以至于你

   ticker other      corr
0     CNP   CNP  1.000000
1     CNP     F  0.302712
2     CNP    GE  0.408604
3     CNP  TSLA  0.205812
4     CNP   WMT  0.289421
5       F   CNP  0.302712
6       F     F  1.000000
7       F    GE  0.510077
8       F  TSLA  0.302415
9       F   WMT  0.280815

然后过滤出相等的值(它们无关紧要)

df = df[df.ticker != df.other]

map

df2 = df2.set_index('ticker')
df['cov'] = df.ticker.map(df2.vol) * df.other.map(df2.vol) * df['corr']

它产生了

df.head()


    ticker  other   corr        cov
1   CNP     F       0.302712    0.000056
2   CNP     GE      0.408604    0.000061
3   CNP     TSLA    0.205812    0.000070
4   CNP     WMT     0.289421    0.000042
5   F       CNP     0.302712    0.000056

当然,你总是可以pivot_table来得到一个矩阵

df.pivot_table(index=['ticker'], columns=['other'], values=['cov'], fill_value=1)


other   CNP         F          GE           TSLA        WMT
ticker                  
CNP     1.000000    0.000056    0.000061    0.000070    0.000042
F       0.000056    1.000000    0.000086    0.000117    0.000046
GE      0.000061    0.000086    1.000000    0.000089    0.000043
TSLA    0.000070    0.000117    0.000089    1.000000    0.000050
WMT     0.000042    0.000046    0.000043    0.000050    1.000000

或者使用.values获得相应的np.array

df.pivot_table(index=['ticker'], columns=['other'], values=['cov'], fill_value=1).values

array([[  1.00000000e+00,   5.62318492e-05,   6.05076457e-05,
          6.99435817e-05,   4.20812754e-05],
       [  5.62318492e-05,   1.00000000e+00,   8.57872875e-05,
          1.16723972e-04,   4.63723078e-05],
       [  6.05076457e-05,   8.57872875e-05,   1.00000000e+00,
          8.88688235e-05,   4.29291322e-05],
       [  6.99435817e-05,   1.16723972e-04,   8.88688235e-05,
          1.00000000e+00,   5.04454626e-05],
       [  4.20812754e-05,   4.63723078e-05,   4.29291322e-05,
          5.04454626e-05,   1.00000000e+00]])

IIUC公司

df.set_index('ticker',inplace=True)
df=pd.DataFrame(s.values*s.values[:,None]*df.values)
df.values[[np.arange(len(df))]*2] = 1
df
Out[24]: 
          0         1         2         3         4
0  1.000000  0.000056  0.000061  0.000070  0.000042
1  0.000056  1.000000  0.000086  0.000117  0.000046
2  0.000061  0.000086  1.000000  0.000089  0.000043
3  0.000070  0.000117  0.000089  1.000000  0.000050
4  0.000042  0.000046  0.000043  0.000050  1.000000

相关问题 更多 >