如何通过 sym 删除前 252 行?

How can I drop the first 252 rows by sym?

我有一个 table 带有 sym-date 索引。

我试图恢复相同的 table,但跳过每个符号的前 252 行。

我预计会是:

ungroup 252_select by sym from t

但这不起作用。我做错了什么?

您正在寻找这样的东西

select from t where 252<=(rank;i) fby sym

其中 rank returns 排序列表中的位置, fby 用于在 sym[=20] 上拆分时将此函数应用于 i 的每个子集=]

您的尝试失败的原因

  • select by sym from t returns 每个符号只有最后一行
  • 因此,当您使用 252_ 删除行时,您将删除最后 252 行
  • ungroup 可能会失败,因为您有两列或更多列具有不同长度的向量元素

如果您想通过 ungroup 执行此操作,您可以使用 xgroup 执行以下操作以保留分组中的所有行

ungroup 252_/:/:`sym xgroup t

我想出了一个公认的更复杂的解决方案:

t:([] date:.z.D+til 1008;sym:(504#`A),(504#`B);px:1008?1.0); / test table
s:252; / # of elements to skip
ungroup (key tt)!{flip (x)_flip y}/: [s;tt[key tt:?[t;();((,)`sym)!(,)`sym;`date`px!`date`px]]]

逻辑涉及:

  • sym
  • 分组
  • 正在将结果分配给 table tt
  • 逐一处理分组字典
  • 重构table

现在,我最初尝试与上面提出的 fby 解决方案进行基准测试,针对非常小的 table 进行测试,使用 fby 的解决方案快 50%:

t:([] date:.z.D+til 10;sym:(5#`A),(5#`B);px:10?1.0);
s:2;
\t:100000 ungroup (key tt)!{flip (x)_flip y}/: [s;tt[key tt:?[t;();((,)`sym)!(,)`sym;`sym`px!`sym`px]]]
796
\t:100000 select from t where s<=(rank;i) fby sym
396

但是,当使用开始时提出的更大table(总共1008行,每个代码跳过前252行)时,性能排名发生变化:

\t:100000 select from t where s<=(rank;i) fby sym
2384
\t:100000 ungroup (key tt)!{flip (x)_flip y}/: [s;tt[key tt:?[t;();((,)`sym)!(,)`sym;`sym`px!`sym`px]]]
1679

select from t where 1=({x>252};i) fby sym