使用Pandas和scipy的树状图

2024-05-14 22:19:50 发布

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

我希望使用pandasscipy生成基于相关性的树状图。我使用一个包含返回值的数据集(如DataFrame),其大小为n x m,其中n是日期数,m是公司数量。然后我简单地运行脚本

import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster import hierarchy as hc
import numpy as np

m = 5
dates = pd.date_range('2013-01-01', periods=365)
random_matrix = np.random.normal(0, 0.01, size=(len(dates), m))
dataframe = pd.DataFrame(data=random_matrix, index=dates)

z = hc.linkage(dataframe.values.T, method='average', metric='correlation')
dendrogram = hc.dendrogram(z, labels=dataframe.columns)
plt.show()

我得到了一个很好的树状图。现在,除了普通的Pearson相关性之外,我还想使用其他相关度量,Pearson相关性是一个通过简单调用DataFrame.corr(method='<method>')而包含在pandas中的特性。所以,我一开始以为它只是运行下面的代码

^{pr2}$

但是,如果我这样做,我会在y轴上得到奇怪的值,作为最大值>;1.4。但是如果我运行第一个脚本,大约是1。我做错什么了?我在hc.linkage中使用了错误的度量吗?在

编辑我可以补充说,树状图的形状完全相同。是否必须用最大值规范化结果z的第三列?在


Tags: hcimport脚本dataframepandasasnpplt
1条回答
网友
1楼 · 发布于 2024-05-14 22:19:50

找到了解决办法。如果您已经计算了一个距离矩阵(不管是相关性还是其他什么),您只需使用distance.squareform来压缩矩阵。也就是说

dataframe = pd.DataFrame(data=random_returns, index=dates)
corr = 1 - dataframe.corr() 

corr_condensed = hc.distance.squareform(corr) # convert to condensed
z = hc.linkage(corr_condensed, method='average')
dendrogram = hc.dendrogram(z, labels=corr.columns)
plt.show()

相关问题 更多 >

    热门问题