使用结果中的列在KDB中创建表

时间:2014-03-05 17:15:38

标签: kdb

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

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

我想要做的是现在使用xbar创建一个表,其中我有每秒的行数和在StartTime和StopTime中交易的所有价格的列。如果价格在1秒内交易,我会在列中放置一个X.我想我可以处理其中的大部分内容,但我正在努力解决的主要问题是将上面得到的结果转换为表格的名称。我也在努力使它变得灵活,所以我的表在一个场景中将有5列(交易5个价格)但在另一个场景中有10个列,所以基本上它取决于我正在搜索的窗口中交易的价格水平。 / p>

感谢。

4 个答案:

答案 0 :(得分:4)

进行程序化选择的最佳和最干净的方法是使用select的功能形式。

来自q凡人,

    ?[t;c;b;a]                

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

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

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

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

答案 1 :(得分: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

它可以支持任意数量的独特价格。

答案 2 :(得分:1)

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

包含时间和价格列的示例表t:

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

这个表应该复制你从函数调用的第一步得到的结果 - “选择时间,交易价格,其中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可能更容易使用。

也请原谅单行......如果我有机会我会分手并尝试让它更具可读性。

答案 3 :(得分:0)

一个更简化的版本是:

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