Есть ли удобный способ для вычисления процентилей для последовательности или одномерного массива numpy?
Я ищу что-то похожее на функцию процентиля Excel.
Я посмотрел статистический справочник NumPy и не смог его найти. Все, что я мог найти, это медиана (50-й процентиль), но не что-то более конкретное.
Ответы:
Возможно, вас заинтересует пакет SciPy Stats . Он имеет функцию процентиля, за которой вы работаете, и много других полезных статистических данных.
percentile()
доступно вnumpy
тоже.Этот билет заставляет меня полагать, что они не будут объединятьсяpercentile()
в NumPy в ближайшее время.источник
df.groupby('key')[['value']].agg(lambda g: np.percentile(g, 10))
Между прочим, существует чистая Python-реализация функции процентиля , на случай, если кто-то не хочет зависеть от scipy. Функция скопирована ниже:
источник
percentile
узнать, что использовать дляN
? Это не указано в вызове функции.N
перед вычислением процентиля. Допустим, у вас есть список кортежей,N = [(1, 2), (3, 1), ..., (5, 1)]
и вы хотите получить процентиль первого элемента кортежей, а затем выбираетеkey=lambda x: x[0]
. Вы также можете применить некоторые (изменяющие порядок) преобразования к элементам списка перед вычислением процентиля.источник
Вот как это сделать без numpy, используя только python для вычисления процентиля.
источник
Определение процентиля, которое я обычно вижу, ожидает в результате значение из предоставленного списка, ниже которого найден P-процент значений ... что означает, что результат должен быть из набора, а не интерполяция между элементами набора. Чтобы получить это, вы можете использовать более простую функцию.
Если вы предпочитаете получить значение из предоставленного списка, в котором или ниже которого найден P-процент значений, используйте эту простую модификацию:
Или с упрощением, предложенным @ijustlovemath:
источник
PERCENTILE
функция возвращает следующие процентили для верхних примеров:3.7 = percentile(A, P=0.3)
,0.82 = percentile(A, P=0.8)
,20 = percentile(B, P=0.3)
,42 = percentile(B, P=0.8)
.n = int(...)
вmax(int(...), 1)
функциюНачиная
Python 3.8
, стандартная библиотека поставляется сquantiles
функцией как частьstatistics
модуля:quantiles
возвращает для данного распределенияdist
списокn - 1
точек разреза, разделяющихn
квантильные интервалы (делениеdist
наn
непрерывные интервалы с равной вероятностью):где
n
в нашем случае (percentiles
) есть100
.источник
проверьте модуль scipy.stats:
источник
Чтобы рассчитать процентиль ряда, запустите:
Например:
источник
Если вам нужен ответ, чтобы быть членом входного массива numpy:
Просто добавим, что функция процентиля в numpy по умолчанию вычисляет выход как линейное средневзвешенное значение двух соседних записей во входном векторе. В некоторых случаях люди могут захотеть, чтобы возвращаемый процентиль был фактическим элементом вектора, в этом случае, начиная с версии 1.9.0, вы можете использовать опцию «интерполяция» с «ниже», «выше» или «ближе».
Последняя является действительной записью в векторе, тогда как первая представляет собой линейную интерполяцию двух векторных записей, граничащих с процентилем
источник
для серии: используются описания функций
предположим, у вас есть df со следующими колонками sales и id. Вы хотите рассчитать процентили для продаж, тогда это работает так,
источник
Удобный способ вычислить процентили для одномерной последовательности или матрицы numpy с помощью numpy.percentile < https://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html >. Пример:
Однако, если в ваших данных есть какое-либо значение NaN, вышеуказанная функция не будет полезна. В этом случае рекомендуется использовать функцию numpy.nanpercentile < https://docs.scipy.org/doc/numpy/reference/generated/numpy.nanpercentile.html >:
В двух представленных выше вариантах вы все равно можете выбрать режим интерполяции. Следуйте приведенным ниже примерам для облегчения понимания.
Если ваш входной массив состоит только из целочисленных значений, вас может заинтересовать процентный ответ в виде целого числа. Если это так, выберите режим интерполяции, например, «ниже», «выше» или «ближайший».
источник