kdb dbmaint 用现有数据回填数据

kdb dbmaint to backfill data with existing data

我想使用 dbmaint 包为 hdb 中的所有日期添加一列,然后用同一 table 中另一个现有列的数据回填我添加的列到所有日期。

我刚刚为所有具有默认值的日期添加了一列。如何用另一列的数据回填该列?我不确定这是如何实现的。

我认为 dbmaint.q 中的 copycol 函数正是您要找的。请注意,此功能不适用于嵌套列。

q)\l dbmaint.q
q)tables[]
`s#`depthsecond`quotessecond`tradessecond
q)tradessecond
date       sym  time                          src price size
------------------------------------------------------------
2018.07.16 AAPL 2018.07.16D08:00:00.078000000 N   25.32 1634
2018.07.16 AAPL 2018.07.16D08:00:03.419000000 O   25.35 1900
2018.07.16 AAPL 2018.07.16D08:00:03.504000000 O   25.32 627
2018.07.16 AAPL 2018.07.16D08:00:03.846000000 O   25.32 69
2018.07.16 AAPL 2018.07.16D08:00:07.177000000 O   25.32 4821
2018.07.16 AAPL 2018.07.16D08:00:07.373000000 O   25.35 2321
2018.07.16 AAPL 2018.07.16D08:00:11.861000000 L   25.33 545

q)
q)copycol[`:hdb2;`tradessecond;`price;`price_new]
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.16/tradessecond
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.17/tradessecond
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.18/tradessecond
q)\l hdb2
q)tradessecond
date       sym  time                          src price size price_new
----------------------------------------------------------------------
2018.07.16 AAPL 2018.07.16D08:00:00.078000000 N   25.32 1634 25.32
2018.07.16 AAPL 2018.07.16D08:00:03.419000000 O   25.35 1900 25.35
2018.07.16 AAPL 2018.07.16D08:00:03.504000000 O   25.32 627  25.32
2018.07.16 AAPL 2018.07.16D08:00:03.846000000 O   25.32 69   25.32

如您所见,tradessecond table 现在包含 price_new 列。如果您有不同的情况(嵌套列或者您不想像我在示例中显示的那样复制该列),您将必须手动进行更新(重复所有分区,保存列,更新 .d 文件并在必要时枚举)。

根据 Alex 的解决方案 - 如果您想要现有列的精确副本,copycol 将起作用。

如果要从现有列创建 derived 列,则还需要使用 fncol 函数将 lambda 应用于该列。例如,创建价格列的副本,然后将新列中的所有价格加倍:

copycol[`:hdb;`table;`price;`price_new];
fncol[`:hdb;`table;`price_new;{2*x}];

lambda 不包含来自 table 的任何其他信息,它仅包含来自正在修改的列的值。

但是,如果您的派生列更高级并且需要来自 table 的两个或多个列的数据,那么您需要对 vanilla dbmaint 包进行一些修改,如下所示:

创建一个将当前目录路径传递给函数的新版本的 fncol

fncol2:{[dbdir;table;col;fn]
 {fn1col[z;x;y@z]}[col;fn;]each allpaths[dbdir;table];};

然后在您的 lambda 中,您可以根据需要拉入其他列,例如,如果您想添加两个价格列:

{[path;vector] vector + get ` sv path,`otherPriceCol}

总的来说,您的复制和修改命令是:

copycol[`:hdb;`table;`price;`price_new];
fncol2[`:hdb;`table;`price_new;{[path;vector] vector + get ` sv path,`otherPriceCol}];