【问题标题】:How to combine multiple columns into one column in kdb?如何在kdb中将多列合并为一列?
【发布时间】:2021-08-25 04:53:09
【问题描述】:

我已经编写了下面的代码,但我认为会有更好的方法来解决这个问题。

我有这样的事情

table:([]time:9 11;Bid1px:4 5;Bid2px:7 3;Bid3px:6 8);
time Bid1px Bid2px Bid3px
-------------------------
9    4      7      6
11   5      3      8
table:update All_bid:flip(Bid1px;Bid2px;Bid3px) from table;
time Bid1px Bid2px Bid3px All_bid
---------------------------------
9    4      7      6      4 7 6
11   5      3      8      5 3 8

我想使用如下 Bidcols 编写代码,但似乎找不到方法,不胜感激。

Bidcols:`Bid1px`Bid2px`Bid3px;
table:update All_bid:flip(Bidcols????) from table;

【问题讨论】:

    标签: kdb


    【解决方案1】:

    一种方法是使用# (take),它在表上将返回列的子集。由于 kdb 中的表只是一个 dicts 列表,因此可以在此表上使用 value each 来获取每一行的值:

    q)table:([]time:9 11;Bid1px:4 5;Bid2px:7 3;Bid3px:6 8)
    q)Bidcols:`Bid1px`Bid2px`Bid3px;
    q)// using just #, all_bid column is a table so each row is a dict
    q)update all_bid:Bidcols#table from table
    time Bid1px Bid2px Bid3px all_bid
    -----------------------------------------------------
    9    4      7      6      `Bid1px`Bid2px`Bid3px!4 7 6
    11   5      3      8      `Bid1px`Bid2px`Bid3px!5 3 8
    q)// adding value each gives us the final desired result
    q)update all_bid:value each Bidcols#table from table
    time Bid1px Bid2px Bid3px all_bid
    ---------------------------------
    9    4      7      6      4 7 6
    11   5      3      8      5 3 8
    

    【讨论】:

      【解决方案2】:

      您可以通过索引来做到这一点。

      q)Bidcols:`Bid1px`Bid2px`Bid3px
      q)show table:([]time:9 11;Bid1px:4 5;Bid2px:7 3;Bid3px:6 8)
      time Bid1px Bid2px Bid3px
      -------------------------
      9    4      7      6
      11   5      3      8
      
      q)update all_bid:flip table Bidcols from table
      time Bid1px Bid2px Bid3px all_bid
      ---------------------------------
      9    4      7      6      4 7 6
      11   5      3      8      5 3 8
      

      为了解释这一点,首先我们用Bidcols索引table

      q)table Bidcols
      4 5
      7 3
      6 8
      

      这将返回一个列表列表 - Bidcols 中的每个列名一个列表。 然后我们flip这个返回另一个列表列表——这次等于table的长度

      q)flip table Bidcols
      4 7 6
      5 3 8
      

      【讨论】:

        【解决方案3】:

        为了完整起见,虽然 Seans 和 Jonathons 的答案是此用例的更好解决方案,但解决像您这样的问题的更通用方法(尝试使 select 语句更具可配置性)是将其转换为函数式 select 语句。

        在这个例子中是:

        /use parse to determine functional form
        q)0N!parse"update All_bid:flip(Bid1px;Bid2px;Bid3px) from table";
        (!;`table;();0b;(,`All_bid)!,(+:;(enlist;`Bid1px;`Bid2px;`Bid3px)))
        
        /replicate the functional form, swapping in your Bidcols list
        q)![table;();0b;(1#`All_bid)!enlist(flip;enlist,Bidcols)]
        time Bid1px Bid2px Bid3px All_bid
        ---------------------------------
        9    4      7      6      4 7 6
        11   5      3      8      5 3 8
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-01
          相关资源
          最近更新 更多