Q/KDB +:百分功能不包括空
问题描述:
什么来表达percentile function在Q(不要与percentile混淆),不包括空值最低详细方法?Q/KDB +:百分功能不包括空
我:
q)x:0N 1 2 0N 2 1 5
q)@[count[x]#0Nf;i;:;(1%count i)*1+rank x i:where not null x]
0n 0.2 0.6 0n 0.8 0.4 1
问题与上面的rank
是关系实际上并不用等概率/百分位值结束。
答
虽然我不认为这是最优化的解决方案,但要解决这个问题:
{
X: x where not null x;
grouped: group asc X;
firstRank: first each value grouped;
quantiles: (key grouped)! firstRank%count X;
quantiles x
}[0N 1 2 0N 2 1 5]
代码
- 过滤掉来自输入数组
- 排序阵列空按升序排列并按每个元素分组。其中给出了下一个结构的地图1 2 5! (0 1; 2 3; 4)
- 通过键获取第一个索引:1 2 5! 0 2 4
- 获取基于(3)
- 地图输入数组元素位数函数值对应位数
答
我比较了几种方法(包括prank4
从对方的回答):
prank1:{
n:asc x where not null x;
(sums[count each group n]%count n) @ x
}
prank2:{
p:(1+(asc n) bin n)%count n:x i:where not null x;
@[count[x]#0Nf;i;:;p]
}
prank3:{@[((1+til[count i])%count i)@last each group asc i:x where not null x;x]}
prank4:{
X: x where not null x;
grouped: group asc X;
firstRank: first each value grouped;
quantiles: (key grouped)! firstRank%count X;
quantiles x
}
检查输出是the nearest rank method of percentile calculation一致,除了prank4
:
prank1 0N 1 2 0N 2 1 5/0n 0.4 0.8 0n 0.8 0.4 1
比较时序和内存占用:
x:10000000?0N,til 500
\ts prank1 x/494 402661632
\ts prank2 x/3905 671088960
\ts prank3 x/552 536879392
\ts prank4 x/496 533741888
prank2[x]~prank1 x/1b
prank1[x]~prank3 x/1b
prank1[x]~prank4 x/0b
感谢@Anton,我在此之前已经打为好。你的解决方案与*的例子略有不同,但仍是最快的两个之一。另一种最快的解决方案具有稍低的内存占用量 –