python-基于多个数据点的评分

python-基于多个数据点的评分,python,scoring,Python,Scoring,需要关于最简单方法的指导。我有多个资产,每个资产都有多个数据点。我希望根据每个数据点的决策为每个资产分配一个值。例如,每个资产都是一栋房子,数据点包括窗户数量、车库门、破损的栅栏等,每个房子都会有一个分数 除了数百条if语句和分数的加/减之外,还有推荐的编码方法吗 我计划如何执行此操作的示例 def score_house(house): # score house score = 0 if (house.windows > 2): score += 10

需要关于最简单方法的指导。我有多个资产,每个资产都有多个数据点。我希望根据每个数据点的决策为每个资产分配一个值。例如,每个资产都是一栋房子,数据点包括窗户数量、车库门、破损的栅栏等,每个房子都会有一个分数

除了数百条if语句和分数的加/减之外,还有推荐的编码方法吗

我计划如何执行此操作的示例

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的。考虑到每个属性有两个独特的计算(比较,得分),这是最干净的方法。我喜欢简单。非常感谢。