このガイドでは、chDBからリモートのClickHouseサーバーにクエリする方法を学びます。
準備
まず、仮想環境を作成しましょう。
python -m venv .venv
source .venv/bin/activate次に、chDBをインストールします。 バージョン 2.0.2 以上であることを確認してください:
pip install "chdb>=2.0.2"次に、pandas と ipython をインストールします:
pip install pandas ipythonこのガイドの以降では、コマンドの実行に ipython を使用します。次を実行して起動できます。
ipythonこのコードは、Python スクリプトやお好みのノートブックでも使用できます。
ClickPy の概要
これからクエリを実行するリモートの ClickHouseサーバーは、ClickPy です。
ClickPy は PyPI パッケージのすべてのダウンロードを追跡しており、UI を通じて各パッケージの統計を確認できます。
基盤となるデータベースには、play ユーザーを使ってクエリを実行できます。
ClickPy の詳細については、GitHub リポジトリをご覧ください。
ClickPy ClickHouse service に対してクエリを実行する
まず、chDB をインポートします:
import chdbremoteSecure 関数を使用して ClickPy にクエリを実行します。
この関数には、最低でもホスト名、テーブル名、ユーザー名を指定する必要があります。
次のクエリを記述すると、openai パッケージ の1日あたりのダウンロード数を Pandas DataFrame として取得できます。
query = """
SELECT
toStartOfDay(date)::Date32 AS x,
sum(count) AS y
FROM remoteSecure(
'clickpy-clickhouse.clickhouse.com',
'pypi.pypi_downloads_per_day',
'play'
)
WHERE project = 'openai'
GROUP BY x
ORDER BY x ASC
"""
openai_df = chdb.query(query, "DataFrame")
openai_df.sort_values(by=["x"], ascending=False).head(n=10) x y
2392 2024-10-02 1793502
2391 2024-10-01 1924901
2390 2024-09-30 1749045
2389 2024-09-29 1177131
2388 2024-09-28 1157323
2387 2024-09-27 1688094
2386 2024-09-26 1862712
2385 2024-09-25 2032923
2384 2024-09-24 1901965
2383 2024-09-23 1777554それでは同様に、scikit-learn のダウンロード数を取得してみましょう。
query = """
SELECT
toStartOfDay(date)::Date32 AS x,
sum(count) AS y
FROM remoteSecure(
'clickpy-clickhouse.clickhouse.com',
'pypi.pypi_downloads_per_day',
'play'
)
WHERE project = 'scikit-learn'
GROUP BY x
ORDER BY x ASC
"""
sklearn_df = chdb.query(query, "DataFrame")
sklearn_df.sort_values(by=["x"], ascending=False).head(n=10) x y
2392 2024-10-02 1793502
2391 2024-10-01 1924901
2390 2024-09-30 1749045
2389 2024-09-29 1177131
2388 2024-09-28 1157323
2387 2024-09-27 1688094
2386 2024-09-26 1862712
2385 2024-09-25 2032923
2384 2024-09-24 1901965
2383 2024-09-23 1777554Pandas DataFramesのマージ
これで2つのDataFrameがそろったので、日付 (xカラム) を基準に、次のようにマージできます。
df = openai_df.merge(
sklearn_df,
on="x",
suffixes=("_openai", "_sklearn")
)
df.head(n=5) x y_openai y_sklearn
0 2018-02-26 83 33971
1 2018-02-27 31 25211
2 2018-02-28 8 26023
3 2018-03-01 8 20912
4 2018-03-02 5 23842次のように、OpenAI のダウンロード数に対する scikit-learn のダウンロード数の比率を計算できます。
df['ratio'] = df['y_openai'] / df['y_sklearn']
df.head(n=5) x y_openai y_sklearn ratio
0 2018-02-26 83 33971 0.002443
1 2018-02-27 31 25211 0.001230
2 2018-02-28 8 26023 0.000307
3 2018-03-01 8 20912 0.000383
4 2018-03-02 5 23842 0.000210Pandas DataFrames のクエリ
次に、比率が最も高い日付と最も低い日付を見つけるとします。 chDB に戻って、それらの値を計算できます。
chdb.query("""
SELECT max(ratio) AS bestRatio,
argMax(x, ratio) AS bestDate,
min(ratio) AS worstRatio,
argMin(x, ratio) AS worstDate
FROM Python(df)
""", "DataFrame") bestRatio bestDate worstRatio worstDate
0 0.693855 2024-09-19 0.000003 2020-02-09Pandas DataFrames へのクエリについて詳しくは、Pandas DataFrames 開発者ガイドを参照してください。