JupySQL é uma biblioteca Python que permite executar SQL em notebooks Jupyter e no shell do IPython.
Neste guia, vamos aprender a consultar dados usando o chDB e o JupySQL.
Vamos criar primeiro um ambiente virtual:
E então, vamos instalar o JupySQL, o IPython e o Jupyter Lab:
Podemos usar o JupySQL no IPython, que pode ser iniciado executando:
Ou, no Jupyter Lab, executando:
Se você estiver usando o Jupyter Lab, precisará criar um notebook antes de seguir com o restante do guia.
Baixando um conjunto de dados
Vamos usar o conjunto de dados de táxis da cidade de Nova York, que contém cerca de 3 milhões de corridas, incluindo a tarifa, a gorjeta e o bairro de embarque de cada uma.
As corridas estão divididas em vários arquivos TSV, então vamos começar fazendo o download deles:
Configurando o chDB e o JupySQL
Em seguida, vamos importar o módulo dbapi do chDB:
E vamos criar uma conexão com o chDB.
Todos os dados que persistirmos serão salvos no diretório taxi.chdb:
Agora, vamos carregar a magic sql e criar uma conexão com o chDB:
Em seguida, vamos mostrar o limite de exibição para que os resultados das consultas não sejam truncados:
Consultando dados em arquivos TSV
Baixamos vários arquivos com o prefixo trips_.
Vamos usar a cláusula DESCRIBE para entender o esquema:
Também podemos executar uma consulta SELECT diretamente nesses arquivos para ver como os dados se apresentam:
Ao examinarmos novamente o esquema, algumas colunas relacionadas a valores monetários — trip_distance, fare_amount e tip_amount — foram inferidas como String, em vez de um tipo numérico.
Vamos corrigir isso ao importar os dados para uma tabela.
Importando arquivos TSV para o chDB
Agora, vamos armazenar os dados desses arquivos TSV em uma tabela.
O banco de dados default não persiste dados em disco, portanto, primeiro precisamos criar outro banco de dados:
Agora, vamos criar uma tabela chamada trips, cujo esquema será derivado da estrutura dos dados nos arquivos TSV.
Usaremos a cláusula REPLACE para converter as colunas de valores monetários em Float64 e a função transform para converter a coluna numérica pickup_borocode em um nome de distrito legível:
Vamos verificar rapidamente os dados na nossa tabela:
Pouco mais de 3 milhões de viagens — vamos também importar uma segunda tabela.
A Taxi & Limousine Commission da cidade de Nova York divide a cidade em zonas de táxi, e um arquivo de consulta associa cada zona ao respectivo distrito.
Vamos baixar esse arquivo:
Em seguida, crie uma tabela chamada zones com base no conteúdo do arquivo CSV:
Quando a execução terminar, podemos conferir os dados que ingerimos:
A ingestão de dados foi concluída; agora chegou a hora da parte divertida: consultar os dados!
Cada distrito é dividido em um número diferente de zonas de táxi.
Vamos escrever uma consulta que faz a junção das duas tabelas para descobrir quantas viagens começaram em cada distrito e quantas viagens isso representa por zona de táxi:
Manhattan e Queens têm o mesmo número de zonas de táxi, mas Manhattan registra mais de 14 vezes mais corridas.
É possível salvar consultas usando o parâmetro --save na mesma linha do magic %%sql.
O parâmetro --no-execute faz com que a execução da consulta seja ignorada.
Quando executamos uma consulta salva, ela é convertida em uma expressão de tabela comum (CTE) antes de ser executada.
Na consulta a seguir, calculamos os bairros com a maior média de gorjetas:
As primeiras entradas são bairros com poucas corridas, portanto uma única corrida com valor alto distorce a média.
Vamos filtrá-los.
Também podemos usar parâmetros em nossas consultas.
Parâmetros são apenas variáveis comuns:
Em seguida, podemos usar a sintaxe {{variable}} em nossa consulta.
A consulta a seguir encontra os bairros com a maior média de gorjetas entre aqueles com mais de 10.000 viagens:
As corridas de aeroporto recebem, de longe, as maiores gorjetas — essas longas viagens até a cidade pesam no bolso.
O JupySQL também tem recursos limitados de criação de gráficos.
Podemos criar box plots ou histogramas.
Vamos criar um histograma, mas primeiro vamos escrever (e salvar) uma consulta que retorna a distância de cada viagem com menos de 20 milhas.
Poderemos usar isso para criar um histograma que conta quantas viagens se enquadram em cada bucket de distância:
Em seguida, podemos criar um histograma da seguinte forma:
A maioria das viagens é curta, de uma a três milhas, com uma longa cauda que se estende até as viagens para o aeroporto.