如何优化批量旋转?
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
,允许您指定键列。由于 t2
和 t3
具有相同的键控,我会改用:
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}
我有一个日期时间列表(出于某种原因我称之为列 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
,允许您指定键列。由于 t2
和 t3
具有相同的键控,我会改用:
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}