我几次遇到了从列表中收集百分位数的要求:
某个数字在百分之几内?
列表中的第n个百分位数是多少?
我写了这些方法来解决这个问题:
/for 1:
percentileWithinThreshold:{[threshold;list] (100 * count where list <= threshold) % count list};
/for 2:
thresholdForPercentile:{[percentile;list] (asc list)[-1 + "j"$((percentile % 100) * count list)]};
它们在两种用例中均能很好地工作,但是我认为这是一个太普通的用例,因此Q可能已经提供了可以立即使用的相同功能。知道是否已经存在其他东西吗?
最佳答案
'100 xrank'生成百分位。
q) 100 xrank 1 2 3 4
q) 0 25 50 75
您第二个要求的解决方案:
q) f:{ y (100 xrank y:asc y) bin x}
另外,请注意,您的第二个函数结果并不总是与xrank相同。原因是“ xrank”使用分数表示输出的底数,这是计算百分位数的正常情况,并且您的函数将值取整并减去-1,以确保输出始终小于等于输入百分位数。例如:
q) thresholdForPercentile[63;til 21] / output 12
q) f[63;til 21] / output 13
对于第一个要求,没有内置功能。但是,如果对输入列表进行排序,则可以改进功能,因为在这种情况下,可以使用在大列表上运行更快的“ bin”功能。
q) percentileWithinThreshold:{[threshold;list] (100 * 1+list bin threshold) % count list};
请记住,如果一个参数是浮点型而另一个参数是整数,则“ bin”将引发类型错误。因此,请确保将它们正确转换为函数。
关于kdb - 查询列表中百分位数的有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54509754/