查询列表中百分位数的有效方法

时间:2019-02-04 03:14:13

标签: kdb

几次遇到从列表中收集百分位数的要求:

  1. 某个数字在百分之几内?
  2. 列表中的第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可能已经提供了开箱即用的功能。知道是否已经存在其他东西吗?

2 个答案:

答案 0 :(得分:4)

'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'将引发类型错误。因此,请确保将其正确转换为函数内部。

答案 1 :(得分:0)

qtln:{[x;y;z]cf:(0 1;1%2 2;0 0;1 1;1%3 3;3%8 8) z-4;n:count y:asc y;?[hf<1;first y;last y]^y[hf-1]+(h-hf)*y[hf]-y -1+hf:floor h:cf[0]+x*n+1f-sum cf}
qtl:qtln[;;8];