通过 Python 在 q-lang 查询中转义字符
Escape characters in a q-lang query via Python
我在对 kdb 服务器的查询中应用转义序列时遇到问题。
本机查询是:
select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like "*[BMPQTUWZ]*", corr <= 1
欢迎任何帮助。
我是用Python发送的,为了传递双引号我在query里放了\"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:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like \"[BMPQTUWZ]\", corr <= 1' 的输出如下所列。
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
现在,我遇到了转义字符的问题。
如果我将查询发送到 kdb 服务器。
query = 'select lo:min price, hi:max price by sym from trade where date = 2007.02.28, corr <= 1'
查询已发送。但是当我添加 not cond like \"[BMPQTUWZ]\" 时,出现错误。
OS 和 Python 语言详细信息:
Windows10,x64,Python3.8.1
你试过转义方括号吗?
查询='select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like \"\[BMPQTUWZ\]\", corr <= 1'
我想你想要运行像这样的东西:
...在 \"BMPQTUWZ\"
中没有条件
转义对我来说效果很好:
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 中显示。
您的 select 似乎因超时而失败。也许尝试增加你的时间。
另外,您希望通过 select 实现什么目标?我的例子不是 cond 以 B 或 S 开头的地方。所以只有 returns 例子。
如果 cond 是单个字符列而不是符号,Conor 上面的建议可能会更快更好。如果它是一个像我上面的符号列,带有整个单词。 Like/Regex
必须使用。
我在对 kdb 服务器的查询中应用转义序列时遇到问题。
本机查询是:
select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like "*[BMPQTUWZ]*", corr <= 1
欢迎任何帮助。
我是用Python发送的,为了传递双引号我在query里放了\"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:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like \"[BMPQTUWZ]\", corr <= 1' 的输出如下所列。
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
现在,我遇到了转义字符的问题。
如果我将查询发送到 kdb 服务器。
query = 'select lo:min price, hi:max price by sym from trade where date = 2007.02.28, corr <= 1'
查询已发送。但是当我添加 not cond like \"[BMPQTUWZ]\" 时,出现错误。
OS 和 Python 语言详细信息: Windows10,x64,Python3.8.1
你试过转义方括号吗?
查询='select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like \"\[BMPQTUWZ\]\", corr <= 1'
我想你想要运行像这样的东西:
...在 \"BMPQTUWZ\"
中没有条件转义对我来说效果很好:
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 中显示。
您的 select 似乎因超时而失败。也许尝试增加你的时间。
另外,您希望通过 select 实现什么目标?我的例子不是 cond 以 B 或 S 开头的地方。所以只有 returns 例子。
如果 cond 是单个字符列而不是符号,Conor 上面的建议可能会更快更好。如果它是一个像我上面的符号列,带有整个单词。 Like/Regex
必须使用。