【问题标题】:Composing symbols in KDB在 KDB 中组合符号
【发布时间】:2017-08-15 11:03:34
【问题描述】:

我目前正在开发一个与 kdb+ 数据库交互的 python 项目。数据库的未来版本将有一个小的变化,由于我无法继续我的 python 编程,我想我应该自己试一试,而不是等待 kdb 开发人员的更新。

我正在使用一个模拟数据库,该数据库会随机生成如下所示的符号:instr1instr2instr81 等。

我环顾四周并相信这些符号是由.gen.uni:$"instr",/: string til .gen.cfg.uniSize;这一行生成的

我想要实现的是将符号设为 exchangeX.instrY 而不仅仅是 instrY(其中 X 和 Y 只是一些生成的数字)。

为了方便起见,我已将线路更改为 $"instr",/: string til 4,这样我的大脑就不会那么痛了。

如何实现这样的目标?我发现了sv 函数,因此我尝试了sv ($"exchange",/: string til 4;$"instr",/: string til 4) 的许多变体,但似乎没有任何效果。

感谢您的宝贵时间!

PS:由于 SO 的格式,我在这里和那里删除了一些反引号

【问题讨论】:

    标签: kdb q-lang


    【解决方案1】:

    使用滚动运算符可用于生成此类数据:http://code.kx.com/q/ref/random/#roll

    下面的函数将生成一个随机的符号列表。

    参数:

    x - 要生成的符号数

    y - 不同交易所的数量

    z - 不同乐器的数量

    q){` sv' flip `$("exch",/:string x?y;"inst",/:string x?z)}
    
    
    q){` sv' flip `$("exch",/:string x?y;"inst",/:string x?z)}[100;4;10]
    `exch0.inst2`exch3.inst3`exch3.inst0`exch2.inst0`exch3.inst4`exch3.inst4`exch2.inst0`exch0.inst3`exch3.inst4`exch0.inst5`exch3.inst0`exch1.inst5`exch1.inst7`exch2.inst4`exch2.inst3`exch3.inst1`exch3.inst6`exch2.inst2`exch2.inst..
    q)
    

    【讨论】:

    • 感谢您的回答!虽然当我把它放在生成器文件中时它仍然不起作用,但它做了我想要的!
    【解决方案2】:

    这就是你要找的吗?我把它分开了一点。

    `$"exchange" ,/: (string til 4) ,' ".inst" ,/: string til 4
    

    【讨论】:

    • 您好!是的,它确实看起来像那样!当我尝试将其转换回生成器格式并将其放入生成器文件时,它并没有按预期工作:.gen.uni:`$"exchange" ,/: (string til .gen.cfg.uniSize) ,' ".inst" ,/: string til .gen.cfg.uniSize。有什么想法吗?
    • 我觉得不错。当你说它没有按预期工作时,你期待什么?
    • 你的回答很完美。问题是我正在尝试在模拟数据生成器中实现这一目标。因此,我不想在最后使用固定的til 4,而是使用脚本中已经存在的.gen.cfg.uniSize 变量(同样,我没有编写它,只是试图实现这一点,以便我可以继续我的python代码)。我不确定这个变量是什么,但如果我查找定义我会发现这个.gen.cfg.uniSize: .cr.getCfgField[`THIS;`group;`cfg.uniSize];
    • 此时对我来说最重要的是instr 可以有多个exchange。例如:exchange3.instr8exchange20.instr8。使用til 4 时,数字始终匹配。这对我的用例来说有点没用。感谢您的宝贵时间,非常友好;)
    【解决方案3】:

    Adverbs 删除一些重复。对于来自 4 个交易所中任何一个的 10 个工具中的任何一个的 100 个示例:

    "."sv/:flip("exchange";"inst"),/:'string 100?/:4 10
    

    稍微分解一下:100?/:4 10 返回两个 100 向量,一个从 0-3 绘制,另一个从 0-99 绘制,由 /: (each-right) 副词提供。 string 将它们转换为字符串。我们称之为n

    q)show n:string 100?/:4 10
    ,"3" ,"2" ,"3" ,"0" ,"3" ,"3" ,"1" ,"2" ,"3" ,"3" ,"3" ,"3" ,"3" ,"1" ,"1" ,"..
    ,"9" ,"5" ,"2" ,"3" ,"7" ,"7" ,"6" ,"7" ,"2" ,"0" ,"3" ,"5" ,"0" ,"5" ,"2" ,"..
    

    each-right副词修饰join函数,所以:

    q)"exchange",/:n 0
    "exchange3"
    "exchange2"
    "exchange3"
    ..
    

    我们可以修改派生函数 ,/:each-both ' 以在第一个向量中的字符串前缀为"exchange",在第二个向量中的字符串为"inst"

    q)("exchange";"inst"),/:'n
    "exchange3" "exchange2" "exchange3" "exchange0" "exchange3" "exchange3" "exch..
    "inst9"     "inst5"     "inst2"     "inst3"     "inst7"     "inst7"     "inst..
    

    现在我们只需要将flip这对向量变成一个向量对

    q)flip("exchange";"inst"),/:'n
    "exchange3" "inst9"
    "exchange2" "inst5"
    "exchange3" "inst2"
    "exchange0" "inst3"
    "exchange3" "inst7"
    ..
    

    并用 each-right 修改 sv 以加入每一对:

    q)"."sv/:flip("exchange";"inst"),/:'n
    "exchange3.inst9"
    "exchange2.inst5"
    "exchange3.inst2"
    "exchange0.inst3"
    "exchange3.inst7"
    ..
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多