DolphinDB使用案例4:asof join双时间连接
程序员文章站
2022-07-13 14:55:49
...
-
双时间连接asof join
双时间连接对于时间序列数据分析非常方便,用于高效的处理双时间连接任务。
连接两个表:包含执行价格的股票交易表、包含报价和询价的股票报价表。
目的:在股票交易表的时间戳没有出现在股票报价表的情况下,想要得到某个股票最近的报价。
-
数据下载
DolphinDB给的网址不对,从这里可以下载:
-
构建交易记录表和买卖报价表
# 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)
参数中,左右表的顺序影响结果。
>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
的最后一个连接列通常是时间列。 -
双时间连接与左连接的区别
- 假设最后一个连接列是“time”。对于左表中时间t对应的行,如果右表中没有与之匹配的记录,则取右表中在t之前的最近时间对应的行。如右表中有多个匹配行,则取最后一行。
- 如果只有1个连接列,则asof join假定右表已按照连接列排过序。 如果有多个连接列,则asof join函数假定右表根据除最后一个连接列外的其他连接列定义分组,每个分组根据最后一个连接列排序。右表的其他连接列不需要排序。 如果这些条件不符合,处理将与期望值不符。 左表不需要排序。