首页 > 解决方案 > 在 Json 中通过 python 访问 kdb+/q 表?

问题描述

我正在尝试通过 python 访问 kdb+/q 表。我知道有一些库可以帮助 python 和 q 之间的通信,但我想看看是否可以在不使用上述库的情况下这样做,因为 kdb+ 版本有一些限制。

我最初的猜测是:

  1. 在 kdb+q 中定义表;使用 urllib- urllib.request.get("localhost:5000?.jk TABLE_NAME") 通过 python 访问 kdb 但没有成功。

  2. 我使用的另一种方法是使用 pd.read_csv("localhost:5000/q.csv?select from table ...") 但由于 HTTP 406 错误,这种方法无法解决。

从 python 中检索 kdb 表的灵活/简单的方法是什么?任何建议/指导将不胜感激。谢谢

标签: pythonpython-requestskdb

解决方案


我能够成功使用您建议的两种方法

>>> import requests
>>> r = requests.get("http://localhost:35207/.json?enlist trades")
>>> r.json()
[{'time': '2019-02-07D08:00:53.319000000', 'sym': 'ORCL', 'src': 'N', 'price': 32.23, 'size': 1099}, {'time': '2019-02-07D08:01:26.649000000', 'sym': 'YHOO', 'src': 'O', 'price': 35.52, 'size': 471}, {'time': '2019-02-07D08:01:36.413000000', 'sym': 'YHOO', 'src': 'L', 'price': 35.52, 'size': 438}]
>>>

根据https://code.kx.com/q/ref/doth/#htx-filetypes上的说明,这enlist是必需的

请注意,.json此处使用的,类似于.csv您的示例 CSV 查询;当发送这样的查询时,kdb 将自动将响应编码为 JSON。

注意:这将适用于 kdb 3.3+ 的版本(3.2 中添加了 JSON 支持,3.3 中添加了通过 HTTP 查询)。要在旧版本上使用类似功能,您可以从 kx 下载json.k并执行以下操作:

q)\l json.k //from kx, not needed for 3.2
q).h.ty[`jsn]:"application/json"
q).h.tx[`jsn]:.j.j'

然后将 HTTP 查询修改为r = requests.get("http://localhost:35207/.jsn?enlist trades")-> not the extension .jsn,这是为了避免修改.z.phHTTP 请求处理程序。[我在 v2.8 上测试过]

或者,使用 CSV 和 Pandas:

>>> import pandas as pd
>>> pd.read_csv("http://localhost:35207/.csv?trades")
                            time   sym src  price  size
0  2019-02-07D08:00:53.319000000  ORCL   N  32.23  1099
1  2019-02-07D08:01:26.649000000  YHOO   O  35.52   471
2  2019-02-07D08:01:36.413000000  YHOO   L  35.52   438

如果您仍然遇到这些方法的问题,请发布详细的错误输出以帮助调试。

正如其他人所观察到的,使用可用的 q-python 库之一可能会更直接,但我认为如果这不可能,它应该可以通过上述 HTTP 请求实现。


推荐阅读