如何更新嵌套字典中 table 中的条目?
How to update entries in a table within a nested dictionary?
我正在尝试创建一个订单簿数据结构,其中顶级字典包含 3 种基本订单类型,每种类型都有出价和要价方,每一方都有一个表列表,每个表一个自动收报机。例如,如果我想检索 Google 股票的所有 type1 询价订单,我会调用 book[`orderType1][`ask][`GOOG]。我使用以下方法实现了它:
bookTemplate: ([]orderID:`int$();date:"d"$();time:`time$();sym:`$();side:`$();
orderType:`$();price:`float$();quantity:`int$());
bookDict:(1#`)!enlist`orderID xkey bookTemplate;
book: `orderType1`orderType2`orderType3 ! (3# enlist(`ask`bid!(2# enlist bookDict)));
使用 book[`orderType1][`ask][`ticker] 的数据检索似乎工作正常。当我尝试向特定订单簿添加新订单时出现问题,例如:
testorder:`orderID`date`time`sym`side`orderType`price`quantity!(111111111;.z.D;.z.T;
`GOOG;`ask;`orderType1;100.0f;123);
book[`orderType1][`ask][`GOOG],:testorder;
执行最后一个查询会出现 'assign 错误。什么原因?如何解决?
这里有几个问题。第一个是虽然您可以使用一系列内联重复键查找字典,即
q)book[`orderType1][`ask][`GOOG]
orderID| date time sym side orderType price quantity
-------| -------------------------------------------
你不能像这样赋值(只能在一层深度赋值)。更好的方法是使用点索引(和点修改来重新分配值)。但是,问题在于,由于词典列表是统一的,您的图书词典的值正在变平为 table。所以这失败了:
q)book . `orderType1`ask`GOOG
'rank
你可以通过检查终端看到它是如何变平的
q)book
| ask
----------| -----------------------------------------------------------------
orderType1| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric
orderType2| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric
orderType3| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric
为防止这种扁平化,您可以通过添加通用 null
强制值成为混合列表
q)book: ``orderType1`orderType2`orderType3 !(::),(3# enlist(`ask`bid!(2# enlist bookDict)));
然后看起来像这样:
q)book
| ::
orderType1| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType2| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType3| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
点索引现在有效:
q)book . `orderType1`ask`GOOG
orderID| date time sym side orderType price quantity
-------| -------------------------------------------
这意味着点修正现在也可以工作了
q).[`book;`orderType1`ask`GOOG;,;testorder]
`book
q)book
| ::
orderType1| `ask`bid!+``GOOG!(((+(,`orderID)!,`int$())!+`date`time`sym`side`o
orderType2| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType3| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
最后,我建议阅读这份关于如何最好地存储图书数据的 FD 白皮书:http://www.firstderivatives.com/downloads/q_for_Gods_Nov_2012.pdf
我正在尝试创建一个订单簿数据结构,其中顶级字典包含 3 种基本订单类型,每种类型都有出价和要价方,每一方都有一个表列表,每个表一个自动收报机。例如,如果我想检索 Google 股票的所有 type1 询价订单,我会调用 book[`orderType1][`ask][`GOOG]。我使用以下方法实现了它:
bookTemplate: ([]orderID:`int$();date:"d"$();time:`time$();sym:`$();side:`$();
orderType:`$();price:`float$();quantity:`int$());
bookDict:(1#`)!enlist`orderID xkey bookTemplate;
book: `orderType1`orderType2`orderType3 ! (3# enlist(`ask`bid!(2# enlist bookDict)));
使用 book[`orderType1][`ask][`ticker] 的数据检索似乎工作正常。当我尝试向特定订单簿添加新订单时出现问题,例如:
testorder:`orderID`date`time`sym`side`orderType`price`quantity!(111111111;.z.D;.z.T;
`GOOG;`ask;`orderType1;100.0f;123);
book[`orderType1][`ask][`GOOG],:testorder;
执行最后一个查询会出现 'assign 错误。什么原因?如何解决?
这里有几个问题。第一个是虽然您可以使用一系列内联重复键查找字典,即
q)book[`orderType1][`ask][`GOOG]
orderID| date time sym side orderType price quantity
-------| -------------------------------------------
你不能像这样赋值(只能在一层深度赋值)。更好的方法是使用点索引(和点修改来重新分配值)。但是,问题在于,由于词典列表是统一的,您的图书词典的值正在变平为 table。所以这失败了:
q)book . `orderType1`ask`GOOG
'rank
你可以通过检查终端看到它是如何变平的
q)book
| ask
----------| -----------------------------------------------------------------
orderType1| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric
orderType2| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric
orderType3| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric
为防止这种扁平化,您可以通过添加通用 null
强制值成为混合列表q)book: ``orderType1`orderType2`orderType3 !(::),(3# enlist(`ask`bid!(2# enlist bookDict)));
然后看起来像这样:
q)book
| ::
orderType1| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType2| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType3| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
点索引现在有效:
q)book . `orderType1`ask`GOOG
orderID| date time sym side orderType price quantity
-------| -------------------------------------------
这意味着点修正现在也可以工作了
q).[`book;`orderType1`ask`GOOG;,;testorder]
`book
q)book
| ::
orderType1| `ask`bid!+``GOOG!(((+(,`orderID)!,`int$())!+`date`time`sym`side`o
orderType2| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType3| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
最后,我建议阅读这份关于如何最好地存储图书数据的 FD 白皮书:http://www.firstderivatives.com/downloads/q_for_Gods_Nov_2012.pdf