Cómo usar SQL en pandas usando consultas de pandasql

SQL, o Lenguaje de Consulta Estructurado, es un lenguaje de programación utilizado para acceder, extraer, manipular y explorar datos almacenados en bases de datos relacionales. pandas es una biblioteca de código abierto de Python diseñada específicamente para la manipulación y análisis de datos.

En este tutorial, vamos a discutir cuándo y cómo podemos (y cuándo no podemos) utilizar la funcionalidad de SQL en el marco de pandas. Además, echaremos un vistazo a varios ejemplos de implementación de este enfoque y compararemos los resultados con el código equivalente en pandas puro.

¿Por qué usar SQL en pandas?

Dados las definiciones en la introducción, ¿por qué alguien querría utilizar SQL combinado con pandas cuando este último es un paquete todo en uno para el análisis de datos?

La respuesta es que en algunas ocasiones, especialmente para programas complejos, las consultas SQL parecen mucho más directas y fáciles de leer que el código correspondiente en pandas. Esto es particularmente verdadero para aquellos que inicialmente usaron SQL para trabajar con datos y luego aprendieron pandas.

Si necesitas más capacitación en pandas, puedes echar un vistazo a nuestro curso Manipulación de Datos con pandas y al Tutorial de Pandas: DataFrames en Python.

Para ver la legibilidad de SQL en acción, supongamos que tenemos una tabla (un dataframe) llamada penguins que contiene varias informaciones sobre pingüinos (y trabajaremos con dicha tabla más adelante en este tutorial). Para extraer todas las especies únicas de pingüinos que son machos y que tienen aletas más largas de 210 mm, necesitaríamos el siguiente código en pandas:

penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique()

En cambio, para obtener la misma información usando SQL, ejecutaríamos el siguiente código:

SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210

La segunda parte del código, escrita en SQL, se parece casi a una frase en inglés natural y, por lo tanto, es mucho más intuitiva. Podemos aumentar aún más su legibilidad dividiéndola en varias líneas:

SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210

Ahora que hemos identificado las ventajas de usar SQL para pandas, veamos cómo podemos técnicamente combinar ambos.

Cómo usar pandasql

La biblioteca de Python pandasql permite consultar dataframes de pandas ejecutando comandos SQL sin tener que conectarse a ningún servidor SQL. Bajo el capó, utiliza sintaxis SQLite, detecta automáticamente cualquier dataframe de pandas y lo trata como una tabla SQL normal.

Configuración de su entorno

Primero, necesitamos instalar pandasql:

pip install pandasql

Después, importamos los paquetes requeridos:

from pandasql import sqldf import pandas as pd

Arriba, directamente importamos la función sqldf de pandasql, que es virtualmente la única función significativa de la biblioteca. Como su nombre indica, se aplica a consultar dataframes utilizando la sintaxis SQL. Aparte de esta función, pandasql viene con dos conjuntos de datos internos sencillos que se pueden cargar usando las funciones autoexplicativas load_births() y load_meat().

Sintaxis de pandasql

La sintaxis de la función sqldf es muy simple:

sqldf(query, env=None)

Aquí, query es un parámetro obligatorio que toma una consulta SQL como una cadena, y env—un parámetro opcional (y raramente útil) que puede ser locals() o globals() y permite que sqldf acceda al conjunto correspondiente de variables en su entorno de Python.

La función sqldf devuelve el resultado de una consulta como un dataframe de pandas.

Cuándo podemos usar pandasql

La biblioteca pandasql permite trabajar con datos utilizando el Lenguaje de Consulta de Datos (DQL), que es uno de los subconjuntos de SQL. En otras palabras, con pandasql, podemos ejecutar consultas sobre los datos almacenados en una base de datos para recuperar la información necesaria de ella. En particular, podemos acceder, extraer, filtrar, ordenar, agrupar, unir, agregar datos y realizar operaciones matemáticas o lógicas sobre ellos.

Cuándo no podemos usar pandasql

pandasql no permite utilizar ningún otro subconjunto de SQL aparte de DQL. Esto significa que no podemos aplicar pandasql para modificar (actualizar, truncar, insertar, etc.) tablas o cambiar (actualizar, borrar o insertar) los datos en una tabla.

Además, ya que esta biblioteca se basa en la sintaxis de SQL, deberíamos tener cuidado de los fallos conocidos en SQLite.

Ejemplos de uso de pandasql

Ahora, daremos un vistazo más detallado a cómo ejecutar consultas SQL en dataframes de pandas utilizando la función sqldf de pandasql. Para tener algo de datos en los que practicar, vamos a cargar uno de los conjuntos de datos integrados de la biblioteca seaborn — penguins:

import seaborn as sns penguins = sns.load_dataset('penguins') print(penguins.head())

Salida:

species island bill_length_mm bill_depth_mm flipper_length_mm \ 0 Adelie Torgersen 39.1 18.7 181.0 1 Adelie Torgersen 39.5 17.4 186.0 2 Adelie Torgersen 40.3 18.0 195.0 3 Adelie Torgersen NaN NaN NaN 4 Adelie Torgersen 36.7 19.3 193.0 body_mass_g sex 0 3750.0 Male 1 3800.0 Female 2 3250.0 Female 3 NaN NaN 4 3450.0 Female

Si necesita actualizar sus habilidades en SQL, nuestro skill track de SQL Fundamentals es un buen punto de referencia.

Extracción de datos con pandasql

print(sqldf('''SELECT species, island FROM penguins LIMIT 5'''))

Salida:

species island 0 Adelie Torgersen 1 Adelie Torgersen 2 Adelie Torgersen 3 Adelie Torgersen 4 Adelie Torgersen

Aquí, hemos extraído información sobre las especies y la geografía de los primeros cinco pingüinos del dataframe penguins. Tenga en cuenta que la ejecución de la función sqldf devuelve un dataframe de pandas:

print(type(sqldf('''SELECT species, island FROM penguins LIMIT 5''')))

Salida:

<class 'pandas.core.frame.DataFrame'>

En pandas pura, sería:

print(penguins[['species', 'island']].head())

Salida:

species island 0 Adelie Torgersen 1 Adelie Torgersen 2 Adelie Torgersen 3 Adelie Torgersen 4 Adelie Torgersen

Otro ejemplo es la extracción de valores únicos de una columna:

print(sqldf('''SELECT DISTINCT species FROM penguins'''))

Salida:

species 0 Adelie 1 Chinstrap 2 Gentoo

En pandas, sería:

print(penguins['species'].unique())

Salida:

['Adelie' 'Chinstrap' 'Gentoo']

Ordenar datos con pandasql

print(sqldf('''SELECT body_mass_g FROM penguins ORDER BY body_mass_g DESC LIMIT 5'''))

Salida:

body_mass_g 0 6300.0 1 6050.0 2 6000.0 3 6000.0 4 5950.0

Aquí, hemos ordenado a nuestros pingüinos por masa corporal en orden descendente y mostramos los cinco valores más altos de la masa corporal.

En pandas, sería:

print(penguins['body_mass_g'].sort_values(ascending=False, ignore_index=True).head())

Salida:

0 6300.0 1 6050.0 2 6000.0 3 6000.0 4 5950.0 Name: body_mass_g, dtype: float64

Filtrado de datos con pandasql

Intentemos el mismo ejemplo que mencionamos en el capítulo ¿Por qué usar SQL en pandas: extraer las especies únicas de pingüinos que son machos y que tienen las aletas más largas que 210 mm:

print(sqldf('''SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210'''))

Salida:

species 0 Chinstrap 1 Gentoo

Arriba, filtramos los datos basándonos en dos condiciones: sex = 'Male' y flipper_length_mm > 210.

El mismo código en pandas sería un poco más abrumador:

print(penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique())

Salida:

['Chinstrap' 'Gentoo']

Agrupamiento y agregación de datos con pandasql

Ahora, apliquemos el agrupamiento y agregación de datos para encontrar la longitud de pico más larga de cada especie en el dataframe:

print(sqldf('''SELECT species, MAX(bill_length_mm) FROM penguins GROUP BY species'''))

Salida:

species MAX(bill_length_mm) 0 Adelie 46.0 1 Chinstrap 58.0 2 Gentoo 59.6

El mismo código en pandas:

print(penguins[['species', 'bill_length_mm']].groupby('species', as_index=False).max())

Salida:

species bill_length_mm 0 Adelie 46.0 1 Chinstrap 58.0 2 Gentoo 59.6

Realización de operaciones matemáticas con pandasql

Con pandasql, podemos fácilmente realizar operaciones matemáticas o lógicas en los datos. Imaginemos que queremos calcular la relación de longitud a profundidad de pico para cada pingüino y mostrar las cinco valores superiores de esta medición:

print(sqldf('''SELECT bill_length_mm / bill_depth_mm AS length_to_depth FROM penguins ORDER BY length_to_depth DESC LIMIT 5'''))

Salida:

length_to_depth 0 3.612676 1 3.510490 2 3.505882 3 3.492424 4 3.458599

Obsérvese que esta vez, usamos el alias length_to_depth para la columna con los valores de la relación. De lo contrario, obtendríamos una columna con un nombre monstruoso bill_length_mm / bill_depth_mm.

En pandas, primero tendríamos que crear una nueva columna con los valores de la relación:

penguins['length_to_depth'] = penguins['bill_length_mm'] / penguins['bill_depth_mm'] print(penguins['length_to_depth'].sort_values(ascending=False, ignore_index=True).head())

Salida:

0 3.612676 1 3.510490 2 3.505882 3 3.492424 4 3.458599 Name: length_to_depth, dtype: float64

Conclusión

En este tutorial, exploramos por qué y cuándo podemos combinar la funcionalidad de SQL para pandas para escribir un código mejor y más eficiente. Discutimos cómo configurar y usar la biblioteca pandasql para este propósito y qué limitaciones tiene este paquete. Finalmente, consideramos varios ejemplos populares de la aplicación práctica de pandasql y, en cada caso, comparamos el código con su contraparte de pandas.

Ahora tienes todo lo que necesitas para aplicar SQL para pandas en proyectos reales. Un gran lugar para practicar es el DataLab, la notebook de datos de DataCamp con gran soporte para SQL y habilidades de IA.

Source:
https://www.datacamp.com/tutorial/how-to-use-sql-in-pandas-using-pandasql-queries