前几天终于调休了,有时间把几个月前,几个不认识的,兄弟,打电话提出的成绩评定问题给解决了,刚做完,又开始加班,不过先把文章上线再说,多谢大家点赞支持!虽然离开PLA一年多了,但一直怀念那些拔草的岁月!O(∩_∩)O哈哈~

使用Python3的numpypandas两个库完成,环境是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=df1(columns=['序号','姓名','通用课目评定'])
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]]
    #print(L)
    N=7 # 总共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版

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐