O que eu aprendi no curso de SQL do Kaggle parte 1

Vamos falar sobre o que é SQL, o que é Kaggle e alguns comandos de Big Query.

João Victor da Silva Araújo
6 min readMay 21, 2023

O que é SQL?

SQL (Structed Query Language, Linguagem estrutura de consultas) é a linguagem que utilizamos para nos comunicar com o banco de dados, quando a gente quer algo, precisamos pedir e é isso que fazemos através da linguagem SQL por meio de queries (ou consultas em português). Agora que você ja sabe o que é SQL e o que são queries, vamos para o que é o Kaggle.

O que é Kaggle?

Kaggle é uma plataforma de Ciência de Dados Machine Learning com cursos, competições e datasets, é uma excelente ferramenta para todos que querem aprender mais sobre dados.

Curso de SQL

O curso Intro To SQL (Introdução ao SQL) do Kaggle é excelente para quem está querendo aprender um pouco mais ou começar do zero em SQL, ja tinha feito um curso faz um tempo, porém como não utilizava no meu emprego esqueci algumas coisas e utilizei o curso para relembrar. O curso tem 3 horas de duração, é em inglês, possui exercícios após todos os temas, é um curso sem vídeo, ou seja, você precisa ler o material do curso(Eu gosto de cursos assim, pois me permite ter um menor senso de urgência, consigo ler quantas vezes quiser) e é dividido em 6 partes:

  1. Getting started with SQL and Big Query (Começando com SQL e Big Query)
  2. SELECT, FROM and WHERE (comandos essenciais para o SQL)
  3. GROUP BY, HAVING and COUNT (comandos para tornar as consultas mais interessantes)
  4. ORDER BY (Comando para ordernar os resultados das consultas)
  5. AS WITH (Comando para tornar sua consulta mais organizada)
  6. Joining Data (Juntando dados, aqui se você utiliza excel, pensa num procv)

Getting started with SQL and Big Query (Começando com SQL e Big Query)

A primeira coisa do curso foi o susto ao ver que não utilizaria uma ferramenta como HeidiSQL ou MySQL Workbench e sim o Google Big Query, mas o que é isso? O Big Query nada mais é que um serviço de cloud da Google que permite que armazenamento e análise de dados em nuvem e está inserido no universo da Google Cloud. Confesso que por mais que lutei um pouco no começo, achei bem legal a forma de trabalhar no Big Query, e ao pesquisar descobri que ele permite que você inpute dados e visualize ao mesmo tempo e tem como grande trunfo a escalabilidade, mas dito isso, vamos aos primeiros comandos que precisamos para nos darmos bem nesse curso.

O primeiro comando dado que utilizamos é a importação do módulo bigquery que esta na biblioteca da google.cloud

from google.cloud import bigquery

Após isso, a gente precisa criar uma instância de cliente, e ela vai ser importante em buscarmos a informação que queremos então fazemos assim:

cliente = bigquery.Client() # Instanciando o cliente

Obs: Mesmo que você lute, assim como eu, para entender o fluxo do trabalho é sempre ir aos poucos e tentar entender o mais importante, o kaggle em vários momentos já vai deixar o ambiente pronto, mas isso aqui não é ressalva para você passar direto desse módulo, quando somos aprendizes precisamos ter a humildade de lembrar que se alguém mais experiente colocou algo num curso é porque é importante a gente saber. (Em geral rsrsrsrsrs)

Para nosso primeiro código, nós vamos utilizar o dataset do chicago-crimes:

https://www.kaggle.com/datasets/chicago/chicago-crime

from google.cloud import bigquery

# Criando um cliente objeto
cliente = bigquery.Client()

# Construindo a referência um dataset de chicago
dataset_ref=cliente.dataset("chicago_crime", project="bigquery-public-data")

# Fazendo uma requisição na API para pegar o dataset
dataset = cliente.get_dataset(dataset_ref)

print(dataset)

>>> Dataset(DatasetReference('bigquery-public-data', 'chicago_crime'))

Isso vai retornar uma referência ao dataset, da seguinte forma:

Quando a gente começa a trabalhar num dataset, é importante vermos as tabelas inicialmente e para isso não é difícil.

#Criamos uma referência a todas as tabelas.
tabelas = cliente.list_tables(dataset)

#Agora pegamos a referência anterior e transformamos numa lista para a gente poder iterar sobre
tabelas_lista = list(tabelas)

#Iterando sobre todas as tabelas
for tabela in tabelas_lista:
print(tabela.table_id)

>>> crime

Então, esse dataset so contém uma tabela cujo nome é crime, caso tivessemos mais tabelas, ao iterar teriamos todos os nomes.

# Construindo uma referencia para a tabela crime.
tabela_ref = dataset_ref.table("crime")

# Fazendo uma requisição de tabela e depois pegando a tabela que queremos
tabela = client.get_table(tabela_ref)

Beleza!!! Vimos que só temos uma tabela que é a crime, fizemos a requisição dessa tabela e agora vamos ver as informações das colunas, para isso utilizamos o comando schema().

# Retorna as informações das colunas da tabela de nome crime.
tabela.schema
>>> [SchemaField('unique_key', 'INTEGER', 'REQUIRED', None, (), None),
SchemaField('case_number', 'STRING', 'NULLABLE', None, (), None),
SchemaField('date', 'TIMESTAMP', 'NULLABLE', None, (), None),
SchemaField('block', 'STRING', 'NULLABLE', None, (), None),
SchemaField('iucr', 'STRING', 'NULLABLE', None, (), None),
SchemaField('primary_type', 'STRING', 'NULLABLE', None, (), None),
SchemaField('description', 'STRING', 'NULLABLE', None, (), None),
SchemaField('location_description', 'STRING', 'NULLABLE', None, (), None),
SchemaField('arrest', 'BOOLEAN', 'NULLABLE', None, (), None),
SchemaField('domestic', 'BOOLEAN', 'NULLABLE', None, (), None),
SchemaField('beat', 'INTEGER', 'NULLABLE', None, (), None),
SchemaField('district', 'INTEGER', 'NULLABLE', None, (), None),
SchemaField('ward', 'INTEGER', 'NULLABLE', None, (), None),
SchemaField('community_area', 'INTEGER', 'NULLABLE', None, (), None),
SchemaField('fbi_code', 'STRING', 'NULLABLE', None, (), None),
SchemaField('x_coordinate', 'FLOAT', 'NULLABLE', None, (), None),
SchemaField('y_coordinate', 'FLOAT', 'NULLABLE', None, (), None),
SchemaField('year', 'INTEGER', 'NULLABLE', None, (), None),
SchemaField('updated_on', 'TIMESTAMP', 'NULLABLE', None, (), None),
SchemaField('latitude', 'FLOAT', 'NULLABLE', None, (), None),
SchemaField('longitude', 'FLOAT', 'NULLABLE', None, (), None),
SchemaField('location', 'STRING', 'NULLABLE', None, (), None)]

O que aparece na ordem é:

  1. O nome da coluna.
  2. O tipo de dado da coluna.
  3. O modo da coluna (NULLABLE diz que a coluna pode ter valores nulos nos campos)
  4. E por fim a descrição da coluna.

Por exemplo a coluna de arrest (preso) é um boolean, ou seja, True se a pessoa que cometeu o crime foi preso e False se a pessoa não foi presa.

E agora que conferimos as tabelas do dataset, aí fomos um pouco mais a dentro e vimos só a tabela crime, e por último agora vimos as infos das colunas das tabelas. Só falta o que????

Vermos os campos preenchidos das colunas, ou seja, os dados propriamente ditos e para isso a gente utiliza o objeto cliente, lembra dele? Ele vai ser usado agora.

# Dar uma olhadinha nas 5 primeiras linhas da tabela crime.
cliente.list_rows(tabela, max_results=5).to_dataframe()
# tabela se refere a tabela crime, não se esqueça!!!
|    |   unique_key | case_number   | date                      | block            |   iucr | primary_type   | description         | location_description   | arrest   | domestic   |   beat |   district |   ward |   community_area | fbi_code   |   x_coordinate |   y_coordinate |   year | updated_on                |   latitude |   longitude | location                      |
|---:|-------------:|:--------------|:--------------------------|:-----------------|-------:|:---------------|:--------------------|:-----------------------|:---------|:-----------|-------:|-----------:|-------:|-----------------:|:-----------|---------------:|---------------:|-------:|:--------------------------|-----------:|------------:|:------------------------------|
| 0 | 23995 | JB303350 | 2018-06-12 08:41:00+00:00 | 000XX W 104TH PL | 0110 | HOMICIDE | FIRST DEGREE MURDER | GARAGE | True | False | 512 | 5 | 34 | 49 | 01A | 1.17786e+06 | 1.83568e+06 | 2018 | 2023-03-28 05:00:19+00:00 | 41.7044 | -87.6243 | (41.704419193, -87.624304349) |
| 1 | 3724 | HM509037 | 2006-07-30 02:52:00+00:00 | 104XX S STATE ST | 0110 | HOMICIDE | FIRST DEGREE MURDER | AUTO | False | False | 512 | 5 | 9 | 49 | 01A | 1.17811e+06 | 1.83544e+06 | 2006 | 2022-08-31 04:51:30+00:00 | 41.7037 | -87.6234 | (41.703746874, -87.623421862) |
| 2 | 26345 | JE395709 | 2021-10-02 06:44:00+00:00 | 001XX E 107TH ST | 0110 | HOMICIDE | FIRST DEGREE MURDER | HOUSE | False | False | 512 | 5 | 9 | 49 | 01A | 1.17898e+06 | 1.83405e+06 | 2021 | 2022-09-18 04:45:51+00:00 | 41.6999 | -87.6202 | (41.699915337, -87.620245268) |
| 3 | 22962 | HZ519714 | 2016-11-17 10:46:00+00:00 | 004XX E 107TH ST | 0110 | HOMICIDE | FIRST DEGREE MURDER | HOUSE | False | False | 512 | 5 | 9 | 49 | 01A | 1.18101e+06 | 1.8341e+06 | 2016 | 2022-09-18 04:45:51+00:00 | 41.7 | -87.6128 | (41.700020108, -87.612843569) |
| 4 | 1933 | HH849690 | 2002-12-20 06:00:00+00:00 | 007XX E 104TH ST | 0110 | HOMICIDE | FIRST DEGREE MURDER | ALLEY | False | False | 512 | 5 | 9 | 50 | 01A | 1.1829e+06 | 1.83615e+06 | 2002 | 2022-09-18 04:45:51+00:00 | 41.7056 | -87.6059 | (41.705607465, -87.60585975) |

E está ai, os 5 registros que pedimos para a nossa query no DataFrame.

E está aiiii… essa foi nosso primeiro do texto do curso, vamos ver a periodicidade que vou conseguir escrever, qualquer dúvida ou sugestão de melhoria meu linkedin está abaixo:

https://www.linkedin.com/in/jo%C3%A3o-victor-silva-araujo-371007196/

--

--