KDB:加权中位数

KDB: weighted median

如何计算 KDB 中的加权中位数?

我可以看到有一个函数med for a simple median but I could not find something like wmed similar to wavg

非常感谢您的帮助!

您可以通过复制(使用 where)有效地加权中位数:

q)med 10 34 23 123 5 56 where 4 1 1 1 1 1
10f
q)med 10 34 23 123 5 56 where 1 1 1 1 1 4
56f
q)med 10 34 23 123 5 56 where 1 2 1 3 2 1
34f

如果您的权重是百分比(例如 0.15 0.10 0.20 0.30 0.25),则将它们转换为等效的 whole/counting 数字

q)med 1 2 3 4 5 where "i"0*0.15 0.10 0.20 0.30 0.25
4f

对于值 v 和权重 wmed v where w 狼吞虎咽 space 对于更大的值 w

相反,将 w 排序为 v 的升序,并查找累计和达到其总和一半的位置。

q)show v:10?100
17 23 12 66 36 37 44 28 20 30
q)show w:.001*10?1000
0.418 0.126 0.077 0.829 0.503 0.12 0.71 0.506 0.804 0.012
q)med v where "j"$w*1000
36f

q)w iasc v / sort w into ascending order of v
0.077 0.418 0.804 0.126 0.506 0.012 0.503 0.12 0.71 0.829
q)0.5 1*(sum;sums)@\:w iasc v / half the sum and cumulative sums of w
2.0525
0.077 0.495 1.299 1.425 1.931 1.943 2.446 2.566 3.276 4.105
q).[>]0.5 1*(sum;sums)@\:w iasc v / compared
1111110000b
q)v i sum .[>]0.5 1*(sum;sums)@\:w i:iasc v / weighted median
36

q)\ts:1000 med v where "j"$w*1000
18 132192
q)\ts:1000 v i sum .[>]0.5 1*(sum;sums)@\:w i:iasc v
2 2576

q)wmed:{x i sum .[>]0.5 1*(sum;sums)@\:y i:iasc x}

一些值得注意的矢量技术:

  • 使用 Each Left (sum;sums)@\: and using Apply . 和运算符对结果应用两个函数,而不是设置变量,例如(0.5*sum yi)>sums yi:y i 或定义内部 lambda {sums[x]<0.5*sum x}y i
  • iasc对一个列表进行评分以对另一个列表进行排序
  • 通过并列的多重映射:v i sum ..