Как я могу сопоставить непрерывную переменную с дискретными строками, используя словари или иным образом в Python? - PullRequest
2 голосов
/ 07 апреля 2019

У меня есть непрерывная переменная с минимальным значением 0 и максимальным значением 1. Поэтому сюда входят все числа с плавающей точкой от 0 до 1 включительно.

Я хочу иметь возможность отображать 0-0,2 на «очень низкий», 0,2–0,4 на «низкий», 0,4–0,6 на «средний», 0,6–0,8 на «высокий» и 0,8–1,0 на «очень высокий» .

Я предполагаю, что есть простое решение для этого с использованием словарей. Однако у меня возникли проблемы с генерацией непрерывных диапазонов в качестве ключей. Кажется возможным, что если бы диапазоны были дискретными целыми числами, тогда я мог бы просто использовать функцию диапазона.

Например:

range_dict = {range(0,2):'very low',range(2,4):'low',range(4,6):'medium',
range(6,8):'high',range(8,10):'high'}

Однако при попытке выполнить следующее:

range_dict[1]

Я ожидаю получить «очень низко». Однако я просто получаю KeyError, несмотря на то, что 1 находится в диапазоне (0,2).

Запись этого как

1 in range(0,2)

возвращает True.

В любом случае, вернемся к исходной проблеме, где я имею дело с непрерывной переменной!

Я уверен, что есть простое решение, но оно, очевидно, требует другого подхода! Во-первых, есть ли функция диапазона для учета непрерывных, а не дискретных переменных? Во-вторых, может быть, другая проблема заключается именно в том, что словари не могут отображать несколько в один? Спасибо ...


Еще один способ приблизиться к этому - написать функцию if, elif, else style, охватывающую все ячейки и возвращающую строку в соответствующую точку функции, но я специально ищу решение, включающее использование словаря (так как словарь кажется более понятным способом прочитать это в коде). Еще раз спасибо ...

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Модуль bisect имеет хороший способ справиться с этим. См. Другие примеры в ссылке выше:

from bisect import bisect

def category(fl, breakpoints=[.2,.4, .6, .8, 1.1], cat=['very low', 'low', 'medium', 'high', 'very high']):
        return cat[bisect(breakpoints, fl)]

category(.15)  # very low
category(.2)   # low
category(.99)  # very high
category(.5)   # medium
1 голос
/ 07 апреля 2019

Я бы сделал это вместо этого, воспользовавшись тем, что ваши лотки имеют одинаковую ширину:

values = [v / 10 for v in range(10)]  # [0.0, 0.1...0.9]
binned = [value // 0.2 for value in values]

mapping = {0: 'very low',
           1: 'low',
           2: 'medium',
           3: 'high',
           4: 'very high'}

result = [mapping[bin] for bin in binned]
print(result)

Выход:

['very low', 'very low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'very high', 'very high']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...