Предположим, что на стороне KDB + у вас есть таблица t со столбцами sym (типа type), date (типа date) и mid (типа float), например, сгенерированная следующим кодом:
t:`date xasc ([] sym:raze (3#) each `USDJPY`GBPUSD`EURBTC;date:9#.z.d-til 3;mid:9?`float$10)
Затем, чтобы перенести данные для обогащения со стороны KDB + на сторону Python, вы можете сделать следующее:
from qpython import qconnection
import pandas as pd
df = pd.DataFrame({'Date': ['2018-09-08','2018-09-08','2018-09-07','2018-09-07'],'sym':['abc','def','abc','def']})
df['Date']=df['Date'].astype('datetime64[ns]')
with qconnection.QConnection(host = 'localhost', port = 5001, pandas = True) as q:
X = q.sync('{select sym,date,mid from t where date in `date$x}',df['Date'])
Здесь первый аргумент q.sync () определяет функцию, которую нужно выполнить, а второй аргумент - это диапазон дат, который вы хотите получить из таблицы t. Внутри функции часть `date $ x преобразует аргумент в список дат, что необходимо, поскольку df ['Date'] отправляется в виде списка меток времени на сторону KDB +.
Полученный фрейм данных X будет иметь столбец sym в виде двоичных строк, поэтому вы можете захотеть сделать что-то вроде
X['sym'].apply(lambda x: x.decode('ascii'))
чтобы преобразовать это в строки.
Альтернативой отправке определения функции является определение функции на стороне KDB + и отправка только ее имени со стороны Python. Итак, если вы можете сделать что-то вроде
getMids:{select sym,date,mid from t where date in `date$x}
на стороне KDB +, тогда вы можете сделать
X = q.sync('getMids',df['Date'])
вместо отправки определения функции.