使用Python程序计算HPU综合评定积分表中的课程成绩分,pandas DataFrame

使用Python程序计算HPU综合评定积分表中的课程成绩分

程序功能

课程成绩分X1计算公式如下:
课程成绩分X1计算方法
在这里插入图片描述

本程序已经打包为exe文件,可以较方便的计算HPU综合评定积分表中的课程成绩分(X1)

使用说明

前期准备:需要下载本程序exe文件,有学院发的成绩单
使用方法:
1.新建一个空的Excel表格(.xlsx文件),命名为“班级成绩单.xlsx”
2.将专业成绩单中自己班级的成绩复制到“班级成绩单.xlsx”的sheet1页
3.进入HPU综合教务系统查看我的课表,
将对应两学期的课程清单复制到“班级成绩单.xlsx”的sheet2页,
粘贴的时候选择“匹配目标格式”,
删除除课程属性、学分、课程名称外的其他列
按照课程名称排序
4.保存“班级成绩单.xlsx”文件,然后关闭该文件
5.运行下载好的exe文件,稍等片刻
6.根据提示在弹出的界面中选择“班级成绩单.xlsx”表格
7.根据提示可能需要手动输入部分课程对应的学分数
8.听到或看到 “Successful Done!”即处理完成
9.在“班级成绩单.xlsx”所在的文件夹中可看到“班级成绩单–output.xlsx”文件,计算结果保存在该文件的最后几列

注意事项

注:因为没有大一大二学年的成绩单,暂时没有添加处理体育课的功能,暂不适合大一大二学年综合评定使用,如果可以提供相应的成绩单可以添加该功能
注:如有同学课程缓考,需要在第2步粘贴成绩后,手动将该同学该成绩所在单元格清空(右键点击该单元格 选择 清除内容或选中该单元格点击键盘上的delete

程序源码

源码GitHub地址:https://github.com/yanconggit/AutoCalculaterSchoolReport.git

exe文件及使用说明:链接: https://pan.baidu.com/s/1UxOYykOXFVNEAb96bQdRCg?pwd=73bj 提取码: 73bj 复制这段内容后打开百度网盘手机App,操作更方便哦

初版代码如下:

import pandas as pd
import numpy as np
import math
import os
import tkinter.filedialog
import pyttsx3


##### 读取所学的主要课程和对应的学分数
# 获取文件
print('提示:请选择您处理后的成绩单,注:输出默认保存到相同路径\n')
#使用TK GUI选择成绩单文件
file_path = tkinter.filedialog.askopenfilename(title='请选择您处理过的成绩单', filetypes=[('所有文件', '.*'), ('xlsx文件', '.xlsx'), ('xls文件', '.xls')])
file_name2 = os.path.split(os.path.splitext(file_path)[0]) # 获取成绩单的文件名
outputfile1 = os.path.dirname(os.path.abspath(file_path))  # 获取成绩单所在路径的父路径
outputfile_path = outputfile1 + "\\" + file_name2[1] + "--output.xlsx" # 得出输出文件的路径
courselist = pd.read_excel(file_path,sheet_name = "Sheet2",usecols="A:C") #读取所学的主要课程和对应的学分数
# 将课程和对应的学分转换位字典 方便快速查找
cs1 = courselist.set_index(['课程名称'])['学分'].to_dict()
# 将课程和对应的课程属性转换位字典 方便快速查找
cs2 = courselist.set_index(['课程名称'])['课程属性'].to_dict()

###### 读取成绩单
schoolreport = pd.read_excel(file_path,sheet_name = "Sheet1") # 将Sheet1中的原始成绩读入
# 查看主要课程学分列表全不全
a = 8
while schoolreport.columns[a] != "课程、学分、成绩": # 判断所有主要课程名称是否有对应的学分
    if cs1.setdefault(schoolreport.columns[a]) == None:
        print("sheet2页中无\"",schoolreport.columns[a],"\"对应的学分数,请手动输入(每次都要输入)或者在成绩单sheet2页补充(一劳永逸)")
        print("请输出上述课程对应的学分数,输入完毕后按回车键结束")
        cs1[schoolreport.columns[a]] = float(input())
    a += 1

# 新添加四列用来记录结果
schoolreport['所学总学分数(分母)'] = '' 
schoolreport['所修课程成绩*该课程学分(分子)'] = ''
schoolreport['课程成绩分'] = ''
schoolreport['必修课最低一门成绩'] = ''
number_addcolumn = 4

# 将等级制的等级转换为对应的分数
schoolreport.replace(['良好','85'])
for row in range(0,schoolreport.shape[0]):
    for col in range(8,schoolreport.shape[1]-number_addcolumn):
        content = schoolreport.loc[row][col]
        if not content is np.nan:
            if schoolreport.loc[row][col] == "优秀":
                schoolreport.iat[row,col] = 95
            elif schoolreport.loc[row][col] == "良好":
                schoolreport.iat[row,col] = 85
            elif schoolreport.loc[row][col] == "中等":
                schoolreport.iat[row,col] = 75
            elif schoolreport.loc[row][col] == "及格":
                schoolreport.iat[row,col] = 65
            elif schoolreport.loc[row][col] == "不及格":
                schoolreport.iat[row,col] = 0

degree2score = {'优秀 ':95,'良好 ':85,'中等 ':75,'及格 ':65,'不及格 ':0}

###### 计算课程成绩分、所学总学分、必修课最低分
# for循环一次一行 即一位同学一位同学的计算
for i in range(0,schoolreport.shape[0]):
    a = 8  # 从第八列开始才是成绩 注:序号列是第 0 列
    sumscore = 0 # 用来存放累加的值
    sumcredit = 0
    minscore = 101
    while schoolreport.columns[a] != "课程、学分、成绩": # 先将主要课程计算完毕
        if not math.isnan(schoolreport.loc[i][a]):  # 计算非空单元格的成绩,有成绩就表示修了这门课
            if cs2.get(schoolreport.columns[a]) == "必修":
                minscore = min(minscore,schoolreport.loc[i][a])
            sumscore += (schoolreport.loc[i][a] * cs1.get(schoolreport.columns[a])) # 累加成绩与学分的乘积
            sumcredit += cs1.get(schoolreport.columns[a]) # 累加所学课程学分数
            a = a + 1 
            if a >= schoolreport.shape[1]-number_addcolumn: # 越界检查
                break
        else: # 单元格为空表示学生没有修这门课
            a = a + 1
            if a >= schoolreport.shape[1]-number_addcolumn:
                break
            continue
    while True: # 计算单列的课程成绩 并不是所有学生都有单列课程(班里没几个同学学的课才会单列为 “课程、学分、成绩”)
        if schoolreport.loc[i][a] is not np.nan: # 判断是否有单列课程成绩
            temp1=schoolreport.loc[i][a].split(',')  # 提取单列课程的
            if degree2score.get(temp1[2],101) != 101 :
                sumscore += float(temp1[1]) * degree2score.get(temp1[2])
            else:
                sumscore += float(temp1[1]) * float(temp1[2]) 
            sumcredit += float(temp1[1])
            a += 1;
            if a >= schoolreport.shape[1]-number_addcolumn:
                break
        else:
            break
##### 保存结果
    schoolreport.iat[i,schoolreport.shape[1]-number_addcolumn] = sumcredit 
    schoolreport.iat[i,schoolreport.shape[1]-number_addcolumn+1] = sumscore
    schoolreport.iat[i,schoolreport.shape[1]-number_addcolumn+2] = sumscore / sumcredit
    schoolreport.iat[i,schoolreport.shape[1]-number_addcolumn+3] = minscore

schoolreport.to_excel(outputfile_path,sheet_name = '成绩单',index = False) # 转存为Excel表格
print('Successful Done!') # 操作成功提示
pyttsx3.speak("Successful Done!")

视频参考

B站视频演示地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w烟囱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值