Como Usar SQL no pandas Utilizando Consultas pandasql

SQL, ou Linguagem de Consulta Estruturada, é uma linguagem de programação usada para acessar, extrair, manipular e explorar dados armazenados em bancos de dados relacionais. pandas é uma biblioteca de código aberto do Python especificamente projetada para manipulação e análise de dados.

Neste tutorial, vamos discutir quando e como podemos (e quando não podemos) usar a funcionalidade SQL no contexto do pandas. Além disso, vamos ver vários exemplos de implementação desta abordagem e comparar os resultados com o código equivalente em pandas puro.

Por Que Usar SQL no pandas?

Dadas as definições na introdução, por que alguém deveria querer usar SQL combinado com pandas quando o último é um pacote abrangente para análise de dados?

A resposta é que em algumas ocasiões, especialmente para programas complexos, as consultas SQL parecem muito mais diretas e fáceis de ler do que o código correspondente em pandas. Isso é particularmente verdadeiro para pessoas que inicialmente usaram SQL para trabalhar com dados e depois aprenderam pandas.

Se você precisa de mais treinamento em pandas, você pode conferir nosso curso Manipulação de Dados com pandas e o Tutorial Pandas: DataFrames em Python.

To see a exemplo de legibilidade do SQL em ação, suponha que temos uma tabela (um dataframe) chamada penguins contendo várias informações sobre pinguins (e trabalharemos com essa tabela mais tarde neste tutorial). Para extrair todas as espécies únicas de pinguins que são machos e que têm nadadeiras maiores que 210 mm, precisaríamos do seguinte código no pandas:

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

Em vez disso, para obter as mesmas informações usando SQL, executaríamos o seguinte código:

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

A segunda parte do código, escrita em SQL, parece quase uma frase em inglês natural e, portanto, é muito mais intuitiva. Podemos aumentar ainda mais sua legibilidade, espalhando-o em várias linhas:

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

Agora que identificamos as vantagens de usar SQL para pandas, vamos ver como podemos tecnicamente combiná-los ambos.

Como usar pandasql

A biblioteca pandasql do Python permite a consulta de dataframes pandas executando comandos SQL sem precisar se conectar a qualquer servidor SQL. Por baixo dos panos, ele usa a sintaxe SQLite, detecta automaticamente qualquer dataframe pandas e trata-o como uma tabela SQL normal.

Configurando seu ambiente

Primeiro, precisamos instalar o pandasql:

pip install pandasql

Então, importamos os pacotes necessários:

from pandasql import sqldf import pandas as pd

Acima, nós importamos diretamente a função sqldf da biblioteca pandasql, que é praticamente a única função significativa da biblioteca. Como o seu nome sugere, ela é aplicada para consultar dataframes usando sintaxe SQL. Além desta função, a pandasql vem com duas simples bases de dados internas que podem ser carregadas usando as funções explicativas load_births() e load_meat().

Sintaxe pandasql

A sintaxe da função sqldf é muito simples:

sqldf(query, env=None)

Aqui, query é um parâmetro obrigatório que recebe uma consulta SQL como uma string, e env—um parâmetro opcional (e raramente útil) que pode ser tanto locals() quanto globals() e permite que o sqldf acesse o conjunto correspondente de variáveis em seu ambiente Python.

A função sqldf retorna o resultado da consulta como um dataframe pandas.

Quando podemos usar pandasql

A biblioteca pandasql permite trabalhar com dados usando a Linguagem de Consulta de Dados (DQL), que é um dos subconjuntos do SQL. Em outras palavras, com pandasql, podemos executar consultas em dados armazenados em uma base de dados para recuperar a informação necessária deles. Em particular, podemos acessar, extrair, filtrar, classificar, agrupar, juntar, agregar dados, e realizar operações matemáticas ou lógicas neles.

Quando não podemos usar pandasql

A pandasql não permite o uso de nenhum outro subconjunto de SQL além da DQL. Isso significa que não podemos aplicar pandasql para modificar (atualizar, truncar, inserir, etc.) tabelas ou mudar (atualizar, excluir, ou inserir) os dados em uma tabela.

Também, já que esta biblioteca é baseada em sintaxe SQL, devamos ter cuidado com as falhas conhecidas no SQLite.

Exemplos de uso de pandasql

Agora, vamos dar uma olhada mais granular em como executar consultas SQL em pandas dataframes usando a função sqldf do pandasql. Para ter algum dado para praticar, vamos carregar um dos conjuntos de dados embutidos na biblioteca seaborn — penguins:

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

Output:

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

Se você precisar recuperar suas habilidades em SQL, nossa skill track de SQL Fundamentals é um bom ponto de referência.

Extraindo dados com pandasql

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

Output:

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

Acima, nós extraímos informações sobre a espécie e a geografia dos primeiros cinco pinguins do dataframe penguins. Note que a execução da função sqldf retorna um dataframe pandas:

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

Output:

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

Em pandas puro, isso seria:

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

Output:

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

Outro exemplo é a extração de valores únicos de uma coluna:

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

Output:

species 0 Adelie 1 Chinstrap 2 Gentoo

Em pandas, isso seria:

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

Output:

['Adelie' 'Chinstrap' 'Gentoo']

Ordenando dados com pandasql

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

Output:

body_mass_g 0 6300.0 1 6050.0 2 6000.0 3 6000.0 4 5950.0

Acima, nós ordenamos nossos pinguins pelo massa corporal de forma decrescente e mostramos os cinco valores de massa corporal mais altos.

No pandas, seria:

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

Resultado:

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

Filtrando dados com pandasql

Vamos tentar o mesmo exemplo que mencionamos no capítulo “Por que usar SQL em pandas”: extraindo as espécies únicas de pinguins que são machos e que têm asas maiores que 210 mm:

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

Resultado:

species 0 Chinstrap 1 Gentoo

A cima, filtramos os dados com base em duas condições: sexo = 'Masculino' e flipper_length_mm > 210.

O mesmo código em pandas teria um pouco mais de complexidade:

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

Resultado:

['Chinstrap' 'Gentoo']

Agrupando e agregando dados com pandasql

Agora, vamos aplicar agrupamento e agregação de dados para encontrar a cauda mais longa para cada espécie no dataframe:

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

Resultado:

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

O mesmo código em pandas:

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

Resultado:

species bill_length_mm 0 Adelie 46.0 1 Chinstrap 58.0 2 Gentoo 59.6

Executando operações matemáticas com pandasql

Com pandasql, podemos facilmente executar operações matemáticas ou lógicas nos dados. Imaginem que queremos calcular a relação de comprimento da cauda para cada pinguim e exibir as cinco melhores medições desta medida:

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

Resultado:

length_to_depth 0 3.612676 1 3.510490 2 3.505882 3 3.492424 4 3.458599

Note que desta vez, usamos o alias length_to_depth para a coluna com os valores de relação. Caso contrário, obteríamos uma coluna com o nome monstruoso bill_length_mm / bill_depth_mm.

Em pandas, precisaríamos primeiro criar uma nova coluna com os valores de relação:

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())

Resultado:

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

Conclusão

Para concluir, neste tutorial, nós exploramos porque e quando podemos combinar a funcionalidade do SQL com o pandas para escrever código melhor e mais eficiente. Nós discutimos como configurar e usar a biblioteca pandasql para esse fim e quais limitações este pacote tem. Finalmente, consideramos inúmeros exemplos populares de aplicação prática de pandasql e, em cada caso, comparamos o código com seu contrapartida pandas.

Agora você tem tudo o que precisa para aplicar o SQL com pandas em projetos do mundo real. Um ótimo local para sua prática é o DataLab, o bloco de notas de dados com suporte a AI do DataCamp.

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