基于多数据点的python评分

2024-05-14 00:12:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

除了成百上千的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

Tags: 数据方法数量if语句资产分数车库
2条回答

我想你也可以在这里使用“责任链”模式:

The pattern allows multiple objects to handle the request without coupling sender class to the concrete classes of the receivers. The chain can be composed dynamically at runtime with any handler that follows a standard handler interface.

使用此模式的好处在于,您可以在单独的模块中定义和扩展不同的记分器,并在运行时根据问题条件动态组合它们。你可以这样做。首先,定义父记分器类:

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)

我认为你的方法很好,不值得费心去做别的事。您可能希望通过定义如下函数来组织它:

def add_score(x, score): 
    score += x
    return score

像这样的dictionary

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

并且可以很容易地从一个dictionary改变得分。你知道吗

您还可以(现在想想,可能应该)使用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)
    ...

相关问题 更多 >