如何编写一个函数来使用 KDB 查询中的列?

How do I write a function that consumes columns in a query in KDB?

我有以下形式的查询:

select lR cor mR from j

这很好用,我得到了一个号码。

当我尝试使用自定义函数时:

center:{x - avg raze x}

fit1:{
  xc: 0^center[x];
  yc: 0^center[y];
  beta: raze yc lsq xc;
  intercept: (avg raze y) - (beta * avg raze x);
  raze beta
  }


select fit1[lR;mR] from j

我得到一列数字,因为它似乎是按行应用函数,而不是按列应用函数。

两个问题:

编辑

t:([] date:tt; x:xx; y:yy)

t          x y
--------------
2021.01.01 0 4
2021.01.02 1 4
2021.01.03 2 4
2021.01.04 3 4
2021.01.05 4 4
2021.01.06 5 4
2021.01.07 6 4
2021.01.08 7 4
2021.01.09 8 4
2021.01.10 9 4

select fit1[x;y] from t

现在更新了一个正确的例子:

center:{x - avg raze x}

fit1:{
  xc: 0^center[x];
  yc: 0^center[y];
  beta: raze yc lsq xc;
  intercept: (avg raze y) - (beta * avg raze x);
  raze beta
  }

tt: 2021.01.01 + til 10
xx: 9h$til 10
yy: ((xx)*3) + 4
t:([] date:tt; x:xx; y:yy)
    date       x y
---------------
2021.01.01 0 4
2021.01.02 1 7
2021.01.03 2 10
2021.01.04 3 13
2021.01.05 4 16
2021.01.06 5 19
2021.01.07 6 22
2021.01.08 7 25
2021.01.09 8 28
2021.01.10 9 31

q)fit1[enlist xx;enlist yy]
,3f
q)select fit1[x;y] from t
y
----
-4.5
-3.5
-2.5
-1.5
-0.5
0.5
1.5
2.5
3.5
4.5

d

  1. 要回答您的第一个问题,您可以这样做:
q)fit1[j`lR;j`mR]
  1. 我认为没有提供足够的信息来帮助为您的问题提供明确的解决方案,但您的函数创建了一个 intercept 变量,它在最终 return。这条线目前毫无意义。您的自定义函数未设计为 return 像 cor.

    这样的原子
  2. 有些关键字只要在q控制台输入关键字就可以提供底层k代码。如果您找回关键字,那么它会被隐藏,但对于 cor 和 cov,文档中提供了等效代码。

https://code.kx.com/q/ref/cor/ https://code.kx.com/q/ref/cov/