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.
Descarga de un conjunto de datos
Usaremos el conjunto de datos de taxis de la ciudad de Nueva York, que contiene unos 3 millones de trayectos en taxi, junto con la tarifa, la propina y el barrio de recogida de cada uno.
Los trayectos están repartidos en varios archivos TSV, así que empecemos por descargarlos:
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 taxi.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:
Consulta de datos en archivos TSV
Hemos descargado varios archivos con el prefijo trips_.
Usemos la cláusula DESCRIBE para conocer el esquema:
También podemos ejecutar una consulta SELECT directamente sobre estos archivos para ver qué aspecto tienen los datos:
Si volvemos a revisar el esquema, algunas de las columnas relacionadas con importes — trip_distance, fare_amount y tip_amount — se infirieron como String en lugar de como tipos numéricos.
Las corregiremos al importar los datos a una tabla.
Importación de archivos TSV en chDB
Ahora vamos a almacenar los datos de estos archivos TSV en una tabla.
La base de datos predeterminada no persiste los datos en disco, por lo que primero debemos crear otra base de datos:
Ahora vamos a crear una tabla llamada trips cuyo esquema se derivará de la estructura de los datos de los archivos TSV.
Usaremos la cláusula REPLACE para convertir a Float64 las columnas relacionadas con importes monetarios y la función transform para convertir la columna numérica pickup_borocode en un nombre de distrito legible para humanos:
Comprobemos rápidamente los datos de nuestra tabla:
Poco más de 3 millones de viajes; incorporemos también una segunda tabla.
La Taxi & Limousine Commission de la ciudad de Nueva York divide la ciudad en zonas de taxi, y un archivo de correspondencias relaciona cada zona con su distrito.
Descarguemos ese archivo:
A continuación, cree una tabla llamada zones a partir del contenido del archivo CSV:
Una vez finalizada la ejecución, podemos echar un vistazo a los datos que hemos ingestado:
La ingestión de datos ha finalizado; ahora llega la parte divertida: ¡consultar los datos!
Cada distrito se divide en un número diferente de zonas de taxi.
Vamos a escribir una consulta que combine las dos tablas para averiguar cuántos viajes se iniciaron en cada distrito y cuántos viajes corresponden a cada zona de taxi:
Manhattan y Queens tienen el mismo número de zonas de taxi, pero Manhattan genera más de 14 veces más recogidas.
Podemos guardar consultas usando el parámetro --save en la misma línea que la instrucción mágica %%sql.
El parámetro --no-execute omite la ejecución de la consulta.
Al ejecutar una consulta guardada, esta se convertirá en una expresión de tabla común (CTE) antes de ejecutarse.
En la siguiente consulta calculamos los vecindarios con la propina media más alta:
Los primeros resultados son barrios con muy pocos viajes, por lo que un solo viaje generoso sesga el promedio.
Vamos a excluirlos.
También podemos usar parámetros en nuestras consultas.
Los parámetros son simplemente variables normales:
A continuación, podemos usar la sintaxis {{variable}} en nuestra consulta.
La siguiente consulta identifica los barrios con la mayor propina media entre aquellos con más de 10 000 viajes:
Los traslados desde el aeropuerto reciben, con mucha diferencia, las propinas más altas; esos largos trayectos hasta la ciudad suman.
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 devuelva la distancia de cada viaje de menos de 20 millas.
Podremos usar esto para crear un histograma que cuente cuántos viajes se incluyen en cada intervalo de distancia:
Podemos crear un histograma ejecutando lo siguiente:
La mayoría de los trayectos son cortos, de una a tres millas, con una larga cola de trayectos hasta el aeropuerto.