各省新高考等级赋分算法实现——python版

各省新高考等级赋分算法实现——python版

一、前言

新高考从2014年启动,目前已经有14个地区(省、市)实行了新高考改革分别是:浙江、上海、北京、山东、天津、海南、湖南、广东、江苏、重庆、河北、湖北、福建、辽宁。
其中有些省份使用3+3模式,即语数英三大主科不变,从剩下的政治、历史、地理、物理、化学、生物这6门科目中选出3科作为选考科目,可以有20种组合。(上海、北京、山东、天津、海南、浙江就是实行的3+3模式,其中浙江比其他省份多一门信息技术,是从7门学科中任选3科。)
有些省份使用3+1+2模式,即语文、数学、英语三大主科不变;“1”是指在物理和历史中选择一门作为选考科目;“2”是指在生物、化学、地理、政治中选择两门作为选考科目,共有12种组合方式。目前,2020年即将实行新高考的八个地区河北、辽宁、江苏、福建、湖北、湖南、广东、以及重庆,均为3+1+2模式。

二、概述

本篇主要讲述:通过找到各省算法算法共性,使用python进行算法实现,解决各省赋分算法不统一的问题。代码可以包裹框架嵌入其他系统、app,同时也可独立运行。可以对excel或者mysql数据库中数十万学生成绩进行赋分运算,作为各学校、各考生家长对学生成绩进行等级赋分参考,模拟高考赋分情况。
(一)算法概述
各省等级赋分算法各有不同,分为不同分数段、不同等级以及不同比例,全部详细写出来没有十几页讲不明白,网上均可查,而且讲的还挺好(但是知道了算法原理,算出来都有问题,不信自己试,原因后面会讲),所以本篇不再概述。
(二)重难点及实现思路
目前各省赋分算法不统一,等级赋分需要对上万甚至数十万学生成绩进行运算才具有实际参考性,同时单独按照每个省、各地区的算法进行代码实现,太过浪费时间,浪费资源。不方便天南地北的网友们拿去用。
代码设计前期,已经找到了各省算法中的共性,因此设计,解决各省赋分算法不统一的问题,采用python轻量、简洁、高效进行算法实现,可以包裹框架嵌入其他系统、app,同时也可独立运行。可以对各省各地区数十万学生成绩,按照相应省份等级赋分算法进行等级赋分运算,最终输出相应学生等级和等级赋分。
~~ 下面代码都给你们写好了,直接运行就ok,但是总有人想知道详细怎么实现,既然你诚心诚意的发问了,那我就大发慈悲的告诉你,方法如下:先举个例子,你去餐馆吃饭,要什么菜直接点,菜端上来直接吃就行了,没必要对菜怎么做的详细了解,也不需要你亲自下厨。不过菜端上来了,你就知道用了哪些食材,基本用了哪些调料,你回家后可以照葫芦画瓢做出菜来。敲代码也是一样的,但是为了保护下自己的劳动果实,就不详细叙述了~~
(三)特别提醒
必须采用大样本量进行运算!!!实际高考中以山东省为例:是以20万考生数据进行赋分运算。若以一个学校一年级1000人运算,这种小样本量计算会出现偏差!!!会导致高分学生成绩部分偏低,中间分数段的学生成绩发生上下偏移,后段低分学生成绩偏高情况(在联考中,一个学校学生成绩偏好,且向上集中,使用全区赋分和全校赋分,全校赋分里面中后段学生成绩将被赋的很低…相反在全区赋分中成绩将赋的很高…)。
最好采用区域联考成绩上千甚至上万人成进行运算。但是以学校为单位的计算,对本学校学生和家长而言,赋分出来的分数和等级是有参考性的。但不能用于和其他学校进行对比,其中干扰因素(年级人数,非统考试卷难易度,生源差异等),若以班级几十人作为计算单位则无参考价值!!!样本量太小,偏差较大!!!

三、代码实现

(一)定义各省等级、分数段确定赋分标准

这里不管3+3模式还是3+1+2模式、还是自定义比例和分数段都可以实现,若需加入其它省份的等级及分数段进行赋分运算直接按照下面格式进行添加即可。
1.参数说明
(1)‘abc_class’ 指的是等级,例如山东分为’A’, ‘B+’, ‘B’, ‘C+’, ‘C’, ‘D+’, ‘D’, ‘E’,分别对应100至90分,90至81分…
(2)‘cumulative_pro’ 指的是等级比例,[3, 10, 26, 50, 74, 90, 97],第一个3是指占比,比如山东的比例A等级占3%,B+等级占7%,B等级占13%…那么cumulative_pro[0] = 3;cumulative_pro[1] = 10 也就是3+7=10;cumulative_pro[2] = 26 也就是3+7+13=26…依次类推
(3)'yhigh’指的是 等级分数上线
(4)'ylow’指的是 等级分数上线
(5)yhigh[0],ylow[0]分别对应abc_class[0],cumulative_pro[0]
2.代码实现
###各省等级划分
def_class = {'山东':{
                    'abc_class':['A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'E'],
                    'cumulative_pro':[3, 10, 26, 50, 74, 90, 97],
                    'yhigh':[100, 90, 80, 70, 60, 50, 40, 30],
                    'ylow':[91, 81, 71, 61, 51, 41, 31, 21]
                    },
            '河北':{
                    'abc_class':['A','B','C','D','E'],
                    'cumulative_pro':[15, 50, 85, 98],
                    'yhigh':[100, 85, 70, 55, 40],
                    'ylow':[86, 71, 56, 41, 30]
                    },
            
            '湖南':{
                    'abc_class':['A','B','C','D','E'],
                    'cumulative_pro':[15, 50, 85, 98],
                    'yhigh':[100, 85, 70, 55, 40],
                    'ylow':[86, 71, 56, 41, 30]
                    },
            '重庆':{
                    'abc_class':['A','B','C','D','E'],
                    'cumulative_pro':[15, 50, 85, 98],
                    'yhigh':[100, 85, 70, 55, 40],
                    'ylow':[86, 71, 56, 41, 30]
                    },
            '广东':{
                    'abc_class':['A','B','C','D','E'],
                    'cumulative_pro':[13, 46, 79, 93],
                    'yhigh':[100, 85, 70, 55, 40],
                    'ylow':[86, 71, 56, 41, 30]
                    },
            '学校自设':{
                    'abc_class':['A','B','C','D','E'],
                    'cumulative_pro':[15, 50, 85, 98],
                    'yhigh':[100, 85, 70, 55, 40],
                    'ylow':[86, 71, 56, 41, 30]
                    },
        }

(二)获取数据

###待等级赋分考试成绩
class grade_score():

在这个函数中可以通过rule_by_province选择想赋分的区域比如def_class[‘河北’],就会按照河北算法进行等级赋分。self.courses
1.参数说明
(1)self.data 读取数据,其中data可以通过panda库read_excel,pymysql取出到dataframe,按照列名:self.courses进行排序即可。
(2)self.rule 选择省份
(3)self.courses = [‘化学’, ‘生物’, ‘政治’, ‘地理’] 选择需要赋分的成绩列
2.代码实现
 def __init__(self,data,rule_by_province=def_class['河北']):
        self.data = data
        self.rule = rule_by_province
        self.courses = ['化学', '生物', '政治', '地理']
        
 def get_grade(self):
        
        def func_adjust_rank_line(rank_line,data_cou,cou):
            result = []
            for rl in rank_line:
                rl_score = data_cou[cou][data_cou['排名']==rl].values
                err = 1
                while rl_score == data_cou[cou][data_cou['排名']==rl+err].values:
                    err += 1
                result.append(rl+err-1)
            return result
   


(三)算法实现

     
        def func_get_grade(x,rank_line,abc_class):
            i = 0
            while x > rank_line[i]:
                i += 1
                if i == len(rank_line):
                    break
            return abc_class[i]
        
        for cou in self.courses:
            
            data_cou = self.data[['学号',cou]]
            data_cou.dropna(inplace=True)
            
            num = len(data_cou)
            rank_line = [int(round((i*num/100),0)) for i in self.rule['cumulative_pro']]
        
            data_cou['排名'] = data_cou[cou].rank(method='first',ascending=False)
            
            rank_line = func_adjust_rank_line(rank_line,data_cou,cou)
            
            data_cou['%s等级' % cou] = data_cou['排名'].apply(lambda x : func_get_grade(x,rank_line,self.rule['abc_class']))
            
            self.data = pd.merge(self.data,data_cou[['学号','%s等级' % cou]],how='outer',on='学号')
代码下载地址:https://download.csdn.net/download/zj2233912/12846448
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值