我有一个具有大量特征的数据集,因此分析相关矩阵变得非常困难。我想绘制一个相关矩阵,我们使用dataframe.corr()函数从pandas库中获得。pandas库是否提供了任何内置函数来绘制这个矩阵?
当前回答
corrmatrix = df.corr()
corrmatrix *= np.tri(*corrmatrix.values.shape, k=-1).T
corrmatrix = corrmatrix.stack().sort_values(ascending = False).reset_index()
corrmatrix.columns = ['Признак 1', 'Признак 2', 'Корреляция']
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
drop_columns = corrmatrix[(corrmatrix['Корреляция'] >= 0.82) + (corrmatrix['Корреляция'] <= -0.7)]['Признак 2']
df.drop(drop_columns, axis=1, inplace=True)
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
其他回答
可以使用matplotlib中的imshow()方法
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.imshow(X.corr(), cmap=plt.cm.Reds, interpolation='nearest')
plt.colorbar()
tick_marks = [i for i in range(len(X.columns))]
plt.xticks(tick_marks, X.columns, rotation='vertical')
plt.yticks(tick_marks, X.columns)
plt.show()
corrmatrix = df.corr()
corrmatrix *= np.tri(*corrmatrix.values.shape, k=-1).T
corrmatrix = corrmatrix.stack().sort_values(ascending = False).reset_index()
corrmatrix.columns = ['Признак 1', 'Признак 2', 'Корреляция']
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
drop_columns = corrmatrix[(corrmatrix['Корреляция'] >= 0.82) + (corrmatrix['Корреляция'] <= -0.7)]['Признак 2']
df.drop(drop_columns, axis=1, inplace=True)
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
形成相关矩阵,在我的情况下,zdf是我需要执行相关矩阵的数据框架。
corrMatrix =zdf.corr()
corrMatrix.to_csv('sm_zscaled_correlation_matrix.csv');
html = corrMatrix.style.background_gradient(cmap='RdBu').set_precision(2).render()
# Writing the output to a html file.
with open('test.html', 'w') as f:
print('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-widthinitial-scale=1.0"><title>Document</title></head><style>table{word-break: break-all;}</style><body>' + html+'</body></html>', file=f)
然后我们可以截屏。或者将HTML转换为图像文件。
除了其他方法,还有对图也很好,它将给出所有情况下的散点图
import pandas as pd
import numpy as np
import seaborn as sns
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
sns.pairplot(df)
如果你的主要目标是可视化相关矩阵,而不是创建一个图形本身,方便的pandas样式选项是一个可行的内置解决方案:
import pandas as pd
import numpy as np
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
corr = df.corr()
corr.style.background_gradient(cmap='coolwarm')
# 'RdBu_r', 'BrBG_r', & PuOr_r are other good diverging colormaps
请注意,这需要在支持呈现HTML的后端中,例如JupyterLab Notebook。
样式
您可以轻松地限制数字精度:
corr.style.background_gradient(cmap='coolwarm').set_precision(2)
如果你更喜欢没有注释的矩阵,也可以把数字都去掉:
corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})
样式文档还包括更高级样式的说明,例如如何更改鼠标指针悬停的单元格的显示。
时间比较
在我的测试中,style.background_gradient()比plt.matshow()快4倍,比sn .heatmap()快120倍,矩阵为10x10。不幸的是,它的伸缩性不如plt.matshow():对于100x100的矩阵,两者需要相同的时间,而对于1000x1000的矩阵,plt.matshow()要快10倍。
储蓄
有几种可能的方法来保存风格化的数据框架:
通过追加render()方法返回HTML,然后将输出写入文件。 通过附加to_excel()方法保存为带有条件格式的.xslx文件。 结合imgkit保存位图 截屏(就像我在这里所做的那样)。
将整个矩阵的颜色归一化(pandas >= 0.24)
通过设置axis=None,现在可以基于整个矩阵计算颜色,而不是每列或每行:
corr.style.background_gradient(cmap='coolwarm', axis=None)
单角热图
由于很多人正在阅读这个答案,我想我应该添加一个技巧,如何只显示相关矩阵的一个角落。我发现这个更容易阅读,因为它删除了多余的信息。
# Fill diagonal and upper half with NaNs
mask = np.zeros_like(corr, dtype=bool)
mask[np.triu_indices_from(mask)] = True
corr[mask] = np.nan
(corr
.style
.background_gradient(cmap='coolwarm', axis=None, vmin=-1, vmax=1)
.highlight_null(null_color='#f1f1f1') # Color NaNs grey
.set_precision(2))
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录