(q/kdb+)使用前一行的结果更新行

(q/kdb+)使用前一行的结果更新行,kdb,Kdb,使用表格 t:([]c1: 3 4 7 2 4.0;c2: 2 8 10 1 9.0;c3:5 8 13 2 11.0) c1 c2 c3 3 2 5 4 8 8 7 10 13 2 1 2 4 9 11 q)({update c3M:max(c3;c1M;c2M),c2M:c2M^avg(prev c1M;prev c2M),c1M:c1M^avg(c1;c2;c3) from x}/)[update c1M:avg(c1,c2,c3),c2M:a

使用表格

t:([]c1: 3 4 7 2 4.0;c2: 2 8 10 1 9.0;c3:5 8 13 2 11.0)

c1  c2  c3
3   2   5
4   8   8
7   10  13
2   1   2
4   9   11
q)({update c3M:max(c3;c1M;c2M),c2M:c2M^avg(prev c1M;prev c2M),c1M:c1M^avg(c1;c2;c3) from x}/)[update c1M:avg(c1,c2,c3),c2M:avg(c1,c2),c3M:c3 from t where i=0] 
c1 c2 c3 c1M c2M c3M
--------------------
3  2  5  3.3 2.5 5  
4  8  8  6.7 2.9 8  
7  10 13 10  4.8 13 
2  1  2  1.7 7.4 7.4
4  9  11 8   4.5 11     
我需要更新3个新列c1M、c2M、c3M,其中:

对于第一行:

c1M:avgc1、c2、c3 c2M:avgc1,c2 c3M:c3 其他行:

c1M:avgc1、c2、c3 c2M:avgprev c1M,prev c2M c3M:maxc3、c1M、c2M 我可以用电脑做第一排

t:update c1M:avg(c1,c2,c3),c2M:avg(c1,c2),c3M:c3 from t where i=0

c1  c2  c3  c1M c2M c3M
3   2   5   3.3 2.5 5
4   8   8   0n  0n  0N
7   10  13  0n  0n  0N
2   1   2   0n  0n  0N
4   9   11  0n  0n  0N
不知道该如何进行。我试过这样的方法:

update c1M:avg(c1;c2;c3),c2M:avg(prev c1M;prev c2M),c3M:c3|c1M|c2M from t where i>0
但是没有运气

此示例的结果应为:

c1  c2  c3  c1M c2M c3M
3   2   5   3.3 2.5 5.0
4   8   8   6.7 2.9 8.0
7   10  13  10  4.8 13.0
2   1   2   1.7 7.4 7.4
4   9   11  8.0 4.5 11.0

有人能帮我吗?

我想你在这里寻找的东西已经结束了:

它将遍历表的每一行

t:([]c1: 3 4 7 2 4.0;c2: 2 8 10 1 9.0;c3:5 8 13 2 11.0)

c1  c2  c3
3   2   5
4   8   8
7   10  13
2   1   2
4   9   11
q)({update c3M:max(c3;c1M;c2M),c2M:c2M^avg(prev c1M;prev c2M),c1M:c1M^avg(c1;c2;c3) from x}/)[update c1M:avg(c1,c2,c3),c2M:avg(c1,c2),c3M:c3 from t where i=0] 
c1 c2 c3 c1M c2M c3M
--------------------
3  2  5  3.3 2.5 5  
4  8  8  6.7 2.9 8  
7  10 13 10  4.8 13 
2  1  2  1.7 7.4 7.4
4  9  11 8   4.5 11     

我想你在这里寻找的已经结束了:

它将遍历表的每一行

t:([]c1: 3 4 7 2 4.0;c2: 2 8 10 1 9.0;c3:5 8 13 2 11.0)

c1  c2  c3
3   2   5
4   8   8
7   10  13
2   1   2
4   9   11
q)({update c3M:max(c3;c1M;c2M),c2M:c2M^avg(prev c1M;prev c2M),c1M:c1M^avg(c1;c2;c3) from x}/)[update c1M:avg(c1,c2,c3),c2M:avg(c1,c2),c3M:c3 from t where i=0] 
c1 c2 c3 c1M c2M c3M
--------------------
3  2  5  3.3 2.5 5  
4  8  8  6.7 2.9 8  
7  10 13 10  4.8 13 
2  1  2  1.7 7.4 7.4
4  9  11 8   4.5 11     

KDB+在向量计算上比在迭代时快得多。因此,一种可能更快的方法是使用副词仅在c2M列上迭代,因为它是唯一需要该列的前一个值的列。 我认为您可能正在寻找的是:

update c3M:c3 from (update c3M:max(c3;c1M;c2M) from update c2M:{avg x,y}\[first 
c2;first[c1],1_prev c1M] from update c1M:avg(c1;c2;c3) from t) where i=0
这比在整个表上迭代和执行计算要快,如下所示:

q)\ts:1000 ({update c3M:max(c3;c1M;c2M),c2M:c2M^avg(prev c1M;prev 
c2M),c1M:c1M^avg(c1;c2;c3) from x}/)[update 
c1M:avg(c1,c2,c3),c2M:avg(c1,c2),c3M:c3 from t where i=0]
53 7568

q)\ts:1000 update c3M:c3 from (update c3M:max(c3;c1M;c2M) from update c2M: 
{avg x,y}\[first c2;first[c1],1_prev c1M] from update c1M:avg(c1;c2;c3) from 
t) where i=0
11 6896

KDB+在向量计算上比在迭代时快得多。因此,一种可能更快的方法是使用副词仅在c2M列上迭代,因为它是唯一需要该列的前一个值的列。 我认为您可能正在寻找的是:

update c3M:c3 from (update c3M:max(c3;c1M;c2M) from update c2M:{avg x,y}\[first 
c2;first[c1],1_prev c1M] from update c1M:avg(c1;c2;c3) from t) where i=0
这比在整个表上迭代和执行计算要快,如下所示:

q)\ts:1000 ({update c3M:max(c3;c1M;c2M),c2M:c2M^avg(prev c1M;prev 
c2M),c1M:c1M^avg(c1;c2;c3) from x}/)[update 
c1M:avg(c1,c2,c3),c2M:avg(c1,c2),c3M:c3 from t where i=0]
53 7568

q)\ts:1000 update c3M:c3 from (update c3M:max(c3;c1M;c2M) from update c2M: 
{avg x,y}\[first c2;first[c1],1_prev c1M] from update c1M:avg(c1;c2;c3) from 
t) where i=0
11 6896

另一种方法,可能不是最快的,但代码占用较小

q){y,`c1M`c2M`c3M!a,max y[`c3],a:(avg y;avg y[`c1`c2]^x`c1M`c2M)}\[t@-1;t]
c1 c2 c3 c1M      c2M      c3M
-----------------------------------
3  2  5  3.333333 2.5      5
4  8  8  6.666667 2.916667 8
7  10 13 10       4.791667 13
2  1  2  1.666667 7.395833 7.395833
4  9  11 8        4.53125  11

另一种方法,可能不是最快的,但代码占用较小

q){y,`c1M`c2M`c3M!a,max y[`c3],a:(avg y;avg y[`c1`c2]^x`c1M`c2M)}\[t@-1;t]
c1 c2 c3 c1M      c2M      c3M
-----------------------------------
3  2  5  3.333333 2.5      5
4  8  8  6.666667 2.916667 8
7  10 13 10       4.791667 13
2  1  2  1.666667 7.395833 7.395833
4  9  11 8        4.53125  11

使用^的含义是什么?是否返回值本身?^为填充,将替换空avgprev c1M;prev c2M值以c2M为例:使用^的含义是什么?是否返回值本身?^为填充,将替换空avgprev c1M;prev c2M value with c2M例如:你能给我一个关于结构的快速解释吗?它将一个空行作为种子t@-1-这允许修改第一次运行的行为,因为初始逻辑不同-并扫描t的每一行。函数X代表第一次运行的先前创建的行或空白,Y代表C1、C2和C3的下一行。然后,您可以执行必要的逻辑以获得平均值和最大值,并将c1M、c2M和c3M附加到c1、c2和c3。该结果作为新的x传回函数,直到所有y(即t中的所有行)都被处理为止。值得一提的是,函数的输入和输出都是字典,因此,由于所有输出字典都符合相同的形状,kdb自动转换为一个表一个表是一个字典列表你能给我一个关于结构的快速解释吗?它以一个空行作为种子t@-1-这允许修改第一次运行的行为,因为初始逻辑不同-并扫描t的每一行。函数X代表第一次运行的先前创建的行或空白,Y代表C1、C2和C3的下一行。然后,您可以执行必要的逻辑以获得平均值和最大值,并将c1M、c2M和c3M附加到c1、c2和c3。该结果作为新的x传递回函数,直到所有y(即t中的所有行)都被处理为止。值得一提的是,函数的输入和输出都是字典,因此由于所有输出字典都符合相同的形状,kdb会自动转换为表a表是字典列表