可靠地 parsing/applying kdb 中表与字典的函数
Reliably parsing/applying a function to tables vs dictionaries in kdb
我正在尝试在 q 的函数中执行函数式 select,如下所示:
dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]};
在表格输入中完美运行,即
q)tab:([]time:2#.z.z;tag:0 0;direction:0 0;scalar:5 10)
q)count tab
2
q).Q.s1 tab
"+`time`tag`direction`scalar!(2020.12.23T12:28:08.254 2020.12.23T12:28:08.254;0 0;0 0;5 10)"
q)dosel tab
time tag direction scalar
--------------------------------------------
2020.12.23T12:49:19.885 0 0 10
而且,正如预期的那样,不适用于字典表:
q)tab:`time`tag`direction`scalar!(.z.z;0;0;4)
q)count tab
4
q)dosel tab
'type
[1] dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
^
你可以通过使用 enlist 来解决这个问题,即
q))dosel enlist tab
time tag direction scalar
-------------------------
然而,这有明显的边缘情况,即
q)tab:`time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
q))type tab
99h
q)count tab
4
q).Q.s1 tab
"`time`tag`direction`scalar!(2020.12.23T12:55:48.835 2020.12.23T12:55:48.835;0 0;0 0;4 4)"
q)dosel tab
'type
[1] dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
^
q)dosel enlist tab
'type
[4] dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
^
q)dosel flip tab
'type
[7] dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
^
在上面的例子中可以看出,count 不是表格性质的一个很好的近似值。
如何可靠地将 tabular/dictionary 数据解析为适当的形式,以便可以应用 dosel。
抱歉,如果这是一个新手问题...再次感谢。
你的最后一个例子对我有用,我不确定你为什么会看到错误:
q)tab:`time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
q)
q)dosel flip tab
time tag direction scalar
-------------------------
无论哪种方式 - 您的函数设计用于 table,因此您需要确保您的输入始终是 table。这可以通过以下方式实现:
makeTab:{$[98h=type x;x;@[(flip;enlist)0>type first x;x]]};
q)dosel makeTab ([]time:2#.z.z;tag:0 0;direction:0 0;scalar:5 10)
time tag direction scalar
--------------------------------------------
2020.12.23T13:18:58.909 0 0 10
q)
q)dosel makeTab `time`tag`direction`scalar!(.z.z;0;0;4)
time tag direction scalar
-------------------------
q)
q)dosel makeTab `time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
time tag direction scalar
-------------------------
此 makeTab
函数假设您将传入 table 或字典,但如果需要可以进一步推广(例如键控 tables)
我正在尝试在 q 的函数中执行函数式 select,如下所示:
dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]};
在表格输入中完美运行,即
q)tab:([]time:2#.z.z;tag:0 0;direction:0 0;scalar:5 10)
q)count tab
2
q).Q.s1 tab
"+`time`tag`direction`scalar!(2020.12.23T12:28:08.254 2020.12.23T12:28:08.254;0 0;0 0;5 10)"
q)dosel tab
time tag direction scalar
--------------------------------------------
2020.12.23T12:49:19.885 0 0 10
而且,正如预期的那样,不适用于字典表:
q)tab:`time`tag`direction`scalar!(.z.z;0;0;4)
q)count tab
4
q)dosel tab
'type
[1] dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
^
你可以通过使用 enlist 来解决这个问题,即
q))dosel enlist tab
time tag direction scalar
-------------------------
然而,这有明显的边缘情况,即
q)tab:`time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
q))type tab
99h
q)count tab
4
q).Q.s1 tab
"`time`tag`direction`scalar!(2020.12.23T12:55:48.835 2020.12.23T12:55:48.835;0 0;0 0;4 4)"
q)dosel tab
'type
[1] dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
^
q)dosel enlist tab
'type
[4] dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
^
q)dosel flip tab
'type
[7] dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
^
在上面的例子中可以看出,count 不是表格性质的一个很好的近似值。 如何可靠地将 tabular/dictionary 数据解析为适当的形式,以便可以应用 dosel。
抱歉,如果这是一个新手问题...再次感谢。
你的最后一个例子对我有用,我不确定你为什么会看到错误:
q)tab:`time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
q)
q)dosel flip tab
time tag direction scalar
-------------------------
无论哪种方式 - 您的函数设计用于 table,因此您需要确保您的输入始终是 table。这可以通过以下方式实现:
makeTab:{$[98h=type x;x;@[(flip;enlist)0>type first x;x]]};
q)dosel makeTab ([]time:2#.z.z;tag:0 0;direction:0 0;scalar:5 10)
time tag direction scalar
--------------------------------------------
2020.12.23T13:18:58.909 0 0 10
q)
q)dosel makeTab `time`tag`direction`scalar!(.z.z;0;0;4)
time tag direction scalar
-------------------------
q)
q)dosel makeTab `time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
time tag direction scalar
-------------------------
此 makeTab
函数假设您将传入 table 或字典,但如果需要可以进一步推广(例如键控 tables)