Вы можете использовать scipy.stats.rankdata
. Следующий пример воспроизводит результат, показанный на http://docs.aws.amazon.com/redshift/latest/dg/r_WF_PERCENT_RANK.html:
In [12]: import numpy as np
In [13]: from scipy.stats import rankdata
In [14]: values = np.array([15, 20, 20, 20, 30, 30, 40])
rankdata(values, method='min')
дает желаемый уровень:
In [15]: rank = rankdata(values, method='min')
In [16]: rank
Out[16]: array([1, 2, 2, 2, 5, 5, 7])
Тогда базовый расчет дает эквивалент percent_rank
:
In [17]: (rank - 1)/(len(values) - 1)
Out[17]:
array([ 0. , 0.16666667, 0.16666667, 0.16666667, 0.66666667,
0.66666667, 1. ])
(I» m, используя Python 3.5. В Python 2 используйте что-то вроде (rank - 1)/float(len(values) - 1)
.)
Вы можете использовать percentileofscore
, но:
- Вы должны использовать аргумент
kind='strict'
.
- Вы должны направить результат на
n/(n-1)
, где n
- количество значений.
- Вы должны разделить на 100, чтобы преобразовать от истинного процента к фракции от 0 до 1.
percentileofscore
ожидает, что второй аргумент будет скалярным, так что вы должны использовать цикл для вычисления результата отдельно для каждого стоимость.
Вот пример, используя одни и те же значения, что и выше:
In [87]: import numpy as np
In [88]: from scipy.stats import percentileofscore
In [89]: values = np.array([15, 20, 20, 20, 30, 30, 40])
In [90]: n = len(values)
Здесь я использую список понимание для генерации результата:
In [91]: [n*percentileofscore(values, val, kind='strict')/100/(n-1) for val in values]
Out[91]:
[0.0,
0.16666666666666666,
0.16666666666666666,
0.16666666666666666,
0.66666666666666663,
0.66666666666666663,
1.0]
Судя по документации на https: // WWW .postgresql.org/docs/current/static/functions-window.html Я не думаю, что какие-либо из 'kind' опций для' scipy.stats.percentileofscore' будут соответствовать функции 'percent_rank' postgresql. Вероятно, вам нужно сделать свою собственную функцию pecent_rank в Python, вычисляя эквивалент '(rank-1)/(total rows-1)' –