KDB中each函数调用异常,无法实现对应行求和相乘需求
KDB 双参数函数逐行应用问题解决
问题分析
你的代码中f2 each [tmrv][tmpr]的写法不符合KDB双参数函数逐行映射的语法,导致函数未被正确执行,返回了未求值的函数表达式。
正确实现方式
方式1:用单引号'实现逐行映射
KDB中双参数函数的逐行应用,需要用'来配对两列的对应元素,语法为函数'[参数1; 参数2]:
f2:{[x;y] sum(x)*sum(y)}; tm:([] pr:(100.01 100.02;100.03 100.04); rv:(15.72 55.64; 16.92 15.17 12.21 34.99)) f2'[tm`pr; tm`rv]
执行结果:
14272.77 13207.91
方式2:直接计算(无需自定义函数)
如果逻辑简单,可直接对两列分别求和后相乘,写法更简洁:
sum each tm`pr * sum each tm`rv
结果与方式1完全一致。
方式3:将结果作为新列添加到表中
若需要把计算结果整合到原表,可用update结合'实现:
update result:f2'[pr;rv] from tm
生成的表:
pr rv result --------------------------------------------------------- 100.01 100.02 15.72 55.64 14272.77 100.03 100.04 16.92 15.17 12.21 34.99 13207.91
错误原因说明
f2 each [tmrv][tm`pr]`等价于`f2 (tm`rv'[tm`pr])`,即先把`tm`pr`的每个元素作为参数传给`tm`rv`的each映射(这本身无意义,因为`tm`rv`是列表的列表而非函数),再将这个无效结果传给`f2`,最终返回未求值的函数表达式而非计算结果。
内容的提问来源于stack exchange,提问作者theQDude
相关产品推荐
相关产品推荐

