2016-10-03 4 views
1

私はPostgreSQLデータベースで行われた計算結果をQAQCに入力しようとしていますが、pythonスクリプトを使用して入力を読み込んで計算ステップをエコーし​​ますpythonスクリプトの最終結果とPostgreSQLの計算結果を比較します。PostgreSQLのpercent_rankとscipy.stats.percentileofscoreの結果が一致するようにする

PostgreSQLデータベースの計算では、percent_rank functionが使用され、値リスト内の単一値のパーセンタイル順位(0〜1)が返されます。私が使用しているPythonスクリプトでScipy percentileofscore function.

私は結果が一致することはできません。PostgreSQLと一致するようにScipy percentileofscore関数でどの設定を使用すべきか知っている人はいませんか? percent_rank関数。

+0

:// WWW .postgresql.org/docs/current/static/functions-window.html 'scipy.stats.percentileofscore'の' kind'オプションのどれもpo​​stgresqlの 'percent_rank'関数と一致しないと思います。 –

答えて

2

scipy.stats.rankdataを使用できます。

In [17]: (rank - 1)/(len(values) - 1) 
Out[17]: 
array([ 0.  , 0.16666667, 0.16666667, 0.16666667, 0.66666667, 
     0.66666667, 1.  ]) 

(I」:基本的な計算はpercent_rankの等価を与えそして

In [15]: rank = rankdata(values, method='min') 

In [16]: rank 
Out[16]: array([1, 2, 2, 2, 5, 5, 7]) 

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')が所望のランクを与える:次の例は、http://docs.aws.amazon.com/redshift/latest/dg/r_WF_PERCENT_RANK.htmlに示した結果を再生しますPython 3.5を使用しています。Python 2では、(rank - 1)/float(len(values) - 1)のようなものを使用してください。)


あなたはpercentileofscoreを使用することができますが、:

  • あなたは引数kind='strict'を使用する必要があります。
  • 結果をn/(n-1)でスケーリングしなければなりません。nは値の数です。あなたはそれぞれの個別の結果を計算するためにループを使用する必要がありますので、あなたは0と1
  • percentileofscore間の画分に真の割合から変換するために、100で分割する必要があり
  • は、2番目の引数がスカラーであることを期待します値。

ここでは上記と同じ値を使用した例です:

ここ
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) 

私は結果を生成するために、リストの内包表記を使用します。httpsでの文書から判断

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の後ろのパーセンテージpercentileofscoreを使うことができますが、'保存されていますが、私を阻止しました。(あなたはおそらく、Pythonで独自のpecent_rank関数を作成する必要があります。私のコードの膨大な部分を書き直す必要がありません。どうもありがとうございます! – traggatmot

関連する問題