kdb / q вопрос: как мне интерпретировать эту группу в моем функциональном выборе? - PullRequest
0 голосов
/ 10 октября 2018

Я новичок в kdb / q и пытаюсь выяснить, что означает этот конкретный запрос.Код использует функциональный выбор, который мне не слишком удобен.

?[output;();b;a];

, где output - это некоторая таблица со столбцами size time symbol

словарь группового фильтра b определяется следующим образом

key | value
---------------
ts  | ("+";00:05:00v;("k){x*y div x:$[16h=abs[@x];"j"$x;x]}";00:05:00v;("%:";`time)))
sym | ("k){x'y}";"{`$(,/)("/" vs string x)}";`symbol)

РадиПолнота, словарь a определяется как

volume  ("sum";`size)  

В действительности, функциональный выбор, кажется, собирает данные в 5-минутные блоки и выполняет некоторый анализ в symbol.Что сбивает с толку, так это как читать словарь для групп.Особенно часть k)" и все это в кавычках.Может ли кто-нибудь помочь мне пройти через это или указать мне ресурсы, которые могут помочь мне понять?Любой вклад будет оценен.

1 Ответ

0 голосов
/ 10 октября 2018

Агрегирующая часть формы функции принимает словарь, ключ - имена столбцов выходных ключей, а значения - функции дерева разбора.

Дерево разбора - это выражение, которое не оценивается сразу.Первый аргумент как функция и последующие элементы являются ее аргументами.Самые внутренние скобки оцениваются первыми, а затем они перемещаются вверх по иерархии, оценивая каждую из них по очереди.Более подробную информацию можно найти здесь и в официальном документе, связанном на этой странице

. Вы можете использовать функцию 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)
...