我正在尝试对在 PostgreSQL 数据库中完成的计算结果进行 QAQC,使用 python 脚本读取计算的输入并回显计算步骤,并将 python 脚本的最终结果与结果进行比较来自 PostgreSQL 的计算。
PostgreSQL数据库中的计算使用percent_rank function ,返回值列表中单个值的百分位数排名(从 0 到 1)。在 python 脚本中,我使用 Scipy percentileofscore function.
所以,问题来了:我无法获得匹配的结果,我想知道是否有人知道我应该在 Scipy percentileofscore 函数中使用什么设置来匹配 PostgreSQL percent_rank 函数。
最佳答案
您可以使用 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. ])
(我使用的是 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]
关于python - 让 PostgreSQL percent_rank 和 scipy.stats.percentileofscore 结果匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39823470/