Kdb 如何优化批量数据透视?

Kdb 如何优化批量数据透视?,kdb,q-lang,Kdb,Q Lang,我有一个datetime列表(出于某种原因,我称之为列date),其中包含超过1k个datetime adates:2017.10.20T00:02:35.650 2017.10.20T01:57:13.454 ... 对于这些日期中的每一个,我需要从某个表中选择数据,然后按列t进行数据透视,即到期,将相应的datedatetime作为列添加到数据透视表中,并将所有日期的数据透视拼接在一起。请注意,我应该能够识别哪个数据透视对应于一个日期,这就是为什么我会逐一进行: fPivot:{[adat

我有一个datetime列表(出于某种原因,我称之为列
date
),其中包含超过1k个datetime

adates:2017.10.20T00:02:35.650 2017.10.20T01:57:13.454 ...
对于这些日期中的每一个,我需要从某个表中选择数据,然后按列
t
进行数据透视,即到期,将相应的
date
datetime作为列添加到数据透视表中,并将所有日期的数据透视拼接在一起。请注意,我应该能够识别哪个数据透视对应于一个日期,这就是为什么我会逐一进行:

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}
然后,我为每个datetime
adates
调用此函数,如下所示:

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

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

如果您没有访问过上的wiki页面,那么这可能是一个好的开始。有一个关于a的部分声称它有一定的效率:

一个用户报告:

这可以使一整天的真实报价数据集中,大约2500万 报价超过4000 sym,平均每sym 5级 四分钟多一点

至于一般性评论,我认为没有必要,因为它是的更一般版本,允许您指定键列。由于
t2
t3
具有相同的键控,我将使用:

t2 ij t3

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

好的,我通过创建数据透视的批处理版本解决了这个问题,该版本在按位进行数据透视时保留了日期(datetime)表字段,即按t:t从…到按日期:日期,t:t从…。它从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}

您在
adates
中提供的数据类型为datetime而不是timestamp。kdb中的时间戳类似于
2017.11.28D12:55:47.354335000
。请注意日期和时间之间的分隔符
D
与日期时间类型中的分隔符
T
相比。请更正我的错误,正在更新..嗨,托马斯,谢谢你的回答。是的,我去过那个维基,那是我构建数据透视的方式。我曾经尝试过使用这个函数,但它非常复杂,特别是要弄清楚f和g应该是什么,但它看起来确实很有希望。如果您能演示如何为OP调用通用pivot,您的答案将是完整的:)如果您给出一个示例
volatilitysurface\u smile
表,甚至只是该表的模式,我可以尝试尝试一下。将其编辑到问题中可能也有助于其他人制定答案。看起来不错,你可以接受它作为总结此问题的答案。