前几天终于调休了,有时间把几个月前,几个不认识的,兄弟,打电话提出的成绩评定问题给解决了,刚做完,又开始加班,不过先把文章上线再说,多谢大家点赞支持!虽然离开PLA一年多了,但一直怀念那些拔草的岁月!O(∩_∩)O哈哈~
使用Python3的numpy,pandas两个库完成,环境是Anaconda3-2021.05-python3.8-Windows-x86_64,强烈安利初学Python的同志安装Anaconda,Anaconda对于python初学者而言及其友好,相比单独安装python主程序,选择Anaconda可以帮助省去很多麻烦。
Anaconda里已经添加了许多常用的功能包,同时Anaconda还附带捆绑了两个非常好用的交互式代码编辑器(Spyder、Jupyter notebook),我就是使用Jupyter notebook完成的此代码开发,对数据分析工作特别友好,因为可以分块执行,同时分块显示结果,非常方便进行上下数据比对。安装方法在CSDN里有很多,基本是傻瓜式的,链接如下。 内网电脑适用的Python环境安装包Anaconda
一、我们要解决的问题
1.次要问题:专项课目
专项课目成绩分为“合格”、“不合格”,只要有一项专项课目不合格,体能综合评定为不及格。专项课目全部合格,体能综合评定等于通用课目评定。
2.主要问题:个人年度军事训练成绩评定
①优秀:所有训练课目成绩均为良好以上且优秀率不低于50%,或者均为及格以且优秀率不低于70%; ②良好:所有训练课目成绩均为及格以上且优良率不低于50%; ③及格:80%以上的训练课目成绩为及格,或者50%以上的训练课目成绩为优秀; ④不及格:达不到及格标准。 本项目中,体能综合评定,加上其他课目共7项课目,按照以上标准,进行计算,得出总评为优秀、良好、及格、不及格。
二、解题思路
使用pandas将原始Excel表的相关内容读入Python,存为DataFrame数据框格式,再使用apply函数调用另外的函数,设计算法,对某列进行赋值。
三、项目实现
1.导入库
import numpy as np
import pandas as pd
2.每一段代码要点击“运行”按钮,单独运行,下面的Out就是输出。选择Excel表中有用的列导入,如要增加或删减项目,要从这里开始修改。
df=pd.read_excel("./通用训练课目考核成绩计算.xlsx", sheet_name="输入",usecols="A,B,V,W,Y,AA,AC,AE,AG,AI,AK,AM,AO,AR")
df
3.因为表头有无用数据,所以要选择有用的行,从7行开始,并重新命名列名,方便查看数据。这里要仔细核对顺序,不能命名错误。
df1=df.iloc[7:]
df1.columns=['序号', '姓名', '通用课目评定', '浪木组合',
'双杠3', '跳绳', '体能综合评定', '手枪射击',
'通指装备操作', '专业课目1', '专业课目2', '步枪射击',
'航空影像标图', '总评']
df1
4.专项课目成绩分为“合格”、“不合格”,只要有一项专项课目不合格,体能综合评定为不及格。专项课目全部合格,体能综合评定等于通用课目评定。
apply函数调用stamina函数,3项专项课目均==‘合格’,return 通用课目评定的成绩,只要有一项专项课目不合格,体能综合评定return ‘不及格’。如果某项没有数据,是空的,则返回空值,并打印提示语。
'''体能综合评定'''
def stamina(x,col1,col2,col3,col4):
if x[col1]=='合格'and x[col2]=='合格' and x[col3]=='合格':
return x[col4]
if x[col1]=='不合格' or x[col2]=='不合格' or x[col3]=='不合格':
return '不及格'
else:
print('体能综合评定有空,是因为某数据为空或者输入有误')
return np.nan
df1['体能综合评定']=df1.apply(stamina,axis=1,col1 ='浪木组合',col2 ='双杠3',col3 ='跳绳',col4='通用课目评定')
df1
5.最后总评。 ①优秀:所有训练课目成绩均为良好以上且优秀率不低于50%,或者均为及格以且优秀率不低于70%; ②良好:所有训练课目成绩均为及格以上且优良率不低于50%; ③及格:80%以上的训练课目成绩为及格,或者50%以上的训练课目成绩为优秀; ④不及格:达不到及格标准。 用L.count()方法统计L列表中某种成绩的数量,除以总课目数N,得到比率,有一项为空则返回空值,再判断及格,逐级提高标准判断良好、优秀,最后else的是不及格,这种算法保证全包含,没有遗漏或交叉错误。逐行运算,批量解决问题!
'''总评'''
def overall_appraisal(x,col1,col2,col3,col4,col5,col6,col7):
L=[x[col1],x[col2],x[col3],x[col4],x[col5],x[col6],x[col7]]
N=7
appraisal=np.nan
if L.count(np.nan)>0:
print('有一人科目没有成绩')
return appraisal
elif L.count('不及格')/N<0.2 or L.count('优秀')/N>=0.5:
appraisal= '及格'
if L.count('不及格')==0 and (L.count('优秀')+L.count('良好'))/N>=0.5:
appraisal= '良好'
if (L.count('不及格')==0 and L.count('及格')==0 and L.count('优秀')/N>=0.5)\
or (L.count('不及格')==0 and L.count('优秀')/N>=0.7):
appraisal= '优秀'
else :
appraisal= '不及格'
return appraisal
df2=df1
df2['总评']=df2.apply(overall_appraisal,axis=1,col1 ='体能综合评定',col2 ='手枪射击',col3 ='通指装备操作',col4='专业课目1',col5='专业课目2',col6='步枪射击',col7='航空影像标图')
df2
6.最后生成结果,一张新表,考核总评.xlsx。
df2.to_excel("./考核总评.xlsx", sheet_name="考核总评")
不用安装其它的IDE,只用Jupyter notebook就可以实现数据处理,将Anaconda环境安装包安装在内网电脑上即可!
个人年度军事训练成绩评定python算法-Jupyter notebook文件
个人年度军事训练成绩评定python源代码及资源
个人年度军事训练成绩评定软件win10版
|