在python中以更优雅的方式重写代码

给定的达图阿什维利

我想考虑以下代码并尝试以简单的方式重写,代码如下

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
iris_df =pd.DataFrame(iris.data, columns=iris.feature_names)
for class_number in np.unique(iris.target):
    plt.figure(1)
    iris_df['sepal length (cm)'].iloc[np.where(iris.target ==class_number)[0]].hist(bins=30)

我想表明我理解这段代码的作用,首先它加载 iris 数据集并转换为数据帧格式,iris.target 将重复显示数字 0,1,2,因此 unique(iris.target) 将只有三个数字 [0,1 2] 并且 class_number 将在 [0,1,2] 之间变化,首先它将为零,然后是 1,然后是 2,在那之后,显示数字,我们只关注列with 对应于萼片长度,但这一列是按照 0,1,2 分布的,我们想彼此分离并为每个构建直方图,但不知何故写作风格

iloc[np.where(iris.target ==class_number)[0]]

让我困惑,np.where(iris.target==class_number)返回所有索引 where iris.target==class_number(0,1,2),但是呢[0]我没有完全理解这部分,你能帮我吗?

亚历山大

首先,让我们通过将目标附加到数据来以可用的形式获取数据:

iris_df = pd.DataFrame(iris.data, columns=iris.feature_names).assign(target=iris.target)

>>> iris_df.tail()
     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
145                6.7               3.0                5.2               2.3   
146                6.3               2.5                5.0               1.9   
147                6.5               3.0                5.2               2.0   
148                6.2               3.4                5.4               2.3   
149                5.9               3.0                5.1               1.8   

     target  
145       2  
146       2  
147       2  
148       2  
149       2  

现在仅对相关列的数据进行子集化,sepal length (cm)然后target

df = iris_df[['sepal length (cm)', 'target']]

透视数据,使每个目标值都是一个单独的列。

df = df.pivot(columns='target')
>>> df.head()
       sepal length (cm)        
target                 0   1   2
0                    5.1 NaN NaN
1                    4.9 NaN NaN
2                    4.7 NaN NaN
3                    4.6 NaN NaN
4                    5.0 NaN NaN

现在绘制直方图。请注意,您应该在单独的窗口中绘制每一个以获得最佳可视化效果。如果您将它们合二为一,则条形图将按以下方式堆叠:

糟糕的可视化(堆叠直方图)

在此处输入图片说明

完整代码

plt.figure()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names).assign(target=iris.target)
iris_df[['sepal length (cm)', 'target']].pivot(columns='target').hist(
    bins=30, alpha=.5, width=.05, grid=True, sharex=True, sharey=True,
)

plt.tight_layout()

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章