JupySQL es una biblioteca de Python que permite ejecutar SQL en notebooks de Jupyter y en el shell de IPython.
En esta guía, aprenderás a consultar datos con chDB y JupySQL.
Primero, vamos a crear un entorno virtual:
Y, a continuación, instalaremos JupySQL, IPython y Jupyter Lab:
Podemos usar JupySQL en IPython, que podemos iniciar con:
O bien en Jupyter Lab, ejecutando:
Si usas Jupyter Lab, tendrás que crear un notebook antes de seguir con el resto de la guía.
Descargando un conjunto de datos
Vamos a usar uno de los conjuntos de datos tennis_atp de Jeff Sackmann, que contiene metadatos sobre los jugadores y su clasificación a lo largo del tiempo.
Empecemos descargando los archivos de clasificación:
Configuración de chDB y JupySQL
A continuación, importemos el módulo dbapi de chDB:
Y crearemos una conexión a chDB.
Todos los datos que persistamos se guardarán en el directorio atp.chdb:
Carguemos ahora la magia sql y establezcamos una conexión con chDB:
A continuación, mostraremos el límite de resultados en pantalla para que los resultados de las consultas no se truncen:
## Consultar datos en archivos CSV
Hemos descargado varios archivos con el prefijo atp_rankings.
Usemos la cláusula DESCRIBE para comprender el esquema:
También podemos escribir una consulta SELECT directamente en estos archivos para ver qué aspecto tienen los datos:
El formato de los datos es un poco raro.
Limpiemos esa fecha y usemos la cláusula REPLACE para devolver ranking_date ya limpio:
Importar archivos CSV en chDB
Ahora vamos a almacenar los datos de estos archivos CSV en una tabla.
La base de datos predeterminada no persiste los datos en disco, así que primero debemos crear otra base de datos:
Y ahora vamos a crear una tabla llamada rankings, cuyo esquema se derivará de la estructura de los datos de los archivos CSV:
Hagamos una revisión rápida de los datos de nuestra tabla:
Se ve bien: el resultado, tal como se esperaba, es el mismo que al consultar directamente los archivos CSV.
Vamos a seguir el mismo proceso para los metadatos de los jugadores.
Esta vez, todos los datos están en un único archivo CSV, así que descarguemos ese archivo:
Luego, crea una tabla llamada players a partir del contenido del archivo CSV.
También ajustaremos el campo dob para que sea del tipo Date32.
En ClickHouse, el tipo Date solo admite fechas a partir de 1970. Como la columna dob contiene fechas anteriores a 1970, usaremos en su lugar el tipo Date32.
Una vez que termine de ejecutarse, podemos echar un vistazo a los datos ingeridos:
La ingestión de datos ya está lista; ahora llega la parte divertida: ¡consultar los datos!
Los tenistas reciben puntos en función de lo bien que rinden en los torneos que disputan.
Los puntos de cada jugador se calculan a lo largo de un período móvil de 52 semanas.
Vamos a escribir una consulta que encuentre el máximo de puntos acumulados por cada jugador, junto con su clasificación en ese momento:
Es bastante interesante que algunos de los jugadores de esta lista hayan acumulado muchos puntos sin haber sido nunca el número 1 con esa cantidad de puntos.
Podemos guardar consultas con el parámetro --save en la misma línea que la instrucción mágica %%sql.
El parámetro --no-execute indica que se omitirá la ejecución de la consulta.
Cuando se ejecuta una consulta guardada, se convierte en una expresión de tabla común (CTE) antes de ejecutarse.
En la siguiente consulta calculamos el máximo de puntos obtenido por los jugadores cuando ocupaban la posición 1:
También podemos usar parámetros en nuestras consultas.
Los parámetros son simplemente variables normales:
Y luego podemos usar la sintaxis {{variable}} en nuestra consulta.
La siguiente consulta encuentra a los jugadores con la menor cantidad de días entre la primera vez que estuvieron clasificados entre los 10 primeros y la última vez que estuvieron clasificados entre los 10 primeros:
JupySQL también tiene funciones de gráficos limitadas.
Podemos crear diagramas de caja o histogramas.
Vamos a crear un histograma, pero primero escribamos (y guardemos) una consulta que calcule las clasificaciones dentro del top 100 que ha alcanzado cada jugador.
Podremos usar esto para crear un histograma que muestre cuántos jugadores alcanzaron cada clasificación:
Podemos crear un histograma ejecutando lo siguiente: