доступ к таблице kdb + / q через Python в Json? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь получить доступ к таблице kdb + / q через python.Я знаю, что есть некоторые библиотеки, которые помогают взаимодействовать между python & q, но я хотел посмотреть, возможно ли это сделать без использования вышеперечисленных библиотек, так как существуют некоторые ограничения на версию kdb +.

Моим первоначальным предположением было:

  1. определить таблицу в kdb + q;получить доступ к kdb через python с помощью urllib-urllib.request.get ("localhost: 5000? .jk TABLE_NAME"), но это не удалось.

  2. Другой подход, который я использовал, - использование pd.read_csv ("localhost: 5000 / q.csv? select from table ..."), но этот подход не сработал из-за ошибки HTTP 406.

Каков гибкий / простой способ получения таблицы kdb из python?Любые советы / рекомендации будут оценены.Спасибо

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Лучший вариант - использовать уже имеющиеся API для интеграции с Python-Q, как упомянуто @Terrylynch.Это упростит множество операций и будет более эффективным также для большинства случаев.

Но если вы хотите сделать это полностью в Python с использованием http-запросов, то вы можете использовать модуль «запросов»:

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

Пример вывода

<code>'<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
'

Как вы можете видеть, это даст вам HTML-текст, поэтому вам нужно проанализировать его, чтобы получитьрезультат из обязательного тега.Для разбора html доступно несколько модулей python, так что вы можете использовать их.

0 голосов
/ 07 февраля 2019

Я смог успешно использовать оба предложенных вами метода

>>> 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+ (поддержка JSON была добавлена ​​в 3.2, запрос через HTTP был добавлен в 3.3).Чтобы использовать подобное в более старых версиях, вы можете загрузить json.k с kx и сделать следующее:

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-запросов.[Я проверял это на 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-запросам, как указано выше..

0 голосов
/ 07 февраля 2019

PyQ , возможно, является наиболее часто используемым и наиболее поддерживаемым подходом.Вы говорите, что у вас есть ограничения по версии, но PyQ существует уже давно, и я уверен, что вы можете загрузить версии, которые совместимы с более старыми версиями kdb.

Если нет, некоторые другие варианты:

https://github.com/exxeleron/qPython

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

и несколько задокументированных здесь вариантов: http://www.timestored.com/kdb-guides/python-api

Через все это, я уверен, вы найдете что-то, что работает

...