如何在python中创建高效,快速的评分系统?

时间:2019-03-26 22:43:03

标签: python python-3.x

作为python项目的一部分,我需要开发一种快速高效的注释系统来对对象进行评分。简要说明一下,我有几个评级标准,分别称为A,B,C,C,D ...每个标准的评估得分都为10。

我必须对一个字典进行评估,该字典的关键是将注释标准(A,B,C,D ...)作为标准,并将要注意的值作为值。

问题是:

  1. 要评估的数据可以有几种类型:int / float / date。
  2. 最高分为10分(项目数 例如出售)或在某些情况下最低(订单数 取消)
  3. 每个评分标准都必须加权
  4. 必须对算法进行优化并快速地实时记录对象

因此,我开始使用JSON将评分标准与评估方法分组。

我的json文件:

{
  "A": {
    "weighting": 2,
    "graduation": {
      "10": ["lesser_than_or_equal", 0],
      "9": ["lesser_than_or_equal", 1],
      "8": ["lesser_than_or_equal", 2],
      "7": ["lesser_than_or_equal", 3],
      "6": ["lesser_than_or_equal", 4],
      "5": ["lesser_than_or_equal", 5],
      "4": ["lesser_than_or_equal", 6],
      "3": ["lesser_than_or_equal", 7],
      "2": ["lesser_than_or_equal", 9],
      "1": ["great_than", 10]
    }
  },
  "B": {
    "weighting": 3,
    "graduation": {
      "10": ["greater_than_or_equal", 10000000],
      "9": ["greater_than_or_equal", 1000000],
      "8": ["greater_than_or_equal", 100000],
      "7": ["greater_than_or_equal", 10000],
      "6": ["greater_than_or_equal", 1000],
      "5": ["greater_than_or_equal", 100],
      "4": ["greater_than_or_equal", 50],
      "3": ["greater_than_or_equal", 30],
      "2": ["greater_than_or_equal", 20],
      "1": ["less_than", 20]
    }
  },

这是我的代码:

class Notation(object):
    def assign_notation(self, score, criterion='A'):
        try:
            grade = self.get_grade_for_criterion(self.fetchScoringSystem('scoringSystem.json'), criterion)
        except Exception as exc:
            logger.error('Impossible to retrieve the criteria scale '+criterion+' : ' + exc)
        else:
            grades = grade['graduation']
            for key in sorted(grades, key=int, reverse=True):
                evaluator, param = grades[key]
                if self.__getattribute__(evaluator)(score, param):
                    return (int(key) * int(grade['weighting']))
                else:
                    raise AttributeError
                    logger.error('Unable to access the function '+evaluator+' with the parameters '+ score + param)

    def fetchGradingScale(self, infile):
        import json
        from collections import OrderedDict

        with open(infile, 'r') as f:
            data = json.load(f, object_pairs_hook=OrderedDict)
        logger.info("Read file %s", infile)
        return data

    def greater_than_or_equal(self, score, x):
        try:
            return score >= x
        except ValueError as exc:
            logger.error('Error in values :' + exc)

    def lesser_than_or_equal(self, score, x):
        try:
            return score <= x
        except ValueError as exc:
            logger.error('Error in values :' + exc)

目前,python返回以下错误:  TypeError:“ int”对象不可迭代

但是,我认为我的assign_notation方法效率不高,并且一位朋友告诉我有关二等分法来优化算法的信息。您是否已经建立了一个复杂的符号系统,如果没有,您是否有任何想法可以帮助我构建它?

1 个答案:

答案 0 :(得分:0)

在这里,您描述的更多是“成本函数”,而不是“算法”。当多个KPI合并为一个无单位数时,有时人们会称其为“绩效指标”或FoM。

  
      
  1. 最高分(例如,售出的商品数量)或在某些情况下最低分(取消订单的数量)可以得到10分
  2.   

这没有什么意义,您需要“好”来统一对应于高值,然后需要“坏”来对应低值。 最简单的解决方法是使用(10 - score)将其翻转为“后退”条件。 进行了分数调整后,您就可以随意放弃当前对大/小的跟踪。

我认为日期不会一直保持这种状态,而是会转换为数字,例如days_old,其处理方式与其他条件非常相似。

为所有标准定义权重,并计算加权和。 小菜一碟。 从单位间隔0 .. 1中选择权重可能最方便。 权重不需要总和为1.0,但这在人类解释输入及其对输出的贡献时肯定会有所帮助。

  

TypeError:'int'对象不可迭代

                evaluator, param = grades[key]

您似乎希望拆开一个2元组,但是grades[key]却只是一个整数,例如7get_grade_for_criterion()函数在返回正确格式的结果时需要小心。