python-基于多个数据点的评分
需要关于最简单方法的指导。我有多个资产,每个资产都有多个数据点。我希望根据每个数据点的决策为每个资产分配一个值。例如,每个资产都是一栋房子,数据点包括窗户数量、车库门、破损的栅栏等,每个房子都会有一个分数 除了数百条if语句和分数的加/减之外,还有推荐的编码方法吗 我计划如何执行此操作的示例python-基于多个数据点的评分,python,scoring,Python,Scoring,需要关于最简单方法的指导。我有多个资产,每个资产都有多个数据点。我希望根据每个数据点的决策为每个资产分配一个值。例如,每个资产都是一栋房子,数据点包括窗户数量、车库门、破损的栅栏等,每个房子都会有一个分数 除了数百条if语句和分数的加/减之外,还有推荐的编码方法吗 我计划如何执行此操作的示例 def score_house(house): # score house score = 0 if (house.windows > 2): score += 10
def score_house(house):
# score house
score = 0
if (house.windows > 2): score += 10
if (house.garage): score += 10
if (house.fence == 'broken'): score += 80
return score
我认为你的方法很好,不值得费心去尝试做其他事情。您可能希望通过定义以下函数来组织它:
def add_score(x, score):
score += x
return score
还有像这样的字典
:
sdict = {windows: 10, garage: 10, broken_fence: 10}
这样您就可以像这样调用函数:
def score_house(house):
# score house
score = 0
if (house.windows > 2): add_score(sdict[windows])
if (house.garage): add_score(sdict[garage])
if (house.fence == 'broken'): add_score(sdict[broken_fence])
return score
并且可以轻松地从单个词典更改评分
您还可以(现在考虑一下,可能应该)使用Enums
:
from enum import Enum
class Scoring(Enum):
WINDOWS = 10
...
def score_house(house):
# score house
score = 0
if (house.windows > 2): add_score(Scoring.WINDOWS)
...
我认为你也可以在这里使用“责任链”模式:
该模式允许多个对象处理请求,而无需将发送方类与接收方的具体类耦合。链可以在运行时与遵循标准处理程序接口的任何处理程序动态组合
使用此模式的好处在于,您可以在单独的模块中定义和扩展不同的记分器,并在运行时根据问题条件动态组合它们。这是你可以做到的。首先,定义一个父记分器类:
from functools import reduce
class BaseScorer(object):
def __init__(self):
self._next_scorer = None
def set_next(self, scorer):
self._next_scorer = scorer
return scorer
def _call_next(self, house, score):
if self._next_scorer is None:
return score
return self._next_scorer.score(house, score)
def score(self, house, score=0):
raise NotImplementedError
@staticmethod
def chain(scorers):
reduce(lambda x, y: x.set_next(y), scorers)
return scorers[0]
然后,定义各种记分器类,例如:
class WindowScorer(BaseScorer):
def score(self, house, score=0):
if house.windows > 2:
score = score + 10
return self._call_next(house, score)
class GarageScorer(BaseScorer):
def score(self, house, score=0):
if house.garage:
score = score + 10
return self._call_next(house, score)
class FenceScorer(BaseScorer):
def score(self, house, score=0):
if house.fence == 'broken':
score = score - 5
return self._call_next(house, score)
这就是它的使用方法:
scorer = BaseScorer.chain([
WindowScorer(),
GarageScorer(),
FenceScorer()
])
house = House(windows=4, garage=True, fence='nice')
score = scorer.score(house)
你在寻找一个实质性的改变吗?更多的只是确保什么是最有效的和最具pythonic的。考虑到每个属性有两个独特的计算(比较,得分),这是最干净的方法。我喜欢简单。非常感谢。