Heatmaps
en langage python
L'essentiel de cette page !
On peut visualiser facilement une dataframe pandas ou une array avec python.
J'ai développé une fonction qui permet de facilement le faire (sans préciser le format), en centrant-réduisant automatiquement les données et en précisant quelle variable imposé (optionnel) pour trier les données (code ci-dessous).
Sinon, des exemples simples apparaissent plus bas dans cette page, permettant notamment de clusteriser.
Exemple d'utilisation de ma fonction heatmap (qui marche aussi sur les arrays).
import seaborn as sns
iris = sns.load_dataset("iris")
heatmap(iris, y = iris.species, transpose = True) # Afficher y trié selon species
from numpy.random import normal as normal
mym = np.round(normal(10,2,12**2).reshape(24,6),0)
heatmap(mym, 4 , cmap="seismic") # Afficher la matrice en triant selon la colonne 5
Fonction heatmap() à copier-coller - Cliquer sur ce titre pour dérouler le code
#######################################
# heatmap (pour dataframe pandas & arrays)
# version 11/11/2021
#######################################
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
def heatmap(x=None,y=[],transpose=False,cmap="viridis"):
x_temp = x.copy()
if isinstance(x_temp, pd.DataFrame)==True : # procédure pandas
# Numériser les variables non numériques
ind_num = np.isin(x_temp.dtypes,['int16','int32','int64','float64','float16','float32'])
ind_nonum = np.logical_not(ind_num)
x.iloc[:,ind_nonum]= x_temp.iloc[:,ind_nonum].astype('category')
ind_nonum = np.where(ind_nonum==True)
for col in ind_nonum :
LE = LabelEncoder()
x_temp.iloc[:,col] = LE.fit_transform(x_temp.iloc[:,col])
x_temp.iloc[:,col] = x_temp.iloc[:,col].astype('float64')
x_temp = x_temp.sub(x_temp.mean())
x_temp = x_temp.div(x_temp.std())
# Trier si y != None
if len(y) > 0 : # y ici doit être une série pandas
ordre = sorted(range(len(y)), key=lambda k: y[k])
x_temp = x_temp.iloc[ordre,:]
if (transpose==True) :
x_temp = x_temp.T
sns.set()
sns.heatmap(x_temp,cmap=cmap)
plt.show()
elif isinstance(x, (np.ndarray, np.generic))==True :
print("array")# procédure array
scaler = StandardScaler()
scaler.fit(x)
x_temp=scaler.transform(x)
if len([y])>0 : # y ici doit être un numéro de colonne
ordre = sorted(range(x.shape[0]), key=lambda k: x_temp[:,y][k])
print(ordre)
x_temp = x_temp[ordre,:]
if (transpose==True) :
x_temp = x_temp.transpose()
sns.set()
sns.heatmap(x_temp,cmap=cmap)
plt.show()
else :
sys.exit('Erreur! x ni pandas ni array')
1- Visualiser les données d'une data.frame pandas facilement en mode heatmap avec seaborn
import seaborn as sns
# Charger le jeu de données iris
iris = sns.load_dataset('iris')
print(iris)
# Suppression de la colonne contenant les catégories
iris2 = iris.iloc[:,0:4]
# Affichage de la heatmap
from matplotlib import pyplot as plt
sns.heatmap(iris2)
plt.show()
2- Centrer-Réduire les données avant affichage avec la fonction scale() de sklearn.preprocessing
from sklearn.preprocessing import scale
iris3 = scale(iris2)
from matplotlib import pyplot as plt
sns.heatmap(iris3)
plt.show()
Cette image diffère de celle du dessus, cette fois-ci les données de chaque variable ont été centrées et réduites.