Escape-символы в запросе q-lang через Python - PullRequest
0 голосов
/ 22 февраля 2020

У меня проблемы с применением escape-последовательностей в запросе к серверу kdb.

Собственный запрос:

select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like "*[BMPQTUWZ]*", corr <= 1

Любая помощь приветствуется.

Я используя Python, чтобы отправить его, и я ставлю \ "for" в запросе, чтобы передать знак двойной кавычки:

from qpython import qconnection
import pandas as pd
from datetime import datetime

query = 'select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like \"*[BMPQTUWZ]*\", corr <= 1'

#query = '\"2+2\"'


print('Attempt to open a connection...')

q = qconnection.QConnection(host=server, port=server_port, username=user, password=server_password, timeout=server_timeout, pandas = True)
q.open()
print('Connection established...')

print('Attempt to send the query', query)
df = pd.DataFrame(q.sendSync(query))
print('Query <<', query, '>> sent...')

Вывод для '"2 + 2"' и вывод для 'select lo: минимальная цена, hi: максимальная цена по символу от сделки, где дата = 2007.02.28, не соответствует типу \ " [BMPQTUWZ] \", corr <= 1 'указан ниже. </p>

PS G:\atom-projects\test> python.exe .\test-1.py
Attempt to open a connection...
Connection established...
Attempt to send the query "2+2"
Traceback (most recent call last):
  File ".\test-1.py", line 23, in <module>
    df = pd.DataFrame(q.sendSync(query))
  File "C:\Python38\lib\site-packages\pandas\core\frame.py", line 509, in __init__
    raise ValueError("DataFrame constructor not properly called!")
ValueError: DataFrame constructor not properly called!


PS G:\atom-projects\test> python.exe .\test-1.py
Attempt to open a connection...
Connection established...
Attempt to send the query select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like "*[BMPQTUWZ]*", corr <= 1
Traceback (most recent call last):
  File ".\test-1.py", line 23, in <module>
    df = pd.DataFrame(q.sendSync(query))
  File "C:\Python38\lib\site-packages\qpython\qconnection.py", line 303, in sendSync
    response = self.receive(data_only = False, **options)
  File "C:\Python38\lib\site-packages\qpython\qconnection.py", line 380, in receive
    result = self._reader.read(**self._options.union_dict(**options))
  File "C:\Python38\lib\site-packages\qpython\qreader.py", line 138, in read
    message = self.read_header(source)
  File "C:\Python38\lib\site-packages\qpython\qreader.py", line 158, in read_header
    header = self._read_bytes(8)
  File "C:\Python38\lib\site-packages\qpython\qreader.py", line 388, in _read_bytes
    data = self._stream.read(length)
  File "C:\Python38\lib\socket.py", line 669, in readinto
    return self._sock.recv_into(b)
socket.timeout: timed out

Теперь у меня проблемы с escape-символами.

Если я отправлю запрос на сервер kdb.

query = 'select lo:min price, hi:max price by sym from trade where date = 2007.02.28, corr <= 1'

запрос будет передан. Но когда я добавляю не так, как \ " [BMPQTUWZ] \" , возникает ошибка.

ОС и Python сведения о языке: Windows 10, x64, Python 3.8.1

Ответы [ 3 ]

0 голосов
/ 22 февраля 2020

Я думаю, вы хотите запустить что-то вроде:

... где не cond в \ "BMPQTUWZ \"

0 голосов
/ 22 февраля 2020

Экранирование отлично работает для меня:

q)t:([]sym:100?`1;cond:100#`Buy`Sell`Example;corr:100?2f;price:100?100f)
q)t
sym cond    corr      price   
------------------------------
n   Buy     1.339583  82.48839
m   Sell    1.17743   95.01603
a   Example 1.135715  54.35053
o   Buy     0.7889166 29.12758
b   Sell    1.851226  45.29782
…

df = q.sendSync('select hi:max price, lo:min price, cond:first cond  by sym from t where not cond like \"[BS]*\"')

df
    hi  lo  cond
sym             
b'a'    64.230790   24.164567   b'Example' 
b'b'    60.669536   12.766243   b'Example'
b'c'    85.688555   79.785111   b'Example'
b'd'    83.056125   83.056125   b'Example' 
b'e'    73.149409   73.149409   b'Example'
b'f'    93.359214   36.638445   b'Example' 
...

Сбой '\"2+2\"', потому что возвращается 4, и это не может быть представлено в DataFrame.

Ваш выбор, кажется, не удается из-за тайм-аута. Возможно, попробуйте увеличить время.

И что вы пытаетесь достичь с помощью выбора? Мой пример не в том случае, когда cond начинается с B или S. Так что возвращается только пример.

Предложение Конора, приведенное выше, может быть быстрее и лучше, если cond является столбцом из одного символа, а не символом. Если это столбец символов, как мой выше, с целыми словами. Like/Regex должен использоваться.

0 голосов
/ 22 февраля 2020

Вы пытались убрать квадратные скобки?

query = 'select lo: min price, hi: max цена по sym из сделки, где date = 2007.02.28, не cond like \ " \ [BMPQTUWZ \] \ ", corr <= 1 '</p>

...