gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:57:18 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com