我有一个带有列a、b、c的表。我可以用函数形式计算cor[a;a],cor[a;b],cor[a;c]的相关矩阵吗
?[table; (); 0b; (`aa`ab`ac)!((cor; `a; `a); (cor; `a; `b);(cor; `a; `b));
如何生成最后一个参数的列表?
(cor;a;b)因此手动键入的表单:
q)t:([] a:10?10; b:10?10; c:10?10)
q)?[t;();0b;`aa`ab`ac!((cor;`a;`a);(cor;`a;`b)
我试图在KDB中创建一个表,其中的列是查询的结果。例如,我加载了股票数据并搜索给定的时间窗口,该股票的交易价格是多少。我创建了一个函数
getTrades[Sybmol;日期;开始时间;停止时间]
这将搜索我的数据库并返回在开始和停止时间之间交易的价格。因此,我对苹果30秒窗口的结果可能是:
527.10、527.45、527.60、526.90等
我现在要做的是使用xbar创建一个表,在这里我有每秒的行和以StartTime和StopTime交易的所有价格的列。如果价格在这1秒内交易,我将在列
我有一个q表,其中非键列的数量是可变的。此外,这些列名的名称中包含一个整数。我想对这些列执行一些函数,而不实际使用它们的实际名称
我怎样才能做到这一点
例如:
table:
a | col10 col20 col30
1 | 2 3 4
2 | 5 7 8
// Assume that I have numbers 10, 20 ,30 obtained from column names
I want som
考虑以下示例:
test:([] name:`symbol$(); secondColumn:`int$());
insert[`test;(`John;1)];
myvar:exec name from test;
现在,myvar是:
因此,要选择实际结果,我必须:
q)myvar[0]
`John
我知道这是因为初始化,所以有没有办法使myvar立即包含实际值?使用[0]进行数组访问,或者如果需要原子变量,第一种方法是正确的
myvar:first exec name from tes
有并没有办法将一个大文本文件(150GB+)逐行加载到kdb中,并将固定数量的行保存到一个表中
我曾尝试在read0中使用大小限制参数,但由于文本文件的每一行大小不同,我无法每次都获得完整的行。您可以在.Q.fs的帮助下完成此操作。这将以cunks格式读取文件。有关moe信息/示例,请参阅。您可以在.Q.fs的帮助下完成此操作。这将以cunks格式读取文件。有关moe信息/示例,请参阅
考虑下表:
`Keys `Values
`A`B `V1`V2
`C`D`E `V1`V2`V3`V4
我只想展平Keys列,使每个键都映射到相应的值。结果应该是:
`Keys `Values
`A `V1`V2
`B `V1`V2
`C `V1`V2`V3`V4
`D `V1`V2`V3`V4
`E `V1`V2`V3`V4
解组函数将解组应用于所有列,在这种情况下,我希望仅应用于键列。有几种不同的方法可以实现这一点,下面是一种方法-
u
有没有办法将引用一个只读表的两个KDB进程加载到主内存中?他们应该能够独立阅读。要求从磁盘加载数据一次。我想出了一个笨拙的解决方案,启动一个Q(生产者)来加载表,其余的Q进程(消费者)在本地连接并将表拉到套接字上。简而言之,我正在尝试多处理select查询。谢谢是的
KDB mmaps开启,因此只需让一个核心构建您的表和它(可选),然后告诉其他表获取它:
`:table set build_table ([] ...);
other_cores @\: ({table:get x};`:tabl
我有一个特定的文件类型,它包含一个带有浮点数的列,我使用insert读取该列
`table insert ("TISISIFIIIFFIbIFFFFFFIIIFIIFFFFIIIIIIIIIIIIFFFFFFIIFFIIIIFFIIIIIIIIIIIIIIIII"; enlist "\t" ) 0:`:my_file.txt
不幸的是,有时列中的值恰好都是整数,而在txt文件中保存为int,而不是float,因此是1而不是1.0,而且kdb似乎抛出了一个类型错误。有没有办法让kdb接受以该格式
假设我有一张清单
b:1 1 2 3 4
我想用另一个列表找到列表b中元素的位置
a:1 2
当我在\a中键入b时,我得到了
11000b
00000b
它应该在哪里
11000b
00100b
发生了什么以及如何获得期望的答案
提前谢谢 您需要使用每个权限/:
q)b in/:a
11000b
00100b
使用\a中的b,第一个输出将作为b传递回。实际上:
q)1 1 2 3 4 in 1
11000b
q)11000b in 2
00000b
您还可以同时使用两个”:
q)in
以问答方式发布此问题
为什么两个相同表(其中一个从HDB中选择)之间的布尔匹配会生成0b,而不是1b
q)trade:trade2:`sym`time xasc ([] sym:5?`apple`google;time:5?.z.t;price:100+5?1.)
q).Q.dpft[`:tmp;.z.d-1;`sym;`trade]
`trade
加载HDB
\l tmp/
q)hist:select from trade where date=.z.d-1
q)hist
date
许多函数式语言都有内置的方法来定义列表中的元素。除非我遗漏了什么,否则Q似乎没有任何这样的内置方法。这让我感到惊讶,因为过滤器在许多函数式语言中都是一个重要的高阶函数
假设我想过滤掉列表1 0 2 3 0 4中的所有0。筛选后的结果列表应为1 2 3 4。目前,我通过以下方式在Q中实现了这一点:
raze{eval(?;(not;(=;x;0));x;())}peach 1 0 2 3 0 4
这为我提供了所需的结果,但在确定所发生的一切都是过滤器时,阅读起来有点不方便
我可以用它创建我自己的
read1和get都将隐式解压缩压缩文件。如果我有一个c函数,它以字节列表的形式返回压缩文件的内容,那么是否有方法将其反序列化为与我在基础文件上调用get时相同的结果
对于未压缩的文件,我可以更改标题并使用-9以反序列化。但是压缩文件与-18的输出有很大不同只给别人一个提示:KDB google group中已经回答了这个问题:只给别人一个提示:KDB google group中已经回答了这个问题:
在任何情况下,kdb都可以读取csv文件,这与pandas中的read_csv()函数一样简单
我通常使用下面的代码来读取kdb中的csv
("I*FS";enlist ",")0:`:a.csv / where a.csv is a csv file with Integer, String, Float and Symbol columns
在实际情况中,很多时候,我们想要读取的csv文件有100多列,因此很难提供要运行的列类型。
在kdb中是否有一种方法可以读取csv,而kdb可以自己理
我想从二进制文件中反序列化或从远程进程中获取一个现有表,并生成代码来创建该表的空副本,这样我就可以获得模式的可读表示,以便轻松地重新创建该表
例如,假设我在内存中有一个交易表,我想生成返回相同模式的空表的代码
q)show meta trade
c | t f a
-----| -----
time | n
sym | s g
price| f
size | i
stop | b
cond | c
ex | c
我知道运行0tra
我们正在尝试使用qPython构建函数查询。使用简单示例分层,以在运行时构建where条件。
我们在我们的KDB服务器上定义了一个q函数,比如
fn:{[c]
t: (select from tbl);
:?[t;c;0b;()];
}
在Python中,我们打开一个连接并发送条件
c = [['=', numpy.string_('TradeId'), 123456]]
result = conn.sendSync('fn', c)
当我这样做时,在q控制台中,我看到=操作
官方只介绍了join的基本用法。但是可以看到左连接lj是如何实现的:
q)lj
k){.Q.ft[,\:[;y];x]}
q).Q.ft
k){$[$[99h=@t:v y;98h=@. t;0];[n:#+!y;n!x 0!y];x y]}
因此可以找到另一个用例dict,键控表:
也有文档中提到的“\:和”的情况。但将表伪装成字典列表,它们只是上面列出的表的衍生物
问题是-这个强大的函数join是否有其他不同参数类型的使用案例,您已经在q中介绍了主要的数据结构,尽管我认为另一种方式对新用户
在函数能够识别其局部变量的情况下,是否可以将字符串作为命令传递给函数?
例如,在以下情况下,值a+:1;无法识别函数中的局部变量
.th.f:{[a]
iterations: (1+ til 4);
while[count (iterations);
value "a+:1";
iterations: 1_iterations
a};
test: .th.f[5];
test //gives 5 instead of 10 ...[1 + 2 + 3
我有以下不起作用的代码:
fun { [h; d]
h(anotherFun; d)
}
h: hopen(`hparam)
d: (2013.06.01, 2013.06.02)
h,/:fun d
我需要做什么才能称h和d的每个元素为乐趣?至少可以说,来自q的诊断是晦涩难懂的。最简单的方法是使用常量参数创建投影,并仅为列表中的每个参数调用它
fun[h;] each d
最简单的方法是使用常量参数创建投影,只需为列表中的每个参数调用它
fun[h;] each d
看起来h和d
我试图测量我创建的数据库的数据访问时间。一天的数据大约需要1秒。为了聚合,我运行了以下代码。我正在使用kdb studio,每天总共有约1百万笔交易
\t ans: raze {select from trade where date=x, sym=`ABC} each 20#dtl
dtl是所有日期的列表。我关闭了服务器并再次运行,令人惊讶的是,这花费了时间,这可能是因为您的操作系统缓存了它从磁盘读取的数据。默认情况下,Kdb+不提供内置缓存。Kdb+不缓存任何内容。如果您看到这样的速度差异
我如何用kdb中每个节点的值表示下面的树结构
a : 4
b : 3
c : 1
d : 2
e : 7
f : 5
g : 2
我还需要设置一个函数来对节点上的值求和。
任何提示都值得欣赏。在我看来,这取决于您计划如何“查询”树,以及您希望从中得到什么-您能进一步阐述吗?你想要子树吗?例如,如果你查询“a”,它会给你“4”或整个子树(在这种情况下,它是整个树)
如果内存不是问题,或者您的树很小,则可以使用嵌套的字典,并在字典中递归函数,或者使用字母符
我有一张桌子:
q)data:([]dt:2017.01.05D19:45:00.238248239 2017.01.05D20:46:00.282382392 2017.01.05D21:47:00.232842342 2017.01.05D22:48:00.835838442 2017.01.05D20:49:00.282382392;sym:`AAPL`GOOG`AAPL`BBRY`GOOG;price:101.20 800.20 102.30 2.20 800.50;shares:500
我有一个函数quotes[ticker;startDate;endDate],还有一个函数indexcitions[index;startDate;endDate],它们产生以下结果:
daterange: 2017.12.05,2017.12.06;
quotes'[AAPL;daterange]
date time sym price
2017.12.05 09:45 AAPL 101.20
2017.12.06 09:45 AAPL 102
我得到了一个文件路径和一个旧参数,要将其更改为一个新参数,我第一次尝试使用案例0,也许sv可以工作。我已将文件保存为:tbl.csv,并希望调用函数将其从“,”更改为“|”。尽管存在tbl.csv,但我在使用时遇到了一个错误:
"|" 0:`:tbl
但我可以用
"|" 0:tbl
为什么不能使用完整的文件路径名?有没有更好的方法来更改文件中的分隔符?0:可以根据您的输入执行多个不同的操作
“|”0:tbl将获取您的q表,tbl,并输出字符串列表,其中包含以“|”分隔的tbl行的文本表示形式
我使用q获取该目录中列出的所有文件:
key`:Dname
然后尝试筛选出以数字开头的,如下所示:
key`:Dname类似于“[0-9]”
但类似的部分并不完全起作用。我也尝试了get,因为我喜欢包含文件所在目录的路径 如果您的文件名定义如下
filename:`2019.01.20file.txt
您可以使用类似于的将其与模式进行比较,类似于您所做的:
filename like "[0-9]*"
“*”是通配符,表示[0-9]后面可以有任何内容
like将字符串或符号与模式进行比较
我在做一些关于kdb的工作,并且一直在修补字符串和变量。我只是想知道是否有可能删除字符串的一部分,并在其结尾添加一些内容
s1:"Hello" s2:" World"
我有一个联合字符串“Hello World”,我使用
s3:s1,s2
我试图删除Hello,并在连接字符串中的World之后添加一些内容
s3[1*til 6] = Hello
这允许我选择字符串的Hello部分,如果这有帮助的话。您可以使用drop(_)来删除“Hello”,并使用join(,)来添加所需内容。差不多
我希望在商店的数据集中找到交易(连续的?),这是一种趋势,即尽管在一天内有几次取消,但他们最终还是完成了一笔交易
有效的批处理交易必须满足一组条件
他们应该来自同一家商店
最终应完成,即X取消金额,但1完成
挂起的批处理事务(取消和完成)不应超过特定的时间范围,例如1天
交易应标记相同金额的现金,以将其视为“相同”交易
交易应按天分类,即任何待处理批次不应视为第二天的连续性
应忽略金额为十次方(即10、1000、10000)的已取消交易
查询应保留满足上述条件的所有批次。最后一个表应该有一列ba
我有一个包含以下两列的表:
初始表格
Date Value
-------------------
2019.01.01 | 150
2019.01.02 | 100
2019.01.04 | 200
2019.01.07 | 300
2019.01.08 | 100
2019.01.10 | 150
2019.01.14 | 200
2019.01.15 | 100
Date Value Sum
-----------------
从R调用KDB服务器上的函数
您好,我在KDB服务器上编写了一个函数,它为我提供了每个日期的输出列表。我必须为一组日期计算函数,但当我将其作为向量传递时,日期格式不起作用。请查看以下代码:
per <- c('2014.07.31', '2014.07.30','2014.07.29','2014.09.28')
per <- as.Date(per,"%Y.%m.%d")
PWPfunc <- function(k){
execute(h,"pwp_frac[0
我在我的主目录(csv)中有一个testdata文件。对于下面的每一项,我都会得到一个错误
\l /absolute/path/to/testdata
\l testdata
data: get `:/absolute/path/to/testdata
data: get `:testdata
他们怎么了
但这在table:(“ISI”inclist“,”)0:testdata``中起作用。如何将此命令用于绝对路径
感谢使用0:阅读您的csv:
("ISI"; enlist ",") 0: `
我想从特定日期回填到最晚日期(比如最后一个工作日)。
考虑到我总共有671个分区
count .Q.pv / 671j
我们需要在过去10天内进行回填
{//backfill function; 0n!x}@'660 11 sublist .Q.pv
除了使用子列表,是否还有其他/更好的方法为回填函数提供分区日期。要列出两个日期之间的所有日期,可以使用以下公式
q)daterange:{[date1;date2] 1+date1+til date2-date1}
q)daterange[20
我如何遍历KDBQ中的列表并替换与某个子字符串标准不匹配的元素
逻辑示例伪代码:
list.stream()
.forEach(x -> {
if (x matches substring) :
newList.add(x)
else :
newList.add("")
})
S: ("Lint"; "Stack"; "Linode"; "Overflow";"Linux")
S: ("L
我有一个客户端函数,可以查询3个远程服务器上的表,并从每个服务器中提取每个字母数字字符的数据
在函数结束时,计时器会检查每个服务器上运行的字典,如果每个字符都已运行(所有字典值都设置为1b),则应停止计时器并关闭连接句柄
但是,我发现计时器没有停止,在最后一个字符运行后(dictionary values all=1b),循环将再次尝试启动,这会导致系统挂起
如何重写计时器函数,使其在all running的值为1b时有效关闭连接句柄
函数的最后3行如下所示
f:{
...do
给定一个表x
q)show meta x;
c | t f a
------| -----
time | z
datum |
q)show first x;
time | 2020.07.27T20:28:18.925
datum | (`FOO;1084300i;1.5f) // Non conforming type
如果基准是一列不符合类型(非统一)的列表,如何正确修改包含统一类型基准的upsert,即
q)show meta y;
c | t f a
------
我想创建一个列,当另一列(colB)的值等于某个值时,该列等于另一列(colA)中的值之和
如果没有该条件,我可以使用以下方法获得colA中所有值的总和:
update TotalVal: sum colB by date from myTable
我试图通过使用
update GOT: sum colB by date from myTable where colA in (`abc,`edf)
这将为GOT创建正确的值,但GOT列仅在colA为abc或edf时才有值。这不是我真正想要的。
如何从kdb表中删除前10行?我想特别删除从以下位置返回的前10行:
select [10] from mytable
我尝试将delete与I索引一起使用,但行数没有减少:
count mytable
2201784
delete from mytable where i < 10
count mytable
2201784
countmytable
2201784
从i
我的q.bat文件运行良好,其内容如下:
g:
cd \q
w32\q.exe %* -p 5000
在init.q文件中定义了一些基本的q函数之后,我希望在每次启动kdb+/q时都能加载并使用它们。
我尝试在q.bat文件的末尾包含以下行,但它没有任何作用:
q init.q
我读过其他方法,比如设置QINIT环境变量或编辑q.q文件,但我怀疑通过.bat加载更干净。设置QINIT或添加q.q文件是将代码加载到每个q进程中的正确方法
但是,如果要将代码加载到有选择数量的q进程中,可以通过以
kdb中有一个函数生成多个表作为结果。我的主要目标是分析使用python生成的每个表
有没有一种方法可以让它返回一个表列表或一些表字典,这样我就可以将它导出到python中,或者我应该尝试其他方法?任何关于这方面的线索都将不胜感激。谢谢不清楚您在问什么-您有生成多个表的函数吗?您想返回这些表的列表吗?如果是这样的话,你有
f:{t:([]a:x?`1;b:x?10);q:([]c:x?`2;d:x?10f)}
如果要修改以同时返回t和q,只需从函数中手动构造一个列表:
q)f:{t:([]a:
如何在q会话的HTTP端口上显示静态HTML页面,而不是显示可用变量和函数的列表?您可以覆盖.z.ph函数以返回静态HTML内容
q)con:"<html><body><h1 style=\"font-family:verdana;\">Static</h1><p style=\"font-family:courier;\">Static HTML page.</p></body></html>";
我试图在2Q过程之间建立一个非常基本的联系
我在端口5000上使用
$ q -p 5000
我让它继续运行,然后从终端启动一个新的q进程,并尝试连接,但得到输出“hopen”
q)h:hopen `:localhost:5000
`hopen
关于hopen和建立连接,似乎有很多资源,这一步通常都很简单!但是这让我发疯了,我找不到任何关于“霍本错误”的参考,我认为这个错误表明霍本没有定义。
应该定义为,您还可以检查q.q中是否定义了修改任何IPC处理程序的内容。z、
我知道如何在启动q会话时加载单个脚本:
q myscript1.q-p 9001
如果我有两个脚本,我想在启动时同时加载这两个脚本,该怎么办
qmyscript1.qmyscript2.q-p9001不起作用。有什么建议吗?利用QINIT,详细说明如下。
它会为你加载一个脚本,你可以随心所欲
// add the load of your file to a startup script
cat start.q
\l a.q
\l b.q
// export QINIT to be your
我正在寻找编码/解码q脚本中的字符串
.Q.x10、.Q.j10、.Q.x12和.Q.j12似乎不符合要求。
例如
我想对“Hello world”进行编码,我应该能够对其进行进一步解码您的问题是默认的.Q.j10和.Q.x10不允许使用空格字符”,因为空格字符不在使用的默认字母表中:
q).Q.j10
64/:?["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"]
如果您查看官方文档中的“提示”注释:
您将看
当我使用下面的窗口连接(wj)时,它的行为与我预期的不一样。
关键问题是,在联接中似乎没有使用ric,因此在下面的示例中,对于一种股票(例如“COSC.SI”),我在定义的窗口中获得了“COMF.SI”和“COSC.SI”的价格。你能告诉我我做错了什么吗?我注意到,我被迫以错误的顺序输入列,以使代码无误地运行-我使用'r列(ric列)是否有问题
如何使此函数产生预期行为(在定义的窗口中为每个独特股票分组的价格)
更广泛地说,以及我的wj实现,是否有比我在这里使用的wj方法更好的方法在时间窗口中围
我有一个分区的hdb,下面的查询工作正常:
select from tableName where date within(.z.d-8;.z.d)
但以下查询中断:
select count i by date from tableName where date within(.z.d-8;.z.d)
出现以下错误:
"./2017.10.14/:./2017.10.15/tableName. OS reports: No such file or directory"
我试图通过贸易数据找出给定数量的价格变动的平均值、媒介和百分比范围。附上下面的代码。问题是,当我在~80k记录上运行该代码时,它会给我wsfull错误。我使用的是4g linux设备。目前,我只能运行约30k条记录,即使这样,q也会占用我70%以上的ram。
有没有办法让它更便于记忆
rangeForVol : {[symIn; vol; dt]
data: select from table where sym=symIn, date=dt;
data: update cumVol:
我很难从KDB字典中删除条目。键和值是字符串
工作
q)l3:`a`b`c!1 2 3
q)`a _l3
b| 2
c| 3
q)l2:("k1";"k2";"ABC")!("v1";"v2";"BLA BLA")
q)"k1" _l2
'type
不工作
q)l3:`a`b`c!1 2 3
q)`a _l3
b| 2
c| 3
q)l2:("k1";"k2";"ABC")!("v1";"v2";"BLA BLA")
q)"k1" _l2
'type
谢谢,
Eugene因为您字典中的“
我在KDB中通过
update Ts: Date + Time + MSec from Table
现在我正试图以微秒的精度来做同样的事情。n似乎是纳秒精度时间类型
n 8 16 00:00:00.000000000 0Nn timespan Timespan TimeSpan
所以我试过了
select Date + "n"$Time + (1000*USec), Date, Time, USec from Table
但它似乎将“n”视为具有毫秒精度,并
我在dataframe中有这样一个列,名为test:
Name Client
A P
B Q
C R
D S
E T
我需要在相同的数据帧中创建一个新的列clienttype,条件是,如果Client=p或Q clienttype=first。如果clienttype=R或S clienttype=second,依此类推。有人能告诉我如何在kdb中做到这一点吗?谢谢,这可以用字典解决吗
q)update ClientT
我有一个进程,有几个到网关、RDB、HDB等的开放句柄
这些句柄保存在一个简单的内存表中
我想找到一种方法来查询远程函数,但在我这边强加超时?可能吗
e、 g
我是否可以以某种方式强制超时,使上述调用在5秒后抛出错误或具有某种重试逻辑?如果希望超时应用于所有远程调用,可以通过\T system命令使用超时功能
如果要在后端进程RDB/HDB上使用此选项,则发送到这些进程的任何查询都将在指定的超时后被终止如果要将超时应用于所有远程调用,可以通过\T system命令使用超时功能
如果在后端进程RD
我正在编写一个q脚本,在特定路径中加载一个db,并对其进行一些处理。db的位置目前在脚本中是硬编码的,但我想将db路径作为参数传递,并从变量中的路径加载它
现在看起来是这样的:
q) \l /path/to/dbDir #Works
dbPath:`$.z.x 0
.Q.l dbPath
我发现.Q.l应该让我们使用一个变量来实现这一点,所以我尝试在脚本中使用以下内容:
dbPath:`$.z.x 0
.Q.l hsym dbPath #Fails
当使
在函数中,我做了如下操作:
{3#x} each 7,8,9
/ returns (7 7 7j;8 8 8j;9 9 9j)
以下代码失败(据我理解,因为lambda中未定义N):
我的解决方法是使用投影:
foo:{
N: floor acos -1;
{y#x}[;N] each x }
是否有更短或更整洁的解决方案?内部函数无法访问父函数变量。您需要显式地将所需的父变量传递给内部函数
在您的示例中,您可以通过将代码更改为使用“#”和:
提示:务必首先尝试使用KDB运算符和
1 2 3 4 5 6 ...
下一页 最后一页 共 16 页