【问题标题】:Create table in KDB with columns from results在 KDB 中使用结果中的列创建表
【发布时间】:2014-03-05 17:15:38
【问题描述】:

我正在尝试在 KDB 中创建一个表,其中的列是查询的结果。例如,我已经加载了股票数据并搜索给定时间窗口的股票交易价格。我创建了一个函数 getTrades[Sybmol;日期;开始时间;停止时间]

这将搜索我的数据库并返回在开始时间和停止时间之间交易的价格。所以我对 Apple 30 秒窗口的结果可能是: 527.10、527.45、527.60、526.90等

我现在要做的是使用 xbar 创建一个表格,其中有每秒的行和在 StartTime 和 StopTime 中交易的所有价格的列。如果价格在那 1 秒内交易,我将在列中放置一个 X。我想我可以处理其中的大部分,但我正在努力解决的主要问题是将上面得到的结果转换为表格的名称。我还在为如何使其灵活而苦苦挣扎,因此我的表格在一种情况下将有 5 列(交易 5 个价格),但在另一种情况下有 10 列,所以基本上它会根据我正在搜索的窗口中交易的价格水平而有所不同。

谢谢。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    进行编程选择的最佳和最简洁的方法是使用 select 的函数形式。

    从 q 为凡人,

        ?[t;c;b;a]                
    

    其中 t 是一个表,a 是聚合字典,b 是 groupbys 字典,c 是约束列表。

    换句话说,从 t where c 中选择 a by b。

    这将允许您动态创建一个,它可以是任意大小。

    您可以在此处找到更多信息: http://code.kx.com/q4m3/9_Queries_q-sql/#912-functional-forms

    【讨论】:

      【解决方案2】:

      Pivot Table

      我认为数据透视表适合这种情况。使用 jgleeson 示例:

      time         price
      ------------------
      11:27:01.600 106
      11:27:02.600 102
      11:27:02.600 102
      11:27:03.100 100
      11:27:03.100 102
      11:27:03.100 102
      11:27:03.100 104
      11:27:03.600 104
      11:27:03.600 102
      11:27:04.100 106
      11:27:05.100 105
      11:27:06.600 106
      11:27:07.100 101
      11:27:07.100 104
      11:27:07.600 105
      11:27:07.600 105
      11:27:07.600 101
      
      not null exec (exec `$string asc distinct price from s)#(`$string price)!price by time:1 xbar time.second from s:select from t where time within 11:27:00 11:27:30
      

      然后返回:

      time    | 100 101 102 103 104 105 106
      --------| ---------------------------
      11:27:01| 0   0   0   0   0   0   1
      11:27:02| 0   0   1   0   0   0   0
      11:27:03| 1   0   1   0   1   0   0
      11:27:04| 0   0   0   0   0   0   1
      11:27:05| 0   0   0   0   0   1   0
      11:27:06| 0   0   0   0   0   0   1
      11:27:07| 0   1   0   0   1   1   0
      

      它可以支持任意数量的唯一价格。

      【讨论】:

        【解决方案3】:

        这看起来有点令人费解......但我认为这可能是你所追求的。

        带有时间和价格列的示例表 t:

        t:`time xasc([]time:100?(.z.T+500*til 100);price:100?(100 101 102 103 104 105 106))
        

        此表应复制您从函数调用的第一步获得的信息 - “select time,price from trade where date=x, symbol=y, starttime=t1, endtime=t2”。

        以指定格式返回表格:

        q) flip (`time,`$string[c])!flip {x,'y}[key a;]value a:{x in y}[c:asc distinct tt`price] each group (!) . reverse value flip tt:update time:time.second from t
        
        time     100 101 102 103 104 105 106
        ------------------------------------
        20:34:29 0   1   0   0   0   1   0
        20:34:30 0   0   0   0   0   0   1
        20:34:31 0   0   1   0   0   0   0
        20:34:32 0   0   1   0   1   0   0
        ...
        

        这有 bools 而不是 X,因为 bools 可能更容易使用。

        还请原谅单行...如果有机会,我会将其分解并尝试使其更具可读性。

        【讨论】:

          【解决方案4】:

          更简化的版本是:

          q)t:`time xasc([] s:100#`s ; time:100?(.z.T+500*til 100);price:100?(100 101 102 103 104 105 106))
          
          q)t1:update `$string price,isPrice:1b from t
          
          q)p:(distinct asc t1`price)
          
          q)exec p#(10b!"X ")@(price!isPrice) by time:1 xbar time.second from t1
          time    | 100 101 102 103 104 105 106
          --------| ---------------------------
          20:39:00| X   X   X
          20:39:01| X   X   X       X
          20:39:02|     X
          20:39:04| X
          20:39:05|             X   X   X   X
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多