如何优化批量旋转?

How to optimize a batch pivotization?

我有一个日期时间列表(出于某种原因我称之为列 date)包含超过 1k 的日期时间。

adates:2017.10.20T00:02:35.650 2017.10.20T01:57:13.454 ...

对于这些日期中的每一个,我都需要 select 来自某些 table 的数据,然后按列 t 进行透视,即到期,添加相应的 date 日期时间作为枢轴化 table 的列,并将所有日期的枢轴化拼接在一起。请注意,我应该能够确定哪个透视化对应于一个日期,这就是我一个一个进行的原因:

fPivot:{[adate;accypair]
     t1:select from volatilitysurface_smile where date=adate,ccypair=accypair;
     mycols:`atm`s10c`s10p`s25c`s25p;
     t2:`t xkey 0!exec mycols#(stype!mid) by t:t from t1;
     t3:`t xkey select distinct t,tenor,xi,volofvol,delta_type,spread from t1;
     result:ej[`t;t2;t3];
     :result}

然后我为每个日期时间 adates 调用此函数,如下所示:

raze {[accypair;adate] `date xcols update date:adate from fPivot[adate;accypair] }[`EURCHF] @/: adates;

这大约需要 90 秒。我想知道是否有更好的方法,例如做一个大的透视而不是 运行 每个日期一个透视,然后将它们拼接在一起。我看到的大问题是,我没有明显的方法将 date 属性作为透视化的一部分,并且 date 不能丢失,否则我无法协调结果。

如果您还没有访问过 pivoting then it may be a good start. There is a section on a general pivoting function 上的维基页面,该页面声称有些效率:

One user reports:

This is able to pivot a whole day of real quote data, about 25 million quotes over about 4000 syms and an average of 5 levels per sym, in a little over four minutes.

至于一般注释,我会说ej is unnecessary as it is a more general version of ij,允许您指定键列。由于 t2t3 具有相同的键控,我会改用:

t2 ij t3

这可能会给您带来非常小的性能提升。

好的,我通过创建一个批处理版本的透视化来解决这个问题,该透视化在进行透视所需的按位分组时保留日期(日期时间)table 字段,即 by t:t from ... 到 [=12] =].它从 90 秒下降到 150 毫秒。

fBatchPivot:{[adates;accypair]
    t1:select from volatilitysurface_smile where date in adates,ccypair=accypair;
    mycols:`atm`s10c`s10p`s25c`s25p;
    t2:`date`t xkey 0!exec mycols#(stype!mid) by date:date,t:t from t1;
    t3:`date`t xkey select distinct date,t,tenor,xi,volofvol,delta_type,spread from t1;
    result:0!(`date`t xasc t2 ij t3);
    :result}