作为python项目的一部分,我需要开发一种快速高效的注释系统来对对象进行评分。简要说明一下,我有几个评级标准,分别称为A,B,C,C,D ...每个标准的评估得分都为10。
我必须对一个字典进行评估,该字典的关键是将注释标准(A,B,C,D ...)作为标准,并将要注意的值作为值。
问题是:
因此,我开始使用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方法效率不高,并且一位朋友告诉我有关二等分法来优化算法的信息。您是否已经建立了一个复杂的符号系统,如果没有,您是否有任何想法可以帮助我构建它?
答案 0 :(得分:0)
在这里,您描述的更多是“成本函数”,而不是“算法”。当多个KPI合并为一个无单位数时,有时人们会称其为“绩效指标”或FoM。
- 最高分(例如,售出的商品数量)或在某些情况下最低分(取消订单的数量)可以得到10分
这没有什么意义,您需要“好”来统一对应于高值,然后需要“坏”来对应低值。
最简单的解决方法是使用(10 - score)
将其翻转为“后退”条件。
进行了分数调整后,您就可以随意放弃当前对大/小的跟踪。
我认为日期不会一直保持这种状态,而是会转换为数字,例如days_old
,其处理方式与其他条件非常相似。
为所有标准定义权重,并计算加权和。 小菜一碟。 从单位间隔0 .. 1中选择权重可能最方便。 权重不需要总和为1.0,但这在人类解释输入及其对输出的贡献时肯定会有所帮助。
TypeError:'int'对象不可迭代
evaluator, param = grades[key]
您似乎希望拆开一个2元组,但是grades[key]
却只是一个整数,例如7
。
get_grade_for_criterion()
函数在返回正确格式的结果时需要小心。