经由蟒访问KDB + / Q表以JSON?

问题描述 投票:-1回答:3

我试图通过Python访问KDB + / Q表。我知道有一些库,帮助蟒蛇&Q之间的通信,但我想看看是否有可能这样做,而不使用上述库,有上KDB +版本的一些限制。

我最初的猜测是:

  1. 定义KDB + Q表;通过使用urllib- urllib.request.get蟒蛇访问KDB(“本地主机:5000 .j.k TABLE_NAME”),但没有成功。
  2. 另一种方法我用pd.read_csv(“本地主机:5000 / q.csv从表中选择...”),但这种方法不能由于HTTP 406错误锻炼。

什么是蟒蛇检索KDB表的灵活/简单的方法?任何建议/指导,将不胜感激。谢谢

python python-requests kdb
3个回答
3
投票

我可以用你的成功表明这两种方法

>>> 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}]
>>>

enlist需要按注,https://code.kx.com/q/ref/doth/#htx-filetypes

需要注意的是.json用在这里,同样在你的例子CSV查询.csv;当发送这样的查询KDB将自动响应编码作为JSON。

注意:这将在KDB的版本一起3.3+(3.2中添加JSON支持,查询通过HTTP 3.3中加入)。如果要使用旧版本类似,您可以从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") - >不是分机.jsn,这是一个黑客在这里避免修改.z.ph,HTTP请求处理程序。 [I测试此上V2.8]

或者,使用CSV&熊猫:

>>> 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请求可行如上。


2
投票

PyQ可能是最常用和最支持的方法。你说你有版本的限制,但PYQ已经存在了很长一段时间,我敢肯定,你可以下载它与旧版本KDB的兼容版本。

如果不是这样,一些其他的选项有:

https://github.com/exxeleron/qPython

https://code.kx.com/q/interfaces/embedpy/

和几个选择这里记载:http://www.timestored.com/kdb-guides/python-api

在所有这些我敢肯定你会发现一些作品


0
投票

更好的选择是由@Terrylynch提到使用已有的API的Python-Q的整合。这将简化很多操作,将是更有效的,以及大多数的情况下。

但是,如果你想使用Python中的http请求完全做到这一点,那么你可以使用“请求”模块:

import requests as req
res=req.get("http://localhost:5000/?.j.j t")
res.text

样本输出

'<html><head><style>a{text-decoration:none}a:link{color:024C7E}a:visited{color:024C7E}a:active{color:958600}body{font:10pt verdana;text-align:justify}</style></head><body>
<pre>"[{\\"id\\":1,\\"v\\":3},\\n {\\"id\\":2,\\"v\\":4}]"\n</pre></body></html>'

正如你所看到的,所以你需要分析它从所需的变量得到的结果,这将使你的HTML文本。有几个可用的HTML解析Python模块,所以你可以使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.