如何在 KDB 中将字典列表转换为 table?
How do I turn a list of dictionaries into a table in KDB?
我已经解码 JSON 生成一个 list
形式:
T v vw o c h l t n
---------------------------------------------------------------------------
"VMAR" 62737 5.0392 5.19 5.07 5.3 4.9555 1.640639e+12 345
"RADA" 376883 9.6936 9.49 9.64 9.87 9.43 1.640639e+12 3216
"MMLG" 23222 27.5049 27.3 27.54 27.55 27.3 1.640639e+12 89
"ITM" 92400 51.3968 51.4 51.4 51.42 51.38 1.640639e+12 307
"IBDS" 111584 26.5429 26.47 26.55 26.57 26.47 1.640639e+12 270
"VGZ" 441111 0.665 0.675 0.67 0.684 0.66 1.640639e+12 533
"MGTX" 110759 22.3499 22.52 22.53 22.62 21.78 1.640639e+12 1672
"AVID" 241058 32.7345 32.16 32.96 33.08 31.87 1.640639e+12 4512
"VBR" 311815 177.2026 176.54 178.52 178.52 175.47 1.640639e+12 4046
"EBIZ" 25115 27.5717 27.52 27.55 27.74 27.48 1.640639e+12 239
"WWJD" 503027 31.2307 31 31.1874 31.26 31 1.640639e+12 248
"OXACW" 6300 0.4 0.4 0.4 0.4 0.4 1.640639e+12 1
"MSOS" 835924 25.4539 25.41 25.29 25.74 25.15 1.640639e+12 5566
每一行都是一个dict
。
我正在尝试将其变成 table。我该怎么做?
要复制的代码,如果您在 KDB 上设置了 TLS:
baseUrl: ":https://api.polygon.io/v2/aggs/grouped/locale/us/market/stocks/"
apiKey: "?apiKey=B__L_1gX9IPlqaSW7JDXv_Ef4i_LhObVOwd_yT"
polyDay: {(.j.k .Q.hg baseUrl, x, apiKey)`results}
r: polyDay["2021-12-27"]
对于不一致的字典列表,您可以强制将其折叠为 table,如下所示:
q)show D:(`a`b!1 2;`b`c!20 30);
`a`b!1 2
`b`c!20 30
q)(distinct raze key each D)#/:D
a b c
-------
1 2
20 30
但是,由于您的数据包含各种数据类型,该解决方案将导致某些列为混合类型,这是不受欢迎的,例如下面,列 vw
和 n
包含混合类型
q)meta (distinct raze key each r)#/:r
c | t f a
--| -----
T | C
v | f
vw|
o | f
c | f
h | f
l | f
t | f
n |
以下应该有效。感谢 Attila Vrabecz,最初在这里给出的解决方案 - How to merge a list of tables with different columns
q)\ts t:{raze((uj/)0#'x)uj/:x}enlist each r
70 9854464
或者如果您事先知道架构,您可以简化为
q)t:0#t // predefined schema
q)\ts t:raze t uj/:enlist each r
34 7768736
q)
q)meta t
c | t f a
--| -----
T | C
v | f
vw| f
o | f
c | f
h | f
l | f
t | f
n | f
我已经解码 JSON 生成一个 list
形式:
T v vw o c h l t n
---------------------------------------------------------------------------
"VMAR" 62737 5.0392 5.19 5.07 5.3 4.9555 1.640639e+12 345
"RADA" 376883 9.6936 9.49 9.64 9.87 9.43 1.640639e+12 3216
"MMLG" 23222 27.5049 27.3 27.54 27.55 27.3 1.640639e+12 89
"ITM" 92400 51.3968 51.4 51.4 51.42 51.38 1.640639e+12 307
"IBDS" 111584 26.5429 26.47 26.55 26.57 26.47 1.640639e+12 270
"VGZ" 441111 0.665 0.675 0.67 0.684 0.66 1.640639e+12 533
"MGTX" 110759 22.3499 22.52 22.53 22.62 21.78 1.640639e+12 1672
"AVID" 241058 32.7345 32.16 32.96 33.08 31.87 1.640639e+12 4512
"VBR" 311815 177.2026 176.54 178.52 178.52 175.47 1.640639e+12 4046
"EBIZ" 25115 27.5717 27.52 27.55 27.74 27.48 1.640639e+12 239
"WWJD" 503027 31.2307 31 31.1874 31.26 31 1.640639e+12 248
"OXACW" 6300 0.4 0.4 0.4 0.4 0.4 1.640639e+12 1
"MSOS" 835924 25.4539 25.41 25.29 25.74 25.15 1.640639e+12 5566
每一行都是一个dict
。
我正在尝试将其变成 table。我该怎么做?
要复制的代码,如果您在 KDB 上设置了 TLS:
baseUrl: ":https://api.polygon.io/v2/aggs/grouped/locale/us/market/stocks/"
apiKey: "?apiKey=B__L_1gX9IPlqaSW7JDXv_Ef4i_LhObVOwd_yT"
polyDay: {(.j.k .Q.hg baseUrl, x, apiKey)`results}
r: polyDay["2021-12-27"]
对于不一致的字典列表,您可以强制将其折叠为 table,如下所示:
q)show D:(`a`b!1 2;`b`c!20 30);
`a`b!1 2
`b`c!20 30
q)(distinct raze key each D)#/:D
a b c
-------
1 2
20 30
但是,由于您的数据包含各种数据类型,该解决方案将导致某些列为混合类型,这是不受欢迎的,例如下面,列 vw
和 n
包含混合类型
q)meta (distinct raze key each r)#/:r
c | t f a
--| -----
T | C
v | f
vw|
o | f
c | f
h | f
l | f
t | f
n |
以下应该有效。感谢 Attila Vrabecz,最初在这里给出的解决方案 - How to merge a list of tables with different columns
q)\ts t:{raze((uj/)0#'x)uj/:x}enlist each r
70 9854464
或者如果您事先知道架构,您可以简化为
q)t:0#t // predefined schema
q)\ts t:raze t uj/:enlist each r
34 7768736
q)
q)meta t
c | t f a
--| -----
T | C
v | f
vw| f
o | f
c | f
h | f
l | f
t | f
n | f