python - 从 Pandas 中的相关矩阵返回最高和最低相关

标签 python pandas correlation

我有一堆股票数据,我正在尝试构建一个数据框,从相关矩阵中提取前两只和尾只股票,以及它们的实际相关性。

假设矩阵 corr 看起来像这样:

  A    B    C    D    E
A 1.00 0.65 0.31 0.94 0.55
B 0.87 1.00 0.96 0.67 0.41
C 0.95 0.88 1.00 0.72 0.69
D 0.64 0.84 0.99 1.00 0.78
E 0.71 0.62 0.89 0.32 1.00

我想要做的是能够为股票 A、B、C、D 和 E 返回最好的两只相关性最低的股票及其相关性,同时降低每只股票必须具有的明显 1.00 相关性本身。

生成的数据框或任何最容易显示的数据框如下所示:

Stock 1st 1st_Val 2nd 2nd_Val Last Last_Val
A     D   0.94    B   0.65    C    0.31
B     C   0.96    A   0.87    E    0.41
C     A   0.95    B   0.88    E    0.69
D     C   0.99    B   0.84    A    0.64
E     C   0.89    A   0.71    D    0.32

到目前为止,我已经能够使用 corr[stock].nlargest().index[0:].tolist() 查看并返回相关的股票名称,然后从每个列表中获取 [1][2][-1] 并将它们粘贴到字典中并从那里构建数据框。但是我无法返回相关值,而且我怀疑我并没有以最有效的方式执行此操作。

非常感谢任何帮助,干杯

最佳答案

您的条件很难归纳为一个命令,但这里是您可以采用的一种方法。

删除对角线

import numpy as np
np.fill_diagonal(corr.values, np.nan)
print(corr)
#      A     B     C     D     E
#A   NaN  0.65  0.31  0.94  0.55
#B  0.87   NaN  0.96  0.67  0.41
#C  0.95  0.88   NaN  0.72  0.69
#D  0.64  0.84  0.99   NaN  0.78
#E  0.71  0.62  0.89  0.32   NaN

查找前 2 列和后列的名称

您可以在 Find names of top-n highest-value columns in each pandas dataframe row 上使用答案获取每一行的前 2 个和后一个值(股票)。

order_top2 = np.argsort(-corr.values, axis=1)[:, :2]
order_bottom = np.argsort(corr.values, axis=1)[:, :1]

result_top2 = pd.DataFrame(
    corr.columns[order_top2], 
    columns=['1st', '2nd'],
    index=corr.index
)

result_bottom = pd.DataFrame(
    corr.columns[order_bottom], 
    columns=['Last'],
    index=corr.index
)

result = result_top2.join(result_bottom)
#  1st 2nd Last
#A   D   B    C
#B   C   A    E
#C   A   B    E
#D   C   B    A
#E   C   A    D

现在使用 pandas.DataFrame.lookupresult

中的每一列获取 corr 中对应的列值
for x in result.columns:
    result[x+"_Val"] = corr.lookup(corr.index, result[x])
print(result)
#  1st 2nd Last  1st_Val  2nd_Val  Last_Val
#A   D   B    C     0.94     0.65      0.31
#B   C   A    E     0.96     0.87      0.41
#C   A   B    E     0.95     0.88      0.69
#D   C   B    A     0.99     0.84      0.64
#E   C   A    D     0.89     0.71      0.32

重新排列列(可选)

print(result[['1st', '1st_Val', '2nd', '2nd_Val', 'Last', 'Last_Val']])
#  1st  1st_Val 2nd  2nd_Val Last  Last_Val
#A   D     0.94   B     0.65    C      0.31
#B   C     0.96   A     0.87    E      0.41
#C   A     0.95   B     0.88    E      0.69
#D   C     0.99   B     0.84    A      0.64
#E   C     0.89   A     0.71    D      0.32

关于python - 从 Pandas 中的相关矩阵返回最高和最低相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55730173/

相关文章:

python - Folium map 无法在 github 上的笔记本中呈现

python - 在网络摄像头流上画线-Python

python - google colab python3 名称 cv2 未定义

python - 如何通过使用 pandas 施加限制来处理异常值?

python - 将 Twitter 时间转换为特定格式的日期时间,以统计一天中推文的频率

r - 计算包含缺失值的相关系数

python - 自动生成代码 : automatic or manual? 的单元测试

python - Pandas 中的 bool 子集

r - R 中的曼特尔测试

python - 计算两个矩阵的行之间的相关系数