【问题标题】:What is the purpose of these two kdb functions?这两个kdb函数的目的是什么?
【发布时间】:2020-07-01 07:19:48
【问题描述】:

我已经有一段时间没有使用 kdb 了。我正在尝试了解这两个功能:

trade:([]sym:n?`sym;time:10:30:00.0+til
n;price:n?3.3e;size:n?9;ex:n?ex);
quote:([]sym:n?`sym;time:10:30:00.0+til
n;bid:n?3.3e;ask:n?3.3e;bsize:n?9;asize:n?9;ex:n?ex);
{@[;`sym;`p#]`sym xasc x}each`trade`quote;
d:2014.08.07 2014.08.08 2014.08.09 2014.08.10 2014.08.11; /Date vector can also be changed by the user
dt:{[d;t].[dst;(`$string d;t;`);:;value t]};

我正在努力理解这一点 @[;`sym;`p#]`sym xasc x}each`trade`quote;

这里的`p# 是什么?那么从交易表和报价表中,它们将 sym 传递给函数吗?而这个函数只是 order sym?一切都在这里做什么?

还有这个dt:{[d;t].[dst;(`$string d;t;`);:;value t]};,这是省钱功能吗?

【问题讨论】:

    标签: database kdb


    【解决方案1】:

    `p# 是 parted 属性,应用于所有不同值相邻的列表,并创建列表中所有不同值到它们出现位置的第一个索引的映射。这允许更快的查找和查询。 parted 属性通常用于存储在磁盘上的表,而 grouped 属性 (`g#) 用于内存中的表。

    函数@[`trade;`sym;`p#] 将parted 属性应用于交易表的sym 列,但只能在不同值相邻时应用。 `sym xasc `trade 按 sym 列升序对交易表进行排序。对于交易和报价数据,通常时间会在 sym 中排序,然后再应用 parted 属性。

    将这两个表达式放在一起 我们得到@[;sym`p#] `sym xasc `trade,与 @[`sym xasc `trade;sym;`p#]。这会将 parted 属性应用于交易表上的 sym 列,该列已按 sym 排序。

    如果dst 是一个目录的路径,那么dt:{[d;t].[dst;(`$string d;t;`);:;value t]} 是日期列表d 中的每个日期,而对于表t,它正在保存表。 dt[d;`quote] 将通过以下方式保存报价表

    dst
    ├── 2014.08.07
    │   ├── quote
    │   │   ├── asize
    │   │   ├── ask
    │   │   ├── bid
    │   │   ├── bsize
    │   │   ├── ex
    │   │   ├── sym
    │   │   └── time
    ├── 2014.08.07
    │   ├── quote
    │   │   ├── asize
    .
    .
    .
    

    【讨论】:

    • 谢谢!只有一个问题。为什么它不使用 x ?像这样 {@[x;sym;p#]sym xasc x}eachtrade`quote;为什么表格参数只留空?
    • x 未排序,因此无法保证直接将 parted 属性应用于它。 @[;`sym;`p#] 是一个投影,排序表是第一个参数。您可以在此处阅读有关预测的更多信息:code.kx.com/q/basics/application/#projection
    猜你喜欢
    • 2014-01-19
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多