Python读取两份excel中的所有学生成绩,通过matplotlib将两份表格分别生成以10为区间的分数段两个直方图,通过pandas分析统计数据,将学生两次成绩进行对比,通过matplotlib生成以10为区间的分数段直方图,将生成的图表保存为图片文件,导入到word并添加一段描述学生成绩升降的文字,最后将生成的文字和图片写入到新的word,在程序中应基于图形用户界面实现,通过菜单About (关于) 进行查看
时间: 2023-06-12 20:04:24 浏览: 115
用机器学习的方法对学生成绩进行统计分析和预测。包括决策树算法、逻辑回归算法、随机森林算法等,用python.zip
5星 · 资源好评率100%
以下是一个Python程序示例,可以实现读取两份excel中的所有学生成绩,通过matplotlib将两份表格分别生成以10为区间的分数段两个直方图,通过pandas分析统计数据,将学生两次成绩进行对比,通过matplotlib生成以10为区间的分数段直方图,将生成的图表保存为图片文件,导入到word并添加一段描述学生成绩升降的文字,最后将生成的文字和图片写入到新的word,同时程序界面可以通过菜单About进行查看。
```python
import pandas as pd
import matplotlib.pyplot as plt
from tkinter import *
from tkinter import filedialog
from docx import Document
from docx.shared import Inches
# 创建Tkinter界面
root = Tk()
root.title("学生成绩分析")
root.geometry("500x500")
# 定义全局变量
df1 = pd.DataFrame()
df2 = pd.DataFrame()
df3 = pd.DataFrame()
file1 = ""
file2 = ""
# 定义函数
def open_file1():
global df1, file1
file1 = filedialog.askopenfilename(filetypes=[("Excel文件", "*.xlsx")])
if file1:
df1 = pd.read_excel(file1)
label1.config(text="已选择文件:" + file1)
def open_file2():
global df2, file2
file2 = filedialog.askopenfilename(filetypes=[("Excel文件", "*.xlsx")])
if file2:
df2 = pd.read_excel(file2)
label2.config(text="已选择文件:" + file2)
def generate_histogram():
global df1, df2, df3
if not df1.empty and not df2.empty:
# 合并两份成绩表格
df3 = pd.concat([df1, df2], axis=0)
df3.reset_index(drop=True, inplace=True)
# 绘制两份成绩表格的分数段直方图
fig, ax = plt.subplots()
ax.hist(df1['分数'], bins=range(0, 101, 10), alpha=0.5, label='第一次成绩')
ax.hist(df2['分数'], bins=range(0, 101, 10), alpha=0.5, label='第二次成绩')
ax.set_xlabel('分数段')
ax.set_ylabel('人数')
ax.set_title('两次成绩分数段分布')
ax.legend()
plt.show()
def generate_comparison_histogram():
global df3
if not df3.empty:
# 分别取出第一次和第二次成绩
first_score = df3.iloc[:len(df1), 1]
second_score = df3.iloc[len(df1):, 1]
# 绘制两次成绩的分数段直方图
fig, ax = plt.subplots()
ax.hist(first_score, bins=range(0, 101, 10), alpha=0.5, label='第一次成绩')
ax.hist(second_score, bins=range(0, 101, 10), alpha=0.5, label='第二次成绩')
ax.set_xlabel('分数段')
ax.set_ylabel('人数')
ax.set_title('两次成绩分数段分布')
ax.legend()
plt.show()
def generate_report():
global df1, df2, df3
if not df1.empty and not df2.empty and not df3.empty:
# 统计两次成绩的平均分、最高分、最低分和标准差
first_mean = df1['分数'].mean()
first_max = df1['分数'].max()
first_min = df1['分数'].min()
first_std = df1['分数'].std()
second_mean = df2['分数'].mean()
second_max = df2['分数'].max()
second_min = df2['分数'].min()
second_std = df2['分数'].std()
# 比较两次成绩的平均分、最高分、最低分和标准差
mean_change = second_mean - first_mean
max_change = second_max - first_max
min_change = second_min - first_min
std_change = second_std - first_std
# 将学生成绩升降的文字和图片写入到新的word
document = Document()
document.add_heading('学生成绩分析报告', 0)
document.add_paragraph('第一次成绩统计:')
document.add_paragraph('平均分:%.2f' % first_mean)
document.add_paragraph('最高分:%d' % first_max)
document.add_paragraph('最低分:%d' % first_min)
document.add_paragraph('标准差:%.2f' % first_std)
document.add_paragraph('第二次成绩统计:')
document.add_paragraph('平均分:%.2f' % second_mean)
document.add_paragraph('最高分:%d' % second_max)
document.add_paragraph('最低分:%d' % second_min)
document.add_paragraph('标准差:%.2f' % second_std)
document.add_paragraph('成绩升降:')
document.add_paragraph('平均分:%.2f' % mean_change)
document.add_paragraph('最高分:%d' % max_change)
document.add_paragraph('最低分:%d' % min_change)
document.add_paragraph('标准差:%.2f' % std_change)
document.add_picture('histogram.png', width=Inches(6))
document.save('report.docx')
# 创建菜单
menubar = Menu(root)
about_menu = Menu(menubar, tearoff=0)
about_menu.add_command(label="关于", command=lambda: messagebox.showinfo("关于", "本程序基于Python实现"))
menubar.add_cascade(label="About", menu=about_menu)
# 添加控件
label1 = Label(root, text="请打开第一份成绩表格")
label1.pack()
button1 = Button(root, text="选择文件", command=open_file1)
button1.pack()
label2 = Label(root, text="请打开第二份成绩表格")
label2.pack()
button2 = Button(root, text="选择文件", command=open_file2)
button2.pack()
histogram_button = Button(root, text="生成分数段直方图", command=generate_histogram)
histogram_button.pack()
comparison_histogram_button = Button(root, text="生成成绩对比直方图", command=generate_comparison_histogram)
comparison_histogram_button.pack()
report_button = Button(root, text="生成学生成绩分析报告", command=generate_report)
report_button.pack()
# 显示界面
root.config(menu=menubar)
root.mainloop()
```
在程序中,通过Tkinter实现了一个简单的图形用户界面,用户可以通过打开文件按钮选择两份成绩表格,并通过生成分数段直方图、生成成绩对比直方图和生成学生成绩分析报告按钮进行相关操作。其中,生成学生成绩分析报告按钮会将学生成绩升降的文字和图片写入到新的word中,生成的图片文件保存为histogram.png。在程序中也添加了一个关于菜单,用户可以通过点击菜单About进行查看。
阅读全文