1

我正在尝试实现一个移动排名函数,采用参数 n(项目数)和 m(列名)。这是我实现它的方法:

mwindow: k){[y;x]$[y>0;x@(!#x)+\:!y;x@(!#x)+\:(!-y)+y+1]};

mrank: {[n;x] sum each x > prev mwindow[neg n;x]};

但如果 n 相当大,比如 100,这似乎需要相当长的时间。

我认为这是因为它必须从头开始计算,这与 msum 不同,msum 保持一个运行变量并且只计算新添加和删除之间的差异。

4

1 回答 1

1

这里有许多通用滑动窗口函数,您可以使用它们来生成滚动列表以应用您的等级:https ://code.kx.com/q/kb/programming-idioms/#how-do-i-apply -a-function-to-a-sequence-sliding-window

这些方法似乎用零/空值填充列表,但我认为这并不适合您使用rank. 这是另一种可能更适合的方法rank(尽管我尚未对其进行大规模性能测试):

q)mwin:{x each (),/:{neg[x]sublist y,z}[y]\[z]}
q)update r:mwin[rank;4;c] from ([]c:10?100)
c  r
----------
84 ,0
25 1 0
31 2 0 1
0  3 1 2 0
51 1 2 0 3
29 2 0 3 1
25 0 3 2 1
73 2 1 0 3
0  2 1 3 0
6  2 3 0 1
q)update r:last each mwin[rank;4;c] from ([]c:10?100)
c  r
----
38 0
72 1
13 0
77 3
64 1
9  0
37 1
79 3
97 3
63 1
q)
于 2021-07-12T09:42:21.213 回答