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
这不能保证在所有情况下都有效,更复杂的表达式可能会失败。但这是一个很好的第一个参考点。
我正在尝试了解 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
这不能保证在所有情况下都有效,更复杂的表达式可能会失败。但这是一个很好的第一个参考点。