我有一个随机的数据表,包含日期和数字:
Date Open Volume abschange
2016.12.08D00:00:00.000000000 11035.76 1.74835e+008 1.30177
2016.12.09D00:00:00.000000000 11170.18 1.0383e+008 0.2994598
2016.12.12D00:00:00.000000000 11198.42 8.98117e+007 0.07331357
...
2016.12.30D00:00:00.000000000 11443.31 4.18109e+007 0.3298871
2017.01.02D00:00:00.000000000 11426.38 4.74561e+007 1.504853
因此,从这个表中,我希望能够创建一个列表,其中包含日期前10天的所有条目,该列表的潜逃次数>1。
我认为从关注这些日期开始最容易:
Date abschange
---------------------------------------
2016.12.08D00:00:00.000000000 1.30177
2017.01.02D00:00:00.000000000 1.504853
2017.01.25D00:00:00.000000000 1.099709
2017.01.31D00:00:00.000000000 1.344625
2017.02.06D00:00:00.000000000 1.016427
2017.02.21D00:00:00.000000000 1.265196
然后创建一个平面列表:
mynewdates: raze tablewithDateAndabschange each
这给了我:
2016.12.08D........ 2017.01.02D......
当我想为列表中的每个条目添加10个之前的日期时,我就陷入了困境。
我真的可以根据第一个表在一行代码中得到我想要的结果吗?还是应该按照我现在的路径?
对于两者——如果可能的话,可能的解决方案是什么?
如果我的理解是正确的,您的要求是:
- 对于潜逃>1的每个日期,从表中获取该日期之前的最后10个日期
下面的查询将创建该映射。它基于以下假设:
- 日期列是唯一的,并且按照示例中显示的顺序(升序(排列
如果上述条件不成立,则需要对下面的查询进行细微的更改才能处理重复和无序列表。
-
表未设置键。
q) (tbl[`Date]a)!b@'where@'not null b:tbl[`Date] -1+(a:where 1<tbl`abschange)-:til 10
更新:基于评论部分的讨论。
只需添加第二步来检查第一个结果的日期列表是否为空。在这种情况下,从该日期生成最后10个日期。
最后,它生成一个表,其中每一行都包含每个日期的前一个日期(最大10个(,其中abschange>1。
q)d:b@'where@'not null b:tbl[`Date] -1+(a:where 1<tbl`abschange)-:til 10
q)d[0]:$[0=count d 0;(t[`Date]a 0)-1+til 10;d 0]
q)([]dates:d)