我想考虑以下代码并尝试以简单的方式重写,代码如下
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] 删除。
我来说两句