五、学生成绩统计可视化

学生成绩统计可视化

使用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()
posted @ 2026-11-02 14:39  桑年  阅读(5)  评论(0)    收藏  举报