Kdb 数据库到 PyQ 中的 NumPy 数组
Kdb database to NumPy array in PyQ
我有一个展开的 Kdb 数据库,包含符号、浮点数和时间戳。我想将其转换为 NumPy 数组。但是使用以下代码...
>>> import numpy as np
>>> from pyq import q
>>> d = q.load(':alpha/HDB/')
>>> a = np.array(d)
Returns 这个错误...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/marrowgari/py3/lib/python3.6/site-packages/pyq/_n.py", line 158, in array
return numpy.array(list(self), dtype)
TypeError: iteration over a K scalar, t=-11
这是因为 Kdb 符号类型在 NumPy 中没有直接对应吗?如果是这样,我该如何纠正?
我认为 .q.load
没有达到您的预期 - 此函数的 return 只是一个空符号。我认为您需要使用 .q.get
例如
jmcmurray@host ~/hdb $ pyq
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> q.load("sym")
k('`sym')
>>> np.array(q.get(":2014.04.21/trades").select())
array([('AAPL', '2014-04-21T08:00:37.853000000', 'O', 25.33, 5048),
('AAPL', '2014-04-21T08:00:58.840000000', 'O', 25.35, 4580),
('AAPL', '2014-04-21T08:01:40.150000000', 'O', 25.35, 5432), ...,
('YHOO', '2014-04-21T16:29:06.868000000', 'L', 35.32, 4825),
('YHOO', '2014-04-21T16:29:43.655000000', 'L', 35.32, 6125),
('YHOO', '2014-04-21T16:29:57.229000000', 'L', 35.36, 41)],
dtype=[('sym', 'O'), ('time', '<M8[ns]'), ('src', 'O'), ('price', '<f8'), ('size', '<i4')])
>>>
注意这里我首先使用.q.load
加载sym
文件,因为符号列是枚举的。然后我从我的 HDB 加载一个 splayed table,这应该等同于你的 splayed table.
我还在 table 上使用 .select()
,因为 .q.get()
只是将 table 映射到内存中(与 KDB 中的 get
相同),这是必要的使用 select
将实际数据拉入内存。
假设您的组屋创建如下:
q)(` sv db,`t`)set .Q.en[db:`:alpha/HDB]([]sym:`A`B`C;a:1 2 3)
`:alpha/HDB/t/
q)\l alpha/HDB
q)t
sym a
-----
A 1
B 2
C 3
然后,首先你应该使用 \l
命令加载它,而不是加载函数:
>>> q('\l alpha/HDB')
k('::')
这将加载您所有的 table 和枚举域。
现在您应该能够将 table 的 sym 列转换为 numpy 字符串数组
>>> np.array(q.t.sym)
array(['A', 'B', 'C'], dtype=object)
或一个 numpy 整数数组:
>>> np.array(q.t.sym.data)
array([0, 1, 2])
你也可以一次性把整个table转成一个numpy记录数组,但是你得先"map"到内存中:
>>> np.array(q.t.select())
array([('A', 1), ('B', 2), ('C', 3)], dtype=[('sym', 'O'), ('a', '<i8')])
我有一个展开的 Kdb 数据库,包含符号、浮点数和时间戳。我想将其转换为 NumPy 数组。但是使用以下代码...
>>> import numpy as np
>>> from pyq import q
>>> d = q.load(':alpha/HDB/')
>>> a = np.array(d)
Returns 这个错误...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/marrowgari/py3/lib/python3.6/site-packages/pyq/_n.py", line 158, in array
return numpy.array(list(self), dtype)
TypeError: iteration over a K scalar, t=-11
这是因为 Kdb 符号类型在 NumPy 中没有直接对应吗?如果是这样,我该如何纠正?
我认为 .q.load
没有达到您的预期 - 此函数的 return 只是一个空符号。我认为您需要使用 .q.get
例如
jmcmurray@host ~/hdb $ pyq
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> q.load("sym")
k('`sym')
>>> np.array(q.get(":2014.04.21/trades").select())
array([('AAPL', '2014-04-21T08:00:37.853000000', 'O', 25.33, 5048),
('AAPL', '2014-04-21T08:00:58.840000000', 'O', 25.35, 4580),
('AAPL', '2014-04-21T08:01:40.150000000', 'O', 25.35, 5432), ...,
('YHOO', '2014-04-21T16:29:06.868000000', 'L', 35.32, 4825),
('YHOO', '2014-04-21T16:29:43.655000000', 'L', 35.32, 6125),
('YHOO', '2014-04-21T16:29:57.229000000', 'L', 35.36, 41)],
dtype=[('sym', 'O'), ('time', '<M8[ns]'), ('src', 'O'), ('price', '<f8'), ('size', '<i4')])
>>>
注意这里我首先使用.q.load
加载sym
文件,因为符号列是枚举的。然后我从我的 HDB 加载一个 splayed table,这应该等同于你的 splayed table.
我还在 table 上使用 .select()
,因为 .q.get()
只是将 table 映射到内存中(与 KDB 中的 get
相同),这是必要的使用 select
将实际数据拉入内存。
假设您的组屋创建如下:
q)(` sv db,`t`)set .Q.en[db:`:alpha/HDB]([]sym:`A`B`C;a:1 2 3)
`:alpha/HDB/t/
q)\l alpha/HDB
q)t
sym a
-----
A 1
B 2
C 3
然后,首先你应该使用 \l
命令加载它,而不是加载函数:
>>> q('\l alpha/HDB')
k('::')
这将加载您所有的 table 和枚举域。
现在您应该能够将 table 的 sym 列转换为 numpy 字符串数组
>>> np.array(q.t.sym)
array(['A', 'B', 'C'], dtype=object)
或一个 numpy 整数数组:
>>> np.array(q.t.sym.data)
array([0, 1, 2])
你也可以一次性把整个table转成一个numpy记录数组,但是你得先"map"到内存中:
>>> np.array(q.t.select())
array([('A', 1), ('B', 2), ('C', 3)], dtype=[('sym', 'O'), ('a', '<i8')])