【问题标题】:kdb - how to augment table with missing dates in a dynamic/fast waykdb - 如何以动态/快速的方式增加缺少日期的表
【发布时间】:2020-07-17 16:25:48
【问题描述】:

我有一个以(日期、符号、符号类型、因子、权重)为列的内存表。

在某些情况下,此内存中的表曾经针对特定日期范围进行查询,但会丢失整个日期。可能是今天的数据,或者如果我们要查询多个日期,可能是中间的一天,也可能是多天,或者是最后一个日期,或者是开始。

我怎样才能想出一个查询来填充那些缺失的日期以及截至该点的最大日期?

所以如果我们有如下数据: 例子:

.z.D 
.z.D-2
.z.D-3
.z.D-6
.z.D-7

我希望表格如下所示:

.z.D -> .z.D
.z.D-1 -> copy of .z.D-2
.z.D-2 -> .z.D-2
.z.D-3 -> .z.D-3
.z.D-4 -> copy of .z.D-6
.z.D-5 -> copy .z.d-6
.z.D-6 -> .z.D-6
.z.D-7 -> .z.D-7

如果您的查询中缺少今天,请使用以前的可用日期作为今天。 如果在您的查询中最后一天是昨天并且它丢失了,则使用前一个可用日期作为昨天,依此类推。 如果您的最后一个(最短日期)缺失,请向上使用下一个可用日期。

我可以通过识别缺失的日期并逐日查看缺失的日期来手动执行此操作,但我想知道是否有更好的方法来执行此操作。

aj 可以通过构造 ([] date: listofdesireddates) cross ([] sym: listofsyms) cross ([] sector: symtype) 来处理中间日期,然后对表格执行 aj 但它没有解决所有情况,例如错过的日期是今天还是开始时。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    你能想出一个可重复的例子来说明为什么aj 不起作用吗?正常aj使用应该可以解决这个问题:

    t1:([]date:.z.D-til 8;sym:`ABC);
    t2:`date xasc([]date:.z.D-0 2 3 6 7;sym:`ABC;data:"I"$ssr[;".";""]each string .z.D-0 2 3 6 7);
    
    q)aj[`sym`date;t1;t2]
    date       sym data
    -----------------------
    2020.07.20 ABC 20200720
    2020.07.19 ABC 20200718
    2020.07.18 ABC 20200718
    2020.07.17 ABC 20200717
    2020.07.16 ABC 20200714
    2020.07.15 ABC 20200714
    2020.07.14 ABC 20200714
    2020.07.13 ABC 20200713
    
    /If you need your last date to fill "upwards" then use fills:
    
    update fills data by sym from aj[`sym`date;([]date:.z.D-til 9;sym:`ABC);t2]
    

    【讨论】:

    • 看起来像预期的那样工作 - 不知道为什么我认为它没有。谢谢@terrylynch
    【解决方案2】:

    快速猜测,但结果上带有 xgroup 的阶跃函数似乎可以工作。

    res:getFromTab[dates];
    f:{`date xcols:update date:x from y@x};
    xgrp:`s#`date xasc `date xgroup res;
    raze f[;xgrp] each dates
    

    性能可能很糟糕......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多