python 学生成绩表,生成数据表并且绘图
在学习python的过程中,老师出了一道题,感觉还不错,就写个博客记录一下:1.已知有50个学生,期末参加5门考试,每一门的权重是(0.3,0.2,0.2,0.2,0.1)1)随机生成学生基本信息(姓名,学号)2)随机生成每个学生的成绩3)计算每个学生的总评成绩4)统计总评成绩中各个分数段的人数,并画出柱状图5)计算每门课的均值与方差,并用折线图显示出来import numpy as npimpo
·
在学习python的过程中,老师出了一道题,感觉还不错,就写个博客记录一下:
1.已知有50个学生,期末参加5门考试,每一门的权重是(0.3,0.2,0.2,0.2,0.1)
1)随机生成学生基本信息(姓名,学号)
2)随机生成每个学生的成绩
3)计算每个学生的总评成绩
4)统计总评成绩中各个分数段的人数,并画出柱状图
5)计算每门课的均值与方差,并用折线图显示出来
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import random as rm
import random
import matplotlib
#成绩生成器
def get(n):
temp = []
for j in range(n):
x = rm.randint(60, 100) # 返回1->100中的任意整数
temp.append(x) # 在数组后面加上相应的元素x
# 建立了一个二维列表 c[[],[],[]....]
return temp
#名字生成器
def random_name(j):
list_Xing = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '张', '李']
list_Ming = ['豫', '章', '故', '郡', '洪', '都', '新', '府', '星', '分', '翼', '轸', '地', '接', '衡', '庐', '襟', '三', '江', '', '而',
'带', '五', '湖', '控', '蛮', '荆', '而', '引', '瓯', '越', '物', '华', '天', '宝', '龙', '光', '射', '牛', '斗', '之',
'墟', '人', '杰', '地', '灵', '徐', '孺', '饯', '子']
list_studentname = []
for i in range(j):
name = random.choice(list_Xing) + random.choice(list_Ming) + random.choice(list_Ming)
list_studentname.append(name)
# 将随机生成的五个姓名生成一个列表list_student
return list_studentname
#柱状图生成器
def map_1(y):
matplotlib.rcParams['font.sans-serif'] = ['YouYuan']
matplotlib.rcParams['axes.unicode_minus'] = False
fig = plt.figure(facecolor='#87CEEB')
label_list = ['60~70', '70~80', '80~90', '90~100'] # 横坐标刻度显示值
num_list1 = y # 纵坐标值1
x = range(len(num_list1))
# 绘制条形图
rects1 = plt.bar(x, height=num_list1, width=0.4, alpha=0.5, color='red', label='学生')
# 设置y轴属性
plt.ylim(0, 50)
plt.ylabel('人数')
# 设置x轴属性
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel("成绩")
plt.title('学生成绩分布图')
plt.legend()
# 显示文本
for rect in rects1:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height + 1, str(height), ha='center', va='bottom')
plt.show()
#折线图生成器
def map_2(X, Y):
x = ['yuwen', 'shuxue', 'yinyu', 'pthon', 'cpp']
y = Y
_y = X
plt.plot(x, y, 'rs-', x, _y, "bo-")
plt.show()
if __name__ == "__main__":
#生成学号
no = []
for i in range(1, 51):
no.append(i)
#使用字典
data = {"name":random_name(50) , "yuwen": get(50), "shuxue": get(50), "yinyu": get(50), "pthon": get(50), "cpp": get(50)}
#使用DataFrame生成一个表
df = pd.DataFrame(data, no)
#定义 列表hole 保存所有学生的总评成绩
hole = []
for i in range(1, 51):
a = df.yuwen[i] * 0.3 + df.shuxue[i] * 0.2 + df.yinyu[i] * 0.2 + df.pthon[i] * 0.2 + df.cpp[i] * 0.1
hole.append(a)
#建一个表 存储总评成绩
data3 = {}
df3 = pd.DataFrame(data3, no)
data2 = {"hole": hole}
df2 = pd.DataFrame(data2, no)
#将两个表合并,并打印
df3 = pd.concat([df, df2], axis=1)
print(df3)
#统计各个分数段(暂定四段)的人数
Y2 = [0, 0, 0, 0]
for i in range(1, 51):
y = df3.hole[i]
if y >= 60 and y <= 70:
Y2[0] += 1
continue
if y > 70 and y <= 80:
Y2[1] += 1
continue
if y > 80 and y <= 90:
Y2[2] += 1
continue
if y > 90 and y <= 100:
Y2[3] += 1
continue
#调用图表生成函数
map_1(Y2)
arr = []
_mean = [] # 平均值
_var = [] # 方差
k = ['yuwen', 'shuxue', 'yinyu', 'pthon', 'cpp']
for j in range(5):
for i in range(1, 51):
arr.append(df3[k[j]][i])#使用arr保存每一列的所有单科成绩
avg = np.mean(arr)#求出该列的平均成绩
var = np.var(arr)#求出该列的方差
_mean.append(avg)#存储五门成绩各自的平均值
_var.append(var)#存储五门成绩各自的方差
#调用图表打印函数
map_2(_mean, _var)
更多推荐
已为社区贡献1条内容
所有评论(0)