【问题标题】:QPython Pandas InteractionQPython Pandas 交互
【发布时间】:2018-09-05 20:13:19
【问题描述】:

我有一个关于 Pandas 数据框的问题,我想用 Tick Source(kdb Table) 中的时间来丰富它。

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 dataframe转换为q table。

访问刻度数据的示例代码(kdb 表)

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

如何使用数据框列 sym 和 date 通过 Qpython 从 kdb 表中提取数据?

【问题讨论】:

    标签: pandas kdb qpython


    【解决方案1】:

    假设在 KDB+ 端,您有一个表 t,其中包含 sym(符号类型)、日期(日期类型)和 mid(浮点类型)列,例如由以下代码生成:

    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'])
    

    而不是发送函数定义。

    【讨论】:

    • 感谢 Slawomir - 我已经通过您的第一种方法实现了这一点。你通过 kdb+ 函数的第二种方法是我正在寻找的,你的解决方案肯定有帮助。
    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2016-01-20
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多