JupySQL と chDB
JupySQL は、JupyterノートブックとIPythonシェルでSQLを実行するためのPythonライブラリです。このガイドでは、chDBとJupySQLを使用してデータをクエリする方法を学びます。
セットアップ
まず、仮想環境を作成します:
次に、JupySQL、IPython、およびJupyter Labをインストールします:
JupySQLをIPythonで使用できます。IPythonを起動するには、以下を実行します:
または、Jupyter Labで実行するには:
Jupyter Labを使用している場合は、他のガイドの続きに従う前にノートブックを作成する必要があります。
データセットのダウンロード
Jeff Sackmannの tennis_atp データセットの1つを使用します。このデータセットには、選手のメタデータとそのランキングの履歴が含まれています。まず、ランキングファイルをダウンロードします:
chDB と JupySQL の設定
次に、chDBの dbapi
モジュールをインポートします:
chDB接続を作成します。永続化したデータは atp.chdb
ディレクトリに保存されます:
次に、sql
マジックを読み込み、chDBへの接続を作成します:
次に、クエリの結果が切り捨てられないように表示制限を設定します:
CSVファイル内のデータのクエリ
atp_rankings
プレフィックスの付いたファイルをダウンロードしました。スキーマを確認するために DESCRIBE
クエリを使用しましょう:
これらのファイルに対して直接 SELECT
クエリを書いて、データがどうなっているか見てみましょう:
データの形式は少し奇妙です。日付をきれいにし、REPLACE
クエリを使用してきれいになった ranking_date
を返します:
chDB への CSVファイルのインポート
これらのCSVファイルからデータをテーブルに格納します。デフォルトのデータベースはディスク上にデータを永続化しないため、最初に別のデータベースを作成する必要があります:
次に、CSVファイルのデータ構造に基づいて rankings
というテーブルを作成します:
テーブル内のデータを簡単に確認しましょう:
良さそうです - 出力は、直接CSVファイルをクエリしたときと期待通り同じです。
選手のメタデータについても同じプロセスを行います。今回はデータが単一のCSVファイルにまとめられているので、そのファイルをダウンロードします:
次に、CSVファイルの内容に基づいて players
というテーブルを作成します。また、dob
フィールドを Date32
型にします。
ClickHouseでは、
Date
型は1970年以降の日付のみをサポートしています。dob
列には1970年以前の日付が含まれているため、代わりにDate32
型を使用します。
終了したら、取り込んだデータを確認します:
chDB に対するクエリ
データの取り込みが完了しました。さて、データをクエリする楽しい部分です!
テニス選手は、参加するトーナメントでのパフォーマンスに基づいてポイントを受け取ります。各選手のポイントは52週間のローリング期間で集計されます。選手ごとに最大ポイントを見つけ、その時のランクを取得するクエリを書きます:
このリストの選手の中には、ポイントが多いにもかかわらず1位でない選手がいることが非常に興味深いです。
クエリの保存
クエリを保存するには、%%sql
マジックと同じ行に --save
パラメータを使用します。--no-execute
パラメータは、クエリの実行をスキップすることを意味します。
保存したクエリを実行すると、実行前に共通テーブル式(CTE)に変換されます。次のクエリでは、選手が1位だったときに達成した最大ポイントを計算します:
パラメータを使ってクエリする
クエリでパラメータを使用することもできます。パラメータは通常の変数です:
次に、クエリ内で {{variable}}
構文を使用します。次のクエリは、選手がランキングのトップ10に初めて入ってから最後に入ったまでの最小日数を取得します:
ヒストグラムのプロット
JupySQLは、限られたチャート機能も持っています。ボックスプロットやヒストグラムを作成できます。
ヒストグラムを作成しますが、まずは各選手が達成したランキング内のランキングを計算するクエリを書いて(保存して)おきましょう。このクエリを使用して、各ランキングを達成した選手の数をカウントするヒストグラムを作成できます:
次に、以下のコードを実行してヒストグラムを作成します:
