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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/The_Time_Runner/article/details/102681839
  • 双时间连接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将会取第一条的匹配记录。

    扫描二维码关注公众号,回复: 7569705 查看本文章

    因此,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)
    

    在这里插入图片描述

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

    >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函数假定右表根据除最后一个连接列外的其他连接列定义分组,每个分组根据最后一个连接列排序。右表的其他连接列不需要排序。 如果这些条件不符合,处理将与期望值不符。 左表不需要排序。

猜你喜欢

转载自blog.csdn.net/The_Time_Runner/article/details/102681839