functools: вычисление межквартильного диапазона

Я использую functools для вычисления процентилей следующим образом:

import functools
percentiles = tuple(functools.partial(np.percentile, q=q) for q in (75, 85, 95))

percentiles
(functools.partial(<function percentile at 0x7f91fe1e9730>, q=75),
 functools.partial(<function percentile at 0x7f91fe1e9730>, q=85),
 functools.partial(<function percentile at 0x7f91fe1e9730>, q=95))

так что в любом месте моего кода я могу вычислять процентили следующим образом:

stat_functions =  percentiles

Затем я хочу добавить промежуточный квартиль к моей процентильной функции, но добавление [75-25] вместо этого вычисляет среднее значение.

percentiles = tuple(functools.partial(np.percentile, q=q) for q in (75, 85, 95, 75-25))

percentiles
(functools.partial(<function percentile at 0x7f91fe1e9730>, q=75),
 functools.partial(<function percentile at 0x7f91fe1e9730>, q=85),
 functools.partial(<function percentile at 0x7f91fe1e9730>, q=95),
 functools.partial(<function percentile at 0x7f91fe1e9730>, q=50))

Мое намерение состоит в том, чтобы получить значение межквартильного диапазона, а не среднее значение. Как это исправить?


person someone    schedule 21.09.2020    source источник
comment
Не уверен, почему вы пытаетесь сделать это именно так, но я опубликовал пару вариантов.   -  person Mad Physicist    schedule 21.09.2020
comment
Вижу, ты уже выбрал один. Задержка на мобильном.   -  person Mad Physicist    schedule 21.09.2020


Ответы (2)


Я добавил функцию iqr в scipy.stats a пока вернулся.

Вы можете изменить понимание следующим образом:

percentiles = tuple(ss.iqr if q is None else functools.partial(np.percentile, q=q) for q in (75, 85, 95, None))
person Mad Physicist    schedule 21.09.2020
comment
Спасибо, сейчас попробую. - person someone; 21.09.2020

Вы не можете получить IQR одним вызовом percentile: это разница между двумя процентилями. Самое близкое, что вы можете сделать, это вычислить 25-й и 75-й процентили за один вызов:

functools.partial(np.percentile, q=(25, 75))

Вы можете изменить свое понимание, чтобы построить функцию, обернутую в np.diff, когда q является кортежем:

percentiles = tuple(lambda x: np.diff(np.percentile(x, q=q)) if isinstance(q, tuple) else functools.partial(np.percentile, q=q) for q in (75, 85, 95, (25, 75)))
person Mad Physicist    schedule 21.09.2020