数据分析与可视化 实践基础练习三 (NumPy)

一、实训要求

实训:葡萄酒品质数据NumPy基础分析

本次案例使用葡萄酒品质数据,该数据集包含1599种红葡萄酒的各种信息,如酒的固定酸度、挥发性酸度和pH值等测量值,也包括一个酒的品质得分,该得分是至少三类口味测试者给该款酒打分的平均值。该数据来源于公开数据库UCI,更多详细信息可以查看 https://archive.ics.uci.edu/ml/datasets/Wine+Quality

数据集下载,DataSet

数据说明:

img-202304011237728


二、练习题目

请完成以下操作:

1、提取第一种葡萄酒的所有数据;

2、将葡萄酒数据降为一维数据;

3、将降维后的数组重新恢复成以前的形状;

4、我们计划引入一种新的葡萄酒品质打分方法,同时保留原来的品质得分,所以需要添加一列新值在原始数组后,初始值全为0;

5、我们认为葡萄酒数据中的品质得分普遍偏低,打算将所有葡萄酒的品质得分加10;

6、我们想要选择最大化酒精含量和品质的葡萄酒(我们想喝醉,但我们想喝好酒),需要计算各葡萄酒酒精度数乘以品质得分的值;

7、计算品质得分数据的标准差;

8、哪些葡萄酒的酒精度数高于10 ,并统计其个数。


三、题解

1
2
3
4
5
6
7
# 基础实训3:葡萄酒品质数据NumPy基础分析

# 0.导入数据
import numpy as np # numpy主要用于对多维数组进行计算

wines = np.loadtxt("./winequality-red.csv", delimiter = ";", skiprows = 1) # 原数据集第1行是字符串,读取数据时要跳过1行(skiprows=1)
wines # 输出
1
2
3
4
5
6
7
array([[ 7.4  ,  0.7  ,  0.   , ...,  0.56 ,  9.4  ,  5.   ],
[ 7.8 , 0.88 , 0. , ..., 0.68 , 9.8 , 5. ],
[ 7.8 , 0.76 , 0.04 , ..., 0.65 , 9.8 , 5. ],
...,
[ 6.3 , 0.51 , 0.13 , ..., 0.75 , 11. , 6. ],
[ 5.9 , 0.645, 0.12 , ..., 0.71 , 10.2 , 5. ],
[ 6. , 0.31 , 0.47 , ..., 0.66 , 11. , 6. ]])

1
2
3
# 1、提取第一种葡萄酒的所有数据;

wines[0] # 输出第一行
1
2
array([ 7.4   ,  0.7   ,  0.    ,  1.9   ,  0.076 , 11.    , 34.    ,
0.9978, 3.51 , 0.56 , 9.4 , 5. ])

1
2
3
4
# 2、将葡萄酒数据降为一维数据;

# 方法一
wines.flatten() # flatten()函数只能适用于numpy对象, 返回一个折叠成一维的数组且原数组不变。
1
array([ 7.4 ,  0.7 ,  0.  , ...,  0.66, 11.  ,  6.  ])

1
wines.shape
1
(1599, 12)

1
2
# 方法二
wines.reshape(1, 1599*12) # 获取数组的尺寸后,用reshape()重塑为1行n列
1
array([[ 7.4 ,  0.7 ,  0.  , ...,  0.66, 11.  ,  6.  ]])

1
2
3
# 3、将降维后的数组重新恢复成以前的形状;

wines.reshape(1599,12) # 还原数组尺寸
1
2
3
4
5
6
7
array([[ 7.4  ,  0.7  ,  0.   , ...,  0.56 ,  9.4  ,  5.   ],
[ 7.8 , 0.88 , 0. , ..., 0.68 , 9.8 , 5. ],
[ 7.8 , 0.76 , 0.04 , ..., 0.65 , 9.8 , 5. ],
...,
[ 6.3 , 0.51 , 0.13 , ..., 0.75 , 11. , 6. ],
[ 5.9 , 0.645, 0.12 , ..., 0.71 , 10.2 , 5. ],
[ 6. , 0.31 , 0.47 , ..., 0.66 , 11. , 6. ]])

1
2
3
4
5
# 4、我们计划引入一种新的葡萄酒品质打分方法,同时保留原来的品质得分,所以需要添加一列新值在原始数组后,初始值全为0;

new_col = np.zeros((1599)) # 相当于初始化一列全0
wines = np.insert(wines, 12, new_col, axis = 1) # 在最后一列位置引入新列(轴向,0:行,1:列)
wines
1
2
3
4
5
6
7
array([[ 7.4  ,  0.7  ,  0.   , ...,  9.4  ,  5.   ,  0.   ],
[ 7.8 , 0.88 , 0. , ..., 9.8 , 5. , 0. ],
[ 7.8 , 0.76 , 0.04 , ..., 9.8 , 5. , 0. ],
...,
[ 6.3 , 0.51 , 0.13 , ..., 11. , 6. , 0. ],
[ 5.9 , 0.645, 0.12 , ..., 10.2 , 5. , 0. ],
[ 6. , 0.31 , 0.47 , ..., 11. , 6. , 0. ]])

1
2
3
4
# 5、我们认为葡萄酒数据中的品质得分普遍偏低,打算将所有葡萄酒的品质得分加10;

wines[:, -2] = wines[:, -2] + 10 # 将倒2列的值更新为加10后的值
wines
1
2
3
4
5
6
7
array([[ 7.4  ,  0.7  ,  0.   , ...,  9.4  , 15.   ,  0.   ],
[ 7.8 , 0.88 , 0. , ..., 9.8 , 15. , 0. ],
[ 7.8 , 0.76 , 0.04 , ..., 9.8 , 15. , 0. ],
...,
[ 6.3 , 0.51 , 0.13 , ..., 11. , 16. , 0. ],
[ 5.9 , 0.645, 0.12 , ..., 10.2 , 15. , 0. ],
[ 6. , 0.31 , 0.47 , ..., 11. , 16. , 0. ]])

1
2
3
4
5
# 6、我们想要选择最大化酒精含量和品质的葡萄酒(我们想喝醉,但我们想喝好酒),需要计算各葡萄酒酒精度数乘以品质得分的值。

a = wines[:, -3] * wines[:, -2] # 倒3列时酒精度数,倒2列是品质得分相乘即可
print(a)
np.max(a) #再利用numpy求最大值即可
1
2
3
[141. 147. 147. ... 176. 153. 176.]

252.0

1
2
3
# 7、计算品质得分数据的标准差。

np.std(wines[:, -2]) # 计算品质得分的标准差
1
0.8073168769639513

1
2
3
# 8、哪些葡萄酒的酒精度数高于10 ,并统计其个数。

sum(wines[:, -3] > 10) # sum会计算为True的数量
1
852

四、参考资料

实训数据集(DataSet)

np.loadtxt()的详细用法

np.insert的用法