【问题标题】:How to match date and string from 2 lists (KDB)?如何匹配 2 个列表(KDB)中的日期和字符串?
【发布时间】:2018-02-05 17:18:22
【问题描述】:

我有两个列表:

data:
dt                             sym    bid    ask
2017.01.01D05:00:09.140745000  AAPL   101.20 101.30
2017.01.01D05:00:09.284281800  GOOG   801.00 802.00
2017.01.02D05:00:09.824847299  AAPL   101.30 101.40

info:
date          sym    shares    divisor
2017.01.01    AAPL   500       2
2017.01.01    GOOG   100       1
2017.01.02    AAPL   200       2

我需要根据日期从“信息”中附加每个股票代码的份额和除数值。我怎样才能做到这一点?下面是一个例子:

result:
dt                             sym    bid    ask     shares   divisor
2017.01.01D05:00:09.140745000  AAPL   101.20 101.30  500      2
2017.01.01D05:00:09.284281800  GOOG   801.00 802.00  100      1
2017.01.02D05:00:09.824847299  AAPL   101.30 101.40  200      2

【问题讨论】:

  • 如果您提供“最小、完整和可验证”的示例,人们测试和提供答案会容易得多。请参阅此处:stackoverflow.com/help/mcve 简而言之,如果您可以提供 Q 表达式来生成输入表,那将非常有帮助,例如真正的时间戳不是ts0
  • 假设表不能以其他方式读取或来自某些数据存储
  • 这样更好,但是如果你能提供一个 Q 表达式来设置表格,它会更有用。例如data:([] dt:(10?2017.01.01+til 2)+10?.z.t;sym:10?`AAPL`GOOG;bid:100+10?5;ask:105+10?5);info:([] date:2017.01.01 2017.01.01 2017.01.02;sym:`AAPL`GOOG`AAPL;shares:500 100 200;divisor:2 1 2)

标签: kdb q-lang


【解决方案1】:

如果匹配基于精确的日期匹配,那么您可以使用lj。为此,您需要在data 表中创建一个日期列,并通过datesym 键入info。像这样:

(update date:`date$dt from data)lj 2!info
dt                            sym  price    date       shares divisor
---------------------------------------------------------------------
2018.02.04D17:25:06.658216000 AAPL 103.9275 2018.02.04 500    2
2018.02.04D17:25:06.658216000 GOOG 105.1709 2018.02.04 100    1
2018.02.05D17:25:06.658217000 AAPL 105.1598 2018.02.05 200    2
2018.02.05D17:25:06.658217000 GOOG 104.0666 2018.02.05

然后您可以从此输出中删除 date 列。

【讨论】:

  • 我认为您需要使用2! 来键入datesym
  • TS,你是个传奇。谢谢你们。
【解决方案2】:

使用 step 属性 [http://code.kx.com/q/cookbook/temporal-data/#stepped-attribute] 可能对您有用

这将允许您拥有例如info 表中缺少日期,而是使用“最近”日期(因此您不必每天都有每个 sym 的数据)。例如,没有 step 属性:

q)data:([] dt:(10?2017.01.01+til 2)+10?.z.t;sym:10?`AAPL`GOOG;bid:100+10?5;ask:105+10?5)
q)info:([] date:2017.01.01 2017.01.01 2017.01.02;sym:`AAPL`GOOG`AAPL;shares:500 100 200;divisor:2 1 2)
q)(update date:`date$dt from data) lj 2!info
dt                            sym  bid ask date       shares divisor
--------------------------------------------------------------------
2017.01.01D04:04:03.440000000 GOOG 104 105 2017.01.01 100    1
2017.01.01D14:00:02.748000000 GOOG 104 105 2017.01.01 100    1
2017.01.02D09:34:52.869000000 GOOG 102 106 2017.01.02
2017.01.02D16:44:16.648000000 AAPL 100 107 2017.01.02 200    2
2017.01.01D08:48:23.285000000 AAPL 102 108 2017.01.01 500    2
2017.01.02D02:31:11.038000000 AAPL 104 109 2017.01.02 200    2
2017.01.01D05:50:50.463000000 GOOG 104 109 2017.01.01 100    1
2017.01.02D02:13:45.275000000 AAPL 101 107 2017.01.02 200    2
2017.01.01D10:25:30.322000000 AAPL 104 109 2017.01.01 500    2
2017.01.01D14:51:12.687000000 AAPL 103 109 2017.01.01 500    2

注意2017.01.02GOOG 的空值。带阶梯属性:

q)(update date:`date$dt from data) lj `s#2!`sym xasc `sym`date xcols info
dt                            sym  bid ask date       shares divisor
--------------------------------------------------------------------
2017.01.01D04:04:03.440000000 GOOG 104 105 2017.01.01 100    1
2017.01.01D14:00:02.748000000 GOOG 104 105 2017.01.01 100    1
2017.01.02D09:34:52.869000000 GOOG 102 106 2017.01.02 100    1
2017.01.02D16:44:16.648000000 AAPL 100 107 2017.01.02 200    2
2017.01.01D08:48:23.285000000 AAPL 102 108 2017.01.01 500    2
2017.01.02D02:31:11.038000000 AAPL 104 109 2017.01.02 200    2
2017.01.01D05:50:50.463000000 GOOG 104 109 2017.01.01 100    1
2017.01.02D02:13:45.275000000 AAPL 101 107 2017.01.02 200    2
2017.01.01D10:25:30.322000000 AAPL 104 109 2017.01.01 500    2
2017.01.01D14:51:12.687000000 AAPL 103 109 2017.01.01 500    2

这里,GOOG 获取 2017.01.01 的值,因为 2017.01.02 上没有新值

【讨论】:

    【解决方案3】:

    也可以使用 aj。

    q)aj[`date`sym;update date:`date$dt from data;info]
    dt                            sym  bid ask date       shares divisor
    --------------------------------------------------------------------
    2017.01.02D07:57:14.764000000 GOOG 101 109 2017.01.02 200    2
    2017.01.02D02:31:39.330000000 AAPL 100 105 2017.01.02 200    2
    2017.01.02D04:25:17.604000000 AAPL 102 107 2017.01.02 200    2
    2017.01.01D01:47:51.333000000 GOOG 104 106 2017.01.01 100    1
    2017.01.02D15:50:12.140000000 AAPL 101 107 2017.01.02 200    2
    2017.01.01D02:59:16.636000000 GOOG 102 106 2017.01.01 100    1
    2017.01.01D14:35:31.860000000 AAPL 100 107 2017.01.01 500    2
    2017.01.01D16:36:29.214000000 GOOG 101 108 2017.01.01 100    1
    2017.01.01D14:01:18.498000000 GOOG 101 107 2017.01.01 100    1
    2017.01.02D08:31:52.958000000 AAPL 102 109 2017.01.02 200    2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多