【问题标题】:How can I efficiently convert the output of one KDB function into three table columns?如何有效地将一个 KDB 函数的输出转换为三个表列?
【发布时间】:2019-10-07 15:49:04
【问题描述】:

我有一个函数,它将表中的一些值作为输入,如果你愿意,它会返回一个元组 - 三个单独的返回值,我想将它们转换为查询的输出。这是我想要实现的简化示例:

multiplier:{(x*2;x*3;x*3)};
select twoX:multiplier[price][0]; threeX:multiplier[price][1]; fourX:multiplier[price][2] from data;

上面的内容基本上是有效的(我认为我已经为简化的示例找到了正确的语法 - 如果不是,那么希望我的意图很清楚),但效率低下,因为我调用了该函数 3 次并丢弃了大部分每次输出。我想重写查询只调用一次函数,我很挣扎。

更新

我认为我在解释影响结果的问题时遗漏了一条关键信息——我需要在查询中获取其他数据以及我的函数输出。这是一个更现实的例子:

multiplier:{(x*2;x*3;x*4)};
select average:avg price, total:sum price, twoX:multiplier[sum price][0]; threeX:multiplier[sum price][1]; fourX:multiplier[sum price][2] by category from data;

无论如何,我都会尝试调整您的答案以适应此要求,并为错过这一点信息而道歉。如果一个专有且相当复杂的算法和真正的查询有大约 30 个输出列,那么真正的功能,因此试图简化示例:)

【问题讨论】:

    标签: kdb


    【解决方案1】:

    如果您只是自己寻找结果,您可以提取 (exec) 为列表,创建字典,然后将字典翻转成表格:

    q)exec flip`twoX`threeX`fourX!multiplier[price] from ([]price:til 10)
    twoX threeX fourX
    -----------------
    0    0      0
    2    3      4
    4    6      8
    6    9      12
    8    12     16
    10   15     20
    12   18     24
    14   21     28
    16   24     32
    18   27     36
    

    如果您还需要原始表中的其他列,那么它会比较棘手,但您可以使用 ,' 横向加入表

    q)t:([]price:til 10)
    q)t,'exec flip`twoX`threeX`fourX!multiplier[price] from t
    

    【讨论】:

    • 正如我的更新中提到的,我需要在我的查询中提取额外的列数据(抱歉将其排除在我对问题的定义之外)并将价格(例如)添加到 @ 的左侧987654324@ 阻止翻转创建列,如您的输出所示。
    • 啊,我的错,我错过了你更新了答案。是的,这很好用,非常感谢!
    【解决方案2】:

    一个apply@也可以实现你想要的。这里data 只是一个包含 10 个随机价格的表格。然后使用@multiplier 函数应用于price 列,同时为三个结果列表中的每一个分配一个列名:

    q)data:([] price:10?100)
    q)multiplier:{(x*2;x*3;x*3)}
    q)@[data;`twoX`threeX`fourX;:;multiplier data`price]
    price twoX threeX fourX
    -----------------------
    80    160  240    240
    24    48   72     72
    41    82   123    123
    0     0    0      0
    81    162  243    243
    10    20   30     30
    36    72   108    108
    36    72   108    108
    16    32   48     48
    17    34   51     51
    

    【讨论】:

    • 这似乎更接近我的目标,因为输出包括价格,但考虑到它,我有点被锁定在使用 select 语句,因为我到处都有已经在使用的代码选择当前仅从算法中提取单个值的语法。我要介绍的更改是让算法返回我需要映射到列中的第二个和第三个值,但实际上将算法重构为三个算法比更改每个消耗点更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多