KDB 中 ema 函数的伪代码翻译是什么?

What is the pseudocode translation for the ema function in KDB?

我正在尝试了解 ema 的基础功能。

当我调用它时,它 returns 来自 k

q)ema

k){(*y)(1f-x)\x*y}

q)ema[0.2;til 5]

0 0.2 0.56 1.048 1.6384

到目前为止,还不错。

当我尝试直接调用它时,它似乎不喜欢 *。我做错了什么?

q){(*y)(1f-x)\x*y}[0.2;til 5]
'*
  [0]  {(*y)(1f-x)\x*y}[0.2;til 5]
         ^

如何描述 English/pseudocode 中的这个 k 短语?

您可以 运行 k 代码,方法是在命令提示符中添加 k)

q)k){(*y)(1f-x)\x*y}[0.2;0 1 2 3 4]
0 0.2 0.56 1.048 1.6384

或者将字符串传递给“k”。这允许您在语句中间执行此操作。你将不得不转义反斜杠

q)"k" "{(*y)(1f-x)\x*y}[0.2;0 1 2 3 4]"
0 0.2 0.56 1.048 1.6384

Mark 比我更准确地给出了答案!

有一件事要添加到他的回答中,这个 ema 函数使用这里记录的特殊 shorthand 形式:https://code.kx.com/q/ref/accumulators/#alternative-syntax

因此,

(*y)(1f-x)\x*y

相当于

{z+x*y}\[first 0 1 2 3 4;1f-0.2;0.2*0 1 2 3 4]

这可能更容易理解:

{(0.2*z)+x*y}\[0;0.8;0 1 2 3 4]

或者干脆

{(0.2*y)+x*0.8}\[0;0 1 2 3 4]

也就是之前总和的 0.8 倍加上新值的 0.2 倍

添加到 Mark 和 Terry 的回答中:您的代码失败的原因是因为 q 无法将 * 识别为二元(双参数)函数以外的任何东西。而如果 k 解释器在正确的上下文中(在 ema 中),解释器会将其视为单子。
.q 命名空间包含 k 函数到 q 关键字的映射,因此,如果您将来 运行 到 k 表达式中的类似运算符,您应该能够在此命名空间中查找它们。例如:

q).q?(*:) // Search for the monadic form of '*'
`first

这里可以看到monadic*确实等价于first。 这适用于其他功能:

q).q?(>:)
`hclose
q).q?(^:)
`null
q).q?(-:)
`neg
q).q?(=:)
`group

这不能保证在所有情况下都有效,更复杂的表达式可能会失败。但这是一个很好的第一个参考点。