KDB +-クイックガイド

これは完全なクイズです kdb+kxシステムから、主に独立して学習する人を対象としています。2003年に導入されたkdb +は、データをキャプチャ、分析、比較、および保存するように設計された新世代のkdbデータベースです。

kdb +システムには、次の2つのコンポーネントが含まれています-

  • KDB+ −データベース(kデータベースプラス)

  • Q − kdb +を操作するためのプログラミング言語

どちらも kdb+ そして q で書かれています k programming language (と同じ q しかし、読みにくい)。

バックグラウンド

Kdb + / qは、あいまいな学術言語として生まれましたが、長年にわたって、使いやすさを徐々に向上させてきました。

  • APL (1964年、プログラミング言語)

  • A+ (1988年、Arthur Whitneyによる修正APL)

  • K (1993年、A。ホイットニーによって開発されたA +の鮮明なバージョン)

  • Kdb (1998、メモリ内の列ベースのデータベース)

  • Kdb+/q (2003、q言語– kのより読みやすいバージョン)

KDB +を使用する理由と場所

どうして?−分析を使用したリアルタイムデータの単一のソリューションが必要な場合は、kdb +を検討する必要があります。Kdb +はデータベースを通常のネイティブファイルとして保存するため、ハードウェアやストレージアーキテクチャに関して特別なニーズはありません。データベースは単なるファイルのセットであるため、管理作業は難しくありません。

KDB +を使用する場所?−ほとんどの投資銀行が現在使用しているか、従来のデータベースからkdb +への切り替えを計画しているため、どの投資銀行がkdb +を使用していないかを簡単に数えることができます。データ量は日々増加しているため、膨大な量のデータを処理できるシステムが必要です。KDB +はこの要件を満たしています。KDB +は、膨大な量のデータを保存するだけでなく、リアルタイムで分析します。

入門

これだけの背景を踏まえて、KDB +の環境をセットアップする方法を説明して学びましょう。KDB +をダウンロードしてインストールする方法から始めます。

KDB +のダウンロードとインストール

KDB +の無料の32ビットバージョンを入手できます。64ビットバージョンのすべての機能は、 http://kx.com/software-download.php

使用許諾契約に同意し、オペレーティングシステムを選択します(すべての主要なオペレーティングシステムで使用可能)。Windowsオペレーティングシステムの場合、最新バージョンは3.2です。最新バージョンをダウンロードします。解凍すると、フォルダ名が表示されます“windows” そして、windowsフォルダ内に別のフォルダがあります “q”。全体をコピーするq c:/ドライブにフォルダを置きます。

実行ターミナルを開き、保存する場所を入力します qフォルダ; 「c:/q/w32/q.exe」のようになります。Enterキーを押すと、次のような新しいコンソールが表示されます-

最初の行には、バージョン番号3.2、リリース日2015.03.05が表示されます。

ディレクトリレイアウト

試用版/無料版は通常、ディレクトリにインストールされます。

For 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

For Windows −

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

Example Files −

kdb +をダウンロードすると、Windowsプラットフォームのディレクトリ構造は次のようになります-

上記のディレクトリ構造では、 trade.q そして sp.q 参照点として使用できるサンプルファイルです。

Kdb +は、膨大な量のデータを処理するために最初から設計された高性能で大量のデータベースです。完全に64ビットであり、マルチコア処理とマルチスレッドが組み込まれています。同じアーキテクチャがリアルタイムデータと履歴データに使用されます。データベースには、独自の強力なクエリ言語が組み込まれています。q, そのため、分析はデータに対して直接実行できます。

kdb+tick は、リアルタイムおよび履歴データのキャプチャ、処理、およびクエリを可能にするアーキテクチャです。

Kdb + /ティックアーキテクチャ

次の図は、典型的なKdb + / tickアーキテクチャの一般的な概要を示し、その後にさまざまなコンポーネントとデータのスルーフローについて簡単に説明しています。

  • ザ・ Data Feeds は、ロイター、ブルームバーグなどのデータフィードプロバイダーによって、または取引所から直接提供される時系列データです。

  • 関連するデータを取得するために、データフィードからのデータはによって解析されます feed handler

  • データがフィードハンドラーによって解析されると、データは ticker-plant

  • 障害からデータを回復するために、ticker-plantは最初に新しいデータを更新/ログファイルに保存してから、独自のテーブルを更新します。

  • 内部テーブルとログファイルを更新した後、オンタイムループデータは、リアルタイムデータベースと、データを要求したすべてのチェーンサブスクライバーに継続的に送信/公開されます。

  • 営業日の終わりに、ログファイルが削除され、新しいログファイルが作成され、リアルタイムデータベースが履歴データベースに保存されます。すべてのデータが履歴データベースに保存されると、リアルタイムデータベースはそのテーブルを削除します。

Kdb + Tickアーキテクチャのコンポーネント

データフィード

データフィードは、任意の市場またはその他の時系列データにすることができます。データフィードをフィードハンドラーへの生の入力と見なします。フィードは、取引所(ライブストリーミングデータ)、トムソンロイター、ブルームバーグなどのニュース/データプロバイダー、またはその他の外部機関から直接送信できます。

フィードハンドラー

フィードハンドラーは、データストリームをkdb +への書き込みに適した形式に変換します。データフィードに接続され、データを取得してフィード固有の形式からKdb +メッセージに変換し、ティッカープラントプロセスに公開します。通常、フィードハンドラは、次の操作を実行するために使用されます-

  • 一連のルールに従ってデータをキャプチャします。
  • そのデータをある形式から別の形式に変換(/強化)します。
  • 最新の値をキャッチします。

ティッカープラント

Ticker Plantは、KDB +アーキテクチャの最も重要なコンポーネントです。これは、リアルタイムデータベースまたは直接サブスクライバー(クライアント)が財務データにアクセスするために接続されるティッカープラントです。それはで動作しますpublish and subscribe機構。サブスクリプション(ライセンス)を取得すると、発行者(ティッカープラント)からのティック(定期的)パブリケーションが定義されます。以下の操作を行います-

  • フィードハンドラーからデータを受信します。

  • ティッカープラントはデータを受信するとすぐに、コピーをログファイルとして保存し、ティッカープラントが更新を取得すると更新するため、障害が発生した場合でもデータが失われることはありません。

  • クライアント(リアルタイムサブスクライバー)は、ティッカープラントに直接サブスクライブできます。

  • 各営業日の終わりに、つまり、リアルタイムデータベースが最後のメッセージを受信すると、今日のすべてのデータを履歴データベースに保存し、今日のデータをサブスクライブしたすべてのサブスクライバーに同じものをプッシュします。次に、すべてのテーブルをリセットします。データが履歴データベースまたはリアルタイムデータベース(rtdb)に直接リンクされた他のサブスクライバーに保存されると、ログファイルも削除されます。

  • その結果、ティッカープラント、リアルタイムデータベース、および履歴データベースは24時間年中無休で運用されています。

ティッカープラントはKdb +アプリケーションであるため、そのテーブルは次を使用してクエリできます。 q他のKdb +データベースと同じように。すべてのティッカープラントクライアントは、サブスクライバーとしてのみデータベースにアクセスできる必要があります。

リアルタイムデータベース

リアルタイムデータベース(rdb)は、今日のデータを格納します。ティッカープラントに直接接続されています。通常、市場時間(1日)にメモリに保存され、1日の終わりに履歴データベース(hdb)に書き出されます。データ(rdbデータ)はメモリに保存されるため、処理は非常に高速です。

kdb +は1日あたりのデータの予想サイズの4倍以上のRAMサイズを推奨しているため、rdbで実行されるクエリは非常に高速で、優れたパフォーマンスを提供します。リアルタイムデータベースには今日のデータのみが含まれているため、日付列(パラメーター)は必要ありません。

たとえば、次のようなrdbクエリを作成できます。

select from trade where sym = `ibm

OR

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

履歴データベース

会社の見積もりを計算する必要がある場合は、その履歴データを利用できるようにする必要があります。履歴データベース(hdb)は、過去に行われたトランザクションのデータを保持します。新しい日のレコードは、1日の終わりにhdbに追加されます。hdb内の大きなテーブルは、分散して保存されるか(各列は独自のファイルに保存されます)、一時データによってパーティション分割されて保存されます。また、一部の非常に大規模なデータベースは、par.txt (ファイル)。

これらのストレージ戦略(分散、パーティション化など)は、大きなテーブルからデータを検索またはアクセスするときに効率的です。

履歴データベースは、内部および外部のレポート目的、つまり分析にも使用できます。たとえば、特定の日のIBMの会社の取引を取引(または任意の)テーブル名から取得したい場合、次のようにクエリを作成する必要があります。

thisday: 2014.10.12

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

Note −概要がわかり次第、このようなクエリをすべて記述します。 q 言語。

Kdb +には、次のように知られている組み込みのプログラミング言語が付属しています。 q。時系列分析用に拡張された標準SQLのスーパーセットが組み込まれており、標準バージョンに比べて多くの利点があります。SQLに精通している人なら誰でも学ぶことができますq 数日のうちに、彼女自身のアドホッククエリをすばやく作成できるようになります。

「q」環境の開始

kdb +の使用を開始するには、を開始する必要があります qセッション。開始するには3つの方法がありますq セッション-

  • 実行端末で「c:/q/w32/q.exe」と入力するだけです。

  • MS-DOSコマンドターミナルを起動し、次のように入力します q

  • をコピーします q.exe ファイルを「C:\ Windows \ System32」に移動し、実行ターミナルで「q」と入力するだけです。

ここでは、Windowsプラットフォームで作業していることを前提としています。

データ型

次の表に、サポートされているデータ型のリストを示します。

名前 チャー タイプ サイズ
ブール値 1b b 1 1
バイト 0xff バツ 4 1
ショート 23時間 h 5 2
int 23i 6 4
長いです 23j j 7 8
リアル 2.3e e 8 4
浮く 2.3f f 9 8
char 「a」 c 10 1
varchar `ab s 11 *
2003.03m m 13 4
日付 2015.03.17T18:01:40.134 z 15 8
08:31 u 17 4
2番目 08:31:53 v 18 4
時間 18:03:18.521 t 19 4
列挙型 `u $` b、ここでu: `a`b * 20 4

アトムとリストの形成

原子は単一のエンティティであり、たとえば、単一の数字、文字、または記号です。上記の表(さまざまなデータ型)では、サポートされているすべてのデータ型はアトムです。リストは、原子のシーケンスまたはリストを含む他のタイプです。

任意の型のアトムをモナド(つまり、単一引数関数)型関数に渡すと、負の値が返されます。 –n、これらのアトムの単純なリストをtype関数に渡すと、正の値が返されます。 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

多くの場合、一部のデータのデータ型をあるタイプから別のタイプに変更する必要があります。標準のキャスト関数は「$」ですdyadic operator

あるタイプから別のタイプにキャストするために3つのアプローチが使用されます(文字列を除く)-

  • シンボル名で目的のデータ型を指定します
  • 文字で目的のデータ型を指定します
  • 短い値で目的のデータ型を指定します。

浮動小数点数への整数のキャスト

整数をfloatにキャストする次の例では、3つの異なるキャスト方法はすべて同等です。

q)a:9 18 27

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

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

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

3つの操作すべてが同等であるかどうかを確認します。

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 言語には、時刻や日付などの時間データを表現および操作するためのさまざまな方法があります。

日付

kdb +の日付は、参照日が2000年1月1日であるため、整数の日数として内部的に保存されます。この日付より後の日付は正の数として内部的に保存され、それより前の日付は負の数として参照されます。

デフォルトでは、日付は「YYYY.MM.DD」の形式で書き込まれます

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

Arithmetic and logical operations 日付に直接実行できます。

q)x+1        / Add one day
2015.01.23

q)x-7        / Subtract 7 days
2015.01.15

2000年1月1日は土曜日に落ちました。したがって、履歴全体または将来の土曜日を7で割ると、余りは0になり、日曜日は1になり、月曜日は2になります。

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

タイムズ

時間は、真夜中のストロークからのミリ秒の整数として内部に格納されます。時刻はHH:MM:SS.MSSの形式で書き込まれます

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

日付の場合と同様に、算術演算は時間に対して直接実行できます。

日時

日時は、ISO標準形式のように、「T」で区切られた日付と時刻の組み合わせです。日時値には、2000年1月1日の午前0時からの日数の小数部が格納されます。

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、したがって、リストを完全に理解することは非常に重要です。リストは、単に原子(原子要素)と他のリスト(1つ以上の原子のグループ)の順序付けられたコレクションです。

リストの種類

A general listアイテムを一致する括弧で囲み、セミコロンで区切ります。例-

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

リストが同じタイプのアトムで構成されている場合、それは uniform list。そうでなければ、それはとして知られていますgeneral list (混合タイプ)。

カウント

リスト内のアイテムの数は、そのカウントから取得できます。

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"

**Note − A simple list of char is called a string.

リストには、アトムまたはリストが含まれます。 To create a single item list、使用します−

q)singleton:enlist 42

q)singleton
,42

To distinguish between an atom and the equivalent singleton、それらのタイプの符号を調べます。

q)signum type 42
-1i

q)signum type enlist 42
1i

リストは、アイテムの位置によって左から右に並べられます。リストの先頭からのアイテムのオフセットは、index。したがって、最初のアイテムのインデックスは0、2番目のアイテム(存在する場合)のインデックスは1などです。カウントのリストn からのインデックスドメインを持っています 0n–1

添字表記

与えられたリスト L、インデックスのアイテム i によってアクセスされます L[i]。インデックスによるアイテムの取得は、item indexing。例えば、

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)

リストへの参加

2つのリストで最も一般的な操作は、それらを結合してより大きなリストを形成することです。より正確には、結合演算子(、)は、右のオペランドを左のオペランドの末尾に追加し、結果を返します。どちらの引数でもアトムを受け入れます。

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

これは2つの項目を持つ深さ3のリストです-

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

q)count l5
2

q)count l5[1]
3

深さでの索引付け

ネストされたリストのアイテムに直接インデックスを付けることができます。

Repeated Item Indexing

単一のインデックスを介してアイテムを取得すると、常にネストされたリストから最上位のアイテムが取得されます。

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

あなたはこれを次のように読むことができます、

Lからインデックス1のアイテムを取得し、そこからインデックス2のアイテムを取得し、そこからインデックス0のアイテムを取得します。

Notation for Indexing at Depth

ネストされたリストの構成要素に繰り返しインデックスを付けるための代替表記法があります。最後の検索は、次のように書くこともできます。

q)L[1;2;0]
300

インデックスを介した割り当ても詳細に機能します。

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

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

エリジオンインデックス

Eliding Indices for a General List

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"

Interpret L[;1;] as,

トップレベルの各リストの2番目の位置にあるすべてのアイテムを取得します。

Interpret L[;;2] as,

2番目のレベルの各リストの3番目の位置にあるアイテムを取得します。

ディクショナリは、テーブルを作成するための基盤を提供するリストの拡張です。数学的に言えば、辞書は

「ドメイン→範囲」

または一般的に(短い)作成します

「キー→値」

要素間の関係。

ディクショナリは、ハッシュテーブルとほぼ同等のキーと値のペアの順序付けられたコレクションです。ディクショナリは、位置対応を介したドメインリストと範囲リスト間の明示的なI / O関連付けによって定義されるマッピングです。辞書の作成には、「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

調べる

入力値に対応する辞書出力値を見つけることは呼び出されます looking up 入力。

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"

検索による逆ルックアップ(?)

検索(?)演算子は、要素の範囲をそのドメイン要素にマッピングすることによって逆ルックアップを実行するために使用されます。

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

q)d2?77
`z

リストの要素が一意でない場合、 find ドメインリストからそれにマッピングされている最初のアイテムを返します。

エントリの削除

辞書からエントリを削除するには、 delete ( _ ) function使用されている。(_)の左側のオペランドは辞書であり、右側のオペランドはキー値です。

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

反転した列の辞書の反転

辞書を2回転置すると、元の辞書が得られます。

q)scores ~ flip flip scores
1b

テーブルはkdb +の中心です。テーブルは、ディクショナリとして実装された名前付き列のコレクションです。q tables 列指向です。

テーブルの作成

テーブルは次の構文を使用して作成されます-

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

上記の例のように角括弧内に列がない場合、テーブルは次のようになります。 unkeyed

を作成するには keyed table、キーの列を角かっこで囲みます。

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

A foreign key 定義されているテーブルの行から、対応するテーブルの行へのマッピングを定義します primary key

外部キーは提供します referential integrity。つまり、主キーにない外部キー値を挿入しようとすると失敗します。

次の例を検討してください。最初の例では、初期化時に外部キーを明示的に定義します。2番目の例では、2つのテーブル間の事前の関係を想定しない外部キー追跡を使用します。

Example 1 − Define foreign key on initialization

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

Example 2 − no pre-defined relationship between tables

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

事前定義された外部キーの一般的な表記法-

cからabを選択します。ここで、aは外部キー(sym)、bはaです。

主キーテーブル(ind)のフィールド、cは

外部キーテーブル(トレード)

テーブルの操作

1つのトレードテーブルを作成し、異なるテーブル式の結果を確認しましょう-

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

インサート

使用する構文 Insert ステートメントは次のとおりです-

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

ここで、Insertステートメントの使用方法を示す例を見てみましょう-

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

Kdb +には、名詞、動詞、副詞があります。すべてのデータオブジェクトと関数はnounsVerbs 式の角括弧と括弧の数を減らすことにより、読みやすさを向上させます。 Adverbs二項(2引数)関数と動詞を変更して、新しい関連する動詞を生成します。副詞によって生成される関数は呼び出されますderived functions または derived verbs

副詞 each( `)で示される、は、リスト自体ではなくリストの項目に適用されるように、ダイアディック関数と動詞を変更します。次の例を見てください-

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

各左と各右

と呼ばれるダイアディック関数のそれぞれの2つのバリアントがあります Each-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言語では、提供された入力テーブルと必要な結合テーブルの種類に基づいて、さまざまな種類の結合があります。結合は、2つのテーブルのデータを結合します。外部キー追跡の他に、テーブルを結合する方法は4つあります-

  • 単純結合
  • Asof結合
  • 左結合
  • ユニオン参加

ここで、この章では、これらの各結合について詳しく説明します。

単純結合

単純結合は最も基本的なタイプの結合であり、コンマ '、'を使用して実行されます。この場合、2つのテーブルはtype conformantつまり、両方のテーブルに同じ数の列が同じ順序であり、同じキーがあります。

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

コンマを使用できます-同じ長さのテーブルの各結合は、横方向に結合します。ここでテーブルの1つにキーを設定できます。

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の特殊なケースであり、2番目の引数はキー付きテーブルであり、最初の引数には右の引数のキーの列が含まれています。

一般的な形式

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

ユニオン結合(uj)

これにより、異なるスキーマを持つ2つのテーブルの和集合を作成できます。これは基本的に単純結合の拡張です(、)

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を使用している場合は、主キーが一致している必要があります。

関数の種類

関数はいくつかの方法で分類できます。ここでは、引数の数とタイプ、および結果のタイプに基づいて分類しました。関数は、

  • Atomic −引数がアトミックであり、アトミックな結果を生成する場合

  • Aggregate −リストからのアトム

  • Uniform (list from list)−リストに適用されるアトムの概念を拡張しました。引数リストの数は、結果リストの数と同じです。

  • Other −関数が上記のカテゴリに属していない場合。

数学の二項演算はと呼ばれます dyadic functionsqで; たとえば、「+」。同様に単項演算はmonadic functions; たとえば、「abs」や「floor」などです。

よく使う機能

で頻繁に使用される関数はかなりあります 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

asc

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

cols

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"

SV

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"

vs

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 [名前空間] –指定された名前空間のテーブルを一覧表示します

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 –dbからファイルまたはディレクトリをロードします

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プログラミング言語には、豊富で強力な組み込み関数のセットがあります。組み込み関数には、次のタイプがあります。

  • String function −文字列を入力として受け取り、文字列を返します。

  • Aggregate function −リストを入力として受け取り、アトムを返します。

  • Uniform function −リストを取得し、同じカウントのリストを返します。

  • Mathematical function −数値引数を取り、数値引数を返します。

  • Miscellaneous function −上記以外のすべての機能。

文字列関数

のように-パターンマッチング

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-cosの逆数

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

cor −は相関関係を与えます

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

var −分散

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

統一された機能

デルタ-前のアイテムとの違い。

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

塗りつぶし-null値を塗りつぶします

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

その他の機能

カウント-要素の戻り数

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

ただし、2番目の引数に要素が存在しません。

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-最初の引数でnullを埋める

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短くてシンプルで、SQLの機能を拡張します。主なクエリ式は「select式」です。これは最も単純な形式でサブテーブルを抽出しますが、新しい列を作成することもできます。

の一般的な形式 Select expression 次のとおりです-

Select columns by columns from table where conditions

**Note − by & where フレーズはオプションであり、「fromexpression」のみが必須です。

一般に、構文は次のようになります。

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句はクエリのパフォーマンスに影響を与えるため、非常に重要です。ザ・partition 変数(日付/月/日)が常に最初に来て、次にソートおよびインデックス付けされた列(通常は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.

制約付きのクエリ

* Denotes HDB query

Select all IBM trades

select from trade where sym in `IBM

*Select all IBM trades on a certain day

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

Select all IBM trades with a price > 100

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

Select all IBM trades with a price less than or equal to 100

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

*Select all IBM trades between 10.30 and 10.40, in the morning, on a certain date

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

Select all IBM trades in ascending order of price

`price xasc select from trade where sym =`IBM

*Select all IBM trades in descending order of price in a certain time frame

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

Composite sort − sort ascending order by sym and then sort the result in descending order of price

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

Select all IBM or MSFT trades

select from trade where sym in `IBM`MSFT

*Calculate count of all symbols in ascending order within a certain time frame

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

*Calculate count of all symbols in descending order within a certain time frame

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

* What is the maximum price of IBM stock within a certain time frame, and when does this first happen?

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 the last price for each sym in hourly buckets

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

集計を使用したクエリ

* Calculate vwap (Volume Weighted Average Price) of all symbols

select vwap:size wavg price by sym from trade

* Count the number of records (in millions) for a certain month

(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 – Daily High, Low, Open and Close for CSCO in a certain month

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

* Daily Vwap for CSCO in a certain month

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

* Calculate the hourly mean, variance and standard deviation of the price for AIG

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

Select the price range in hourly buckets

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

* Daily Spread (average bid-ask) for CSCO in a certain month

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

* Daily Traded Values for all syms in a certain month

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

Extract a 5 minute vwap for CSCO

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

* Extract 10 minute bars for CSCO

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

* Find the times when the price exceeds 100 basis points (100e-4) over the last price for CSCO for a certain day

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

* Full Day Price and Volume for MSFT in 1 Minute Intervals for the last date in the database

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

KDB +を使用すると、プロセス間通信を介して1つのプロセスが別のプロセスと通信できます。Kdb +プロセスは、同じコンピューター、同じネットワーク、またはリモートでさえ、他のkdb +に接続できます。ポートを指定するだけで、クライアントはそのポートと通信できます。どれかq プロセスは他の人と通信できます q ネットワーク上でアクセス可能であり、接続をリッスンしている限り、処理します。

  • サーバープロセスは接続をリッスンし、すべての要求を処理します

  • クライアントプロセスが接続を開始し、実行するコマンドを送信します

クライアントとサーバーは、同じマシン上に置くことも、異なるマシン上に置くこともできます。プロセスは、クライアントとサーバーの両方にすることができます。

コミュニケーションは、

  • Synchronous (結果が返されるのを待ちます)

  • Asynchronous (待機せず、結果も返されません)

サーバーを初期化する

A 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

同期および非同期メッセージ

ハンドルを取得したら、同期または非同期でメッセージを送信できます。

Synchronous Message−メッセージが送信されると、メッセージは待機して結果を返します。そのフォーマットは次のとおりです-

handle “message”

Asynchronous Message−メッセージを送信した後、待機して結果を返すことなく、すぐに次のステートメントの処理を開始します。そのフォーマットは次のとおりです-

neg[handle] “message”

関数呼び出しやselectステートメントなど、応答を必要とするメッセージは通常、同期形式を使用します。一方、テーブルへの更新の挿入など、出力を返す必要のないメッセージは非同期になります。

いつ q プロセスは別のプロセスに接続します qプロセス間通信を介して処理し、メッセージハンドラーによって処理されます。これらのメッセージハンドラにはデフォルトの動作があります。たとえば、同期メッセージ処理の場合、ハンドラーはクエリの値を返します。この場合の同期ハンドラーは.z.pg、要件に応じてオーバーライドできます。

Kdb +プロセスには、いくつかの事前定義されたメッセージハンドラーがあります。メッセージハンドラは、データベースを構成するために重要です。いくつかの使用法は次のとおりです。

  • Logging −受信メッセージをログに記録します(致命的なエラーが発生した場合に役立ちます)。

  • Security−ユーザー名/ IPアドレスに基づいて、データベースへのアクセス、特定の関数呼び出しなどを許可/禁止します。これは、許可されたサブスクライバーのみにアクセスを提供するのに役立ちます。

  • Handle connections/disconnections 他のプロセスから。

事前定義されたメッセージハンドラ

事前定義されたメッセージハンドラのいくつかを以下で説明します。

.z.pg

これは同期メッセージハンドラー(プロセス取得)です。この関数は、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}

入力は userid (記号)と password (テキスト)。

テーブルのリスト、辞書、または列には、属性を適用できます。属性は、リストに特定のプロパティを課します。一部の属性は、変更すると消える場合があります。

属性の種類

ソート済み( `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 type 年、月、日などの基礎となる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

Note −

  • parted属性は、操作がパーティショニングを保持している場合でも、リストの操作では保持されません。

  • エンティティの数が10億に達し、ほとんどのパーティションがかなりのサイズである場合、つまり、かなりの繰り返しがある場合は、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#)をリストに適用すると、リストの項目が異なることを示します。リストの要素が一意であることを知っていると、劇的にスピードアップしますdistinct そして許可します 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

Note −

  • `u#は、一意性を保持する連結で保持されます。削除や一意でない連結では失われます。

  • `u#リストの検索は、ハッシュ関数を介して行われます。

属性の削除

`#を適用することで属性を削除できます。

属性の適用

属性を適用するための3つの形式は次のとおりです。

  • L: `s# 14 2 3 3 9/リスト作成時に指定

  • @[ `.; `L ; `s#]/機能適用、つまり変数リストLに

    /デフォルトの名前空間(つまり `。)で適用

    /ソートされた `s#属性

  • Update `s#time from `tab

    /テーブル(タブ)を更新して適用します

    /属性。

上記の3つの異なるフォーマットを例を挙げて適用してみましょう。

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-sqlのselect / exec / delete列のシンボルとして列名を指定できます。列名を動的に指定する場合に非常に便利です。

関数形式は次のとおりです。

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

どこ

  • t テーブルです。

  • a 集合体の辞書です。

  • bバイフレーズ; そして

  • c 制約のリストです。

注-

  • すべて q のエンティティ ab、および c 名前で参照する必要があります。これは、エンティティ名を含むシンボルを意味します。

  • selectとupdateの構文形式は、によって同等の関数形式に解析されます。 q インタプリタなので、2つの形式の間にパフォーマンスの違いはありません。

機能選択

次のコードブロックは、使用方法を示しています functional select

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

Functional Exec

execの関数形式は、の簡略化された形式です。 select

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

機能アップデート

更新の機能形式は、それと完全に類似しています。 select。次の例では、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)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

ハードディスク(履歴データベースとも呼ばれます)上のデータは、フラットファイル、スプレイテーブル、パーティションテーブルの3つの異なる形式で保存できます。ここでは、これら3つの形式を使用してデータを保存する方法を学習します。

フラットファイル

フラットファイルはメモリに完全にロードされるため、サイズ(メモリフットプリント)を小さくする必要があります。テーブルは完全に1つのファイルでディスクに保存されます(サイズが重要です)。

これらのテーブルを操作するために使用される関数は次のとおりです。 set/get

`: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

ディスク(履歴データベース)からフラットファイルを取得し、 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

Note −テーブルをスプレイとして保存するには、キーを解除して列挙する必要があります。

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

Note −パーティションモードは、1日あたり数百万のレコード(つまり時系列データ)を持つテーブルに適しています

Symファイル

symファイルは、すべての展開テーブルとパーティションテーブルのシンボルのリストを含むkdb +バイナリファイルです。それはで読むことができます、

get `:sym

par.txtファイル(オプション)

これは構成ファイルであり、パーティションが複数のディレクトリ/ディスクドライブに分散している場合に使用され、ディスクパーティションへのパスが含まれています。

.Q.en

.Q.enは、シンボル列を列挙することによってテーブルを表示するのに役立つダイアディック関数です。これは、履歴データベース(分散テーブル、パーティションテーブルなど)を処理する場合に特に役立ちます。−

.Q.en[`:directory;table]

どこ directory 履歴データベースのホームディレクトリです。 sym file があり、 table 列挙するテーブルです。

テーブルをスプレイテーブルとして保存するためにテーブルを手動で列挙する必要はありません。これは-によって実行されるためです。

.Q.en[`:directory_where_symbol_file_stored]table_name

.Q.dpft

ザ・ .Q.dpft関数は、パーティション化およびセグメント化されたテーブルの作成に役立ちます。の高度な形です.Q.en、テーブルを広げるだけでなく、パーティションテーブルも作成するためです。

で使用される4つの引数があります .Q.dpft

  • パーティションを作成するデータベースのシンボリックファイルハンドル、

  • 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

テーブルを削除しました 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

どこ directory 履歴データベースのホームディレクトリです。