代码之家  ›  专栏  ›  技术社区  ›  Fomalhaut -C

在输入列表上迭代函数(Q/KDB)

  •  4
  • Fomalhaut -C  · 技术社区  · 6 年前

    我有一个功能, f[symbol;date0;date1] ,以及一系列日期

    2017.12.04
    2017.12.05
    2017.12.06
    

    我想为给定的符号运行此函数-假设为“AAPL”-每天运行一次。本质上:

    f[AAPL;2017.12.04;2017.12.04]
    f[AAPL;2017.12.05;2017.12.05]
    f[AAPL;2017.12.05;2017.12.05]
    

    这个函数返回一个表,所以我希望每个日期都附加到以前的结果中。最好的方法是什么?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Ryan McCarron    6 年前

    对于这种形式的函数,最好的方法是使用kdb each-both 一般形式:

    d:2017.12.04 2017.12.05 2017.12.06
    
    f'[`AAPL;d;d]
    

    kdb识别原子第一个参数和列表第二个参数,并将函数按顺序应用于每个参数。您还可以使用raze按顺序连接每个表:

    raze f'[`AAPL;d;d]
    

    然后,如果架构相同,则返回单个联接表。

        2
  •  2
  •   Sean O'Hagan Rahul    6 年前

    假设f为每个调用生成相同的列,那么可以将结果夷为平地

    q)f:{([]1#x;1#y;1#z)};
    q)raze f'[`a;3#.z.d;3#.z.d-1]
    x y          z
    -----------------------
    a 2018.02.07 2018.02.06
    a 2018.02.07 2018.02.06
    a 2018.02.07 2018.02.06
    

    结果是一个[更大的]表,结果彼此附加