从大Pandas的相关矩阵中返回最高和最低相关性

2024-09-28 01:23:56 发布

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

我有一堆股票数据,我正试图构建一个数据框架,从相关矩阵中获取前两个股票和底部股票,以及它们的实际相关性。在

假设矩阵,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相关性。在

生成的数据帧或最容易显示的内容如下所示:

^{pr2}$

到目前为止,我已经能够通过使用corr[stock].nlargest().index[0:].tolist()查看并返回相关股票名称,然后从每个列表中提取[1][2]和{},并将它们粘贴到字典中并从中构建数据帧。但是我不能返回相关值,我怀疑我没有以最有效的方式来做这件事。在

真的很感谢你的帮助,干杯


Tags: 数据框架内容indexstock矩阵股票关联度
3条回答

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

拆下对角线

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个和后一个值。在

^{pr2}$

现在使用^{}result中的每一列获取corr中相应的列值

^{3}$

重新排序列(可选)

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

如果您需要可视化结果,但实际上并不需要获取和处理实际的相关值,那么为什么不使用一个非常简单的heatmap?你也可以玩绘图,让数字显示在每个方块上。在

import seaborn as sns
import pandas as pd

 dict = {'Date':['2018-01-01','2018-01-02','2018-01-03','2018-01-04','2018-01-05'],'Col1':[1,2,3,4,5],'Col2':[1.1,1.2,1.3,1.4,1.5],'Col3':[0.33,0.98,1.54,0.01,0.99],'Col4':[8,9.98,6,0.01,0.1],'Col1':[19,42,3,0.4,51]}
df = pd.DataFrame(dict, columns=dict.keys())
sns.heatmap(df.corr())

heatmap

另一个答案更多地依赖于modern pandas style。对于第二大相关性,我没有找到一个好的解决方案。我找到答案后会编辑它。在

### Create an example df
df = pd.DataFrame(data = {"A":pd.np.random.randn(10),
                    "B":pd.np.random.randn(10),
                    "C":pd.np.random.randn(10),
                    "D":pd.np.random.randn(10),
                        }
                )


# Solution
(
df.corr() #correlation matrix
  .replace(1, pd.np.nan) # replace the matrix with nans
  .assign(  # assign new variables
            First = lambda x: x.loc[["A","B","C","D"], ["A","B","C","D"]].idxmax(axis = 1), # Biggest correlation idx
            First_value = lambda x: x.loc[["A","B","C","D"], ["A","B","C","D"]].max(axis = 1), # Biggest correlation
            Last = lambda x: x.loc[["A","B","C","D"],["A","B","C","D"]].idxmin(axis = 1), # Smallest correlation idx
            Last_value = lambda x: x.loc[["A","B","C","D"],["A","B","C","D"]].idxmin(axis = 1), # Smallest correlation
              )
)

我使用.loc[["A","B","C","D"],["A","B","C","D"]],这样操作只在未修改的数据帧上进行。在

输出: ^{pr2}$

相关问题 更多 >

    热门问题