我在数据帧GetToolTipText
中有此相关矩阵:
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
中具有此波动向量:
df_vol
我想拥有协方差矩阵。我不能在实际示例中使用numpy cov,因为波动率和相关性不是来自同一张表。
以下是预期结果:
CNP 0.012789
F 0.014525
GE 0.011579
TSLA 0.026573
WMT 0.011369
答案 0 :(得分:1)
IIUC,请考虑以下设置
"UK"
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
stack
您得到的
df = df.set_index('ticker').stack().reset_index()
df.columns = ['ticker', 'other', 'corr']
然后过滤掉相等的值(无关紧要)
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
答案 1 :(得分:0)
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