QPython 熊猫互动.



我有一个关于熊猫数据帧的问题,我想用来自 Tick 源(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)

上面的代码将熊猫数据帧转换为 q 表。

访问即时报价数据的示例代码(kdb 表(

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

如何使用数据帧列符号和日期来使用 Qpython 从 kdb 表中提取数据?

假设在 KDB+ 端,您有一个表 t,其中包含列 sym(类型为符号(、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'])

而不是发送函数定义。

最新更新