# Data e hora de compilação
print(paste("Arquivo compilado em:", Sys.time()))
[1] "Arquivo compilado em: 2025-10-02 11:51:34.85911"
# Data e hora de compilação
print(paste("Arquivo compilado em:", Sys.time()))
[1] "Arquivo compilado em: 2025-10-02 11:51:34.85911"
# Instalando o pacote reticulate
#install.packages("reticulate")
# Carregue o pacote
#library(reticulate)
# Execute o comando Python
#py_run_string("import pip; from pip._internal.cli.main import main; main(['install', '--upgrade', 'pip'])")
# Instalando a biblioteca polars e fastexcel
#!pip install polars
#!pip install fastexcel
# Importando o pacote com seu alias
import polars as pl
# Importa o banco de dados "airports", selecionando 3 colunas e depois mostra duas linhas de observações
= pl.read_csv("airports.csv",
aeroportos = ["IATA_CODE", "CITY", "STATE"])
columns 2) aeroportos.head(
IATA_CODE | CITY | STATE |
---|---|---|
str | str | str |
"ABE" | "Allentown" | "PA" |
"ABI" | "Abilene" | "TX" |
# Importa o banco de dados "WDIEXCEL", selecionando a aba e duas colunas específicas, depois mostra duas linhas de observações
= pl.read_excel("WDIEXCEL.xlsx", sheet_name = "Country",
wdi = ["Short Name", "Region"])
columns 2) wdi.head(
Short Name | Region |
---|---|
str | str |
"Aruba" | "Latin America & Caribbean" |
"Afghanistan" | "South Asia" |
# Cria um data frame simples
= pl.DataFrame({
df "grupo": ["A", "A", "B", "B", "C"],
"valor1": [10, 15, 10, None, 25],
"valor2": [5, None, 20, 30, None]
}) df
grupo | valor1 | valor2 |
---|---|---|
str | i64 | i64 |
"A" | 10 | 5 |
"A" | 15 | null |
"B" | 10 | 20 |
"B" | null | 30 |
"C" | 25 | null |
# Mostra a coluna "valor1" do data frame
"valor1"] df[
valor1 |
---|
i64 |
10 |
15 |
10 |
null |
25 |
# Mostra a média dos valores da coluna "valor1" do data frame
"valor1"].mean() df[
15.0
# Mesma análise da coluna "valor1", mas omitindo valores vazios "null"
"valor1"].drop_nulls() df[
valor1 |
---|
i64 |
10 |
15 |
10 |
25 |
# Mostra a média dos valores da coluna "valor1" do data frame, omitindo valores vazios, "null"
"valor1"].drop_nulls().mean() df[
15.0
# Seleciona a média da coluna "valor1" e "valor2", além de mostrar a média do valor 1 como "media_v1"
df.select(["valor1").mean().alias("media_v1"),
pl.col("valor2").mean()
pl.col( ])
media_v1 | valor2 |
---|---|
f64 | f64 |
15.0 | 18.333333 |
# Agrupa os dados pela coluna "grupo", calcula a média de "valor1" para cada grupo, calcula o valor mínimo de "valor2" para cada grupo e ordena o resultado pela coluna "grupo"
"grupo").agg([
df.group_by("valor1").mean().alias("media_valor1"),
pl.col("valor2").min().alias("min_valor2")
pl.col("grupo") ]).sort(
grupo | media_valor1 | min_valor2 |
---|---|---|
str | f64 | i64 |
"A" | 12.5 | 5 |
"B" | 10.0 | 20 |
"C" | 25.0 | null |
# Importa o banco de dados "flights", selecionando 3 colunas. Além de especificar os tipos de dados das colunas
= pl.read_csv("flights.csv",
voos = ["AIRLINE", "ARRIVAL_DELAY", "DESTINATION_AIRPORT"],
columns = {"AIRLINE": pl.Utf8,
schema_overrides "ARRIVAL_DELAY": pl.Int32,
"DESTINATION_AIRPORT": pl.Utf8})
voos.shape
(5819079, 3)
# Mostra as 3 primeiras linhas de observações de voos
3) voos.head(
AIRLINE | DESTINATION_AIRPORT | ARRIVAL_DELAY |
---|---|---|
str | str | i32 |
"AS" | "SEA" | -22 |
"AA" | "PBI" | -9 |
"US" | "CLT" | 5 |
# Limpa e filtra dados de voos específicos, depois calcula a taxa de atrasos por companhia aérea e aeroporto de destino.
# Resulta numa análise de performance operacional mostrando a proporção de voos com mais de 30 minutos de atraso para cada rota.
= (
resultado "AIRLINE", "DESTINATION_AIRPORT", "ARRIVAL_DELAY"])
voos.drop_nulls([filter(
."AIRLINE").is_in(["AA", "DL"]) &
pl.col("DESTINATION_AIRPORT").is_in(["SEA", "MIA", "BWI"])
pl.col(
)"AIRLINE", "DESTINATION_AIRPORT"])
.group_by([
.agg(["ARRIVAL_DELAY") > 30).mean().alias("atraso_medio")
(pl.col(
]) )
# Ordena o resultado pela coluna "atraso_medio"
"atraso_medio") resultado.sort(
AIRLINE | DESTINATION_AIRPORT | atraso_medio |
---|---|---|
str | str | f64 |
"DL" | "BWI" | 0.069455 |
"DL" | "SEA" | 0.072967 |
"DL" | "MIA" | 0.090467 |
"AA" | "MIA" | 0.117894 |
"AA" | "SEA" | 0.124212 |
"AA" | "BWI" | 0.127523 |
# Criando Data Frame "clientes"
= pl.DataFrame({
clientes "cliente_id": [1, 2, 3, 4],
"nome": ["Ana", "Bruno", "Clara", "Daniel"]
})
print(clientes)
shape: (4, 2)
┌────────────┬────────┐
│ cliente_id ┆ nome │
│ --- ┆ --- │
│ i64 ┆ str │
╞════════════╪════════╡
│ 1 ┆ Ana │
│ 2 ┆ Bruno │
│ 3 ┆ Clara │
│ 4 ┆ Daniel │
└────────────┴────────┘
# Criando data frame "pedidos"
= pl.DataFrame({
pedidos "pedido_id": [101, 102, 103, 104, 105],
"cliente_id": [1, 2, 3, 1, 5],
"valor": [100.50, 250.75, 75.00, 130.00, 79.00]
})
print(pedidos)
shape: (5, 3)
┌───────────┬────────────┬────────┐
│ pedido_id ┆ cliente_id ┆ valor │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ f64 │
╞═══════════╪════════════╪════════╡
│ 101 ┆ 1 ┆ 100.5 │
│ 102 ┆ 2 ┆ 250.75 │
│ 103 ┆ 3 ┆ 75.0 │
│ 104 ┆ 1 ┆ 130.0 │
│ 105 ┆ 5 ┆ 79.0 │
└───────────┴────────────┴────────┘
# Inner Join entre "clientes" e "pedidos"
= clientes.join(pedidos, on="cliente_id", how="inner")
res_ij print(res_ij)
shape: (4, 4)
┌────────────┬───────┬───────────┬────────┐
│ cliente_id ┆ nome ┆ pedido_id ┆ valor │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 ┆ f64 │
╞════════════╪═══════╪═══════════╪════════╡
│ 1 ┆ Ana ┆ 101 ┆ 100.5 │
│ 2 ┆ Bruno ┆ 102 ┆ 250.75 │
│ 3 ┆ Clara ┆ 103 ┆ 75.0 │
│ 1 ┆ Ana ┆ 104 ┆ 130.0 │
└────────────┴───────┴───────────┴────────┘
# Left Join entre "clientes" e "pedidos"
= clientes.join(pedidos, on="cliente_id", how="left")
res_lj print(res_lj)
shape: (5, 4)
┌────────────┬────────┬───────────┬────────┐
│ cliente_id ┆ nome ┆ pedido_id ┆ valor │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 ┆ f64 │
╞════════════╪════════╪═══════════╪════════╡
│ 1 ┆ Ana ┆ 101 ┆ 100.5 │
│ 1 ┆ Ana ┆ 104 ┆ 130.0 │
│ 2 ┆ Bruno ┆ 102 ┆ 250.75 │
│ 3 ┆ Clara ┆ 103 ┆ 75.0 │
│ 4 ┆ Daniel ┆ null ┆ null │
└────────────┴────────┴───────────┴────────┘
# Right Join entre "clientes" e "pedidos"
= clientes.join(pedidos, on="cliente_id", how="right")
res_rj print(res_rj)
shape: (5, 4)
┌───────┬───────────┬────────────┬────────┐
│ nome ┆ pedido_id ┆ cliente_id ┆ valor │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ f64 │
╞═══════╪═══════════╪════════════╪════════╡
│ Ana ┆ 101 ┆ 1 ┆ 100.5 │
│ Bruno ┆ 102 ┆ 2 ┆ 250.75 │
│ Clara ┆ 103 ┆ 3 ┆ 75.0 │
│ Ana ┆ 104 ┆ 1 ┆ 130.0 │
│ null ┆ 105 ┆ 5 ┆ 79.0 │
└───────┴───────────┴────────────┴────────┘
# Outer Join entre "clientes" e "pedidos"
= clientes.join(pedidos, on="cliente_id", how="outer") res_oj
<string>:2: DeprecationWarning: use of `how='outer'` should be replaced with `how='full'`.
(Deprecated in version 0.20.29)
print(res_oj)
shape: (6, 5)
┌────────────┬────────┬───────────┬──────────────────┬────────┐
│ cliente_id ┆ nome ┆ pedido_id ┆ cliente_id_right ┆ valor │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 ┆ i64 ┆ f64 │
╞════════════╪════════╪═══════════╪══════════════════╪════════╡
│ 1 ┆ Ana ┆ 101 ┆ 1 ┆ 100.5 │
│ 2 ┆ Bruno ┆ 102 ┆ 2 ┆ 250.75 │
│ 3 ┆ Clara ┆ 103 ┆ 3 ┆ 75.0 │
│ 1 ┆ Ana ┆ 104 ┆ 1 ┆ 130.0 │
│ null ┆ null ┆ 105 ┆ 5 ┆ 79.0 │
│ 4 ┆ Daniel ┆ null ┆ null ┆ null │
└────────────┴────────┴───────────┴──────────────────┴────────┘
# Cross Join entre "clientes" e "pedidos". O erro a seguir aparece:
= clientes.join(pedidos, how="cross")
res_cj print(res_cj)
shape: (20, 5)
┌────────────┬────────┬───────────┬──────────────────┬────────┐
│ cliente_id ┆ nome ┆ pedido_id ┆ cliente_id_right ┆ valor │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 ┆ i64 ┆ f64 │
╞════════════╪════════╪═══════════╪══════════════════╪════════╡
│ 1 ┆ Ana ┆ 101 ┆ 1 ┆ 100.5 │
│ 1 ┆ Ana ┆ 102 ┆ 2 ┆ 250.75 │
│ 1 ┆ Ana ┆ 103 ┆ 3 ┆ 75.0 │
│ 1 ┆ Ana ┆ 104 ┆ 1 ┆ 130.0 │
│ 1 ┆ Ana ┆ 105 ┆ 5 ┆ 79.0 │
│ … ┆ … ┆ … ┆ … ┆ … │
│ 4 ┆ Daniel ┆ 101 ┆ 1 ┆ 100.5 │
│ 4 ┆ Daniel ┆ 102 ┆ 2 ┆ 250.75 │
│ 4 ┆ Daniel ┆ 103 ┆ 3 ┆ 75.0 │
│ 4 ┆ Daniel ┆ 104 ┆ 1 ┆ 130.0 │
│ 4 ┆ Daniel ┆ 105 ┆ 5 ┆ 79.0 │
└────────────┴────────┴───────────┴──────────────────┴────────┘
# P1: Qual é o valor médio das compras realizadas para cada cliente identificado?
= res_ij.group_by(["nome", "cliente_id"]).agg(pl.col("valor").mean())
res print(res)
shape: (3, 3)
┌───────┬────────────┬────────┐
│ nome ┆ cliente_id ┆ valor │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ f64 │
╞═══════╪════════════╪════════╡
│ Clara ┆ 3 ┆ 75.0 │
│ Bruno ┆ 2 ┆ 250.75 │
│ Ana ┆ 1 ┆ 115.25 │
└───────┴────────────┴────────┘
# P2: Informe os nomes e a quantidade de compras com valor mínimo de $100.00 realizadas por cada cliente.
= (res_oj.with_columns(pl.col("valor") > 100)
res "nome")
.group_by("valor").sum()))
.agg(pl.col(print(res)
shape: (5, 2)
┌────────┬───────┐
│ nome ┆ valor │
│ --- ┆ --- │
│ str ┆ u32 │
╞════════╪═══════╡
│ null ┆ 0 │
│ Bruno ┆ 1 │
│ Daniel ┆ 0 │
│ Ana ┆ 2 │
│ Clara ┆ 0 │
└────────┴───────┘
# JOIN com Múltiplas Colunas como Chave, novos data frames "vendas" e "detalhes_pedidos"
= pl.DataFrame({
vendas "id_venda": [1, 2, 3],
"id_cl": [1, 2, 1],
"id_prod": [101, 102, 103],
"qtde": [2, 1, 1]
})
= pl.DataFrame({
detalhes_pedidos "id_ped": [201, 202, 203],
"cl_id": [1, 2, 1],
"id_prod": [101, 102, 104],
"valor": [50.00, 75.00, 100.00]
})
# Mostrando os data frames criados
print(vendas)
shape: (3, 4)
┌──────────┬───────┬─────────┬──────┐
│ id_venda ┆ id_cl ┆ id_prod ┆ qtde │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 ┆ i64 │
╞══════════╪═══════╪═════════╪══════╡
│ 1 ┆ 1 ┆ 101 ┆ 2 │
│ 2 ┆ 2 ┆ 102 ┆ 1 │
│ 3 ┆ 1 ┆ 103 ┆ 1 │
└──────────┴───────┴─────────┴──────┘
print(detalhes_pedidos)
shape: (3, 4)
┌────────┬───────┬─────────┬───────┐
│ id_ped ┆ cl_id ┆ id_prod ┆ valor │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 ┆ f64 │
╞════════╪═══════╪═════════╪═══════╡
│ 201 ┆ 1 ┆ 101 ┆ 50.0 │
│ 202 ┆ 2 ┆ 102 ┆ 75.0 │
│ 203 ┆ 1 ┆ 104 ┆ 100.0 │
└────────┴───────┴─────────┴───────┘
# Criando um data frame "final", vindo de um join com múltiplas colunas.
= vendas.join(detalhes_pedidos,
final = ["id_cl", "id_prod"],
left_on = ["cl_id", "id_prod"],
right_on = "inner")
how print(final)
shape: (2, 6)
┌──────────┬───────┬─────────┬──────┬────────┬───────┐
│ id_venda ┆ id_cl ┆ id_prod ┆ qtde ┆ id_ped ┆ valor │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ f64 │
╞══════════╪═══════╪═════════╪══════╪════════╪═══════╡
│ 1 ┆ 1 ┆ 101 ┆ 2 ┆ 201 ┆ 50.0 │
│ 2 ┆ 2 ┆ 102 ┆ 1 ┆ 202 ┆ 75.0 │
└──────────┴───────┴─────────┴──────┴────────┴───────┘