メインコンテンツまでスキップ
メインコンテンツまでスキップ

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は、限られたチャート機能も持っています。ボックスプロットやヒストグラムを作成できます。

ヒストグラムを作成しますが、まずは各選手が達成したランキング内のランキングを計算するクエリを書いて(保存して)おきましょう。このクエリを使用して、各ランキングを達成した選手の数をカウントするヒストグラムを作成できます:

次に、以下のコードを実行してヒストグラムを作成します:

ATPデータセットにおけるプレイヤーランキングのヒストグラム