如何在 KDB 中编写更高级的 functions/objects?

How do I write more advanced functions/objects in KDB?

我正在尝试编写一些适合 x;y 线性回归的内容,如下所示。

fit: {
  coef: enlist[y] lsq flip[x];
  intercept: avg y;
  rSquared: sum raze[(intercept + (raze coef mmu flip[x]) - y) xexp 2];
  0"intercept";
  0"coef"; }
fit[x;y]

我遇到的问题是:

但由于生成的字典不是方形的,它不允许这样做。

在 KDB 中处理此问题的正确方法是什么?

下面是一个可能会有所帮助的简单示例。 假设我有计算三个变量的函数 f

f:{[x] n1:x+10; n2:x+20; n3:x+30;}

我可以让 f 将所有这三个输出为一个列表:

f:{[x] n1:x+10; n2:x+20; n3:x+30;:(n1;n2;n3);}

如果我有一个函数 g 可以将三个输入相加,我可以将 f 的输出输入其中,例如:

q)g:{[x;y;z] x+y+z};
q)g . f[10]

. 表示法会将其右侧参数的元素应用于左侧参数,就好像它们是不同的变量一样。

当然,您可以自由地将 f[10] 作为列表。 在这种情况下,您的 g 需要一个新定义:

q)g:{[l] l[0] + l[1] + l[2]}
q)g[f[10]]

同样可以用字典来完成,但你会用符号索引替换你的数字索引。

q)f:{[x] n1:x+10; n2:x+20; n3:x+30;:`n1`n2`n3!(n1;n2;n3);}
q)g:{[d] d[`n1] + d[`n2] + d[`n3]}
q)g[f[10]]