Агрегирующая часть формы функции принимает словарь, ключ - имена столбцов выходных ключей, а значения - функции дерева разбора.
Дерево разбора - это выражение, которое не оценивается сразу.Первый аргумент как функция и последующие элементы являются ее аргументами.Самые внутренние скобки оцениваются первыми, а затем они перемещаются вверх по иерархии, оценивая каждую из них по очереди.Более подробную информацию можно найти здесь и в официальном документе, связанном на этой странице
. Вы можете использовать функцию parse
со строковым аргументом, чтобы получить дерево разбора функции.Например, дерево разбора для 1+2+3
равно (+;1;(+;2;3))
:
q)parse "1+2+3"
+
1
(+;2;3)
Самая внутренняя скобка (+;2;3)
сначала оценивается, что приводит к 5
, до того как результат будет распространен до крайнего значенияФункция дерева разбора (+;1;5)
, дающая 6
Часть предложения groupby, в которой будет оцениваться одна или несколько функций дерева разбора, а затем соберет вместе записи с одним и тем же выводом из функции группировки.
Делая функцию немного понятнее для чтения:
(+;00:05:00v;({x*y div x:$[16h=abs[@x];"j"$x;x]}";00:05:00v;(%:;`time)))
Глядя на самую внутреннюю скобку (%:;`time)
, она возвращает результат %:
, примененный к столбцу времени.Мы можем видеть, что %:
- это k для функции ltime
q)ltime
%:
При движении вверх на уровень следующая функция оценивается как лямбда-функция {x*y div x:$[16h=abs[@x];"j"$x;x]}
с аргументами 00:05:00v
и результатом нашегопредыдущая оцененная функция.Лямбда округляет ее до ближайшего 5-минутного интервала.
({x*y div x:$[16h=abs[@x];"j"$x;x]};00:05:00v;(%:;`time))
. Перемещение еще раз ко всему выражению эквивалентно 00:05:00v + {x*y div x:$[16h=abs[@x];"j"$x;x]};00:05:00v;(%:;`time))
, с добавлением 00:05:00 к каждому результату из предыдущегооценка.
Таким образом, по сути, сначала возвращается местное время метки времени, затем
Для агрегирования symbol
("k""{x'y}";{`$(,/)("/" vs string x)};`symbol)
Внутренняя функция {`$(,/)("/" vs string x)}
строк aсимвол, разбивает его на символ "/" и затем соединяет его вместе, эффективно удаляя косую черту
"k"
- это функция, которая оценивает строку с использованием интерпретатора k.
"k""{x'y}""
возвращает функцию, которая сама принимает функцию x
и аргумент y
и изменяет функцию, чтобы использовать наречие каждого из обоих '
.Это делает так, что функция x
применяется к каждому символу отдельно, а не к столбцу в целом.
Это может быть реализовано в q
вместо k следующим образом:
({x@'y};{`$(,/)("/" vs string x)};`symbol)
Функция {x@'y}
принимает аргумент функции {`$(,/)("/" vs string x)}
и столбец symbol
, как и раньше, но мы должны использовать @
с наречием each-both в q, чтобы применить функцию к аргументам.
Функция агрегирования будет применена к каждой группе.В вашем случае функция представляет собой простое дерево разбора, которое будет возвращать sum
столбцов размера в каждой группе с выходным столбцом с именем volume
a:enlist[`volume]!enlist (sum;`size)