Какова обратная функция квантиля на серии pandas?

Вопрос:Функции квантиля дают нам квантиль данной серии pandas s, например. s.quantile(0.9) равно 4.2 Есть ли обратная функция (т.е. кумулятивное распределение), которая находит значение x такое, что s.quantile(х) = 4 Спасибо Лучший ответ: У меня был тот же вопрос, что и вы! Я нашел простой способ получить обратный квантиль, используя scipy. #libs required from scipy import

Вопрос:

Функции квантиля дают нам квантиль данной серии pandas s,

например.

s.quantile(0.9) равно 4.2

Есть ли обратная функция (т.е. кумулятивное распределение), которая находит значение x такое, что

s.quantile(х) = 4

Спасибо

Лучший ответ:

У меня был тот же вопрос, что и вы! Я нашел простой способ получить обратный квантиль, используя scipy.

#libs required from scipy import stats import pandas as pd import numpy as np #generate ramdom data with same seed (to be reproducible) np.random.seed(seed=1) df = pd.DataFrame(np.random.uniform(0,1,(10)), columns=[‘a’]) #quantile function x = df.quantile(0.5)[0] #inverse of quantile stats.percentileofscore(df[‘a’],x) Ответ №1>>> df.column.rank(pct=True) Ответ №2

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

s = pd.Series(np.random.uniform(size=1000)) ( s < 0.7 ).astype(int).mean() # =0.7ish

Вероятно, есть способ избежать использования shenanigan int (bool).

Ответ №3

Натолкнулась на ту же проблему. Здесь мои два цента.

def inverse_percentile(arr, num): arr = sorted(arr) i_arr = [i for i, x in enumerate(arr) if x > num] return i_arr[0] / len(arr) if len(i_arr) > 0 else 1 Ответ №4

Нет 1-лайнера, о котором я знаю, но вы можете добиться этого с помощью scipy:

import pandas as pd import numpy as np from scipy.interpolate import interp1d # set up a sample dataframe df = pd.DataFrame(np.random.uniform(0,1,(11)), columns=[‘a’]) # sort it by the desired series and caculate the percentile sdf = df.sort(‘a’).reset_index() sdf[‘b’] = sdf.index / float(len(sdf) — 1) # setup the interpolator using the value as the index interp = interp1d(sdf[‘a’], sdf[‘b’]) # a is the value, b is the percentile >>> sdf index a b 0 10 0.030469 0.0 1 3 0.144445 0.1 2 4 0.304763 0.2 3 1 0.359589 0.3 4 7 0.385524 0.4 5 5 0.538959 0.5 6 8 0.642845 0.6 7 6 0.667710 0.7 8 9 0.733504 0.8 9 2 0.905646 0.9 10 0 0.961936 1.0

Теперь мы видим, что обе функции являются обратными друг другу.

>>> df[‘a’].quantile(0.57) 0.61167933268395969 >>> interp(0.61167933268395969) array(0.57) >>> interp(df[‘a’].quantile(0.43)) array(0.43)

interp также может принимать список, массив numpy или ряд данных pandas, любой итератор действительно!

Оцените статью
Добавить комментарий