我遇到了一个烦人的问题。我们在 kdb+ 数据库中得到了股票代码 AGN-A,但是查询这个代码是否在代码列表中几乎是不可能的。以下查询根本不起作用:
`$"A-o" in (`$"A-o";`R)
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
您将如何使用 q kdb 解析格式为“dd/MM/yyyy”的日期字符串?
当月份参数是第一个 "MM/dd/yyyy" 时是可能的,如下所示:
"D"$"1/20/2014"
2014-01-20d
Run Code Online (Sandbox Code Playgroud)
但是,如果第一天是“dd/MM/yyyy”
"D"$"20/1/2014"
0Nd
Run Code Online (Sandbox Code Playgroud) 这个有效:
d1:`t1`t2`idx!(2017.01.01;2018.01.01;42)
Run Code Online (Sandbox Code Playgroud)
但是这个失败了(类型错误):
d2:()!()
d2[`t1]:2017.01.01
d2[`t2]:2018.01.01
d2[`idx]:42
Run Code Online (Sandbox Code Playgroud)
有解决方法吗?为了更好的可读性,我想逐键(逐行)填充字典。实际上,它更长。
在Kdb+中,如何使用“roll”函数使生成的随机数落在不以0开头的范围内?例如,如果我希望范围在 2-10 而不是 0-10 内怎么办?
我必须在代码中添加什么才能使其落入一个范围而不是默认的 0-x 范围内?我已经尝试并寻找了每一种方法,但似乎找不到一种方法。
我正在尝试通过 Haskell 类型系统对 kdb/q“原子和列表”进行建模。
在 kdb/q 中,所有数据都是由原子构建的。原子是特定数据类型的不可约值。Int、boolean 和 char 是原子的例子。列表是从原子构建的有序集合。由于 q 是一种向量语言,大多数内置操作都是原子的,因此它会递归到参数结构中,直到到达原子。
例如:
(1;2;3) 是一个简单的整数列表 1, 2, 3
(1.0;2;(3;4;5)) 是 1.0(float), 2(int) 的一般列表,以及简单的 int 列表 (3;4;5)
neg 是一个否定一个数字的函数。例如:
负 1 产生 -1
负 -1.0 产生 1f
负 (1.0;2;(3;4;5)) 产生 (-1f;-2;(-3;-4;-5))。
这就是激励我尝试在 Haskell 类型中模拟这种行为的原因。数据类型应该由原子类型和一个列表组成。
以下是我目前所拥有的简化版本。我还进一步尝试使其成为可折叠和可遍历的实例。
data Atom = I Int
| C Char
| D Double
deriving Show
data Q a = QAtom a
| QList [Q a]
deriving Show
instance Functor Q where
fmap f (QAtom a) = QAtom (f …Run Code Online (Sandbox Code Playgroud) 我有以下函数来识别空符号,哪里ns 应该代表空符号。
#include"k.h"
K test (K x) {
K ns = ks("");
if (abs(x->t) != KS) {
R krr("type");
}
if (x->t > 0) {
K res = ktn(KB,x->n);
for (int i=0;i<x->n;++i){
if (kK(x)[i] == ns) {
kG(res)[i] = 1;
}
else {
kG(res)[i] = 0;
}
}
R res;
}
else {
if (x == ns) {
R kb(1);
}
else {
R kb(0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
检查参数x(或kK(x)[i]arg的元素x)的相等性ns并没有按我预期的那样工作。
q)`test …Run Code Online (Sandbox Code Playgroud) 我想从符号列表中过滤掉包含 `1 的记录
示例表:
tab:([]a:((``1`2);`a;b);c:1 2 3);
Run Code Online (Sandbox Code Playgroud)
我试过这个:
select from tab where a = `1
Run Code Online (Sandbox Code Playgroud)
还有这个:
select from tab where `1 in raze a
Run Code Online (Sandbox Code Playgroud)
这些都不起作用。
我试图以与“as of”连接非常相似的方式连接两个表,除了不是选择具有最后一个时间戳的行进行连接(假设它们按时间顺序排序),我想加入最接近的时间戳。例如:
q)t: ([]time:10:00:06 10:00:03 10:00:04;sym:`msft`ibm`ge;qty:100 200 150)
q)t
time sym qty
-----------------
10:00:06 msft 100
10:00:03 ibm 200
10:00:04 ge 150
q)q: ([]time:10:00:00 10:00:00 10:00:02 10:00:07 10:02:00;sym:`ibm`msft`msft`msft`ibm;px:100 99 101 102 98 )
q)q
time sym px
-----------------
10:00:00 ibm 100
10:00:00 msft 99
10:00:02 msft 101
10:00:07 msft 102
10:02:00 ibm 98
Run Code Online (Sandbox Code Playgroud)
加入时的标准:
q)aj[`sym`time;t;q]
time sym qty px
---------------------
10:00:06 msft 100 101 //10:00:02 is closest timestamp that is not greater than 10:00:06, so that px is chosen
10:00:03 …Run Code Online (Sandbox Code Playgroud) 我注意到以下几点
select (count t)#`test from t
Run Code Online (Sandbox Code Playgroud)
退货
flip (enlist `x)!enlist enlist `test`test`test
Run Code Online (Sandbox Code Playgroud)
对比
select 3#`test from t
Run Code Online (Sandbox Code Playgroud)
哪个返回
flip (enlist `x)!enlist `test`test`test
Run Code Online (Sandbox Code Playgroud)
与select (sum 1 2)#1 from tvsselect(1 + 2)#1 from t等类似
任何人都知道为什么选择中的关键字似乎导致返回是一个包含一行嵌套列表的表,其中包含 x 元素与一个包含 x 行的表?
我写了一个下面的代码,但我认为会有更好的方法来解决这个问题。
我有这样的事情
table:([]time:9 11;Bid1px:4 5;Bid2px:7 3;Bid3px:6 8);
time Bid1px Bid2px Bid3px
-------------------------
9 4 7 6
11 5 3 8
table:update All_bid:flip(Bid1px;Bid2px;Bid3px) from table;
time Bid1px Bid2px Bid3px All_bid
---------------------------------
9 4 7 6 4 7 6
11 5 3 8 5 3 8
Run Code Online (Sandbox Code Playgroud)
我想使用如下所示的 Bidcols 编写代码,但似乎找不到方法,任何帮助将不胜感激。
Bidcols:`Bid1px`Bid2px`Bid3px;
table:update All_bid:flip(Bidcols????) from table;
Run Code Online (Sandbox Code Playgroud)