如何实现Q KDB中返回重复排名的rank函数?
Q/KDB 实现重复值共享排名的自定义rank函数
标准rank函数的行为
Q/KDB中的标准rank函数会为重复值分配递增的不同排名,示例如下:
rank 2 7 4 3 19 16 15 20 25 16 19
返回结果:
0 3 2 1 7 5 4 9 10 6 8
可以看到,重复出现的16分别被分配了排名5和6,19则是7和8。
需求说明
需要实现一个自定义rank函数,要求相等的值对应相同的排名编号,针对上述输入,期望返回结果为:
0 3 2 1 6 5 4 7 8 5 6
这里16的两次出现都对应排名5,19的两次都对应排名6,符合重复值共享排名的要求。
实现方案
可以利用Q的内置函数组合实现该逻辑,代码如下:
myRank:{[x] (rank key group x) flip group x}
逻辑拆解
group x:对输入序列分组,生成字典,键是序列中的唯一值,值是该值在原序列中的位置索引列表rank key group x:对分组的唯一值执行标准rank,得到每个唯一值对应的排名flip group x:将分组的位置索引列表展开为原序列长度的索引序列- 通过索引映射,将原序列的每个位置替换为对应值的排名
测试验证
执行自定义函数:
myRank 2 7 4 3 19 16 15 20 25 16 19
返回结果与期望一致:
0 3 2 1 6 5 4 7 8 5 6
内容的提问来源于stack exchange,提问作者crogg01
相关产品推荐
相关产品推荐

