Учебники

KDB + — Краткое руководство

KDB + — Обзор

Это полная версия kdb + от систем kx, нацеленная в первую очередь на тех, кто изучает самостоятельно. KDB +, представленный в 2003 году, представляет собой новое поколение базы данных KDB, которая предназначена для сбора, анализа, сравнения и хранения данных.

Система kdb + содержит следующие два компонента:

  • KDB + — база данных (k база данных плюс)

  • Q — язык программирования для работы с kdb +

KDB + — база данных (k база данных плюс)

Q — язык программирования для работы с kdb +

И kdb +, и q написаны на языке программирования k (так же, как q, но менее читаемы).

Фон

Kdb + / q зародился как неясный академический язык, но с годами он постепенно улучшал удобство использования.

  • APL (1964, язык программирования)

  • A + (1988, модифицированный APL Артура Уитни)

  • K (1993, четкая версия A +, разработанная A. Whitney)

  • Kdb (1998, БД в колонке в памяти)

  • Kdb + / q (2003, язык q — более читаемая версия k)

APL (1964, язык программирования)

A + (1988, модифицированный APL Артура Уитни)

K (1993, четкая версия A +, разработанная A. Whitney)

Kdb (1998, БД в колонке в памяти)

Kdb + / q (2003, язык q — более читаемая версия k)

Почему и где использовать KDB +

Зачем? — Если вам нужно одно решение для данных в реальном времени с аналитикой, то вам следует рассмотреть kdb +. Kdb + хранит базу данных как обычные собственные файлы, поэтому у нее нет особых требований к аппаратному обеспечению и архитектуре хранения. Стоит отметить, что база данных — это просто набор файлов, поэтому ваша административная работа не составит труда.

Где использовать KDB + ? — Легко сосчитать, какие инвестиционные банки НЕ используют kdb +, поскольку большинство из них используют в настоящее время или планируют перейти с обычных баз данных на kdb +. Поскольку объем данных растет день ото дня, нам нужна система, которая может обрабатывать огромные объемы данных. KDB + выполняет это требование. KDB + не только хранит огромное количество данных, но и анализирует их в режиме реального времени.

Начиная

Имея такой большой опыт, давайте теперь изложим и узнаем, как настроить среду для KDB +. Начнем с того, как скачать и установить KDB +.

Загрузка и установка KDB +

Вы можете получить бесплатную 32-разрядную версию KDB + со всеми функциями 64-разрядной версии по адресу http://kx.com/software-download.php

Согласитесь с лицензионным соглашением, выберите операционную систему (доступно для всех основных операционных систем). Для операционной системы Windows последняя версия — 3.2. Загрузите последнюю версию. После того, как вы распакуете его, вы получите имя папки «windows», а внутри папки Windows вы получите еще одну папку «q» . Скопируйте всю папку q на ваш диск c: /.

Откройте терминал Run, введите место, где вы храните папку q ; это будет похоже на «c: /q/w32/q.exe». Как только вы нажмете Enter, вы получите новую консоль следующим образом —

KDB + Консоль

В первой строке вы видите номер версии 3.2 и дату выпуска 2015.03.05

Макет каталога

Пробная / бесплатная версия обычно устанавливается в каталогах,

Для Linux / Mac —

~/q       / main q directory (under the user’s home)
~/q/l32   / location of linux 32-bit executable
~/q/m32   / Location of mac 32-bit executable

Для Windows —

c:/q          / Main q directory
c:/q/w32/     / Location of windows 32-bit executable

Файлы примеров —

После загрузки kdb + структура каталогов на платформе Windows будет выглядеть следующим образом:

Файлы примеров KDB +

В приведенной выше структуре каталогов trade.q и sp.q являются примерами файлов, которые мы можем использовать в качестве ориентира.

KDB + — Архитектура

Kdb + — это высокопроизводительная база данных большого объема, изначально разработанная для обработки огромных объемов данных. Он полностью 64-битный, имеет встроенную многоядерную обработку и многопоточность. Та же архитектура используется для данных в реальном времени и исторических данных. База данных включает собственный мощный язык запросов q, поэтому аналитика может быть запущена непосредственно на данных.

kdb + tick — это архитектура, которая позволяет собирать, обрабатывать и запрашивать данные в реальном времени и исторические данные.

Kdb + / галочка Архитектура

На следующем рисунке представлена ​​обобщенная схема типичной архитектуры Kdb + / tick с последующим кратким объяснением различных компонентов и сквозного потока данных.

KDB + Архитектура

  • Каналы данных — это данные временных рядов, которые в основном предоставляются поставщиками каналов данных, такими как Reuters, Bloomberg или напрямую с бирж.

  • Чтобы получить соответствующие данные, данные из фида данных анализируются обработчиком фида .

  • После того, как данные обработаны обработчиком подачи, они отправляются на тиккерную станцию .

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

  • После обновления внутренних таблиц и файлов журналов данные цикла времени непрерывно отправляются / публикуются в базу данных в режиме реального времени и всем подписчикам в цепочке, которые запрашивали данные.

  • В конце рабочего дня файл журнала удаляется, создается новый, а база данных в реальном времени сохраняется в исторической базе данных. Как только все данные сохранены в исторической базе данных, база данных в реальном времени очищает свои таблицы.

Каналы данных — это данные временных рядов, которые в основном предоставляются поставщиками каналов данных, такими как Reuters, Bloomberg или напрямую с бирж.

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

После того, как данные обработаны обработчиком подачи, они отправляются на тиккерную станцию .

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

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

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

Компоненты архитектуры Kdb + Tick

Фиды данных

Каналы данных могут быть любыми рыночными или другими данными временных рядов. Рассматривайте каналы данных как необработанный ввод для обработчика каналов. Ленты могут быть получены непосредственно от биржи (потоковой передачи данных), от поставщиков новостей / данных, таких как Thomson-Reuters, Bloomberg или любых других внешних агентств.

Feed Handler

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

  • Захват данных в соответствии с набором правил.
  • Перевести (/ обогатить) эти данные из одного формата в другой.
  • Поймай самые последние значения.

Тиккерный завод

Ticker Plant является важнейшим компонентом архитектуры KDB +. Это тикерная станция, с которой база данных в реальном времени или напрямую подписчики (клиенты) подключаются для доступа к финансовым данным. Он работает по механизму публикации и подписки . Как только вы получаете подписку (лицензию), определяется тиковая (обычная) публикация от издателя (тикерная установка). Он выполняет следующие операции —

  • Получает данные от обработчика каналов.

  • Сразу после того, как завод по производству тикеров получает данные, он сохраняет копию в виде файла журнала и обновляет ее, как только завод по производству тикеров получает любое обновление, чтобы в случае любого сбоя у нас не было потери данных.

  • Клиенты (подписчик в режиме реального времени) могут напрямую подписаться на тикер-завод.

  • В конце каждого рабочего дня, т. Е. Как только база данных в реальном времени получает последнее сообщение, она сохраняет все сегодняшние данные в исторической базе данных и передает их всем подписчикам, которые подписались на сегодняшние данные. Затем он сбрасывает все свои таблицы. Файл журнала также удаляется после сохранения данных в исторической базе данных или другом напрямую связанном подписчике с базой данных реального времени (rtdb).

  • В результате, тикерная фабрика, база данных в реальном времени и историческая база данных работают круглосуточно.

Получает данные от обработчика каналов.

Сразу после того, как завод по производству тикеров получает данные, он сохраняет копию в виде файла журнала и обновляет ее, как только завод по производству тикеров получает любое обновление, чтобы в случае любого сбоя у нас не было потери данных.

Клиенты (подписчик в режиме реального времени) могут напрямую подписаться на тикер-завод.

В конце каждого рабочего дня, т. Е. Как только база данных в реальном времени получает последнее сообщение, она сохраняет все сегодняшние данные в исторической базе данных и передает их всем подписчикам, которые подписались на сегодняшние данные. Затем он сбрасывает все свои таблицы. Файл журнала также удаляется после сохранения данных в исторической базе данных или другом напрямую связанном подписчике с базой данных реального времени (rtdb).

В результате, тикерная фабрика, база данных в реальном времени и историческая база данных работают круглосуточно.

Поскольку ticker-plant является приложением Kdb +, к его таблицам можно обращаться с помощью q, как и к любой другой базе данных Kdb +. Все клиенты Ticker-Plant должны иметь доступ к базе данных только в качестве подписчиков.

База данных в реальном времени

База данных в реальном времени (rdb) хранит сегодняшние данные. Это напрямую связано с тикером завода. Обычно он хранится в памяти в часы работы рынка (день) и записывается в историческую базу данных (hdb) в конце дня. Поскольку данные (данные rdb) хранятся в памяти, обработка выполняется чрезвычайно быстро.

Поскольку kdb + рекомендует иметь размер оперативной памяти, который в четыре или более раз превышает ожидаемый объем данных в день, запрос, выполняемый на rdb, очень быстрый и обеспечивает превосходную производительность. Поскольку база данных реального времени содержит только сегодняшние данные, столбец даты (параметр) не требуется.

Например, мы можем иметь запросы RDB, как,

select from trade where sym = `ibm

OR

select from trade where sym = `ibm, price > 100

Историческая база данных

Если нам нужно рассчитать оценки компании, нам нужно иметь ее исторические данные. Историческая база данных (hdb) содержит данные о транзакциях, совершенных в прошлом. Запись каждого нового дня будет добавлена ​​в hdb в конце дня. Большие таблицы в hdb либо хранятся с разбивкой (каждый столбец хранится в своем собственном файле), либо они хранятся разделенными временными данными. Также некоторые очень большие базы данных могут быть дополнительно разделены с использованием par.txt (файл).

Эти стратегии хранения (распределенные, разделенные и т. Д.) Эффективны при поиске или доступе к данным из большой таблицы.

Историческая база данных также может использоваться для внутренней и внешней отчетности, т. Е. Для аналитики. Например, предположим, что мы хотим получить информацию о сделках компании IBM за определенный день из имени торговой (или любой) таблицы, нам нужно написать запрос следующим образом:

thisday: 2014.10.12

select from trade where date = thisday, sym =`ibm

Примечание. Мы напишем все такие запросы, как только получим обзор языка q .

Q Язык программирования

Kdb + поставляется со встроенным языком программирования, который известен как q . Он включает в себя расширенный набор стандартного SQL, который расширен для анализа временных рядов и предлагает много преимуществ по сравнению со стандартной версией. Любой, кто знаком с SQL, может выучить q за считанные дни и быстро написать свои собственные специальные запросы.

Запуск среды «q»

Чтобы начать использовать kdb +, вам нужно начать сеанс q . Есть три способа начать сеанс q

  • Просто введите «c: /q/w32/q.exe» на своем терминале запуска.

  • Запустите командный терминал MS-DOS и введите q .

  • Скопируйте файл q.exe в «C: \ Windows \ System32» и на рабочем терминале просто введите «q».

Просто введите «c: /q/w32/q.exe» на своем терминале запуска.

Запустите командный терминал MS-DOS и введите q .

Скопируйте файл q.exe в «C: \ Windows \ System32» и на рабочем терминале просто введите «q».

Здесь мы предполагаем, что вы работаете на платформе Windows.

Типы данных

В следующей таблице приведен список поддерживаемых типов данных.

название пример голец Тип Размер
логический б 1 1
байт 0xff Икс 4 1
короткая 23ч час 5 2
ИНТ 23i я 6 4
долго 23J J 7 8
реальный 2.3e е 8 4
поплавок 2.3f е 9 8
голец «А» с 10 1
VARCHAR `аб s 11 *
месяц 2003.03m м 13 4
Дата 2015.03.17T18: 01: 40,134 Z 15 8
минут 8:31 U 17 4
второй 8:31:53 v 18 4
время 18: 03: 18,521 T 19 4
перечисление `u $` b, где u: `a`b * 20 4

Формирование атома и списка

Атомы — это отдельные объекты, например, одно число, символ или символ. В приведенной выше таблице (разных типов данных) все поддерживаемые типы данных являются атомами. Список — это последовательность атомов или других типов, включая списки.

Передача атома любого типа в функцию монадического типа (т. Е. Функции с одним аргументом) вернет отрицательное значение, то есть –n , тогда как передача простого списка этих атомов в функцию типа вернет положительное значение n .

Пример 1 — Формирование атома и списка

/ Note that the comments begin with a slash “ / ” and cause the parser
/ to ignore everything up to the end of the line.

x: `mohan              / `mohan is a symbol, assigned to a variable x
type x                 / let’s check the type of x
-11h                   / -ve sign, because it’s single element.

y: (`abc;`bca;`cab)    / list of three symbols, y is the variable name.

type y
11h                    / +ve sign, as it contain list of atoms (symbol).

y1: (`abc`bca`cab)     / another way of writing y, please note NO semicolon

y2: (`$”symbols may have interior blanks”)   / string to symbol conversion
y[0]                   / return `abc
y 0                    / same as y[0], also returns `abc
y 0 2                  / returns `abc`cab, same as does y[0 2]

z: (`abc; 10 20 30; (`a`b); 9.9 8.8 7.7)      / List of different types,
z 2 0                  / returns (`a`b; `abc),
z[2;0]                 / return `a. first element of z[2]

x: “Hello World!”      / list of character, a string
x 4 0                  / returns “oH” i.e. 4th and 0th(first)
element

Q Language — Кастинг типов

Часто требуется изменить тип данных некоторых данных с одного типа на другой. Стандартная функция приведения — это двоичный оператор «$».

Три подхода используются для приведения из одного типа в другой (кроме строки) —

  • Укажите желаемый тип данных по имени символа
  • Укажите желаемый тип данных по его символу
  • Укажите желаемый тип данных по его короткому значению.

Приведение целых чисел к плавающим

В следующем примере приведения целых чисел к плавающим, все три различных способа приведения эквивалентны —

q)a:9 18 27

q)$[`float;a]     / Specify desired data type by its symbol name, 1 st way
9 18 27f

q)$["f";a]        / Specify desired data type by its character, 2 nd way
9 18 27f

q)$[9h;a]         / Specify desired data type by its short value, 3 rd way
9 18 27f

Проверьте, все ли три операции эквивалентны,

q)($[`float;a]~$["f";a]) and ($[`float;a] ~ $[9h;a])
1b

Приведение строк в символы

Приведение строки к символам и наоборот работает немного по-другому. Давайте проверим это на примере —

q)b: ("Hello";"World";"HelloWorld")    / define a list of strings

q)b
"Hello"
"World"
"HelloWorld"

q)c: `$b                               / this is how to cast strings to symbols

q)c                                    / Now c is a list of symbols
`Hello`World`HelloWorld

Попытка привести строки к символам с использованием ключевых слов `symbol или 11h потерпит неудачу с ошибкой типа —

q)b
"Hello"
"World"
"HelloWorld"

q)`symbol$b
'type

q)11h$b
'type

Приведение строк в не-символы

Преобразование строк в тип данных, отличный от символа, выполняется следующим образом:

q)b:900               / b contain single atomic integer

q)c:string b          / convert this integer atom to string “900”

q)c
"900"

q)`int $ c            / converting string to integer will return the
                      / ASCII equivalent of the character “9”, “0” and
                      / “0” to produce the list of integer 57, 48 and
                      / 48.
57 48 48i

q)6h $ c              / Same as above
57 48 48i

q)"i" $ c             / Same a above
57 48 48i

q)"I" $ c
900i

Таким образом, для приведения всей строки (списка символов) к одному атому типа данных x необходимо указать заглавную букву, представляющую тип данных x, в качестве первого аргумента оператора $ . Если вы укажете тип данных x любым другим способом, это приведет к тому, что приведение будет применено к каждому символу строки.

Q Language — временные данные

В языке q есть много разных способов представления и обработки временных данных, таких как время и дата.

Дата

Дата в kdb + внутренне сохраняется как целое число дней, так как наша справочная дата — 01 января 2000 года. Дата после этой даты внутренне сохраняется как положительное число, а дата до нее упоминается как отрицательное число.

По умолчанию дата записывается в формате «ГГГГ.ММ.ДД»

q)x:2015.01.22      / This is how we write 22nd Jan 2015

q)`int$x            / Number of days since 2000.01.01
5500i

q)`year$x           / Extracting year from the date
2015i

q)x.year            / Another way of extracting year
2015i

q)`mm$x             / Extracting month from the date
1i

q)x.mm              / Another way of extracting month
1i

q)`dd$x             / Extracting day from the date
22i

q)x.dd              / Another way of extracting day
22i

Арифметические и логические операции могут выполняться непосредственно по датам.

q)x+1        / Add one day
2015.01.23

q)x-7        / Subtract 7 days
2015.01.15

1 января 2000 года выпало на субботу. Поэтому любая суббота на протяжении всей истории или в будущем при делении на 7 даст остаток от 0, воскресенье дает 1, понедельник — 2.

             Day               mod 7
           Saturday              0
           Sunday                1
           Monday                2
           Tuesday               3
           Wednesday             4
           Thursday              5
           Friday                6

раз

Время хранится в виде целого числа миллисекунд с момента полуночи. Время записывается в формате ЧЧ: ММ: СС.МСС

q)tt1: 03:30:00.000     / tt1 store the time 03:30 AM

q)tt1
03:30:00.000

q)`int$tt1              / Number of milliseconds in 3.5 hours
12600000i

q)`hh$tt1               / Extract the hour component from time
3i

q)tt1.hh
3i

q)`mm$tt1               / Extract the minute component from time
30i

q)tt1.mm
30i

q)`ss$tt1               / Extract the second component from time
0i

q)tt1.ss
0i

Как и в случае с датами, арифметика может быть выполнена непосредственно по времени.

DateTimes

Дата и время — это комбинация даты и времени, разделенных буквой «Т», как в стандартном формате ISO. Значение datetime хранит дробное число дней с полуночи 1 января 2000 года.

q)dt:2012.12.20T04:54:59:000      / 04:54.59 AM on 20thDec2012

q)type dt
-15h

q)dt
2012.12.20T04:54:59.000
9
q)`float$dt
4737.205

Основной дробный счетчик дней может быть получен путем приведения в плавающее положение.

Q Language — Списки

Списки являются основными строительными блоками языка q , поэтому очень важно хорошо понимать списки. Список — это просто упорядоченная коллекция атомов (атомных элементов) и других списков (группа из одного или нескольких атомов).

Типы Списка

Общий список заключает его элементы в соответствующие скобки и разделяет их точкой с запятой. Например —

(9;8;7)   or   ("a"; "b"; "c")   or   (-10.0; 3.1415e; `abcd; "r")

Если список состоит из атомов одного типа, он называется единым списком . Иначе, это известно как общий список (смешанный тип).

подсчитывать

Мы можем получить количество элементов в списке по его количеству.

q)l1:(-10.0;3.1415e;`abcd;"r")    / Assigning variable name to general list

q)count l1                        / Calculating number of items in the list l1
4

Примеры простого списка

q)h:(1h;2h;255h)                    / Simple Integer List

q)h
1 2 255h

q)f:(123.4567;9876.543;98.7)        / Simple Floating Point List

q)f
123.4567 9876.543 98.7

q)b:(0b;1b;0b;1b;1b)                / Simple Binary Lists

q)b
01011b

q)symbols:(`Life;`Is;`Beautiful)    / Simple Symbols List

q)symbols
`Life`Is`Beautiful

q)chars:("h";"e";"l";"l";"o";" ";"w";"o";"r";"l";"d") 
                                    / Simple char lists and Strings.
q)chars
"hello world"

** Примечание. Простой список символов называется строкой.

Список содержит атомы или списки. Чтобы создать единый список элементов , мы используем —

q)singleton:enlist 42

q)singleton
,42

Чтобы различить атом и эквивалентный синглтон , изучите знак их типа.

q)signum type 42
-1i

q)signum type enlist 42
1i

Q Language — Индексирование

Список упорядочен слева направо по позиции его элементов. Смещение элемента от начала списка называется его индексом . Таким образом, первый элемент имеет индекс 0, второй элемент (если таковой имеется) имеет индекс 1 и т. Д. Список с номером n имеет индексную область от 0 до n – 1 .

Индексная нотация

Имея список L , элемент с индексом i доступен через L [i] . Получение элемента по его индексу называется индексацией элемента . Например,

q)L:(99;98.7e;`b;`abc;"z")

q)L[0]
99

q)L[1]
98.7e

q)L[4]
"z

Индексированное назначение

Элементы в списке также могут быть назначены с помощью индексации элементов. Таким образом,

q)L1:9 8 7

q)L1[2]:66      / Indexed assignment into a simple list
                / enforces strict type matching.
                
q)L1
9 8 66

Списки из переменных

q)l1:(9;8;40;200)

q)l2:(1 4 3; `abc`xyz)

q)l:(l1;l2)               / combining the two list l1 and l2

q)l
9 8 40 200
(1 4 3;`abc`xyz)

Присоединяющиеся списки

Самая распространенная операция в двух списках — это объединение их в большой список. Точнее, оператор соединения (,) добавляет свой правый операнд в конец левого операнда и возвращает результат. Он принимает атом в любом аргументе.

q)1,2 3 4
1 2 3 4

q)1 2 3, 4.4 5.6     / If the arguments are not of uniform type,
                     / the result is a general list.
1
2
3
4.4
5.6

гнездование

Сложность данных строится с использованием списков в качестве элементов списков.

глубина

Количество уровней вложенности для списка называется его глубиной. Атомы имеют глубину 0, а простые списки имеют глубину 1.

q)l1:(9;8;(99;88))

q)count l1
3

Вот список глубины 3 с двумя пунктами:

q)l5
9
(90;180;900 1800 2700 3600)

q)count l5
2

q)count l5[1]
3

Индексирование по глубине

Можно индексировать непосредственно в элементы вложенного списка.

Повторное индексирование предметов

Извлечение элемента по одному индексу всегда приводит к получению самого верхнего элемента из вложенного списка.

q)L:(1;(100;200;(300;400;500;600)))

q)L[0]
1

q)L[1]
100
200
300 400 500 600

Поскольку результат L [1] сам по себе является списком, мы можем извлечь его элементы, используя один индекс.

q)L[1][2]
300 400 500 600

Мы можем повторить одиночную индексацию еще раз, чтобы извлечь элемент из внутреннего вложенного списка.

q)L[1][2][0]
300

Вы можете прочитать это как,

Получить элемент по индексу 1 из L и извлечь из него элемент по индексу 2, а из него получить элемент по индексу 0.

Обозначение для индексации на глубине

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

q)L[1;2;0]
300

Назначение через индекс также работает на глубине.

q)L[1;2;1]:900

q)L
1
(100;200;300 900 500 600)

Элидируемые индексы

Исключение индексов для общего списка

q)L:((1 2 3; 4 5 6 7); (`a`b`c;`d`e`f`g;`0`1`2);("good";"morning"))

q)L
(1 2 3;4 5 6 7)
(`a`b`c;`d`e`f`g;`0`1`2)
("good";"morning")

q)L[;1;]
4 5 6 7
`d`e`f`g
"morning"

q)L[;;2]
3 6
`c`f`2
"or"

Интерпретировать L [; 1;] как,

Получить все элементы во второй позиции каждого списка на верхнем уровне.

Интерпретировать L [;; 2] как,

Получить элементы в третьей позиции для каждого списка на втором уровне.

Q Language — Словари

Словари являются расширением списков, которые служат основой для создания таблиц. В математических терминах словарь создает

«Домен → диапазон»

или вообще (коротко) создает

«Ключ → значение»

отношения между элементами.

Словарь — это упорядоченная коллекция пар ключ-значение, которая примерно эквивалентна хеш-таблице. Словарь — это отображение, определяемое явной ассоциацией ввода-вывода между списком доменов и списком диапазонов посредством позиционного соответствия. При создании словаря используется примитив xkey (!)

                  ListOfDomain ! ListOfRange

Самый основной словарь отображает простой список в простой список.

Вход (I) Выход (O)
`Имя `Джон
`Возраст 36
`Пол «M»
Вес 60,3
q)d:`Name`Age`Sex`Weight!(`John;36;"M";60.3)   / Create a dictionary d

q)d

Name   | `John
Age    | 36
Sex    | "M"
Weight | 60.3

q)count d             / To get the number of rows in a dictionary.
4

q)key d               / The function key returns the domain
`Name`Age`Sex`Weight

q)value d             / The function value returns the range.

`John
36

"M"
60.3

q)cols d             / The function cols also returns the domain.
`Name`Age`Sex`Weight

Уважать

Поиск значения словаря, соответствующего входному значению, называется поиском ввода.

q)d[`Name]       / Accessing the value of domain `Name
`John

q)d[`Name`Sex]   / extended item-wise to a simple list of keys
`John
"M"

Поиск с глаголом @

q)d1:`one`two`three!9 18 27

q)d1[`two]
18

q)d1@`two
18

Операции над словарями

Поправка и одобрение

Как и в случае списков, элементы словаря могут быть изменены с помощью индексированного присваивания.

d:`Name`Age`Sex`Weight! (`John;36;"M";60.3)
                                  / A dictionary d
                                  
q)d[`Age]:35                      / Assigning new value to key Age

q)d 
                              / New value assigned to key Age in d
Name   | `John
Age    | 35
Sex    | "M"
Weight | 60.3

Словари могут быть расширены с помощью назначения индекса.

q)d[`Height]:"182 Ft"

q)d

Name   | `John
Age    | 35
Sex    | "M"
Weight | 60.3
Height | "182 Ft"

Обратный поиск с Find (?)

Оператор find (?) Используется для обратного просмотра путем сопоставления диапазона элементов с его элементом домена.

q)d2:`x`y`z!99 88 77

q)d2?77
`z

В случае, если элементы списка не являются уникальными, find возвращает первое сопоставление элементов из списка доменов.

Удаление записей

Чтобы удалить запись из словаря, используется функция delete (_) . Левый операнд (_) — это словарь, а правый операнд — это ключевое значение.

q)d2:`x`y`z!99 88 77

q)d2 _`z

x| 99
y| 88

Пробел слева от _ требуется, если первый операнд является переменной.

q)`x`y _ d2           / Deleting multiple entries

z| 77

Словари колонок

Словарные столбцы являются основой для создания таблиц. Рассмотрим следующий пример —

q)scores: `name`id!(`John`Jenny`Jonathan;9 18 27)
                              / Dictionary scores
                              
q)scores[`name]               / The values for the name column are
`John`Jenny`Jonathan

q)scores.name                 / Retrieving the values for a column in a
                              / column dictionary using dot notation.
`John`Jenny`Jonathan

q)scores[`name][1]            / Values in row 1 of the name column
`Jenny

q)scores[`id][2]              / Values in row 2 of the id column is
27

Листать словарь

Чистый эффект от переворота словаря столбцов просто меняет порядок индексов. Это логически эквивалентно переносу строк и столбцов.

Переверните словарь столбца

Транспонирование словаря достигается применением унарного флип-оператора. Взгляните на следующий пример —

q)scores

name  | John Jenny Jonathan
id    | 9   18   27

q)flip scores

  name     id
---------------
  John     9
  Jenny    18
 Jonathan  27

Перевернутый словарь перевернутых столбцов

Если вы транспонируете словарь дважды, вы получаете оригинальный словарь,

q)scores ~ flip flip scores
1b

Q Language — Таблица

Таблицы лежат в основе KDB +. Таблица представляет собой набор именованных столбцов, реализованных в виде словаря. q таблицы ориентированы на столбцы.

Создание таблиц

Таблицы создаются с использованием следующего синтаксиса —

q)trade:([]time:();sym:();price:();size:())

q)trade
time sym price size
-------------------

В приведенном выше примере мы не указали тип каждого столбца. Это будет установлено при первой вставке в таблицу.

Другой способ, мы можем указать тип столбца при инициализации —

q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())

Или мы также можем определить непустые таблицы —

q)trade:([]sym:(`a`b);price:(1 2))

q)trade

 sym   price
-------------
  a      1
  b      2

Если в квадратных скобках нет столбцов, как в приведенных выше примерах, таблица не помечается .

Чтобы создать таблицу с ключами, мы вставляем столбец (столбцы) для ключа в квадратных скобках.

q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$())

q)trade

 sym   | time price size
-----  | ---------------

Можно также определить типы столбцов, установив значения в нулевые списки различных типов —

q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)

Получение информации о таблице

Давайте создадим торговый стол —

trade: ([]sym:`ibm`msft`apple`samsung;mcap:2000 4000 9000 6000;ex:`nasdaq`nasdaq`DAX`Dow)

q)cols trade                         / column names of a table
`sym`mcap`ex

q)trade.sym                          / Retrieves the value of column sym
`ibm`msft`apple`samsung

q)show meta trade                    / Get the meta data of a table trade.

  c   | t f a
----- | -----
 Sym  | s
 Mcap | j
 ex   | s

Первичные ключи и таблицы ключей

Таблица с ключами

Таблица с ключами — это словарь, который отображает каждую строку в таблице уникальных ключей на соответствующую строку в таблице значений. Давайте возьмем пример —

val:flip `name`id!(`John`Jenny`Jonathan;9 18 27)
                          / a flip dictionary create table val
id:flip (enlist `eid)!enlist 99 198 297
                          / flip dictionary, having single column eid

Теперь создайте простую таблицу с ключами, содержащую eid в качестве ключа,

q)valid: id ! val

q)valid                 / table name valid, having key as eid

  eid |  name      id
---   | ---------------
  99  |  John      9
  198 |  Jenny     18
  297 |  Jonathan  27

ForeignKeys

Внешний ключ определяет отображение из строк таблицы, в которой он определен, в строки таблицы с соответствующим первичным ключом .

Внешние ключи обеспечивают ссылочную целостность . Другими словами, попытка вставить значение внешнего ключа, которого нет в первичном ключе, потерпит неудачу.

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

Пример 1 — определение внешнего ключа при инициализации

q)sector:([sym:`SAMSUNG`HSBC`JPMC`APPLE]ex:`N`CME`DAQ`N;MC:1000 2000 3000 4000)

q)tab:([]sym:`sector$`HSBC`APPLE`APPLE`APPLE`HSBC`JPMC;price:6?9f)

q)show meta tab

  c    | t f a
------ | ----------
 sym   | s sector
 price | f

q)show select from tab where sym.ex=`N

  sym     price
----------------
 APPLE   4.65382
 APPLE   4.643817
 APPLE   3.659978

Пример 2 — нет предопределенных отношений между таблицами

sector: ([symb:`IBM`MSFT`HSBC]ex:`N`CME`N;MC:1000 2000 3000)
tab:([]sym:`IBM`MSFT`MSFT`HSBC`HSBC;price:5?9f)

Чтобы использовать отслеживание внешнего ключа, мы должны создать таблицу для ввода ключа в сектор.

q)show update mc:(sector([]symb:sym))[`MC] from tab

  sym     price      mc
--------------------------
  IBM   7.065297    1000
  MSFT  4.812387    2000
  MSFT  6.400545    2000
  HSBC  3.704373    3000
  HSBC  4.438651    3000

Общие обозначения для предопределенного внешнего ключа —

выберите ab из c, где a это внешний ключ (sym), b это a

поле в таблице первичного ключа (ind), c является

таблица внешнего ключа (торговля)

Манипулирующие столы

Давайте создадим одну торговую таблицу и проверим результат другого табличного выражения —

q)trade:([]sym:5?`ibm`msft`hsbc`samsung;price:5?(303.00*3+1);size:5?(900*5);time:5?(.z.T-365))

q)trade

  sym        price   size   time
-----------------------------------------
 msft      743.8592  3162  02:32:17.036
 msft      641.7307  2917  01:44:56.936
 hsbc      838.2311  1492  00:25:23.210
 samsung   278.3498  1983  00:29:38.945
 ibm       838.6471  4006  07:24:26.842

Давайте теперь посмотрим на операторы, которые используются для манипулирования таблицами с использованием языка q .

Выбрать

Синтаксис для использования оператора Select следующий:

select [columns] [by columns] from table [where clause]

Давайте теперь возьмем пример, чтобы продемонстрировать, как использовать оператор Select —

q)/ select expression example

q)select sym,price,size by time from trade where size > 2000

    time      |  sym    price     size
------------- | -----------------------
 01:44:56.936 |  msft   641.7307  2917
 02:32:17.036 |  msft   743.8592  3162
 07:24:26.842 |  ibm    838.6471  4006

Вставить

Синтаксис для использования оператора вставки следующий:

`tablename insert (values)
Insert[`tablename; values]

Давайте теперь возьмем пример, чтобы продемонстрировать, как использовать оператор вставки —

q)/ Insert expression example

q)`trade insert (`hsbc`apple;302.0 730.40;3020 3012;09:30:17.00409:15:00.000)
5 6

q)trade

   sym    price     size    time
------------------------------------------
  msft    743.8592  3162   02:32:17.036
  msft    641.7307  2917   01:44:56.936
  hsbc    838.2311  1492   00:25:23.210
 samsung  278.3498  1983   00:29:38.945
  ibm     838.6471  4006   07:24:26.842
  hsbc    302       3020   09:30:17.004
  apple   730.4     3012   09:15:00.000

q)/Insert another value

q)insert[`trade;(`samsung;302.0; 3333;10:30:00.000]
']

q)insert[`trade;(`samsung;302.0; 3333;10:30:00.000)]
,7

q)trade

   sym     price   size     time
----------------------------------------
  msft   743.8592  3162  02:32:17.036
  msft   641.7307  2917  01:44:56.936
  hsbc   838.2311  1492  00:25:23.210
 samsung 278.3498  1983  00:29:38.945
  ibm    838.6471  4006  07:24:26.842
  hsbc   302       3020  09:30:17.004
  apple  730.4     3012  09:15:00.000
 samsung 302       3333  10:30:00.000

удалять

Синтаксис для использования оператора Delete выглядит следующим образом:

delete columns from table
delete from table where clause

Давайте теперь возьмем пример, чтобы продемонстрировать, как использовать оператор Delete —

q)/Delete expression example

q)delete price from trade

   sym   size       time
-------------------------------
  msft   3162   02:32:17.036
  msft   2917   01:44:56.936
  hsbc   1492   00:25:23.210
 samsung 1983   00:29:38.945
  ibm    4006   07:24:26.842
  hsbc   3020   09:30:17.004
  apple  3012   09:15:00.000
 samsung 3333   10:30:00.000

q)delete from trade where price > 3000

   sym     price     size       time
-------------------------------------------
  msft    743.8592   3162    02:32:17.036
  msft    641.7307   2917    01:44:56.936
  hsbc    838.2311   1492    00:25:23.210
 samsung  278.3498   1983    00:29:38.945
  ibm     838.6471   4006    07:24:26.842
  hsbc    302        3020    09:30:17.004
  apple   730.4      3012    09:15:00.000
 samsung  302        3333    10:30:00.000

q)delete from trade where price > 500

  sym     price     size     time
-----------------------------------------
 samsung  278.3498  1983  00:29:38.945
  hsbc    302       3020  09:30:17.004
 samsung  302       3333  10:30:00.000

Обновить

Синтаксис для использования оператора Update следующий:

update column: newValue from table where ….

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

update column:newValue from `table where …

Давайте теперь возьмем пример, чтобы продемонстрировать, как использовать оператор Update

q)/Update expression example

q)update size:9000 from trade where price > 600

  sym     price      size     time
------------------------------------------
  msft    743.8592   9000   02:32:17.036
  msft    641.7307   9000   01:44:56.936
  hsbc    838.2311   9000   00:25:23.210
 samsung  278.3498   1983   00:29:38.945
  ibm     838.6471   9000   07:24:26.842
  hsbc    302        3020   09:30:17.004
  apple   730.4      9000   09:15:00.000
 samsung  302        3333   10:30:00.000

q)/Update the datatype of a column using the cast function

q)meta trade

   c  |  t f a
----- | --------
  sym |  s
 price|  f
 size |  j
 time |  t

q)update size:`float$size from trade

  sym     price     size      time
------------------------------------------
  msft    743.8592  3162    02:32:17.036
  msft    641.7307  2917    01:44:56.936 
  hsbc    838.2311  1492    00:25:23.210
 samsung  278.3498  1983    00:29:38.945
  ibm     838.6471  4006    07:24:26.842
  hsbc    302       3020    09:30:17.004
  apple   730.4     3012    09:15:00.000
 samsung  302       3333    10:30:00.000

q)/ Above statement will not update the size column datatype permanently

q)meta trade

   c   |  t f a
------ | --------
  sym  |   s
 price |   f
 size  |   j
 time  |   t
 
q)/to make changes in the trade table permanently, we have do

q)update size:`float$size from `trade
`trade

q)meta trade

   c   |  t f a
------ | --------
  sym  |   s
 price |   f
 size  |   f
 time  |   t

Q язык — глагол и наречия

Kdb + имеет существительные, глаголы и наречия. Все объекты данных и функции являются существительными . Глаголы улучшают читаемость, уменьшая количество квадратных скобок и скобок в выражениях. Наречия изменяют двоичные (2 аргумента) функции и глаголы для создания новых связанных глаголов. Функции, производимые наречиями, называются производными функциями или производными глаголами .

каждый

Каждое наречие, обозначаемое (`), изменяет двоичные функции и глаголы для применения к элементам списков вместо самих списков. Взгляните на следующий пример —

q)1, (2 3 5)       / Join
1 2 3 5

q)1, '( 2 3 4)     / Join each
1 2
1 3
1 4

Существует форма Each для монадических функций, которая использует ключевое слово «each». Например,

q)reverse ( 1 2 3; "abc")           /Reverse
a b c
1 2 3

q)each [reverse] (1 2 3; "abc")     /Reverse-Each
3 2 1
c b a

q)'[reverse] ( 1 2 3; "abc")
3 2 1
c b a

Каждый-левый и каждый-правый

Существует два варианта каждой из них для двоичных функций, которые называются Every-Left (\ 🙂 и Each-Right (/ :). В следующем примере объясняется, как их использовать.

q)x: 9 18 27 36

q)y:10 20 30 40

q)x,y            / join
9 18 27 36 10 20 30 40

q)x,'y           / each

9   10
18  20
27  30
36  40

q)x: 9 18 27 36

q)y:10 20 30 40

q)x,y            / join
9 18 27 36 10 20 30 40

q)x,'y           / each, will return a list of pairs

9   10
18  20
27  30
36  40

q)x, \:y         / each left, returns a list of each element
                 / from x with all of y
					  
9   10  20  30  40
18  10  20  30  40
27  10  20  30  40
36  10  20  30  40

q)x,/:y          / each right, returns a list of all the x with
                 / each element of y
					  
9  18  27  36  10
9  18  27  36  20
9  18  27  36  30
9  18  27  36  40

q)1 _x           / drop the first element
18 27 36

q)-2_y           / drop the last two element
10 20

q)               / Combine each left and each right to be a
                 / cross-product (cartesian product)
                 
q)x,/:\:y

9   10  9   20  9   30  9   40
18  10  18  20  18  30  18  40
27  10  27  20  27  30  27  40
36  10  36  20  36  30  36  40

Q Language — Joins

В языке q у нас есть различные виды объединений, основанные на предоставленных входных таблицах и желаемых типах объединяемых таблиц. Объединение объединяет данные из двух таблиц. Помимо отслеживания внешнего ключа, есть еще четыре способа объединения таблиц:

  • Простое соединение
  • Asof присоединиться
  • Левый присоединиться
  • Союз присоединиться

Здесь, в этой главе, мы подробно обсудим каждое из этих объединений.

Простое соединение

Простое объединение — это самый простой тип объединения, выполняемый с запятой ‘,’. В этом случае две таблицы должны соответствовать типу , т. Е. Обе таблицы имеют одинаковое количество столбцов в одинаковом порядке и одинаковый ключ.

table1,:table2 / table1 is assigned the value of table2

Мы можем использовать объединение через запятую для таблиц одинаковой длины, чтобы соединять вбок. Здесь можно ввести одну из таблиц,

Table1, `Table2

Asof Регистрация (aj)

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

Общий формат

aj[joinColumns;tbl1;tbl2]

Например,

aj[`sym`time;trade;quote]

пример

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([]a:(2 3 4);b:(3 4 5); c:( 4 5 6))

q)show aj[`a`b;tab1;tab2]

 a  b  d  c
-------------
 1  2  6
 2  3  7  4
 3  4  8  5
 4  5  9  6

Левое соединение (lj)

Это особый случай aj, где второй аргумент является таблицей с ключами, а первый аргумент содержит столбцы ключа правого аргумента.

Общий формат

table1 lj Keyed-table

пример

q)/Left join- syntax table1 lj table2 or lj[table1;table2]

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([a:(2 3 4);b:(3 4 5)]; c:( 4 5 6))

q)show lj[tab1;tab2]

 a  b  d  c
-------------
 1  2  6
 2  3  7  4
 3  4  8  5
 4  5  9  6

Union Join (UJ)

Это позволяет создать объединение двух таблиц с различными схемами. Это в основном расширение простого соединения (,)

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([]a:(2 3 4);b:(3 4 5); c:( 4 5 6))

q)show uj[tab1;tab2]

 a  b  d  c
------------
 1  2  6
 2  3  7
 3  4  8
 4  5  9
 2  3     4
 3  4     5
 4  5     6

Если вы используете uj в таблицах с ключами, то первичные ключи должны совпадать.

Q Language — Функции

Типы функций

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

  • Атомная — где аргументы являются атомными и дают атомные результаты

  • Агрегат — атом из списка

  • Uniform (список из списка) — Расширено понятие атома применительно к спискам. Количество списка аргументов равно количеству списка результатов.

  • Другое — если функция не из вышеуказанной категории.

Атомная — где аргументы являются атомными и дают атомные результаты

Агрегат — атом из списка

Uniform (список из списка) — Расширено понятие атома применительно к спискам. Количество списка аргументов равно количеству списка результатов.

Другое — если функция не из вышеуказанной категории.

Бинарные операции в математике называются двоичными функциями в q; например, «+». Точно так же унарные операции называются монадическими функциями ; например, «абс» или «пол».

Часто используемые функции

В программировании q часто используется довольно много функций. Здесь, в этом разделе, мы увидим использование некоторых популярных функций —

абс

q) abs -9.9 / Absolute value, Negates -ve number & leaves non -ve number
9.9

все

q) all 4 5 0 -4 / Logical AND (numeric min), returns the minimum value
0b

Макс (&), Мин (|) и Нет (!)

q) /And, Or, and Logical Negation

q) 1b & 1b        / And (Max)
1b

q) 1b|0b              / Or (Min)
1b

q) not 1b             /Logical Negate (Not)
0b 

по возрастанию

q)asc 1 3 5 7 -2 0 4    / Order list ascending, sorted list
                        / in ascending order i
s returned
`s#-2 0 1 3 4 5 7

q)/attr - gives the attributes of data, which describe how it's sorted.
`s denotes fully sorted, `u denotes unique and `p and `g are used to 
refer to lists with repetition, with `p standing for parted and `g for grouped

средний

q)avg 3 4 5 6 7           / Return average of a list of numeric values
5f

q)/Create on trade table

q)trade:([]time:3?(.z.Z-200);sym:3?(`ibm`msft`apple);price:3?99.0;size:3?100)

от

q)/ by - Groups rows in a table at given sym

q)select sum price by sym from trade    / find total price for each sym

  sym  |   price
------ | --------
 apple | 140.2165
  ibm  | 16.11385

смещ_по_столбцам

q)cols trade / Lists columns of a table
`time`sym`price`size

подсчитывать

q)count (til 9) / Count list, count the elements in a list and
                / return a single int value 9

порт

q)\p 9999 / assign port number

q)/csv - This command allows queries in a browser to be exported to
   excel by prefixing the query, such as http://localhost:9999/.csv?select from trade where sym =`ibm

резать

q)/ cut - Allows a table or list to be cut at a certain point

q)(1 3 5) cut "abcdefghijkl"
                            / the argument is split at 1st, 3rd and 5th letter.
"bc"
"de"
"fghijkl"

q)5 cut "abcdefghijkl"      / cut the right arg. Into 5 letters part
                            / until its end.
"abcde"
"fghij"
"kl"

удалять

q)/delete - Delete rows/columns from a table

q)delete price from trade

          time              sym   size
---------------------------------------
  2009.06.18T06:04:42.919  apple   36
  2009.11.14T12:42:34.653   ibm    12
  2009.12.27T17:02:11.518  apple   97

отчетливый

q)/distinct - Returns the distinct element of a list

q)distinct 1 2 3 2 3 4 5 2 1 3            / generate unique set of number
1 2 3 4 5

завербоваться

q)/enlist - Creates one-item list.

q)enlist 37
,37

q)type 37           / -ve type value
-7h

q)type enlist 37    / +ve type value
7h 

Заполнить (^)

q)/fill - used with nulls. There are three functions for processing null values.

The dyadic function named fill replaces null values in the right argument with the atomic left argument.

q)100 ^ 3 4 0N 0N -5
3 4 100 100 -5

q)`Hello^`jack`herry``john`
`jack`herry`Hello`john`Hello

заливка

q)/fills - fills in nulls with the previous not null value.

q)fills 1 0N 2 0N 0N 2 3 0N -5 0N
1 1 2 2 2 2 3 3 -5 -5

Первый

q)/first - returns the first atom of a list

q)first 1 3 34 5 3
1

кувырок

q)/flip - Monadic primitive that applies to lists and associations. It interchange the top two levels of its argument.

q)trade

       time                   sym      price   size
------------------------------------------------------
  2009.06.18T06:04:42.919    apple   72.05742   36
  2009.11.14T12:42:34.653    ibm     16.11385   12
  2009.12.27T17:02:11.518    apple   68.15909   97

q)flip trade

time | 2009.06.18T06:04:42.919 2009.11.14T12:42:34.653
2009.12.27T17:02:11.518

sym   |  apple         ibm         apple
price | 72.05742     16.11385    68.15909
size  | 36 12 97

IASC

q)/iasc - Index ascending, return the indices of the ascended sorted list relative to the input list.

q)iasc 5 4 0 3 4 9

2 3 1 4 0 5

Idesc

q)/idesc - Index desceding, return the descended sorted list relative to the input list

q)idesc 0 1 3 4

3 2 1 0

в

q)/in - In a list, dyadic function used to query list (on the right-handside) about their contents.

q)(2 4) in 1 2 3

10b

вставить

q)/insert - Insert statement, upload new data into a table.

q)insert[`trade;((.z.Z);`samsung;48.35;99)],3

q)trade

      time                  sym       price     size
------------------------------------------------------
 2009.06.18T06:04:42.919   apple    72.05742     36
 2009.11.14T12:42:34.653    ibm     16.11385     12
 2009.12.27T17:02:11.518   apple    68.15909     97
 2015.04.06T10:03:36.738   samsung  48.35        99

ключ

q)/key - three different functions i.e. generate +ve integer number, gives content of a directory or key of a table/dictionary.

q)key 9

0 1 2 3 4 5 6 7 8

q)key `:c:
`$RECYCLE.BIN`Config.Msi`Documents and Settings`Drivers`Geojit`hiberfil.sys`I..

ниже

q)/lower - Convert to lower case and floor

q)lower ("JoHn";`HERRY`SYM)
"john"
`herry`sym

Макс и Мин (т.е. | и &)

q)/Max and Min / a|b and a&b

q)9|7
9

q)9&5
5

ноль

q)/null - return 1b if the atom is a null else 0b from the argument list

q)null 1 3 3 0N
0001b

персик

q)/peach - Parallel each, allows process across slaves

q)foo peach list1       / function foo applied across the slaves named in list1

'list1

q)foo:{x+27}

q)list1:(0 1 2 3 4)

q)foo peach list1       / function foo applied across the slaves named in list1
27 28 29 30 31

Предыдущая

q)/prev - returns the previous element i.e. pushes list forwards

q)prev 0 1 3 4 5 7

0N 0 1 3 4 5

Случайный (?)

q)/random - syntax - n?list, gives random sequences of ints and floats

q)9?5
0 0 4 0 3 2 2 0 1

q)3?9.9
0.2426823 1.674133 3.901671

сровнять с землей

q)/raze - Flattn a list of lists, removes a layer of indexing from a list of lists. for instance:

q)raze (( 12 3 4; 30 0);("hello";7 8); 1 3 4)

12 3 4
30 0
"hello"
7 8
1
3
4

read0

q)/read0 - Read in a text file

q)read0 `:c:/q/README.txt    / gives the contents of *.txt file

READ1

q)/read1 - Read in a q data file

q)read1 `:c:/q/t1

0xff016200630b000500000073796d0074696d6500707269636…

задний ход

q)/reverse - Reverse a list

q)reverse 2 30 29 1 3 4

4 3 1 29 30 2

q)reverse "HelloWorld"

"dlroWolleH"

задавать

q)/set - set value of a variable

q)`x set 9
`x

q)x
9

q)`:c:/q/test12 set trade

`:c:/q/test12

q)get `:c:/q/test12

       time                   sym      price     size
---------------------------------------------------------
  2009.06.18T06:04:42.919    apple    72.05742    36
  2009.11.14T12:42:34.653     ibm     16.11385    12
  2009.12.27T17:02:11.518    apple    68.15909    97
  2015.04.06T10:03:36.738    samsung  48.35       99
  2015.04.06T10:03:47.540    samsung  48.35       99
  2015.04.06T10:04:44.844    samsung  48.35       99

SSR

q)/ssr - String search and replace, syntax - ssr["string";searchstring;replaced-with]

q)ssr["HelloWorld";"o";"O"]

"HellOWOrld"

строка

q)/string - converts to string, converts all types to a string format.

q)string (1 2 3; `abc;"XYZ";0b)

(,"1";,"2";,"3")
"abc"

(,"X";,"Y";,"Z")
,"0"

С.В.

q)/sv - Scalar from vector, performs different tasks dependent on its arguments.

It evaluates the base representation of numbers, which allows us to calculate the number of seconds in a month or convert a length from feet and inches to centimeters.

q)24 60 60 sv 11 30 49

41449   / number of seconds elapsed in a day at 11:30:49

система

q)/system - allows a system command to be sent,

q)system "dir *.py"

" Volume in drive C is New Volume"
" Volume Serial Number is 8CD2-05B2"
""

" Directory of C:\\Users\\myaccount-raj"
""

"09/14/2014    06:32 PM     22 hello1.py"
"                1 File(s)    22 bytes"

таблицы

q)/tables - list all tables

q)tables `

`s#`tab1`tab2`trade

сезам

q)/til - Enumerate

q)til 5

0 1 2 3 4

отделка

q)/trim - Eliminate string spaces

q)trim " John "

"John"

против

q)/vs - Vector from scaler , produces a vector quantity from a scaler quantity

q)"|" vs "20150204|msft|20.45"

"20150204"
"msft"
"20.45"

xasc

q)/xasc - Order table ascending, allows a table (right-hand argument) to be sorted such that (left-hand argument) is in ascending order

q)`price xasc trade

          time                 sym      price      size
----------------------------------------------------------
   2009.11.14T12:42:34.653     ibm     16.11385     12
   2015.04.06T10:03:36.738   samsung   48.35        99
   2015.04.06T10:03:47.540   samsung   48.35        99
   2015.04.06T10:04:44.844   samsung   48.35        99
   2009.12.27T17:02:11.518    apple    68.15909     97
   2009.06.18T06:04:42.919    apple    72.05742     36

xcol

q)/xcol - Renames columns of a table

q)`timeNew`symNew xcol trade

        timeNew                 symNew    price      size
-------------------------------------------------------------
   2009.06.18T06:04:42.919      apple    72.05742     36
   2009.11.14T12:42:34.653       ibm     16.11385     12
   2009.12.27T17:02:11.518      apple    68.15909     97
   2015.04.06T10:03:36.738     samsung   48.35        99
   2015.04.06T10:03:47.540     samsung   48.35        99
   2015.04.06T10:04:44.844     samsung   48.35        99

xcols

q)/xcols - Reorders the columns of a table,

q)`size`price xcols trade

  size    price           time                   sym
-----------------------------------------------------------
   36   72.05742   2009.06.18T06:04:42.919      apple 
   12   16.11385   2009.11.14T12:42:34.653       ibm
   97   68.15909   2009.12.27T17:02:11.518      apple
   99   48.35      2015.04.06T10:03:36.738     samsung 
   99   48.35      2015.04.06T10:03:47.540     samsung
   99   48.35      2015.04.06T10:04:44.844     samsung

xdesc

q)/xdesc - Order table descending, allows tables to be sorted such that the left-hand argument is in descending order.

q)`price xdesc trade

        time                   sym       price      size
-----------------------------------------------------------
   2009.06.18T06:04:42.919    apple    72.05742      36
   2009.12.27T17:02:11.518    apple    68.15909      97
   2015.04.06T10:03:36.738   samsung   48.35         99
   2015.04.06T10:03:47.540   samsung   48.35         99
   2015.04.06T10:04:44.844   samsung   48.35         99
   2009.11.14T12:42:34.653     ibm     16.11385      12

Xgroup

q)/xgroup - Creates nested table

q)`x xgroup ([]x:9 18 9 18 27 9 9;y:10 20 10 20 30 40)
'length

q)`x xgroup ([]x:9 18 9 18 27 9 9;y:10 20 10 20 30 40 10)

  x  |    y
---- | -----------
  9  | 10 10 40 10
  18 | 20 20
  27 | ,30

xkey

q)/xkey - Set key on table

q)`sym xkey trade

    sym   |      time                    price     size
--------- | -----------------------------------------------
   apple  | 2009.06.18T06:04:42.919    72.05742     36
    ibm   | 2009.11.14T12:42:34.653    16.11385     12
   apple  | 2009.12.27T17:02:11.518    68.15909     97
  samsung | 2015.04.06T10:03:36.738    48.35        99
  samsung | 2015.04.06T10:03:47.540    48.35        99
  samsung | 2015.04.06T10:04:44.844    48.35        99

Системные Команды

Системные команды управляют средой q . Они имеют следующую форму —

\cmd [p]       where p may be optional

Некоторые из популярных системных команд были обсуждены ниже —

\ a [namespace] — Список таблиц в данном пространстве имен

q)/Tables in default namespace

q)\a
,`trade

q)\a .o         / table in .o namespace.
,`TI

\ b — просмотр зависимостей

q)/ views/dependencies

q)a:: x+y      / global assingment

q)b:: x+1

q)\b
`s#`a`b

\ B — ожидающие представления / зависимости

q)/ Pending views/dependencies

q)a::x+1     / a depends on x

q)\B         / the dependency is pending
' / the dependency is pending

q)\B
`s#`a`b

q)\b
`s#`a`b

q)b
29

q)a
29

q)\B
`symbol$()

\ cd — Сменить каталог

q)/change directory, \cd [name]

q)\cd
"C:\\Users\\myaccount-raj"

q)\cd ../new-account

q)\cd
"C:\\Users\\new-account"

\ d — устанавливает текущее пространство имен

q)/ sets current namespace \d [namespace]

q)\d             /default namespace
'

q)\d .o          /change to .o

q.o)\d
`.o

q.o)\d .         / return to default

q)key `          /lists namespaces other than .z
`q`Q`h`j`o

q)\d .john       /change to non-existent namespace

q.john)\d
`.john

q.john)\d .

q)\d
`.

\ l — загрузить файл или каталог из БД

q)/ Load file or directory, \l

q)\l test2.q / loading test2.q which is stored in current path.

   ric      |     date      ex      openP    closeP    MCap
----------- | -------------------------------------------------
 JPMORGAN   | 2008.05.23  SENSEX  18.30185  17.16319  17876
   HSBC     | 2002.05.21  NIFTY   2.696749  16.58846  26559
 JPMORGAN   | 2006.09.07  NIFTY   14.15219  20.05624  14557
   HSBC     | 2010.10.11  SENSEX  7.394497  25.45859  29366
 JPMORGAN   | 2007.10.02  SENSEX  1.558085  25.61478  20390
 
   ric     |    date       ex      openP     closeP    MCap
---------- | ------------------------------------------------
  INFOSYS  | 2003.10.30    DOW    21.2342   7.565652   2375
 RELIANCE  | 2004.08.12    DOW    12.34132  17.68381   4201
   SBIN    | 2008.02.14    DOW    1.830857  9.006485   15465
  INFOSYS  | 2009.06.11  HENSENG  19.47664  12.05208   11143
   SBIN    | 2010.07.05    DOW    18.55637  10.54082   15873

\ p — номер порта

q)/ assign port number, \p

q)\p
5001i

q)\p 8888

q)\p
8888i

\\ — выход из консоли q

\\ - exit
Exit form q.

Q Language — Встроенные функции

Язык программирования q имеет набор богатых и мощных встроенных функций. Встроенная функция может быть следующих типов:

  • Функция String — принимает строку в качестве входных данных и возвращает строку.

  • Агрегатная функция — принимает список в качестве входных данных и возвращает атом.

  • Унифицированная функция — берет список и возвращает список с тем же количеством.

  • Математическая функция — принимает числовой аргумент и возвращает числовой аргумент.

  • Разная функция — все функции, кроме указанных выше.

Функция String — принимает строку в качестве входных данных и возвращает строку.

Агрегатная функция — принимает список в качестве входных данных и возвращает атом.

Унифицированная функция — берет список и возвращает список с тем же количеством.

Математическая функция — принимает числовой аргумент и возвращает числовой аргумент.

Разная функция — все функции, кроме указанных выше.

Строковые функции

Like — сопоставление с образцом

q)/like is a dyadic, performs pattern matching, return 1b on success else 0b

q)"John" like "J??n"
1b

q)"John My Name" like "J*"
1b

ltrim — удаляет ведущие пробелы

q)/ ltrim - monadic ltrim takes string argument, removes leading blanks

q)ltrim " Rick "
"Rick "

rtrim — удаляет завершающие пробелы

q)/rtrim - takes string argument, returns the result of removing trailing blanks

q)rtrim " Rick "
" Rick"

ss — поиск строки

q)/ss - string search, perform pattern matching, same as "like" but return the indices of the matches of the pattern in source.

q)"Life is beautiful" ss "i"
1 5 13

отделка — удаляет ведущие и задние пробелы

q)/trim - takes string argument, returns the result of removing leading & trailing blanks

q)trim " John "
"John"

Математические функции

acos — обратная кос

q)/acos - inverse of cos, for input between -1 and 1, return float between 0 and pi

q)acos 1
0f

q)acos -1
3.141593

q)acos 0
1.570796

кор — дает корреляцию

q)/cor - the dyadic takes two numeric lists of same count, returns a correlation between the items of the two arguments

q)27 18 18 9 0 cor 27 36 45 54 63
-0.9707253

крест — декартово произведение

q)/cross - takes atoms or lists as arguments and returns their Cartesian product

q)9 18 cross `x`y`z

9 `x
9 `y
9 `z

18 `x
18 `y
18 `z

дисперсия

q)/var - monadic, takes a scaler or numeric list and returns a float equal to the mathematical variance of the items

q)var 45
0f

q)var 9 18 27 36
101.25

wavg

q)/wavg - dyadic, takes two numeric lists of the same count and returns the average of the second argument weighted by the first argument.

q)1 2 3 4 wavg 200 300 400 500
400f

Агрегатные функции

все — и операция

q)/all - monadic, takes a scaler or list of numeric type and returns the result of & applied across the items.

q)all 0b
0b

q)all 9 18 27 36
1b

q)all 10 20 30
1b

Любой — | операция

q)/any - monadic, takes scaler or list of numeric type and the return the result of | applied across the items

q)any 20 30 40 50
1b

q)any 20012.02.12 2013.03.11
'20012.02.12

prd — арифметическое произведение

q)/prd - monadic, takes scaler, list, dictionary or table of numeric type and returns the arithmetic product.

q)prd `x`y`z! 10 20 30
6000

q)prd ((1 2; 3 4);(10 20; 30 40))

10 40
90 160

Сумма — арифметическая сумма

q)/sum - monadic, takes a scaler, list,dictionary or table of numeric type and returns the arithmetic sum.

q)sum 2 3 4 5 6
20

q)sum (1 2; 4 5)
5 7

Унифицированные функции

Deltas — отличие от предыдущего пункта.

q)/deltas -takes a scalar, list, dictionary or table and returns the difference of each item from its predecessor.

q)deltas 2 3 5 7 9
2 1 2 2 2

q)deltas `x`y`z!9 18 27

x | 9
y | 9
z | 9

заполняет — заполняет нулевое значение

q)/fills - takes scalar, list, dictionary or table of numeric type and returns a c copy of the source in which non-null items are propagated forward to fill nulls

q)fills 1 0N 2 0N 4
1 1 2 2 4

q)fills `a`b`c`d! 10 0N 30 0N

a | 10
b | 10
c | 30
d | 30

maxs — совокупный максимум

q)/maxs - takes scalar, list, dictionary or table and returns the cumulative maximum of the source items.

q)maxs 1 2 4 3 9 13 2
1 2 4 4 9 13 13

q)maxs `a`b`c`d!9 18 0 36

a | 9
b | 18
c | 18
d | 36

Разные функции

Count — вернуть номер элемента

q)/count - returns the number of entities in its argument.

q)count 10 30 30
3

q)count (til 9)
9

q)count ([]a:9 18 27;b:1.1 2.2 3.3)
3

Distinct — вернуть отдельные объекты

q)/distinct - monadic, returns the distinct entities in its argument

q)distinct 1 2 3 4 2 3 4 5 6 9
1 2 3 4 5 6 9

За исключением — элемент не присутствует во втором аргументе.

q)/except - takes a simple list (target) as its first argument and returns a list containing the items of target that are not in its second argument

q)1 2 3 4 3 1 except 1
2 3 4 3

fill — заполнить ноль первым аргументом

q)/fill (^) - takes an atom as its first argument and a list(target) as its second argument and return a list obtained by substituting the first argument for every occurrence of null in target

q)42^ 9 18 0N 27 0N 36
9 18 42 27 42 36

q)";"^"Life is Beautiful"
"Life;is;Beautiful"

Q Language — Запросы

Запросы в q короче и проще и расширяют возможности sql. Основным выражением запроса является «выражение выбора», которое в своей простейшей форме извлекает вложенные таблицы, но также может создавать новые столбцы.

Общая форма выражения Select выглядит следующим образом:

Select columns by columns from table where conditions

** Примечание — по &, где фразы не являются обязательными, только «из выражения» является обязательным.

В общем, синтаксис будет —

select [a] [by b] from t [where c]
update [a] [by b] from t [where c]

Синтаксис выражений q выглядит очень похоже на SQL, но выражения q просты и мощны. Эквивалентное выражение sql для приведенного выше выражения q будет выглядеть следующим образом:

select [b] [a] from t [where c] [group by b order by b]
update t set [a] [where c]

Все предложения выполняются в столбцах и, следовательно, q может использовать порядок. Поскольку запросы Sql не основаны на порядке, они не могут воспользоваться этим преимуществом.

q реляционные запросы обычно намного меньше по размеру по сравнению с соответствующими им sql. Упорядоченные и функциональные запросы делают сложные вещи в SQL.

В исторической базе данных порядок предложения where очень важен, поскольку он влияет на производительность запроса. Переменная раздела (дата / месяц / день) всегда идет первой, за ней следует отсортированный и проиндексированный столбец (обычно столбец sym).

Например,

select from table where date in d, sym in s

намного быстрее чем,

select from table where sym in s, date in d

Основы Запросы

Давайте напишем скрипт запроса в блокноте (как показано ниже), сохраним (как * .q), а затем загрузим его.

sym:asc`AIG`CITI`CSCO`IBM`MSFT;
ex:"NASDAQ"
dst:`$":c:/q/test/data/";           /database destination

@[dst;`sym;:;sym];
n:1000000;

trade:([]sym:n?`sym;time:10:30:00.0+til
n;price:n?3.3e;size:n?9;ex:n?ex);

quote:([]sym:n?`sym;time:10:30:00.0+til
n;bid:n?3.3e;ask:n?3.3e;bsize:n?9;asize:n?9;ex:n?ex);

{@[;`sym;`p#]`sym xasc x}each`trade`quote;
d:2014.08.07 2014.08.08 2014.08.09 2014.08.10 2014.08.11; /Date vector can also be changed by the user

dt:{[d;t].[dst;(`$string d;t;`);:;value t]};
d dt/:\:`trade`quote;

Note: Once you run this query, two folders .i.e. "test" and "data" will be created under "c:/q/", and date partition data can be seen inside data folder.

Запросы с ограничениями

* Обозначает запрос HDB

Выбрать все сделки IBM

select from trade where sym in `IBM

* Выберите все сделки IBM в определенный день

thisday: 2014.08.11
select from trade where date=thisday,sym=`IBM

Выбрать все сделки IBM с ценой> 100

select from trade where sym=`IBM, price > 100.0

Выберите все сделки IBM с ценой, меньшей или равной 100

select from trade where sym=`IBM,not price > 100.0

* Выберите все сделки IBM между 10.30 и 10.40, утром, в определенную дату

thisday: 2014.08.11
select from trade where
date = thisday, sym = `IBM, time > 10:30:00.000,time < 10:40:00.000

Выбрать все сделки IBM в порядке возрастания цены

`price xasc select from trade where sym =`IBM

* Выберите все сделки IBM в порядке убывания цены за определенный промежуток времени

`price xdesc select from trade where date within 2014.08.07 2014.08.11, sym =`IBM

Сложная сортировка — сортировка по возрастанию в порядке возрастания, а затем сортировка результата по убыванию цены.

`sym xasc `price xdesc select from trade where date = 2014.08.07,size = 5

Выбрать все сделки IBM или MSFT

select from trade where sym in `IBM`MSFT

* Рассчитать количество всех символов в порядке возрастания в течение определенного периода времени

`numsym xasc select numsym: count i by sym from trade where date within 2014.08.07 2014.08.11

* Рассчитать количество всех символов в порядке убывания в течение определенного периода времени

`numsym xdesc select numsym: count i by sym from trade where date within 2014.08.07 2014.08.11

* Какова максимальная цена акций IBM за определенный период времени и когда это происходит впервые?

select time,ask from quote where date within 2014.08.07 2014.08.11,
sym =`IBM, ask = exec first ask from select max ask from quote where
sym =`IBM

Выберите последнюю цену для каждого сима в почасовых корзинах

select last price by hour:time.hh, sym from trade

Запросы с агрегациями

* Рассчитать vwap (средневзвешенная цена) всех символов

select vwap:size wavg price by sym from trade

* Подсчитать количество записей (в миллионах) за определенный месяц

(select trade:1e-6*count i by date.dd from trade where date.month=2014.08m) + select quote:1e-6*count i by date.dd from quote where date.month=2014.08m

* HLOC — дневной максимум, минимум, открытие и закрытие для CSCO за определенный месяц

select high:max price,low:min price,open:first price,close:last price by date.dd from trade where date.month=2014.08m,sym =`CSCO

* Ежедневный Vwap для CSCO в определенный месяц

select vwap:size wavg price by date.dd from trade where date.month = 2014.08m ,sym = `CSCO

* Рассчитать среднечасовое значение, дисперсию и стандартное отклонение цены для AIG

select mean:avg price, variance:var price, stdDev:dev price by date, hour:time.hh from trade where sym = `AIG

Выберите диапазон цен в почасовых ведрах

select range:max[price] – min price by date,sym,hour:time.hh from trade

* Дневной спред (средняя ставка-спрос) для CSCO за определенный месяц

select spread:avg bid-ask by date.dd from quote where date.month = 2014.08m, sym = `CSCO

* Ежедневные Торговые Значения для всех симов в определенном месяце

select dtv:sum size by date,sym from trade where date.month = 2014.08m

Извлечь 5 минут VWAP для CSCO

select size wavg price by 5 xbar time.minute from trade where sym = `CSCO

* Извлечение 10 минутных баров для CSCO

select high:max price,low:min price,close:last price by date, 10 xbar time.minute from trade where sym = `CSCO

* Найдите время, когда цена превышает 100 базисных пунктов (100e-4) по сравнению с последней ценой CSCO на определенный день

select time from trade where date = 2014.08.11,sym = `CSCO,price > 1.01*last price

* Цена и объем за полный день для MSFT с интервалом в 1 минуту за последнюю дату в базе данных

select last price,last size by time.minute from trade where date = last date, sym = `MSFT

Q Language — межпроцессное взаимодействие

KDB + позволяет одному процессу связываться с другим процессом посредством межпроцессного взаимодействия. Процессы KDB + могут подключаться к любому другому KDB + на том же компьютере, в той же сети или даже удаленно. Нам просто нужно указать порт, и тогда клиенты смогут общаться с этим портом. Любой процесс q может взаимодействовать с любым другим процессом q, если он доступен в сети и ожидает подключения.

  • серверный процесс прослушивает соединения и обрабатывает любые запросы

  • клиентский процесс инициирует соединение и отправляет команды для выполнения

серверный процесс прослушивает соединения и обрабатывает любые запросы

клиентский процесс инициирует соединение и отправляет команды для выполнения

Клиент и сервер могут находиться на одной машине или на разных машинах. Процесс может быть как клиентом, так и сервером.

Общение может быть,

  • Синхронный (ожидание результата, который будет возвращен)

  • Асинхронный (без ожидания и без результата)

Синхронный (ожидание результата, который будет возвращен)

Асинхронный (без ожидания и без результата)

Инициализировать сервер

Сервер q инициализируется путем указания порта для прослушивания,

q –p 5001 / command line
\p 5001   / session command

Ручка связи

Дескриптор связи — это символ, который начинается с «:» и имеет вид —

`:[server]:port-number

пример

`::5001              / server and client on same machine
`:jack:5001          / server on machine jack
`:192.168.0.156      / server on specific IP address
`:www.myfx.com:5001  / server at www.myfx.com

Чтобы начать соединение, мы используем функцию «hopen», которая возвращает целочисленный дескриптор соединения. Этот дескриптор используется для всех последующих клиентских запросов. Например —

q)h:hopen `::5001

q)h"til 5"
0 1 2 3 4

q)hclose h

Синхронные и асинхронные сообщения

Как только у нас есть дескриптор, мы можем отправить сообщение синхронно или асинхронно.

Синхронное сообщение — после отправки сообщения оно ожидает и возвращает результат. Его формат выглядит следующим образом —

handle “message”

Асинхронное сообщение — после отправки сообщения немедленно приступите к обработке следующего оператора без необходимости ждать и возвращать результат. Его формат выглядит следующим образом —

neg[handle] “message”

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

Q Language — Обработчик сообщений

Когда процесс q подключается к другому процессу q через межпроцессное взаимодействие, он обрабатывается обработчиками сообщений. Эти обработчики сообщений имеют поведение по умолчанию. Например, в случае синхронной обработки сообщений обработчик возвращает значение запроса. Синхронный обработчик в этом случае — .z.pg , который мы можем переопределить согласно требованию.

Процессы Kdb + имеют несколько предопределенных обработчиков сообщений. Обработчики сообщений важны для настройки базы данных. Некоторые из употреблений включают в себя —

  • Журнал — Журнал входящих сообщений (полезно в случае любой фатальной ошибки),

  • Безопасность — разрешить / запретить доступ к базе данных, вызовам определенных функций и т. Д. В зависимости от имени пользователя / IP-адреса. Помогает в предоставлении доступа только авторизованным подписчикам.

  • Обрабатывать подключения / отключения от других процессов.

Журнал — Журнал входящих сообщений (полезно в случае любой фатальной ошибки),

Безопасность — разрешить / запретить доступ к базе данных, вызовам определенных функций и т. Д. В зависимости от имени пользователя / IP-адреса. Помогает в предоставлении доступа только авторизованным подписчикам.

Обрабатывать подключения / отключения от других процессов.

Предопределенные обработчики сообщений

Некоторые из предопределенных обработчиков сообщений обсуждаются ниже.

.z.pg

Это синхронный обработчик сообщений (процесс get). Эта функция вызывается автоматически при получении сообщения синхронизации на экземпляре kdb +.

Параметр — это вызов строки / функции, который необходимо выполнить, т. Е. Переданное сообщение. По умолчанию это определяется следующим образом —

.z.pg: {value x}                / simply execute the message 
                                received but we can overwrite it to
give any customized result.
.z.pg : {handle::.z.w;value x}  / this will store the remote handle
.z.pg : {show .z.w;value x}     / this will show the remote handle

.z.ps

Это асинхронный обработчик сообщений (набор процессов). Это эквивалентный обработчик для асинхронных сообщений. Параметр — это вызов строки / функции, который нужно выполнить. По умолчанию это определяется как,

.z.pg : {value x}        / Can be overriden for a customized action.

Ниже приведен настраиваемый обработчик сообщений для асинхронных сообщений, в котором мы использовали защищенное выполнение.

.z.pg: {@[value; x; errhandler x]}

Здесь errhandler — это функция, используемая в случае непредвиденной ошибки.

.z.po []

Это обработчик открытого соединения (процесс-открытый). Он выполняется, когда удаленный процесс открывает соединение. Чтобы увидеть дескриптор, когда соединение с процессом открыто, мы можем определить .z.po как,

.z.po : {Show “Connection opened by” , string h: .z.h}

.z.pc []

Это обработчик закрытого соединения (process-close). Он вызывается, когда соединение закрыто. Мы можем создать наш собственный обработчик закрытия, который может сбросить глобальный дескриптор соединения на 0 и выполнить команду, чтобы таймер срабатывал (выполнялся) каждые 3 секунды (3000 миллисекунд).

.z.pc : { h::0; value “\\t 3000”} 

Обработчик таймера (.z.ts) пытается заново открыть соединение. В случае успеха таймер выключается.

.z.ts : { h:: hopen `::5001; if [h>0; value “\\t 0”] }

.z.pi []

PI обозначает процесс ввода. Он вызывается для любого вида ввода. Он может использоваться для обработки ввода с консоли или удаленного ввода клиента. Используя .z.pi [], можно проверить ввод с консоли или заменить дисплей по умолчанию. Кроме того, он может быть использован для любых операций регистрации.

q).z.pi
'.z.pi

q).z.pi:{">", .Q.s value x}

q)5+4
>9

q)30+42
>72

q)30*2
>60

q)\x .z.pi
>q)

q)5+4
9

.z.pw

Это обработчик соединения проверки (аутентификация пользователя). Он добавляет дополнительный обратный вызов при открытии соединения для сеанса KDB +. Он вызывается после проверок –u / -U и до .z.po (открытие порта).

.z.pw : {[user_id;passwd] 1b}

Входами являются ID пользователя (символ) и пароль (текст).

Q Language — Атрибуты

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

Типы атрибутов

Сортировка (`s #)

`s # означает, что список отсортирован в порядке возрастания. Если список явно отсортирован по asc (или xasc), в списке автоматически будет установлен атрибут сортировки.

q)L1: asc 40 30 20 50 9 4

q)L1
`s#4 9 20 30 40 50

Список, который, как известно, сортируется, также может иметь атрибут, установленный явно. Q проверит, отсортирован ли список, а если нет, будет выдана ошибка s-fail .

q)L2:30 40 24 30 2

q)`s#L2
's-fail

Сортированный атрибут будет потерян при несортированном добавлении.

Расстались (`p #)

`p # означает, что список разделен и идентичные элементы хранятся непрерывно.

Диапазон — это тип int или temporal, имеющий базовое значение типа int, например, годы, месяцы, дни и т. Д. Вы также можете разделить символ, если он перечислен.

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

q)L:`p# 99 88 77 1 2 3

q)L
`p#99 88 77 1 2 3

q)L,:3

q)L
99 88 77 1 2 3 3

Примечание —

  • Атрибут parted не сохраняется под операцией в списке, даже если операция сохраняет разбиение.

  • Атрибут parted следует учитывать, когда число объектов достигает миллиарда, а большинство разделов имеют значительный размер, т. Е. Имеется значительное повторение.

Атрибут parted не сохраняется под операцией в списке, даже если операция сохраняет разбиение.

Атрибут parted следует учитывать, когда число объектов достигает миллиарда, а большинство разделов имеют значительный размер, т. Е. Имеется значительное повторение.

Сгруппированный (`g #)

`g # означает, что список сгруппирован. Создается и поддерживается внутренний словарь, который отображает каждый уникальный элемент на каждый из его индексов, что требует значительного места для хранения. Для списка длины L, содержащего u уникальных элементов размера s , это будет (L × 4) + (u × s) байтов.

Группировка может быть применена к списку, когда никакие другие предположения относительно его структуры не могут быть сделаны.

Атрибут может быть применен к любым типизированным спискам. Поддерживается при добавлении, но теряется при удалении.

q)L: `g# 1 2 3 4 5 4 2 3 1 4 5 6

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6

q)L,:9

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6 9

q)L _:2

q)L
1 2 4 5 4 2 3 1 4 5 6 9

Уникальный (`#u)

Применение уникального атрибута (`u #) к списку означает, что элементы списка различны. Знание того, что элементы списка уникальны, значительно ускоряет различие и позволяет q выполнить некоторые сравнения на ранней стадии.

Когда список помечается как уникальный, для каждого элемента в списке создается внутренняя хеш-карта. Операции в списке должны сохранять уникальность, иначе атрибут будет утерян.

q)LU:`u#`MSFT`SAMSUNG`APPLE

q)LU
`u#`MSFT`SAMSUNG`APPLE

q)LU,:`IBM                        /Uniqueness preserved

q)LU
`u#`MSFT`SAMSUNG`APPLE`IBM

q)LU,:`SAMSUNG                    / Attribute lost

q)LU
`MSFT`SAMSUNG`APPLE`IBM`SAMSUNG

Примечание —

  • `u # сохраняется в конкатенациях, которые сохраняют уникальность. Он теряется при удалении и неуникальных конкатенациях.

  • Поиск по спискам `u # осуществляется через хеш-функцию.

`u # сохраняется в конкатенациях, которые сохраняют уникальность. Он теряется при удалении и неуникальных конкатенациях.

Поиск по спискам `u # осуществляется через хеш-функцию.

Удаление атрибутов

Атрибуты можно удалить, применив `#.

Применение атрибутов

Три формата для применения атрибутов:

  • L: `s # 14 2 3 3 9 / Указать при создании списка

  • @ [`.; `L; `s #] / Функциональное применение, т.е. к списку переменных L

    / в пространстве имен по умолчанию (то есть `.) применяются

    / отсортированный атрибут `s #

  • Обновление `s # time из` tab

    / Обновите таблицу (вкладку), чтобы применить

    / атрибут.

L: `s # 14 2 3 3 9 / Указать при создании списка

@ [`.; `L; `s #] / Функциональное применение, т.е. к списку переменных L

/ в пространстве имен по умолчанию (то есть `.) применяются

/ отсортированный атрибут `s #

Обновление `s # time из` tab

/ Обновите таблицу (вкладку), чтобы применить

/ атрибут.

Давайте применим вышеупомянутые три различных формата с примерами.

q)/ set the attribute during creation

q)L:`s# 3 4 9 10 23 84 90

q)/apply the attribute to existing list data

q)L1: 9 18 27 36 42 54

q)@[`.;`L1;`s#]
`.

q)L1                 / check
`s#9 18 27 36 42 54

q)@[`.;`L1;`#]       / clear attribute
`.

q)L1
9 18 27 36 42 54

q)/update a table to apply the attribute

q)t: ([] sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t:([]time:09:00 09:30 10:00t;sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t

    time         sym    mcap
---------------------------------
  09:00:00.000   ibm    9000
  09:30:00.000   msft   18000
  10:00:00.000  samsung 27000

q)update `s#time from `t
`t

q)meta t               / check it was applied

    c  | t f a
------ | -----
  time | t s
  sym  | s
  mcap | j
  
Above we can see that the attribute column in meta table results shows the time column is sorted (`s#).

Q Language — Функциональные запросы

Функциональные (динамические) запросы позволяют указывать имена столбцов в виде символов для типичных столбцов q-sql select / exec / delete. Это очень удобно, когда мы хотим динамически указывать имена столбцов.

Функциональные формы —

?[t;c;b;a]    / for select
![t;c;b;a]    / for update

где

  • т — таблица;

  • а — словарь агрегатов;

  • б за фраза; а также

  • с список ограничений.

т — таблица;

а — словарь агрегатов;

б за фраза; а также

с список ограничений.

Примечание —

  • Все q сущностей в a , b и c должны указываться по имени, что означает символы, содержащие имена сущностей.

  • Синтаксические формы select и update анализируются интерпретатором q в их эквивалентные функциональные формы, поэтому между этими двумя формами нет разницы в производительности.

Все q сущностей в a , b и c должны указываться по имени, что означает символы, содержащие имена сущностей.

Синтаксические формы select и update анализируются интерпретатором q в их эквивалентные функциональные формы, поэтому между этими двумя формами нет разницы в производительности.

Функциональный выбор

Следующий блок кода показывает, как использовать функциональный выбор

q)t:([]n:`ibm`msft`samsung`apple;p:40 38 45 54)

q)t

    n       p
-------------------
   ibm     40
   msft    38
 samsung   45
  apple    54

q)select m:max p,s:sum p by name:n from t where p>36, n in `ibm`msft`apple

  name |   m   s
------ | ---------
 apple |  54  54
 ibm   |  40  40
 msft  |  38  38

Пример 1

Начнем с самого простого случая, функциональная версия «select from t» будет выглядеть так:

q)?[t;();0b;()]     / select from t

    n      p
-----------------
   ibm    40
   msft   38
 samsung  45
  apple   54

Пример 2

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

q)wherecon: enlist (>;`p;40)

q)?[`t;wherecon;0b;()] / select from t where p > 40

    n      p
----------------
 samsung  45
  apple   54

Пример 3

q)groupby: enlist[`p] ! enlist `p

q)selcols: enlist [`n]!enlist `n

q)?[ `t;(); groupby;selcols]        / select n by p from t

   p  |    n
----- | -------
  38  |  msft
  40  |  ibm
  45  | samsung
  54  | apple

Функциональный Exec

Функциональная форма exec — это упрощенная форма выбора .

q)?[t;();();`n]                / exec n from t (functional form of exec)
`ibm`msft`samsung`apple

q)?[t;();`n;`p]                / exec p by n from t (functional exec)

apple   | 54
ibm     | 40
msft    | 38
samsung | 45

Функциональное обновление

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

q)c:enlist (>;`p;0)

q)b: (enlist `n)!enlist `n

q)a: (enlist `p) ! enlist (max;`p)

q)![t;c;b;a]

   n      p
-------------
  ibm    40
  msft   38
 samsung 45
 apple   54

Функциональное удаление

Функциональное удаление — это упрощенная форма функционального обновления. Его синтаксис выглядит следующим образом —

![t;c;0b;a]        / t is a table, c is a list of where constraints, a is a
                   / list of column names

Давайте теперь возьмем пример, чтобы показать, как работает функциональное удаление —

q)![t; enlist (=;`p; 40); 0b;`symbol$()]
                                          / delete from t where p = 40
   n       p
---------------
  msft    38
 samsung  45
  apple   54

Q Language — табличная арифметика

В этой главе мы научимся работать со словарями, а затем с таблицами. Начнем со словарей —

q)d:`u`v`x`y`z! 9 18 27 36 45                  / Creating a dictionary d

q)/ key of this dictionary (d) is given by

q)key d
`u`v`x`y`z

q)/and the value by

q)value d
9 18 27 36 45

q)/a specific value

q)d`x
27

q)d[`x]
27

q)/values can be manipulated by using the arithmetic operator +-*% as,

q)45 + d[`x`y]
72 81

Если нужно изменить значения словаря, то формулировка поправки может быть:

q)@[`d;`z;*;9]
`d

q)d

u | 9
v | 18
x | 27
y | 36

q)/Example, table tab

q)tab:([]sym:`;time:0#0nt;price:0n;size:0N)

q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT

q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)]
0 1 2 3 4 5 6 7 8 9

q)`time xasc `tab
`tab

q)/ to get particular column from table tab

q)tab[`size]
12 10 1 90 73 90 43 90 84 63

q)tab[`size]+9
21 19 10 99 82 99 52 99 93 72

z | 405

q)/Example table tab

q)tab:([]sym:`;time:0#0nt;price:0n;size:0N)

q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT

q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)]
0 1 2 3 4 5 6 7 8 9

q)`time xasc `tab
`tab

q)/ to get particular column from table tab

q)tab[`size]
12 10 1 90 73 90 43 90 84 63

q)tab[`size]+9
21 19 10 99 82 99 52 99 93 72

q)/Example table tab

q)tab:([]sym:`;time:0#0nt;price:0n;size:0N)

q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT

q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)]
0 1 2 3 4 5 6 7 8 9

q)`time xasc `tab
`tab

q)/ to get particular column from table tab

q)tab[`size]
12 10 1 90 73 90 43 90 84 63

q)tab[`size]+9
21 19 10 99 82 99 52 99 93 72

q)/We can also use the @ amend too

q)@[tab;`price;-;2]

   sym      time           price     size
--------------------------------------------
  APPLE   11:16:39.779   6.388858     12
  MSFT    11:16:39.779   17.59907     10
  IBM     11:16:39.779   35.5638      1
 SAMSUNG  11:16:39.779   59.37452     90
  APPLE   11:16:39.779   50.94808     73
 SAMSUNG  11:16:39.779   67.16099     90
  APPLE   11:16:39.779   20.96615     43
 SAMSUNG  11:16:39.779   67.19531     90
  IBM     11:16:39.779   45.07883     84
  IBM     11:16:39.779   61.46716     63

q)/if the table is keyed

q)tab1:`sym xkey tab[0 1 2 3 4]

q)tab1

   sym    |   time          price     size
--------- | ----------------------------------
  APPLE   | 11:16:39.779   8.388858    12
  MSFT    | 11:16:39.779   19.59907    10
  IBM     | 11:16:39.779   37.5638     1
 SAMSUNG  | 11:16:39.779   61.37452    90
  APPLE   | 11:16:39.779   52.94808    73

q)/To work on specific column, try this

q){tab1[x]`size} each sym
1 90 12 10

q)(0!tab1)`size
12 10 1 90 73

q)/once we got unkeyed table, manipulation is easy

q)2+ (0!tab1)`size
14 12 3 92 75

Q Language — таблицы на диске

Данные на вашем жестком диске (также называемом исторической базой данных) могут быть сохранены в трех различных форматах — плоские файлы, разбитые таблицы и секционированные таблицы. Здесь мы узнаем, как использовать эти три формата для сохранения данных.

Плоский файл

Плоские файлы полностью загружаются в память, поэтому их размер (объем памяти) должен быть небольшим. Таблицы сохраняются на диске целиком в одном файле (поэтому размер имеет значение).

Функции, используемые для управления этими таблицами, устанавливаются / получают

`:path_to_file/filename set tablename

Давайте рассмотрим пример, чтобы продемонстрировать, как это работает.

q)tables `.
`s#`t`tab`tab1 

q)`:c:/q/w32/tab1_test set tab1
`:c:/q/w32/tab1_test

В среде Windows плоские файлы сохраняются в расположении — C: \ q \ w32

Окружающая среда Windows

Получите плоский файл с вашего диска (исторический дБ) и используйте команду get следующим образом:

q)tab2: get `:c:/q/w32/tab1_test

q)tab2

   sym    |   time           price   size
--------- | -------------------------------
  APPLE   | 11:16:39.779   8.388858   12
  MSFT    | 11:16:39.779   19.59907   10
  IBM     | 11:16:39.779   37.5638    1
 SAMSUNG  | 11:16:39.779   61.37452   90
  APPLE   | 11:16:39.779   52.94808   73

Создается новая таблица tab2, содержимое которой хранится в файле tab1_test .

Таблицы с растяжкой

Если в таблице слишком много столбцов, мы храним такие таблицы в расширенном формате, т.е. сохраняем их на диске в каталоге. Внутри каталога каждый столбец сохраняется в отдельном файле под тем же именем, что и имя столбца. Каждый столбец сохраняется в виде списка соответствующего типа в двоичном файле kdb +.

Сохранение таблицы в расширенном формате очень полезно, когда нам приходится часто обращаться только к нескольким столбцам из множества столбцов. Каталог с развернутой таблицей содержит двоичный файл .d, который содержит порядок столбцов.

Подобно плоскому файлу, таблица может быть сохранена как развернутая с помощью команды set . Чтобы сохранить таблицу как развернутую, путь к файлу должен заканчиваться отрицательной реакцией —

`:path_to_filename/filename/ set tablename

Для чтения развернутой таблицы мы можем использовать функцию get

tablename: get `:path_to_file/filename

Примечание. Чтобы таблица сохранялась как развернутая, она должна быть разблокирована и перечислена.

В среде Windows ваша файловая структура будет выглядеть следующим образом:

Файловая структура

Разделенные таблицы

Секционированные таблицы предоставляют эффективные средства для управления огромными таблицами, содержащими значительные объемы данных. Разделенные таблицы — это расширенные таблицы, распределенные по нескольким разделам (каталогам).

Внутри каждого раздела таблица будет иметь свой собственный каталог со структурой развернутой таблицы. Таблицы могут быть разделены на день / месяц / год, чтобы обеспечить оптимизированный доступ к его контенту.

Чтобы получить содержимое секционированной таблицы, используйте следующий блок кода —

q)get `:c:/q/data/2000.01.13              // “get” command used, sample folder

quote| +`sym`time`bid`ask`bsize`asize`ex!(`p#`sym!0 0 0 0 0 0 0 0 0 0 0
0 0 0….

trade| +`sym`time`price`size`ex!(`p#`sym!0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 ….

Давайте попробуем получить содержимое торговой таблицы —

q)get `:c:/q/data/2000.01.13/trade

   sym    time            price     size    ex
--------------------------------------------------
    0   09:30:00.496    0.4092016    7      T
    0   09:30:00.501    1.428629     4      N
    0   09:30:00.707    0.5647834    6      T
    0   09:30:00.781    1.590509     5      T
    0   09:30:00.848    2.242627     3      A
    0   09:30:00.860    2.277041     8      T
    0   09:30:00.931    0.8044885    8      A
    0   09:30:01.197    1.344031     2      A
    0   09:30:01.337    1.875        3      A
    0   09:30:01.399    2.187723     7      A

Примечание. Режим секционирования подходит для таблиц с миллионами записей в день (т. Е. Данные временных рядов).

Sym файл

Файл sym — это двоичный файл kdb +, содержащий список символов из всех таблиц с разделениями и секциями. Это можно прочитать с,

get `:sym

файл par.txt (необязательно)

Это файл конфигурации, используемый, когда разделы распределены по нескольким каталогам / дискам, и содержит пути к разделам диска.

Q Language — Функции обслуживания

.Q.en

.Q.en — это двоичная функция, которая помогает в развертывании таблицы путем перечисления символьного столбца. Это особенно полезно, когда мы имеем дело с историческими БД (splayed, таблицы разделов и т. Д.).

.Q.en[`:directory;table]

где каталог — это домашний каталог базы данных истории, в которой находится файл sym, а таблица — это таблица для перечисления.

Ручное перечисление таблиц не требуется для сохранения их в виде таблиц с расширением, так как это будет сделано с помощью —

.Q.en[`:directory_where_symbol_file_stored]table_name

.Q.dpft

Функция .Q.dpft помогает в создании секционированных и сегментированных таблиц. Это расширенная форма .Q.en , поскольку она не только отображает таблицу, но и создает таблицу разделов.

В .Q.dpft используются четыре аргумента :

  • символьный дескриптор файла базы данных, в которой мы хотим создать раздел,

  • q значение данных, с которым мы собираемся разбить таблицу,

  • имя поля, с которым будет применен атрибут parted (`p #) (обычно` sym), и

  • имя таблицы.

символьный дескриптор файла базы данных, в которой мы хотим создать раздел,

q значение данных, с которым мы собираемся разбить таблицу,

имя поля, с которым будет применен атрибут parted (`p #) (обычно` sym), и

имя таблицы.

Давайте рассмотрим пример, чтобы увидеть, как это работает —

q)tab:([]sym:5?`msft`hsbc`samsung`ibm;time:5?(09:30:30);price:5?30.25)

q).Q.dpft[`:c:/q/;2014.08.24;`sym;`tab]
`tab

q)delete tab from `
'type

q)delete tab from `/
'type

q)delete tab from .
'type

q)delete tab from `.
`.

q)tab
'tab

Мы удалили вкладку таблицы из памяти. Давайте теперь загрузим его из БД

q)\l c:/q/2014.08.24/

q)\a
,`tab

q)tab

   sym      time      price
-------------------------------
  hsbc    07:38:13   15.64201
  hsbc    07:21:05   5.387037
  msft    06:16:58   11.88076
  msft    08:09:26   12.30159
 samsung  04:57:56   15.60838

.Q.chk

.Q.chk — это монадическая функция, единственным параметром которой является символьный дескриптор файла корневого каталога. Он создает пустые таблицы в разделе, где это необходимо, путем изучения каждого подкаталога раздела в корневом каталоге.

.Q.chk `:directory

где каталог — домашний каталог исторической базы данных.