将每个列表值映射到其相应的百分位数

将每个列表值映射到其相应的百分位数,第1张

将每个列表值映射到其相应的百分位数

我认为您的示例输入/输出与典型的百分位数计算方法不符。如果将百分位数计算为“数据点的比例严格小于此值”,则最高值应为0.8(因为5个值中的4个小于最大值)。如果您将其计算为“小于或等于此值的数据点百分比”,则最低值应为0.2(因为5个值中的1个等于最小值)。因此,百分位数将为

[0,0.2, 0.4, 0.6, 0.8]
[0.2, 0.4, 0.6, 0.8,1]
。您的定义似乎是“数据点的数量严格小于该值,被视为不等于该值的数据点的数量的比例”,但是根据我的经验,这不是一个常见的定义(例如参见Wikipedia)

使用典型的百分位数定义,数据点的百分位数等于其等级除以数据点的数量。(例如,请参阅Stats
SE上的此问题,询问如何在R中执行相同的 *** 作。)如何计算百分位数与在计算排名(例如,对绑定值进行排名)上存在差异。该

scipy.stats.percentileofscore
函数提供了四种计算百分位数的方法:

>>> x = [1, 1, 2, 2, 17]>>> [stats.percentileofscore(x, a, 'rank') for a in x][30.0, 30.0, 70.0, 70.0, 100.0]>>> [stats.percentileofscore(x, a, 'weak') for a in x][40.0, 40.0, 80.0, 80.0, 100.0]>>> [stats.percentileofscore(x, a, 'strict') for a in x][0.0, 0.0, 40.0, 40.0, 80.0]>>> [stats.percentileofscore(x, a, 'mean') for a in x][20.0, 20.0, 60.0, 60.0, 90.0]

(我使用包含关系的数据集来说明在这种情况下会发生什么。)

“等级”方法为联系组分配的等级等于他们将覆盖的等级的平均值(即,第二名的三路并列获得3的等级,因为它“占据”了等级2、3和4)。“弱”方法根据小于或等于给定点的数据点的比例分配百分位数;“严格”是相同的,但计数点的比例严格小于给定点。“均值”方法是后两者的平均值。

正如Kevin H.
Lin指出的那样,

percentileofscore
循环调用效率很低,因为它必须在每次通过时重新计算排名。但是,可以使用提供的不同排名方法轻松地复制这些百分比计算
scipy.stats.rankdata
,让您一次计算所有百分比:

>>> from scipy import stats>>> stats.rankdata(x, "average")/len(x)array([ 0.3,  0.3,  0.7,  0.7,  1. ])>>> stats.rankdata(x, 'max')/len(x)array([ 0.4,  0.4,  0.8,  0.8,  1. ])>>> (stats.rankdata(x, 'min')-1)/len(x)array([ 0. ,  0. ,  0.4,  0.4,  0.8])

在最后一种情况下,将排名降低1,以使排名从0开始而不是从1开始。(我省略了“均值”,但是可以通过对后两种方法的结果求平均值来轻松获得。)

我做了一些时间。对于像您的示例这样的小数据,使用

rankdata
的速度要比Kevin H.
Lin的解决方案要慢一些(大概是由于将东西转换成幕后的numpy数组会产生开销),但比像调用
percentileofscore
reptilicus的那样循环调用要快:

In [11]: %timeit [stats.percentileofscore(x, i) for i in x]1000 loops, best of 3: 414 µs per loopIn [12]: %timeit list_to_percentiles(x)100000 loops, best of 3: 11.1 µs per loopIn [13]: %timeit stats.rankdata(x, "average")/len(x)10000 loops, best of 3: 39.3 µs per loop

但是,对于大型数据集,numpy的性能优势会生效,使用

rankdata
速度比Kevin快10倍
list_to_percentiles

In [18]: x = np.random.randint(0, 10000, 1000)In [19]: %timeit [stats.percentileofscore(x, i) for i in x]1 loops, best of 3: 437 ms per loopIn [20]: %timeit list_to_percentiles(x)100 loops, best of 3: 1.08 ms per loopIn [21]: %timeit stats.rankdata(x, "average")/len(x)10000 loops, best of 3: 102 µs per loop

这种优势只会在越来越大的数据集上变得更加明显。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5643973.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存