使用pandas和scipy创建树状图

5

我希望使用 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相关之外的其他相关测量方法,这是一个功能,可以通过简单地调用DataFrame.corr(method='<method>')pandas中实现。所以,一开始我认为只需运行以下代码:

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_returns = np.random.normal(0, 0.01, size=(len(dates), m))

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

z = hc.linkage(corr.values, method='average')
dendrogram = hc.dendrogram(z, labels=corr.columns)
plt.show()

然而,如果我这样做,y轴上的数值会变得奇怪,因为最大值>1.4。而如果我运行第一个脚本,它大约是1。我做错了什么?我在hc.linkage中使用了错误的度量吗?
编辑我可能还要补充一点,树状图的形状完全相同。我是否需要用最大值来归一化结果中的第三列z
1个回答

12

找到了解决方法。如果您已经计算出了一个距离矩阵(无论是相关性还是其他什么),那么您只需使用 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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接