(q/kdb+) 搜索列金额
(q/kdb+) Search column amounts
有人可以帮我解决以下问题吗?
nColss:1 3 4 4.5;
aa:([]amount:250000+500000*5?10;n1M:0.5*5?4;n3M:2+0.5*5?4;n4M:4+0.5*5?4;n4.5M:6+0.5*5?4);
aa:update nRng:{[l;n] (min l | l l bin n),(l l binr n & max l)}[nColss] each aa[`amount]%1000000 from aa;
aa:update nRng2:{`$("n",'string x),'"M"} each aa[`nRng] from aa;
amount n1M n3M n4M n4.5M nRng nRng2
250000 1.5 2 4 7 1 1f `n1M`n1M
2250000 0.5 2 5 6.5 1 3f `n1M`n3M
4250000 1.5 2.5 5 6 4 4.5 `n4M`n4.5M
250000 1 3.5 4.5 7.5 1 1f `n1M`n1M
1250000 1 2.5 4 7 1 3f `n1M`n3M
如何生成一个列 nValue,其中每一行都包含在 nRng2 列中指定的列的值?
像这样
nValue
1.5 1.5
0.5 2
5 6
1 1
1 2.5
我正在尝试类似
aa[aa[`nRng2]]
生成
index value
0 (1.5 0.5 1.5 1 1;1.5 0.5 1.5 1 1)
1 (1.5 0.5 1.5 1 1;2 2 2.5 3.5 2.5)
2 (4 5 5 4.5 4;7 6.5 6 7.5 7)
3 (1.5 0.5 1.5 1 1;1.5 0.5 1.5 1 1)
4 (1.5 0.5 1.5 1 1;2 2 2.5 3.5 2.5)
然后我需要取这个矩阵的对角线,但我坚持了下来。
当我输入您的示例代码时,我在 aa
table 中得到的值略有不同,但像这样的东西似乎有效:
q)aa[`nValue]:{x x`nRng2} each aa
q)aa
amount n1M n3M n4M n4.5M nRng nRng2 nValue
-----------------------------------------------------
4750000 0.5 2 4.5 6 4.5 4.5 n4.5M n4.5M 6 6
1250000 0 3.5 5 6 1 3 n1M n3M 0 3.5
3750000 0.5 2.5 5.5 7 3 4 n3M n4M 2.5 5.5
250000 1 3 5 6.5 1 1 n1M n1M 1 1
750000 0 3 4.5 7 1 1 n1M n1M 0 0
快速解释这是做什么的;通过执行 each aa
,我们实际上是将 table 中的每条记录作为字典传递给 lambda 函数(kdb+ 中的 table 只是一个字典列表)。在此我们使用 nRng2
对记录进行索引以获取列名,然后使用 those 列名再次对字典进行索引。然后我们使用索引符号分配它以添加新列
有人可以帮我解决以下问题吗?
nColss:1 3 4 4.5;
aa:([]amount:250000+500000*5?10;n1M:0.5*5?4;n3M:2+0.5*5?4;n4M:4+0.5*5?4;n4.5M:6+0.5*5?4);
aa:update nRng:{[l;n] (min l | l l bin n),(l l binr n & max l)}[nColss] each aa[`amount]%1000000 from aa;
aa:update nRng2:{`$("n",'string x),'"M"} each aa[`nRng] from aa;
amount n1M n3M n4M n4.5M nRng nRng2
250000 1.5 2 4 7 1 1f `n1M`n1M
2250000 0.5 2 5 6.5 1 3f `n1M`n3M
4250000 1.5 2.5 5 6 4 4.5 `n4M`n4.5M
250000 1 3.5 4.5 7.5 1 1f `n1M`n1M
1250000 1 2.5 4 7 1 3f `n1M`n3M
如何生成一个列 nValue,其中每一行都包含在 nRng2 列中指定的列的值?
像这样
nValue
1.5 1.5
0.5 2
5 6
1 1
1 2.5
我正在尝试类似
aa[aa[`nRng2]]
生成
index value
0 (1.5 0.5 1.5 1 1;1.5 0.5 1.5 1 1)
1 (1.5 0.5 1.5 1 1;2 2 2.5 3.5 2.5)
2 (4 5 5 4.5 4;7 6.5 6 7.5 7)
3 (1.5 0.5 1.5 1 1;1.5 0.5 1.5 1 1)
4 (1.5 0.5 1.5 1 1;2 2 2.5 3.5 2.5)
然后我需要取这个矩阵的对角线,但我坚持了下来。
当我输入您的示例代码时,我在 aa
table 中得到的值略有不同,但像这样的东西似乎有效:
q)aa[`nValue]:{x x`nRng2} each aa
q)aa
amount n1M n3M n4M n4.5M nRng nRng2 nValue
-----------------------------------------------------
4750000 0.5 2 4.5 6 4.5 4.5 n4.5M n4.5M 6 6
1250000 0 3.5 5 6 1 3 n1M n3M 0 3.5
3750000 0.5 2.5 5.5 7 3 4 n3M n4M 2.5 5.5
250000 1 3 5 6.5 1 1 n1M n1M 1 1
750000 0 3 4.5 7 1 1 n1M n1M 0 0
快速解释这是做什么的;通过执行 each aa
,我们实际上是将 table 中的每条记录作为字典传递给 lambda 函数(kdb+ 中的 table 只是一个字典列表)。在此我们使用 nRng2
对记录进行索引以获取列名,然后使用 those 列名再次对字典进行索引。然后我们使用索引符号分配它以添加新列