QPython Pandas 交互
QPython Pandas Interaction
我有一个关于 Pandas 数据框的问题,我想用来自 Tick Source(kdb Table) 的 Timings 来丰富它。
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数据帧转换为qtable。
访问报价数据的示例代码(kdb Tables)
select Mid by sym,date from quotestackevent where date = 2018.07.01, sym = `CCYPAIR
如何使用数据框列 sym 和日期从 kdb tables 使用 Qpython 提取数据?
假设在 KDB+ 端,您有一个 table t,其中包含列 sym(符号类型)、日期(日期类型)和 mid(浮点类型),例如由以下代码生成:
t:`date xasc ([] sym:raze (3#) each `USDJPY`GBPUSD`EURBTC;date:9#.z.d-til 3;mid:9?`float)
然后将用于丰富的数据从 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() 的第一个参数定义要执行的函数,第二个参数是您希望从 table 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'])
而不是发送函数定义。
我有一个关于 Pandas 数据框的问题,我想用来自 Tick Source(kdb Table) 的 Timings 来丰富它。
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数据帧转换为qtable。
访问报价数据的示例代码(kdb Tables)
select Mid by sym,date from quotestackevent where date = 2018.07.01, sym = `CCYPAIR
如何使用数据框列 sym 和日期从 kdb tables 使用 Qpython 提取数据?
假设在 KDB+ 端,您有一个 table t,其中包含列 sym(符号类型)、日期(日期类型)和 mid(浮点类型),例如由以下代码生成:
t:`date xasc ([] sym:raze (3#) each `USDJPY`GBPUSD`EURBTC;date:9#.z.d-til 3;mid:9?`float)
然后将用于丰富的数据从 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() 的第一个参数定义要执行的函数,第二个参数是您希望从 table 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'])
而不是发送函数定义。