L oop над столбцами в кадре данных для создания гистограмм по категориям - PullRequest
1 голос
/ 26 февраля 2020

Я хотел бы исследовать распределение частот всех функций (столбцов) в моей df на основе переменной результата (целевой столбец). В поисках решений я нашел этот прекрасный фрагмент из здесь , который содержит oop над функциями и генерирует гистограммы для объектов в наборе данных рака из Scikit-learn.

import numpy as np
import matplotlib.pyplot as plt 
# from matplotlib.pyplot import matplotlib
fig,axes =plt.subplots(10,3, figsize=(12, 9)) # 3 columns each containing 10 figures, total 30 features
malignant=cancer.data[cancer.target==0] # define malignant
benign=cancer.data[cancer.target==1] # define benign
ax=axes.ravel()# flat axes with numpy ravel
for i in range(30):
  _,bins=np.histogram(cancer.data[:,i],bins=40)
  ax[i].hist(malignant[:,i],bins=bins,color='r',alpha=.5)
  ax[i].hist(benign[:,i],bins=bins,color='g',alpha=0.3)
  ax[i].set_title(cancer.feature_names[i],fontsize=9)
  ax[i].axes.get_xaxis().set_visible(False) # the x-axis co-ordinates are not so useful, as we just want to look how well separated the histograms are
  ax[i].set_yticks(())
ax[0].legend(['malignant','benign'],loc='best',fontsize=8)
plt.tight_layout()# let's make good plots
plt.show() 

Frequency distribution of features by class

Предполагая, что у меня есть df со всеми функциями и целевой переменной, организованной по последовательным столбцам, как я смогу l oop по моим столбцам воспроизводить гистограммы. Одним из решений, которое я рассмотрел, является groupby метод.

df.groupby("class").col01.plot(kind='kde', ax=axs[1]) 

Любые идеи очень ценятся!

1 Ответ

1 голос
/ 27 февраля 2020

На самом деле вы можете использовать sns.FacetGrid для этого:

# Random data:
np.random.seed(1)
df = pd.DataFrame(np.random.uniform(0,1,(100,6)), columns=list('ABCDEF'))
df['class'] = np.random.choice([0,1], p=[0.3,0.7], size=len(df))

# plot
g = sns.FacetGrid(df.melt(id_vars='class'), 
                  col='variable', 
                  hue='class',
                  col_wrap=3)                # change this to your liking
g = g.map(sns.kdeplot, "value", alpha=0.5)

Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...