我有两张桌子
表1(订单)列:(日期,符号,数量) 表2(marketData)列:(日期,符号,收盘价)
我想将T + 0到T + 5的关闭添加到表1。
{[nday]
value "temp0::update date",string[nday],":mdDates[DateInd+",string[nday],"] from orders";
value "temp::temp0 lj 2! select date",string[nday],":date,sym,close",string[nday],":close from marketData";
table1::temp
} each (1+til 5)
我确信有更好的方法可以做到这一点,但是当我尝试运行此函数时出现'循环错误。有什么建议吗?
答案 0 :(得分:2)
有关常见错误,请参阅here。您的循环错误是因为您使用value
设置了视图,而不是全局变量。函数value
内部的评估就好像它在函数之外,所以你不需要::
。
那说还有很大的改进空间,这里有一些指示。
根据您的情况,您根本不需要value
。例如。这一行:
第一行可以简化为(我假设mdDates
是某种函数,你只需从一个整数中计算出日期,DateInd
一些一种全球性的):
{[nday]
temp0:update date:mdDates[nday;DateInd] from orders;
....
} each (1+til 5)
在这一点上,您似乎只是想尝试在列名称上附加内容:
select date",string[nday],":date
请记住,表格是翻转的词典......你可以通过键弄乱他们的列名,如下图所示(非常难得):
q)t:flip `a`b!(1 2; 3 4)
q)t
a b
---
1 3
2 4
q)flip ((`$"a","1"),`b)!(t`a;t`b)
a1 b
----
1 3
2 4
你也可以使用功能选择,这是更整洁的IMO:
q)?[t;();0b;((`$"a","1"),`b)!(`a`b)]
a1 b
----
1 3
2 4
答案 1 :(得分:0)
好像您想拥有p0
至p5
列,其价格对应于date+0
至date+5
日期。
使用副词over
迭代0
至5
天:
q)orders:([] date:(2018.01.01+til 5); sym:5?`A`G; qty:5?10)
q)data:([] date:20#(2018.01.01+til 10); sym:raze 10#'`A`G; price:20?10+10.)
q)delete d from {c:`$"p",string[y]; (update d:date+y from x) lj 2!(`d`sym,c )xcol 0!data}/[ orders;0 1 2 3 4]
date sym qty p0 p1 p2 p3 p4
---------------------------------------------------------------
2018.01.01 A 0 10.08094 6.027448 6.045174 18.11676 1.919615
2018.01.02 G 3 13.1917 8.515314 19.018 19.18736 6.64622
2018.01.03 A 2 6.045174 18.11676 1.919615 14.27323 2.255483
2018.01.04 A 7 18.11676 1.919615 14.27323 2.255483 2.352626
2018.01.05 G 0 19.18736 6.64622 11.16619 2.437314 4.698096