首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kdb数据库到PyQ中的NumPy阵列

Kdb数据库到PyQ中的NumPy阵列
EN

Stack Overflow用户
提问于 2018-03-01 05:29:33
回答 2查看 673关注 0票数 2

我有一个展开的Kdb数据库,里面有符号、浮点数和时间戳。我想把它转换成NumPy数组。不过,使用以下代码...

代码语言:javascript
运行
复制
>>> import numpy as np
>>> from pyq import q
>>> d = q.load(':alpha/HDB/')
>>> a = np.array(d)

返回此错误...

代码语言:javascript
运行
复制
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中没有直接的类比吗?如果是这样的话,我该如何纠正呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 05:52:49

假设您的HDB按如下方式创建:

代码语言:javascript
运行
复制
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命令加载它,而不是使用load函数:

代码语言:javascript
运行
复制
>>> q('\\l alpha/HDB')
k('::')

这将加载所有的表和枚举域。

现在,您应该能够将表的sym列转换为字符串数组

代码语言:javascript
运行
复制
>>> np.array(q.t.sym)
array(['A', 'B', 'C'], dtype=object)

或者转换为整数的numpy数组:

代码语言:javascript
运行
复制
>>> np.array(q.t.sym.data)
array([0, 1, 2])

您还可以一次性将整个表转换为numpy记录数组,但您必须首先将其“映射”到内存中:

代码语言:javascript
运行
复制
>>> np.array(q.t.select())
array([('A', 1), ('B', 2), ('C', 3)], dtype=[('sym', 'O'), ('a', '<i8')])
票数 3
EN

Stack Overflow用户

发布于 2018-03-01 05:45:29

我不认为.q.load做了你所期望的--这个函数的返回值只是一个空符号。我认为你需要使用.q.get

代码语言:javascript
运行
复制
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加载一个展开的表,它应该等同于你的展开的表。

我还对表使用了.select(),因为.q.get()只是将表映射到内存中(与KDB中的get相同),所以有必要使用select将实际数据放入内存中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49038899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档