在KDB中使用结果中的列创建表
我试图在KDB中创建一个表,其中的列是查询的结果。例如,我加载了股票数据并搜索给定的时间窗口,该股票的交易价格是多少。我创建了一个函数 getTrades[Sybmol;日期;开始时间;停止时间] 这将搜索我的数据库并返回在开始和停止时间之间交易的价格。因此,我对苹果30秒窗口的结果可能是: 527.10、527.45、527.60、526.90等 我现在要做的是使用xbar创建一个表,在这里我有每秒的行和以StartTime和StopTime交易的所有价格的列。如果价格在这1秒内交易,我将在列中放置一个X。我想我可以处理大部分问题,但我最头疼的是将上面得到的结果转换成表名。我也在努力使它灵活,这样我的表在一个场景中有5列(5个交易价格),但在另一个场景中有10列,所以本质上它会根据我搜索的窗口中交易的价格水平而变化在KDB中使用结果中的列创建表,kdb,Kdb,我试图在KDB中创建一个表,其中的列是查询的结果。例如,我加载了股票数据并搜索给定的时间窗口,该股票的交易价格是多少。我创建了一个函数 getTrades[Sybmol;日期;开始时间;停止时间] 这将搜索我的数据库并返回在开始和停止时间之间交易的价格。因此,我对苹果30秒窗口的结果可能是: 527.10、527.45、527.60、526.90等 我现在要做的是使用xbar创建一个表,在这里我有每秒的行和以StartTime和StopTime交易的所有价格的列。如果价格在这1秒内交易,我将在列
谢谢。进行编程选择的最好、最干净的方法是使用select的函数形式 从q到凡人
?[t;c;b;a]
其中t是表,a是聚合字典,b是groupbys字典,c是约束列表
换句话说,从t中选择a by b,其中c
这将允许您动态创建一个可以是任意大小的
您可以在此处找到更多信息:
这看起来有点复杂。。。但我想这可能就是你想要的 带有时间和价格列的示例表t:
t:`time xasc([]time:100?(.z.T+500*til 100);price:100?(100 101 102 103 104 105 106))
此表应该复制您从函数调用的第一步得到的结果-“选择时间,交易价格,其中日期=x,符号=y,开始时间=t1,结束时间=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
...
这有布尔而不是X,因为布尔可能更容易处理
也请原谅一行。。。如果有机会,我会把它拆开,让它更可读。
我认为透视表适合这种情况。使用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
它可以支持任何数量的独特价格 更简化的版本是:
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