Попытка преобразовать нечеткую логику Excel в функцию Python - PullRequest
0 голосов
/ 10 апреля 2019

В настоящее время я использую следующую команду нечеткой логики в Excel, чтобы выбрать значение из справочной таблицы: =IF(E49>0,VLOOKUP(E49,'Ref Table'!$D$4:$E$22,2,FALSE),"--")

Я пытаюсь написать функцию Django / Python, которая выдаст значение, ближайшее к указанным числам. (Пример: оценка = 14,5 - возвращаемое значение 0,021)

Я установил fuzzywuzzy, но я не уверен, что это лучший способ реализовать это.

Ниже приведен пример функции без Fuzzy Logic.

@register.simple_tag
def get_perc(score):
    if score is None:
        return '--'
    else:
        pct_dict = {
            14: 0.016,
            14.7: 0.021,
            15.3: 0.026,
            16: 0.034,
            16.7: 0.04,
            17.3: 0.05,
            18: 0.07,
            18.7: 0.09,
            19.3: 0.11,
            20: 0.13,
            20.7: 0.17,
            21.3: 0.21,
            22: 0.26,
            22.7: 0.31,
            23.3: 0.38,
            24: 0.47,
            24.7: 0.56,
            25.3: 0.68,
            26: 0.82,
            26.7: 0.98,
            27.3: 1.17,
            28: 1.39,
            29.3: 1.94,
            30: 2.28
        }
    if score in pct_dict.keys():
        return pct_dict[score]
    else:
        return '--'

(Пример: счет = 14,5 - возвращаемое значение равно 0,021)

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Спасибо, вы мне очень помогли. Я также узнал, что данные, используемые с FuzzyWuzzy, должны быть преобразованы в текст для правильной работы. Я смог заключить данные в '' и преобразовать входящий счет, используя str (). В настоящее время я ищу метод для использования команды str () в многомерном массиве, чтобы исключить необходимость использования '' в данных.

Вот мой рабочий код:

@register.simple_tag
def get_perc(score):
    MATCH_THRESHOLD = 80
    pct_dict = {'14': '0.016', '14.7': '0.021', '15.3': '0.026', '16': '0.034', '16.7': '0.04', '17.3': '0.05', '18': '0.07', '18.7': '0.09', '19.3': '0.11', '20': '0.13', '20.7': '0.17', '21.3': '0.21', '22': '0.26', '22.7': '0.31', '23.3': '0.38', '24': '0.47'}
    if not score:
        return '--'
    elif score < 24:
        return '<1'

    match, match_score = process.extractOne(str(score), pct_dict.keys())

    if match_score >= MATCH_THRESHOLD:
        return pct_dict[match]
    else:
        return '--'
0 голосов
/ 10 апреля 2019

Если вы просто пытаетесь нечетко сопоставить ввод с одной из ваших клавиш, используя fuzzywuzzy, вы можете попробовать что-то вроде этого:

from fuzzywuzzy import process

def get_perc(score):
    # I put your dictionary up here so that it's always defined.
    pct_dict = {
        14: 0.016,
        14.7: 0.021,
        15.3: 0.026,
        16: 0.034,
        16.7: 0.04,
        17.3: 0.05,
        18: 0.07,
        18.7: 0.09,
        19.3: 0.11,
        20: 0.13,
        20.7: 0.17,
        21.3: 0.21,
        22: 0.26,
        22.7: 0.31,
        23.3: 0.38,
        24: 0.47,
        24.7: 0.56,
        25.3: 0.68,
        26: 0.82,
        26.7: 0.98,
        27.3: 1.17,
        28: 1.39,
        29.3: 1.94,
        30: 2.28
    }
    MATCH_THRESHOLD = 80 # This is the minimum score needed to "match" a value
                         #  you can change it as you like.

    if not score:   # I changed this, so that any "falsey" value will return '--'
                    #   this includes values like '', None, 0, and False
        return '--'

    match, match_score = process.extractOne(score, pct_dict.keys())

    if match_score >= MATCH_THRESHOLD:
        return pct_dict[match]
    else:
        return '--'

Я внес несколько изменений в ваш исходный код с объяснениемв комментариях.

Я никогда не использовал fuzzywuzzy, но основываясь на этом в разделе «Использование» нечеткого README: https://github.com/seatgeek/fuzzywuzzy

...