欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DolphinDB使用案例4:asof join双时间连接

程序员文章站 2022-07-13 14:55:49
...
  • 双时间连接asof join

    双时间连接对于时间序列数据分析非常方便,用于高效的处理双时间连接任务。

    连接两个表:包含执行价格的股票交易表、包含报价和询价的股票报价表。

    目的:在股票交易表的时间戳没有出现在股票报价表的情况下,想要得到某个股票最近的报价。

  • 数据下载

    DolphinDB给的网址不对,从这里可以下载

    1. EQY_US_ALL_TRADE_20161024.gz
    2. EQY_US_ALL_NBBO_20161024.gz
  • 构建交易记录表和买卖报价表

    # Trades、Quotes
    PTNDB_DIR = "C:/DolphinDB/Data"
    dbName = database(PTNDB_DIR + "/NYSE", RANGE, string('A'..'Z') join `ZZZZ)
    Trades = loadTextEx(dbName, `Trades, `Symbol, PTNDB_DIR + "/EQY_US_ALL_TRADE_20161024.csv",'|')
    Quotes = loadTextEx(dbName, `Nbbo, `Symbol, PTNDB_DIR + "/EQY_US_ALL_NBBO_20161024.csv",'|')
    

    Trades:包含2016.10.24所有美股交易记录

    Quotes:包含2016.10.24全国最佳买卖报价(NBBO

  • Trades和表Quotes左连接

    t1=select Time, Symbol, Trade_Volume, Trade_Price, Bid_Price, Offer_Price as QuoteTime from lj(Trades, Quotes, `Symbol`Time)
    
  • lj左连接
    lj(leftTable, rightTable, matchingCols, [rightMatchingCols])
    
    参数 意义 备注
    leftTable 需要连接的表
    rightTable 需要连接的表
    matchingCols 表示连接列的字符串标量或向量
    rightMatchingCols 表示右表连接列的字符串标量或向量 当leftTable和rightTable至少有一个连接列不同时,必须指定rightMatchingCols。
    返回结果中的连接列与左表的连接列名称相同。

    左连接(lj)返回左表中所有与右表匹配的记录。

    如果右表中没有匹配的记录,将会返回NULL

    如果右表中有多条匹配记录,将会返回所有的匹配记录。

    因此,lj返回结果的行数有可能比左表的行数多。

  • lsj左半连接
    lsj(leftTable, rightTable, matchingCols, [rightMatchingCols])
    

    左半连接(lsj)和左连接(lj)的唯一区别是,如果右表中有多条匹配记录,lsj将会取第一条的匹配记录。

    因此,lsj返回结果的行数与左表的行数相等。

  • 举例
    t1= table(1 2 3 3 as id, 7.8 4.6 5.1 0.1 as value)
    t2 = table(5 3 1 as id,  300 500 800 as qty)
    # 选择列不需要指明来自哪个表
    select id, value, qty from lj(t1, t2, `id)
    

    DolphinDB使用案例4:asof join双时间连接

    参数中,左右表的顺序影响结果。

    >select id, value, qty from lj(t2, t1, `id);
    id value qty
    -- ----- ---
    5        300
    3  5.1   500
    3  0.1   500
    1  7.8   800
    
    >select id, value, qty from lsj(t2, t1, `id);
    id value qty
    -- ----- ---
    5        300
    3  5.1   500
    1  7.8   800
    

    如果左表和右表有除连接列之外其他相同的字段名,需要指定表.字段名

  • Trades和表Quotes进行asof join连接

    t2=select Time, Symbol, Trade_Volume, Trade_Price, Bid_Price, Offer_Price, Quotes.Time as QuoteTime from aj(Trades, Quotes, `Symbol`Time)
    
  • aj双时间连接
    aj(leftTable, rightTable, matchingCols, [rightMatchingCols])
    
    参数 意义 备注
    leftTable 需要连接的表
    rightTable 需要连接的表
    matchingCols 表示连接列的字符串标量或向量
    rightMatchingCols 表示右表连接列的字符串标量或向量 当leftTable和rightTable至少有一个连接列不同时,必须指定rightMatchingCols。 返回结果中的连接列与左表的连接列名称相同。

    asof join的最后一个连接列通常是时间列。

  • 双时间连接与左连接的区别
    1. 假设最后一个连接列是“time”。对于左表中时间t对应的行,如果右表中没有与之匹配的记录,则取右表中在t之前的最近时间对应的行。如右表中有多个匹配行,则取最后一行。
    2. 如果只有1个连接列,则asof join假定右表已按照连接列排过序。 如果有多个连接列,则asof join函数假定右表根据除最后一个连接列外的其他连接列定义分组,每个分组根据最后一个连接列排序。右表的其他连接列不需要排序。 如果这些条件不符合,处理将与期望值不符。 左表不需要排序。