五、学生成绩统计可视化
学生成绩统计可视化
使用Pandas读取准备好的学生成绩表,计算每个学生的最终成绩
最终成绩是平时成绩的百分之三十加上考试成绩的百分之七十
判断是否及格(60),并将最终成绩和及格率填到表格里,并保存
然后使用 Matplotlib 进行显示最终成绩和及格率
我的方法:
"""
使用 Pandas 读取准备好的学生成绩表,计算每个学生的最终成绩 -- 最终成绩是平时成绩的百分之三十加上考试成绩的百分之七十
判断是否及格(60),并将最终成绩和及格率填到表格里,并保存
然后使用 `Matplotlib` 进行显示最终成绩和及格率
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_excel("source.xlsx")
# 填充缺失值 -- 原地修改
data.fillna(0, inplace=True)
# 获取成绩(平时,考试)
score = data.get(["attendance","exam"])
# 计算最终成绩
def fin_score(s):
return s["attendance"] * 0.3 + s["exam"] * 0.7
grades = score.apply(fin_score, axis=1)
grades.name = "grades"
# 将最终成绩加入数据
data["grades"] = grades
# 判断是否及格
def is_pass(s):
if s["grades"] >= 60:
return "yes"
else:
return "no"
result = data.apply(is_pass, axis=1)
result.name = "pass"
# 将及格率加入数据
data["pass"] = result
# 将最终成绩和及格率写入表格
data.to_excel("my_source.xlsx")
print("写入成功")
# ========== 绘制最终成绩分布图 ==========
# 创建区间分布,用于计算该区间有多少人 -- [ 0 10 20 30 40 50 60 70 80 90 100]
bins = np.arange(0,101,10)
# 计算每个区间的学生人数
hist, bin_edges = np.histogram(data["grades"], bins=bins)
# 创建一个新的图形窗口(画板)
fig = plt.figure()
# 计算条形图宽度
bin_width = bin_edges[1]-bin_edges[0]
# 绘制条形图
plt.bar(bin_edges[:-1], hist, # 横坐标(区间),纵坐标(频数)
width=bin_width, # 条形的宽度
align='edge', # 条形与x位置的对齐方式
edgecolor='black', # 条形边缘的颜色
)
# 添加人数标签
for i in range(len(hist)):
if hist[i]: # 如果有,则添加文本
x = bin_edges[i] + bin_width / 2 # 中间轴
y = hist[i]+0.2
plt.text(x, y, str(hist[i]), horizontalalignment='center')
# 设置图表的标题和坐标轴标签
plt.title("grades")
plt.xlabel("score")
plt.ylabel("number")
# 显示图像
plt.show(block=False)
# ========== 绘制及格率饼图 ==========
# 创建一个新的图形窗口(画板)
fig = plt.figure()
# 计算频率 -- yes、no
pass_count = data["pass"].value_counts()
print(pass_count)
# 绘制饼图,使用 **kwargs 定制扇形
plt.pie(pass_count, # 饼图中每个扇形的尺寸
labels=pass_count.index, # 用于指定每个扇形的标签 - 将 Pandas 数据对象 pass_count 的索引(index)作为 X 轴刻度标签
autopct='%1.1f%%', # 显示百分比格式
)
# 设置饼图的标题
plt.title('Distribution of Passing Status')
# 显示饼图
plt.show()
老师的方法:
import numpy as np # 导入NumPy库,用于数学计算
import pandas as pd # 导入Pandas库,用于数据处理
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘制图表
# 从Excel文件中读取数据到DataFrame
df = pd.read_excel('./source.xlsx')
# 使用fillna方法将DataFrame中的缺失值替换为0
df = df.fillna(0)
# 从DataFrame中提取考试分数列的值
exam_data = df['exam'].values
# 从DataFrame中提取出勤分数列的值
attendance_data = df['attendance'].values
# 使用NumPy的round函数计算最终成绩,考试分数占70%,出勤分数占30%
finally_data = np.round(exam_data * 0.7 + attendance_data * 0.3)
# 将计算得到的最终成绩添加到DataFrame的新列'finally'中
df['finally'] = finally_data
# 使用apply函数根据最终成绩判断是否通过(60分及以上),并创建新列'pass'
df['pass'] = df['finally'].apply(lambda x: 'yes' if x >= 60 else 'no')
# 设置直方图的区间边界,从0到110,步长为10
bins = np.arange(0, 111, 10)
# 使用np.histogram函数计算每个区间的学生人数
hist, bin_edges = np.histogram(df['finally'], bins=bins)
# 创建一个图表实例
fig = plt.figure()
# 计算条形图的宽度
bar_width = (bin_edges[1] - bin_edges[0])
# 绘制条形图,x轴是分数区间,y轴是学生人数
plt.bar(bin_edges[:-1], hist, width=bar_width, align='edge')
# 在每个条形图上添加文本,显示该区间内的学生人数
for i in range(len(hist)):
if hist[i]: # 如果该区间有学生,则添加文本
plt.text(bin_edges[i] + bar_width / 2, hist[i] + 0.1, str(hist[i]),
ha='center')
# 设置图表的标题和坐标轴标签
plt.title('finally')
plt.xlabel('score')
plt.ylabel('number')
# 设置x轴的刻度,显示分数区间的边界
plt.xticks(bin_edges[:-1])
# 显示条形图
plt.show()
# 创建一个新的图表实例
fig = plt.figure()
# 使用value_counts方法统计通过和未通过的学生数量
pass_count = df['pass'].value_counts()
# 绘制饼图,显示通过和未通过的比例
plt.pie(pass_count, labels=pass_count.index, autopct='%1.1f%%')
# 设置饼图的标题
plt.title('Distribution of Passing Status')
# 显示饼图
plt.show()
本文来自博客园,作者:桑年,转载请注明原文链接:https://www.cnblogs.com/clover-1105/p/23522338

浙公网安备 33010602011771号