En esta guía, aprenderemos a consultar un servidor remoto de ClickHouse desde chDB.
Configuración
Primero, vamos a crear un entorno virtual:
python -m venv .venv
source .venv/bin/activateY ahora instalaremos chDB. Asegúrate de tener la versión 2.0.2 o posterior:
pip install "chdb>=2.0.2"Ahora vamos a instalar pandas e ipython:
pip install pandas ipythonVamos a usar ipython para ejecutar los comandos del resto de la guía, que puedes iniciar con:
ipythonTambién puedes usar el código en un script de Python o en tu notebook preferido.
Introducción a ClickPy
El servidor remoto de ClickHouse que vamos a consultar es ClickPy.
ClickPy hace un seguimiento de todas las descargas de paquetes de PyPI y te permite explorar sus estadísticas a través de una UI.
La base de datos subyacente se puede consultar con el usuario play.
Puedes obtener más información sobre ClickPy en su repositorio de GitHub.
Consultas al servicio de ClickHouse de ClickPy
Importemos chDB:
import chdbVamos a consultar ClickPy con la función remoteSecure.
Esta función requiere, como mínimo, un nombre del host, un nombre de tabla y un nombre de usuario.
Podemos escribir la siguiente consulta para obtener el número de descargas por día del paquete openai como un DataFrame de Pandas:
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 1777554Ahora hagamos lo mismo para obtener las descargas de 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 1777554Combinar DataFrames de Pandas
Ahora tenemos dos DataFrames, que podemos combinar según la fecha (que es la columna x) de la siguiente manera:
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 23842A continuación, podemos calcular la proporción entre las descargas de Open AI y las de scikit-learn así:
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.000210Consulta de DataFrames de Pandas
A continuación, supongamos que queremos encontrar las fechas con los mejores y peores ratios. Podemos volver a chDB y calcular esos valores:
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-09Si quieres obtener más información sobre la consulta de DataFrames de Pandas, consulta la guía para desarrolladores sobre DataFrames de Pandas.