鱼C论坛

 找回密码
 立即注册
查看: 3392|回复: 1

【新手求助】改进“学生成绩全自动统计程序”

[复制链接]
发表于 2021-2-17 15:20:29 | 显示全部楼层 |阅读模式
10鱼币
这是原来的程序
  1. # coding=utf-8
  2. import pandas as pd
  3. import easygui as g
  4. import sys
  5. import os


  6. #选择原文件路径


  7. def get_file():
  8.     confirm = g.ccbox(msg="程序简介 & 注意事项: \n\n 1.本程序可以根据Excel登分表一键生成九科总分排名以及单科排名。选择或保存文件时,   左上角会有提示,请注意左上角小标题。\n2.本程序设计初衷是为了分担老师们的排名统计工作,未经允许严禁用于商用。\n\n\n      ⚬ 注意事项:登分表内必须有且仅有\n      ‘考号’‘班别’‘姓名’‘语文’‘数学’‘外语’\n      ‘物理’‘历史’‘生物’‘地理’‘政治’‘化学’。\n        但无需按照顺序排列,本程序会自动排序。\n\n\n\n                           准备好后请单击“下一步”",
  9.                       title='学生成绩统计程序', choices=('下一步', '退出'))
  10.     if confirm == True:

  11.         file = g.fileopenbox(msg='', title='请选择登分表Excel文件',
  12.                              default=r'C:\\', filetypes=['*.xlsx'])
  13.         if file == None or file == '.':
  14.             sys.exit()
  15.         else:
  16.             return file
  17.     else:
  18.         sys.exit()


  19. #得到所有科目
  20. def get_subject(data):
  21.     km = ['语文', '数学', '外语', '物理', '化学', '生物', '政治', '历史', '地理']
  22.     all_subject = []
  23.     for subject in data.columns:
  24.         if subject in km:
  25.             all_subject.append(subject)

  26.     return all_subject


  27. #猎取单科数据 ID + 班别 + 姓名 + 本科目的成绩 + 排名
  28. def get_series(kem, orig, savep):

  29.     with pd.ExcelWriter(savep) as writer:
  30.         orig.to_excel(writer, sheet_name='所有科目')

  31.         for i in kem:
  32.             pm = i + '名次'
  33.             df_dk = orig.loc[:, ['班别', '姓名', i, pm]]
  34.             df_dk.sort_values(by=pm, inplace=True)
  35.             df_dk.to_excel(writer, sheet_name=i)


  36. def edit_all(data1):

  37.     for kemu in data1.columns[2:]:
  38.         data1[kemu+'名次'] = data1[kemu].rank(method='min', ascending=False)

  39.     data1['3科总分'] = data1['语文'] + data1['数学'] + data1['外语']
  40.     data1['3科总分名次'] = data1['3科总分'].rank(method='min', ascending=False)

  41.     data1['9科总分'] = data1.loc[:, '语文':'地理'].sum(axis=1)
  42.     data1['9科总分名次'] = data1['9科总分'].rank(method='min', ascending=False)

  43.     data1.sort_values(by="9科总分名次", inplace=True)

  44.     data2 = data1.loc[:, ['班别', '姓名', '语文', '语文名次', '数学', '数学名次',
  45.                           '外语', '外语名次', '物理', '物理名次', '化学', '化学名次',
  46.                           '生物', '生物名次', '政治', '政治名次', '历史', '历史名次',
  47.                           '地理', '地理名次', '3科总分', '3科总分名次', '9科总分', '9科总分名次']]

  48.     return data2


  49. excel_file = get_file()
  50. df1 = pd.read_excel(excel_file, index_col=0)
  51. df2 = edit_all(df1)
  52. allkm = get_subject(df1)
  53. sp = g.filesavebox(msg='请选择保存路径及输入保存文件名(注:默认为“成绩统计表”。不需要写后缀).',
  54.                    title='学生成绩统计程序', default=r'成绩统计表', filetypes=['*.xlsx'])
  55. spp = sp + '.xlsx'
  56. get_series(allkm, df2, spp)
  57. g.msgbox("文件保存成功,感谢您的使用!\n\n\n\n\n\n                         更多功能正在开发中....\n\n\n\n\n                                                           版本号:2020/12/23", '学生成绩统计程序')
复制代码



因为只能识别九科太过于机械,而且功能比较少太过于局限,现在我想改进一下:
1.给出任何科目都能一键生成成绩表,如果给出的科目在一个以上,除了主表外还额外生成这些科目的单科排名sheet。
2.以班为单位,额外生成这些科目的班级平均分排名、总分排名sheet。如:班级物理平均分 班级化学平均分 (给出的科目数)[x]科班级总分
(最好还能改进一下GUI,想生成什么科目的总分或者平均分就生成什么,不行的话就算了)
改进到一半卡壳了,请大佬指教一下,或者帮忙补全,谢谢!
  1. import pandas as pd

  2. #识别登分表中含有的科目
  3. data = pd.read_excel(r'D:\Desktop\登分表.xls')
  4. columns = list(data.columns)
  5. subjects_list = ['语文','数学','英语','日语','外语','物理','化学','地理','生物','政治','历史']
  6. subjects = [i for i in columns if i in subjects_list]

  7. #新增已有科目的单科排名sheet
  8. with pd.ExcelWriter(r'D:\Desktop\成绩统计.xls') as writer:
  9.     data.to_excel(writer, sheet_name='所有科目')
  10.     Personal_Information = columns.index(subjects[1])-1
  11.     for i in subjects:
  12.         rank = i +'单科排名'
  13.         single_subject_ranking = data.loc[:,i]
  14.         single_subject_ranking.sort_values(rank,inplace = True)
  15.         single_subject_ranking.to_excel(writer,sheet = rank)

  16. sequence = []
  17. for i in subjects:
  18.     data[i + '排名'] = data[i].rank(method='min', ascending=False)
  19.     sequence.append(i,i+'排名')
  20. data['三科总分'] = data['语文'] + data['数学'] + data['英语']
  21. data['三科总分排名'] = data['三科总分'].rank(method = 'min',ascending = False)
  22. data[range(subjects) + '科总分'] = data.loc[Personal_Information:].sum(axis=1)
  23. data[range(subjects) + '科总分名次'] = data[range(subjects)].rank(method = 'min',ascending = False)
  24. data.sort_values(by= range(subjects) + "科总分名次", inplace=True)
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-25 15:28:25 From FishC Mobile | 显示全部楼层
看了半天,发现没看懂。新手路过,看大佬操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 12:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表