数据分析作业5

数据分析作业5

练习1

在讲解 Matplotlib 的时候,我们使用以下代码绘制分组条形图。其中讲解到,三根柱子的位置需要同时往左或往右移动时,需要使用到列表推导式。现在使用numpy模块来优化以下代码。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sales = [1000,800,3000]
Q2_sales = [1200,700,2800]

# 柱子的对应索引位置 [0,1,2]
# 设置柱子宽度
width = 0.35
# rects1 = plt.bar(list(range(len(fruits))),Q1_sales,width)
# rects2 = plt.bar(list(range(len(fruits))),Q2_sales,width)

# 蓝黄柱子宽度都为0.35 怎么使蓝色显示左边  黄色显示右边
# 位置左移width/2  位置-width/2    [0-width/2,1-width/2,2-width/2]
po_l = [i-width/2 for i in list(range(len(fruits)))]
plt.bar(po_l,Q1_sales,width,label="Q1")

po_r = [i+width/2 for i in list(range(len(fruits)))]
plt.bar(po_r,Q2_sales,width,label="Q2")

# 设置图例 
plt.legend()

# 数据标签
auto_label(po_l,Q1_sales)
auto_label(po_r,Q2_sales)

plt.xticks(list(range(len(fruits))),fruits)

plt.show()

以numpy模块进行优化:

import matplotlib.pyplot as plt
import numpy as np # 导入numpy模块
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

# 数据标签函数
def auto_label(x_list,y_list):
    for x_i,y_i in zip(x_list,y_list):
        plt.text(x_i,y_i+1,f'{y_i}',ha='center',va='bottom')

# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sales = [1000,800,3000]
Q2_sales = [1200,700,2800]

# 柱子的对应索引位置 [0,1,2]
# 设置柱子宽度
width = 0.35

# 蓝黄柱子宽度都为0.35 怎么使蓝色显示左边  黄色显示右边
# 位置左移width/2  位置-width/2    [0-width/2,1-width/2,2-width/2]
# po_l = [i-width/2 for i in list(range(len(fruits)))]
po_l = np.arange(len(fruits))-width/2
plt.bar(po_l,Q1_sales,width,label="Q1")

# po_r = [i+width/2 for i in list(range(len(fruits)))]
po_r = np.arange(len(fruits))+width/2
plt.bar(po_r,Q2_sales,width,label="Q2")

# 设置图例 
plt.legend()

# 数据标签
auto_label(po_l,Q1_sales)
auto_label(po_r,Q2_sales)

plt.xticks(list(range(len(fruits))),fruits)

plt.show()

输出结果:
水果销售柱状图

练习2

  • 请完成以下基础练习:
    – np.arange(16).reshape(4,4)与2做减法
    – np.arange(16).reshape(4,4)与np.arange(16,32).reshape(4,4)做加法运算
    – np.arange(8).reshape(2,4)与np.arange(4)运算吗?
    – np.arange(8).reshape(2,4)与np.arange(4).reshape(1,4)运算吗?
    – np.arange(8).reshape(2,4)与np.arange(4).reshape(4,1)运算吗?
import numpy as np
arr1 = np.arange(16).reshape(4,4)
print("创建一个4*4数组arr1:\n"+f"{arr1}")
print("arr1与2做减法,结果为:\n"+f"{arr1-2}")

arr2 = np.arange(16).reshape(4,4)
print("创建一个4*4数组arr2:\n"+f"{arr2}")
arr3 = np.arange(16,32).reshape(4,4)
print("创建一个4*4数组arr3:\n"+f"{arr3}")
print("arr2与arr3进行加法运算,结果为:\n"+f"{arr2+arr3}")

arr4 = np.arange(8).reshape(2,4)
print("创建一个2*4数组arr4:\n"+f"{arr4}")
arr5 = np.arange(4)
print("创建一维数组arr5:\n"+f"{arr5}")
print("arr4与arr5进行加法运算,结果为:\n"+f"{arr4+arr5}")

# np.arange(8).reshape(2,4)与np.arange(4).reshape(1,4)运算吗?
arr6 = np.arange(8).reshape(2,4)
print("创建一个2*4数组arr6:\n"+f"{arr6}")
arr7 = np.arange(4).reshape(1,4)
print("创建一个1*4数组arr7:\n"+f"{arr7}")
print("arr6与arr7进行加法运算,结果为:\n"+f"{arr6+arr7}")

# np.arange(8).reshape(2,4)与np.arange(4).reshape(4,1)运算吗?
arr8 = np.arange(8).reshape(2,4)
print("创建一个2*4数组arr8:\n"+f"{arr8}")
arr9 = np.arange(4).reshape(4,1)
print("创建一个4*1数组arr9:\n"+f"{arr9}")
print("arr8与arr9进行加法运算,结果为:\n"+f"{arr8+arr9}")

输出结果:

创建一个4*4数组arr1:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
arr1与2做减法,结果为:
[[-2 -1  0  1]
 [ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
创建一个4*4数组arr2:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
创建一个4*4数组arr3:
[[16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
arr2与arr3进行加法运算,结果为:
[[16 18 20 22]
 [24 26 28 30]
 [32 34 36 38]
 [40 42 44 46]]
创建一个2*4数组arr4:
[[0 1 2 3]
 [4 5 6 7]]
创建一维数组arr5:
[0 1 2 3]
arr4与arr5进行加法运算,结果为:
[[ 0  2  4  6]
 [ 4  6  8 10]]
创建一个2*4数组arr6:
[[0 1 2 3]
 [4 5 6 7]]
创建一个1*4数组arr7:
[[0 1 2 3]]
arr6与arr7进行加法运算,结果为:
[[ 0  2  4  6]
 [ 4  6  8 10]]
创建一个2*4数组arr8:
[[0 1 2 3]
 [4 5 6 7]]
创建一个4*1数组arr9:
[[0]
 [1]
 [2]
 [3]]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-63-2b8e73cde585> in <module>
     28 arr9 = np.arange(4).reshape(4,1)
     29 print("创建一个4*1数组arr9:\n"+f"{arr9}")
---> 30 print("arr8与arr9进行加法运算,结果为:\n"+f"{arr8+arr9}")

ValueError: operands could not be broadcast together with shapes (2,4) (4,1) 

结论:
– 广播机制规则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。但当两个数组的维度完全不同时,则无法进行运算。

练习3

  • 请完成以下基础练习:
    – 构建数组: np.arange(16).reshape(4,4)
    – 选择 第3列
    – 选择 1-3 列
    – 选择 2,4 列
    – 选择 4,7 两个点 将值改为 0
    – 过滤出 <5 的值
import numpy as np
arr = np.arange(16).reshape(4,4)
print("构建4*4数组arr为:\n" +f"{arr}")
# 选择 第3列
print("arr的第3列为:\n" +f"{arr[:,2]}")
# 选择 1-3 列
print("arr的第1-3列为:\n" +f"{arr[:,:3]}")
# 选择 2,4 列
print("选择arr中的第2,4列为:\n" +f"{arr[:,1::2]}")
# 选择 4,7 两个点 将值改为 0
arr[(arr==4)|(arr==7)] = 0
print("arr的 4,7 两个点,并将值改为 0:\n" +f"{arr}")
# 过滤出 <5 的值
arr1 = arr[arr<5]
print("arr中小于5的值:\n" +f"{arr1}")

输出结果:

构建4*4数组arr为:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
arr的第3列为:
[ 2  6 10 14]
arr的第1-3列为:
[[ 0  1  2]
 [ 4  5  6]
 [ 8  9 10]
 [12 13 14]]
选择arr中的第2,4列为:
[[ 1  3]
 [ 5  7]
 [ 9 11]
 [13 15]]
arr的 4,7 两个点,并将值改为 0:
[[ 0  1  2  3]
 [ 0  5  6  0]
 [ 8  9 10 11]
 [12 13 14 15]]
arr中小于5的值:
[0 1 2 3 0 0]

练习4

  • 读取scores.csv 数据,并且完成以下练习:
    – 筛选出 成绩 大于60 并且 小于80 的数据
    – 筛选出 成绩 大于80 并且 小于90 的数据
    – 筛选出 成绩 大于90 的数据
import numpy as np
score_data = np.loadtxt("scores.csv",delimiter=",",skiprows=1)
print("读取scores.csv 的数据为:\n" +f"{score_data}")
score_data1 = score_data[(score_data>60)&(score_data<80)]
print("其中成绩大于60并且小于80的数据为:\n" +f"{score_data1}")
score_data2 = score_data[(score_data>80)&(score_data<90)]
print("其中成绩大于80并且小于90的数据为:\n" +f"{score_data2}")
score_data3 = score_data[score_data>90]
print("其中成绩大于90的数据为:\n" +f"{score_data3}")

输出结果:

读取scores.csv 的数据为:
[[52. 83.]
 [27. 73.]
 [14. 42.]
 [82. 34.]
 [93. 52.]
 [89. 90.]
 [62. 49.]
 [23. 12.]
 [98.  0.]
 [88. 26.]
 [73.  8.]
 [67. 29.]
 [87. 26.]
 [65. 48.]
 [99. 38.]
 [23. 80.]
 [41. 50.]
 [38. 12.]
 [30. 79.]
 [57. 69.]
 [12. 41.]
 [81.  6.]
 [96. 21.]
 [58. 72.]
 [43. 73.]
 [52. 13.]
 [36. 33.]
 [48. 93.]
 [19. 46.]
 [25. 77.]
 [10. 29.]
 [20. 71.]
 [74. 77.]
 [37. 44.]
 [30. 36.]
 [22. 48.]
 [22. 67.]
 [96. 54.]
 [38. 53.]
 [95. 13.]]
其中成绩大于60并且小于80的数据为:
[73. 62. 73. 67. 65. 79. 69. 72. 73. 77. 71. 74. 77. 67.]
其中成绩大于80并且小于90的数据为:
[83. 82. 89. 88. 87. 81.]
其中成绩大于90的数据为:
[93. 98. 99. 96. 93. 96. 95.]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值