KDB:功能优化
KDB: Function optimization
我在 kdb 中有 2 个 table,如下所示
q)table1:([]A:1 2 3 5 5 6 2 1;B:`HAK`ZAK`NAK`AAK`AZK`HAK`ZAK`HAK;C:2000.01.01+0 1 2 3 4 0 1 0)
q)table1
A B C
----------------
1 HAK 2000.01.01
2 ZAK 2000.01.02
3 NAK 2000.01.03
5 AAK 2000.01.04
5 AZK 2000.01.05
6 HAK 2000.01.01
2 ZAK 2000.01.02
1 HAK 2000.01.01
q)table2:([]B:`HAK`ZAK`NAK`AAK`AZK;Z:`NAFK`RFK`NAFK`RFK`ORQ)
q)table2
B Z
--------
HAK NAFK
ZAK RFK
NAK NAFK
AAK RFK
AZK ORQ
我想根据 Table 2 的映射修改 Table1 列 B。
例如 table1 columnB 中的任何地方都有单词 "HAK",然后查看 table2 columnB 并将 table1 替换为相应的 table2 columnz
table1.
的所有行都相同
我想要的最终输出是 table1 应该像下面这样更新。
A B C
-----------------
1 NAFK 2000.01.01
2 RFK 2000.01.02
3 NAFK 2000.01.03
5 RFK 2000.01.04
5 ORQ 2000.01.05
6 NAFK 2000.01.01
2 RFK 2000.01.02
1 NAFK 2000.01.01
我想出的功能如下。
hfun:
{$[
x in `$("HAK");`$("NAFK");
x in `$("ZAK");`$("RFK");
x in `$("NAK");`$("NAFK");
x in `$("AAK");`$("RFK");
x in `$(AZK);`$("ORQ");
x]}
finalOutput:update B:hfun'[B] from table1
以上函数按预期工作,但每次为新映射编写新函数或如果 table2 有 200 行时,都不可行。
有人可以看看并提供进一步的建议吗?
您可以使用字典更新而不是带条件的循环:
dict:`HAK`ZAK`NAK`AAK`AZK!`NAFK`RFK`NAFK`RFK`ORQ;
update B^dict B from table1
(with spaces)
table1:([]A:1 2 3 5 5 6 2 1;B:(`$"HAK z";`$"ZAK";`$"NAK";`$"AAK";`$"AZK";`$"HAK";`$"ZAK";`$"HAK");C:2000.01.01+0 1 2 3 4 0 1 0)
table2:([]B:(`$"HAK z";`$"ZAK";`$"NAK";`$"AAK";`$"AZK");Z:`NAFK`RFK`NAFK`RFK`ORQ)
dict:exec B!Z from table2;
update B^dict B from table1
update B:({x[;0]!x[;1]}flip value flip table2)'[B]from table1
这将实现预期的结果,而无需定义额外的变量或条件语句。
它也适用于符号中的空格。
也可以使用 amend 来实现:
@[table1;`B;(!/)table2`B`Z]
你也可以使用 lj
q)select A,B:B^Z,C from table1 lj `B xkey table2
A B C
-----------------
1 NAFK 2000.01.01
2 RFK 2000.01.02
3 NAFK 2000.01.03
5 RFK 2000.01.04
5 ORQ 2000.01.05
6 NAFK 2000.01.01
2 RFK 2000.01.02
1 NAFK 2000.01.01
我在 kdb 中有 2 个 table,如下所示
q)table1:([]A:1 2 3 5 5 6 2 1;B:`HAK`ZAK`NAK`AAK`AZK`HAK`ZAK`HAK;C:2000.01.01+0 1 2 3 4 0 1 0)
q)table1
A B C
----------------
1 HAK 2000.01.01
2 ZAK 2000.01.02
3 NAK 2000.01.03
5 AAK 2000.01.04
5 AZK 2000.01.05
6 HAK 2000.01.01
2 ZAK 2000.01.02
1 HAK 2000.01.01
q)table2:([]B:`HAK`ZAK`NAK`AAK`AZK;Z:`NAFK`RFK`NAFK`RFK`ORQ)
q)table2
B Z
--------
HAK NAFK
ZAK RFK
NAK NAFK
AAK RFK
AZK ORQ
我想根据 Table 2 的映射修改 Table1 列 B。 例如 table1 columnB 中的任何地方都有单词 "HAK",然后查看 table2 columnB 并将 table1 替换为相应的 table2 columnz table1.
的所有行都相同我想要的最终输出是 table1 应该像下面这样更新。
A B C
-----------------
1 NAFK 2000.01.01
2 RFK 2000.01.02
3 NAFK 2000.01.03
5 RFK 2000.01.04
5 ORQ 2000.01.05
6 NAFK 2000.01.01
2 RFK 2000.01.02
1 NAFK 2000.01.01
我想出的功能如下。
hfun:
{$[
x in `$("HAK");`$("NAFK");
x in `$("ZAK");`$("RFK");
x in `$("NAK");`$("NAFK");
x in `$("AAK");`$("RFK");
x in `$(AZK);`$("ORQ");
x]}
finalOutput:update B:hfun'[B] from table1
以上函数按预期工作,但每次为新映射编写新函数或如果 table2 有 200 行时,都不可行。
有人可以看看并提供进一步的建议吗?
您可以使用字典更新而不是带条件的循环:
dict:`HAK`ZAK`NAK`AAK`AZK!`NAFK`RFK`NAFK`RFK`ORQ;
update B^dict B from table1
(with spaces)
table1:([]A:1 2 3 5 5 6 2 1;B:(`$"HAK z";`$"ZAK";`$"NAK";`$"AAK";`$"AZK";`$"HAK";`$"ZAK";`$"HAK");C:2000.01.01+0 1 2 3 4 0 1 0)
table2:([]B:(`$"HAK z";`$"ZAK";`$"NAK";`$"AAK";`$"AZK");Z:`NAFK`RFK`NAFK`RFK`ORQ)
dict:exec B!Z from table2;
update B^dict B from table1
update B:({x[;0]!x[;1]}flip value flip table2)'[B]from table1
这将实现预期的结果,而无需定义额外的变量或条件语句。 它也适用于符号中的空格。
也可以使用 amend 来实现:
@[table1;`B;(!/)table2`B`Z]
你也可以使用 lj
q)select A,B:B^Z,C from table1 lj `B xkey table2
A B C
-----------------
1 NAFK 2000.01.01
2 RFK 2000.01.02
3 NAFK 2000.01.03
5 RFK 2000.01.04
5 ORQ 2000.01.05
6 NAFK 2000.01.01
2 RFK 2000.01.02
1 NAFK 2000.01.01