代码之家  ›  专栏  ›  技术社区  ›  Shekhar

QPython熊猫互动

  •  1
  • Shekhar  · 技术社区  · 6 年前

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

    访问记号数据的示例代码(kdb表)

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Slawomir K.    6 年前

    假设在KDB+端有一个表t,其中有sym(symbol类型)、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'])
    

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

    而不是发送函数定义。