按符号累加每个时间点的所有值

Accumulate all values at every point in time by symbol

我有这个table:

execs:([]time:til 12;sym:`a`b`c`a`c`c`c`b`b`a`b`c;leavesQty:(1000;900;1300;800;1200;900;600;800;400;300;200;100))

我有不同的符号,每个符号在某个时间都有一个 leavesQty。现在我想以这种方式扩展 table,以便此时在每一行我都通过 sym 获得所有 leavesQty 条目的总和。

所以我必须为这个例子得出这些值:

execs:([]time:til 12;sym:`a`b`c`a`c`c`c`b`b`a`b`c;leavesQty:(1000;900;1300;800;1200;900;600;800;400;300;200;100);accLeavesQty:(1000;1900;3200;3000;2900;2600;2300;2200;1800;1300;1100;600))

首先,您想要获取每个交易品种的叶数量增量,以便了解该值随时间的变化情况。之后,您只需要对结果列进行累加和。

 q)update sums accLeavesQty from update accLeavesQty:deltas leavesQty by sym  from execs
time sym leavesQty accLeavesQty
-------------------------------
0    a   1000      1000        
1    b   900       1900        
2    c   1300      3200        
3    a   800       3000        
4    c   1200      2900        
5    c   900       2600        
6    c   600       2300        
7    b   800       2200        
8    b   400       1800        
9    a   300       1300        
10   b   200       1100        
11   c   100       600  

另一种方法涉及递归:

update accLeavesQty:sum each @[;;:;]\[()!();sym;leavesQty] from execs

它为每个 sym 保留了一个 运行 字典,其中包含最后一个 accLeavesQty,然后计算它们中的每一个的总和

q)update accLeavesQty:@[;;:;]\[()!();sym;leavesQty] from execs
time sym leavesQty accLeavesQty
---------------------------------------
0    a   1000      (,`a)!,1000
1    b   900       `a`b!1000 900
2    c   1300      `a`b`c!1000 900 1300
3    a   800       `a`b`c!800 900 1300
4    c   1200      `a`b`c!800 900 1200
5    c   900       `a`b`c!800 900 900
6    c   600       `a`b`c!800 900 600
7    b   800       `a`b`c!800 800 600
8    b   400       `a`b`c!800 400 600
9    a   300       `a`b`c!300 400 600
10   b   200       `a`b`c!300 200 600
11   c   100       `a`b`c!300 200 100

如果您使用 fby,您可以使用单个更新语句添加此列:

q)update accLeavesQty:sums (deltas;leavesQty) fby sym from execs
time sym leavesQty accLeavesQty
-------------------------------
0    a   1000      1000
1    b   900       1900
2    c   1300      3200
3    a   800       3000
4    c   1200      2900
5    c   900       2600
6    c   600       2300
7    b   800       2200
8    b   400       1800
9    a   300       1300
10   b   200       1100
11   c   100       600

你有一个很好的 fby 案例

q)update accLeavesQty:sums (deltas;leavesQty) fby sym from execs
time sym leavesQty accLeavesQty
-------------------------------
0    a   1000      1000
1    b   900       1900
2    c   1300      3200
3    a   800       3000
4    c   1200      2900
5    c   900       2600
6    c   600       2300
7    b   800       2200
8    b   400       1800
9    a   300       1300
10   b   200       1100
11   c   100       600