python - 让 PostgreSQL percent_rank 和 scipy.stats.percentileofscore 结果匹配

标签 python postgresql scipy rank percentile

我正在尝试对在 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/

相关文章:

python - 无法使用 subprocess.call 按顺序运行两个或更多命令

编写多个正则表达式测试的 Pythonic 方式

python - 使用 scipy fft 计算信号的自相关给出了与直接计算不同的答案

python - 求解稀疏上三角系统

python - psycopg2.DatabaseError : SSL SYSCALL error: Connection timed out

Python 不会将所有值返回到系统,而是将其替换为...

python - 如何使用子进程 Popen 运行命令

Python 解析器/编译器与解释器,以及字符串连接编译时与运行时?

python - 如何将数据类型从 python pandas 映射到 postgres 表?

postgresql - 进一步加快后缀通配符搜索