QPython Pandas Взаимодействие - PullRequest
       14

QPython Pandas Взаимодействие

0 голосов
/ 05 сентября 2018

У меня есть вопрос, относящийся к фрейму данных Pandas, который я хочу дополнить данными Timings Source (таблица kdb).

Pandas DataFrame
Date         sym   Level
2018-07-01   USDJPY    110
2018-08-01   GBPUSD    1.20

Я хочу дополнить этот информационный фрейм таймингами (впервые для данной валютной пары для данной даты, когда уровень пересечен).

from qpython import qconnection
from qpython import MetaData
from qpython.qtype import QKEYED_TABLE
from qpython.qtype import QSTRING_LIST, QINT_LIST, 
QDATETIME_LIST,QSYMBOL_LIST
q.open()
df.meta = MetaData(sym = QSYMBOL_LIST, val = QINT_LIST, Date = 
QDATE_LIST)
q('set', np.string_('tbl'), df)

Приведенный выше код преобразует кадр данных pandas в таблицу q.

Пример кода для доступа к тиковым данным (таблицы kdb)

select Mid by sym,date from quotestackevent where date = 2018.07.01, sym = `CCYPAIR

Как я могу использовать столбцы данных sym и дату для извлечения данных из таблиц kdb с помощью Qpython?

1 Ответ

0 голосов
/ 08 сентября 2018

Предположим, что на стороне 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'])

вместо отправки определения функции.

...