2016-10-03 8 views
1

Я пытаюсь выполнить QAQC результаты вычислений, которые выполняются в базе данных PostgreSQL, используя скрипт python для чтения на входах для вычисления и эхо-шага вычисления и сравнить окончательные результаты скрипта python с результатами вычисления PostgreSQL.Получение результатов PostgreSQL percent_rank и scipy.stats.percentileofscore для соответствия

В расчетах в базе данных PostgreSQL используется percent_rank function, возвращая ранжирование процентиля (от 0 до 1) одного значения в списке значений. В сценарии python я использую Scipy percentileofscore function.

Итак, вот вопрос: я не могу получить результаты, чтобы соответствовать, и мне интересно узнать, какие настройки я должен использовать в функции Scipy percentileofscore для соответствия PostgreSQL percent_rank.

+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)' –

ответ

2

Вы можете использовать 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] 
+0

Часть после '\t Вы можете использовать процентили, но:' сохранил мой, но и не позволил мне от необходимости переписывать огромные части моего кода. Спасибо огромное! – traggatmot