Медиана, которая не делит сумму двух элементов в случаях, когда количество элементов четное. - PullRequest
0 голосов
/ 18 июня 2020

Пробовал искать, ничего подходящего не обнаружил. Допустим, у нас есть ряд с четным числом чисел, и мы хотим вычислить его медианное значение:

pd.Series([4, 6, 8, 10]).median()

Поскольку у нас четное количество элементов, нет ни одного элемента, который находится точно посередине, поэтому вместо этого метод выполняет вычисление: (6 + 8) / 2 = 7. Однако для моих целей очень важно, чтобы медиана - это число, которое уже существует в Серии, а не что-то рассчитанное с нуля. Поэтому я бы предпочел выбрать 6 или 8, чем использовать 7.

Одним из возможных решений является обнаружение четного числа элементов и, в таких случаях, добавление еще одного гарантированного элемента. быть самым большим или самым маленьким, а затем просто удалить его после получения медианы. Но такое решение кажется довольно корявым даже для случая с одной серией. И если вместо этого мы имеем дело с объектом SeriesGroupBy, где такая медиана должна вычисляться для каждой группы отдельно, я даже не могу представить, как это реализовать.

Похоже, что в метод median(), который заставляет его выбирать один из двух ближайших элементов вместо деления, и я не могу найти альтернативы методу median(), который также может это сделать. Является ли реализация моей собственной медианной функции единственным выбором?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Если вам не нужно использовать pandas, вы можете сделать это, просто отсортировав список и получив средний элемент. Используйте целочисленное деление, чтобы получить фактический индекс без дроби.

def list_median(l):
    if len(l) == 0:
        return None # or maybe raise an error
    return sorted(l)[(len(l) - 1) // 2]

Примеры:

Если длина списка 7 (нечетный), носитель имеет индекс 3, и (len(l) - 1) // 2) == 3.

Если длина списка 8 (четная), медиана находится между индексами 3 и 4 и (len(l) - 1) // 2) == 3, который является первым из этих двух индексов.

1 голос
/ 18 июня 2020

Вместо использования медианы вам, вероятно, следует использовать опцию квантиля (по умолчанию - медиана, квантиль 0,5) и установить для интерполяции большее, меньшее или ближайшее значение.

Например,

>>> pd.Series([4, 6, 8, 10]).quantile(q=0.5, interpolation='nearest')
8
>>> pd.Series([4, 6, 8, 10]).quantile(q=0.5, interpolation='higher')
8
>>> pd.Series([4, 6, 8, 10]).quantile(q=0.5, interpolation='lower')
6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...