Apache переписать поддомен в поддомен / папку с SSL

Я думаю, что ваш пример ввода / вывода не соответствует типичным способам вычисления процентиля. Если вы вычисляете процентиль как «пропорцию точек данных, строго меньших этого значения», то верхнее значение должно быть 0,8 (поскольку 4 из 5 значений меньше самого большого). Если вы подсчитаете его как «процент точек данных, меньших или равных этому значению», то нижнее значение должно быть 0,2 (поскольку 1 из 5 значений равно наименьшему). Таким образом, процентили будут [0, 0.2, 0.4, 0.6, 0.8] или [0.2, 0.4, 0.6, 0.8, 1]. Ваше определение, по-видимому, представляет собой «количество точек данных, строго меньшее этого значения, которое рассматривается как доля от числа точек данных, не равных этому значению», но, по моему опыту, это не общее определение (см., Например, wikipedia ).

С типичными определениями процентилей процентиль точки данных равен ее рангу, деленному на количество точек данных. (См., Например, этот вопрос по статистике SE, в котором просят, как сделать то же самое в R.) Различия в том, как вычислить процентную долю в различиях в том, как вычислить ранг (например, как ранжировать привязанные значения). Функция scipy.stats.percentileofscore предоставляет четыре способа вычисления процентилей:

>>> x = [1, 1, 2, 2, 17]
>>> [stats.percentileofscore(x, a, 'rank') for a in x]
[30.0, 30.0, 70.0, 70.0, 100.0]
>>> [stats.percentileofscore(x, a, 'weak') for a in x]
[40.0, 40.0, 80.0, 80.0, 100.0]
>>> [stats.percentileofscore(x, a, 'strict') for a in x]
[0.0, 0.0, 40.0, 40.0, 80.0]
>>> [stats.percentileofscore(x, a, 'mean') for a in x]
[20.0, 20.0, 60.0, 60.0, 90.0]

(я использовал набор данных, содержащий ссылки, чтобы проиллюстрировать, что происходит в таких случаях.)

Метод «ранга» присваивает связанным группам ранг, равный среднему числу рангов, которые они будут покрывать (т. е. трехсторонняя связь для 2-го места получает звание 3, потому что она «занимает» звания 2, 3 и 4). «Слабый» метод присваивает процентиль, исходя из доли точек данных, меньших или равных данной точке; «строгий» - это то же самое, но счет пропорции точек строго меньше данной точки. «Средний» метод является средним из последних двух.

Как заметил Кевин Х. Линь, вызов percentileofscore в цикле неэффективен, поскольку он должен пересчитать ряды на каждом проходе. Однако эти процентильные вычисления могут быть легко реплицированы с использованием различных методов ранжирования, предоставляемых scipy.stats.rankdata , позволяя вам сразу вычислить процентили:

>>> from scipy import stats
>>> stats.rankdata(x, "average")/len(x)
array([ 0.3,  0.3,  0.7,  0.7,  1. ])
>>> stats.rankdata(x, 'max')/len(x)
array([ 0.4,  0.4,  0.8,  0.8,  1. ])
>>> (stats.rankdata(x, 'min')-1)/len(x)
array([ 0. ,  0. ,  0.4,  0.4,  0.8])

. В последнем случае ранги скорректированы вниз на один, чтобы они начинались с 0 вместо 1. (я опустил «среднее», но его можно было легко получить, усреднив результаты последних двух методов.)

I сделал некоторые тайминги. С небольшими данными, такими как в вашем примере, использование rankdata несколько медленнее, чем решение Кевина Х. Лина (предположительно из-за того, что накладные расходы приходится на преобразование вещей в массивы numpy под капотом), но быстрее, чем вызов percentileofscore в как и в ответе рептилия:

In [11]: %timeit [stats.percentileofscore(x, i) for i in x]
1000 loops, best of 3: 414 µs per loop

In [12]: %timeit list_to_percentiles(x)
100000 loops, best of 3: 11.1 µs per loop

In [13]: %timeit stats.rankdata(x, "average")/len(x)
10000 loops, best of 3: 39.3 µs per loop

Однако при большом наборе данных преимущество работы numpy вступает в силу, а использование rankdata в 10 раз быстрее, чем у Кевина list_to_percentiles:

In [18]: x = np.random.randint(0, 10000, 1000)

In [19]: %timeit [stats.percentileofscore(x, i) for i in x]
1 loops, best of 3: 437 ms per loop

In [20]: %timeit list_to_percentiles(x)
100 loops, best of 3: 1.08 ms per loop

In [21]: %timeit stats.rankdata(x, "average")/len(x)
10000 loops, best of 3: 102 µs per loop

Это преимущество будет только более выраженным в больших и больших наборах данных.

0
задан sascotta 26 February 2019 в 17:25
поделиться