我有一个带有一些高频股价数据的csv文件,我想从表中获得第二个价格数据。
在每个文件中,都有名为date
,time
,symbol
,price
,volume
等的列。
有几秒没有交易,因此在几秒钟内缺少数据。
我想知道如何填写Q中的缺失数据以便从9:30到16:00完整获取第二个数据?如果缺少价格,只需使用最近的价格作为其价格。
我正在考虑写一些循环,但我不知道该怎么做。
答案 0 :(得分:1)
简化一点,我假设您的数据集中有一些随机时间戳,如下所示:
time price
--------------------------------------
2015.01.20D22:42:34.776607000 7
2015.01.20D22:42:34.886607000 3
2015.01.20D22:42:36.776607000 4
2015.01.20D22:42:37.776607000 8
2015.01.20D22:42:37.886607000 7
2015.01.20D22:42:39.776607000 9
2015.01.20D22:42:40.776607000 4
2015.01.20D22:42:41.776607000 9
所以那里有一些缺失的秒。我打算打电话给这张桌子t
。因此,如果您执行秒级类型的查询,显然缺少的秒数仍然缺失:
q)select max price by time.second from t
second | price
--------| -----
22:42:34| 7
22:42:36| 4
22:42:37| 8
22:42:39| 9
22:42:40| 4
22:42:41| 9
要获得缺失的秒数,您必须加入空值列表。在这种情况下,我们知道数据从22:42:34到22:42:41,但实际上你必须找到最小/最大时间并使用它来创建一个临时的" null&# 34;要加入的表:
q)([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N)
second price
--------------
22:42:34
22:42:35
22:42:36
22:42:37
22:42:38
22:42:39
22:42:40
22:42:41
然后离开加入:
q)([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N) lj select max price by time.second from t
second price
--------------
22:42:34 7
22:42:35
22:42:36 4
22:42:37 8
22:42:38
22:42:39 9
22:42:40 4
22:42:41 9
您可以使用fills
或之后您最喜欢的填充启发式。
q)fills `second xasc asc ([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N) lj select max price by time.second from t
second price
--------------
22:42:34 7
22:42:35 7
22:42:36 4
22:42:37 8
22:42:38 8
22:42:39 9
22:42:40 4
22:42:41 9
(请注意second
之前fills
上的排序!)
顺便说一下,对于较大的表,这将比循环更快 。 q中的循环通常是一个坏主意。
修改强>
你也可以使用逗号连接,两个表都需要在second
列上键入
t,t1
(其中t1是在second
上键入的空填充表)
我还没有测试过它,但我怀疑它会比lj
版本略快一些。
答案 1 :(得分:0)
使用aj
,这是KDB最强大的功能之一:
q)data
sym time price size
----------------------------
MS 10:24:04 93.35974 8
MS 10:10:47 4.586986 1
APPL 10:50:23 0.7831685 1
GOOG 10:19:52 49.17305 0
内存表需要sym
,time
排序,并且将g#
属性应用于sym
列
q)data:update `g#sym from `sym`time xasc data
q)meta trade
c | t f a
-----| -----
sym | s g
time | v
price| f
size | j
创建每个符号每秒间隔的rack
表:
q)rack: `sym`time xasc (select distinct sym from data) cross ([] time:{x[0]+til `int$x[1]-x[0]}(min;max)@\:data`time)
使用aj
合并数据:
q)aj[`sym`time; rack; data]