Desafio 10

Author

Maria Eduarda Villéla Silva

Este relatório foi compilado em: 02/10/2025 11:31:57.

Introdução ao Polars

library(reticulate) #para usar o python no RStudio

#garantir que o reticulate vai usar o Python 3.12 que está presente nos pcs do lab
use_virtualenv("~/.virtualenvs/r-reticulate", required = TRUE)
py_run_string("import polars as pl; print(pl.__version__)")
1.33.1
#instalar pacotes dentro desse Python, apenas se o chunk logo abaixo não funcionar
py_install("pip", pip = TRUE)
Using virtual environment "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate" ...
+ "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate/Scripts/python.exe" -m pip install --upgrade --no-user pip
py_install("numpy", pip = TRUE)
Using virtual environment "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate" ...
+ "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate/Scripts/python.exe" -m pip install --upgrade --no-user numpy
py_install("pyarrow", pip = TRUE)
Using virtual environment "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate" ...
+ "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate/Scripts/python.exe" -m pip install --upgrade --no-user pyarrow
py_install("polars[pyarrow]", pip = TRUE)
Using virtual environment "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate" ...
+ "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate/Scripts/python.exe" -m pip install --upgrade --no-user "polars[pyarrow]"
#instalando os pacotes necessários do python
#!pip install polars
#!pip install fastexcel
#!pip install pyarrow
import polars as pl #importando polars
import fastexcel    #importando fastexcel
#pl.read_csv serve para ler o dataset airports.csv, especificamente as colunas
#IATA_CODE, CITY e STATE
aeroportos = pl.read_csv("airports.csv", columns = ["IATA_CODE", "CITY", "STATE"])
aeroportos.head(2) #mostra as duas primeiras linhas
shape: (2, 3)
IATA_CODE CITY STATE
str str str
"ABE" "Allentown" "PA"
"ABI" "Abilene" "TX"
#pl.read_excel serve para ler um dataset com extensão .xlsx
wdi = pl.read_excel("WDIEXCEL.xlsx", sheet_name = "Country",
                    columns = ["Short Name", "Region"])
wdi.head(2)
shape: (2, 2)
Short Name Region
str str
"Aruba" "Latin America & Caribbean"
"Africa Eastern and Southern" null
#operações com data frames
df = pl.DataFrame({
    "grupo": ["A", "A", "B", "B", "C"],
    "valor1": [10, 15, 10, None, 25],
    "valor2": [5, None, 20, 30, None]})
df
shape: (5, 3)
grupo valor1 valor2
str i64 i64
"A" 10 5
"A" 15 null
"B" 10 20
"B" null 30
"C" 25 null
#operando em valor1
df["valor1"]
shape: (5,)
valor1
i64
10
15
10
null
25
df["valor1"].mean()
15.0
#tirando os nulls em valor1
df["valor1"].drop_nulls()
shape: (4,)
valor1
i64
10
15
10
25
df["valor1"].drop_nulls().mean()
15.0
#operando em colunas
df.select([
  pl.col("valor1").mean().alias("media_v1"),
  pl.col("valor2").mean()
])
shape: (1, 2)
media_v1 valor2
f64 f64
15.0 18.333333
#Quais são as médias da variável valor1 e o valor mínimo da variável valor2 para cada um dos grupos definidos por grupo?
df.group_by("grupo").agg([
  pl.col("valor1").mean().alias("media_valor1"),
  pl.col("valor2").min().alias("min_valor2")
]).sort("grupo")
shape: (3, 3)
grupo media_valor1 min_valor2
str f64 i64
"A" 12.5 5
"B" 10.0 20
"C" 25.0 null
#Calcule o percentual de vôos das cias. aéreas “AA” e “DL” que atrasaram pelo menos 30 minutos nas chegadas aos aeroportos “SEA”, “MIA” e “BWI”.
voos = pl.read_csv("flights.csv",
                   columns = ["AIRLINE", "ARRIVAL_DELAY", "DESTINATION_AIRPORT"],
                   schema_overrides = {"AIRLINE": pl.Utf8,
                             "ARRIVAL_DELAY": pl.Int32,
                             "DESTINATION_AIRPORT": pl.Utf8})
voos.shape
(5819079, 3)
voos.head(3)
shape: (3, 3)
AIRLINE DESTINATION_AIRPORT ARRIVAL_DELAY
str str i32
"AS" "SEA" -22
"AA" "PBI" -9
"US" "CLT" 5
#Calcule o percentual de vôos das cias. aéreas “AA” e “DL” que atrasaram pelo menos 30 minutos nas chegadas aos aeroportos “SEA”, “MIA” e “BWI”.
resultado = (
  voos.drop_nulls(["AIRLINE", "DESTINATION_AIRPORT", "ARRIVAL_DELAY"])
  .filter(
    pl.col("AIRLINE").is_in(["AA", "DL"]) &
    pl.col("DESTINATION_AIRPORT").is_in(["SEA", "MIA", "BWI"])
    )
    .group_by(["AIRLINE", "DESTINATION_AIRPORT"])
    .agg([
      (pl.col("ARRIVAL_DELAY") > 30).mean().alias("atraso_medio")
      ])
)
resultado.sort("atraso_medio")
shape: (6, 3)
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

Dados Relacionais

#dados clientes
#criando um data frame
clientes = pl.DataFrame({
    "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 │
└────────────┴────────┘
#dados compras
#crtiando um data frame
pedidos = pl.DataFrame({
    "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

#Retorna apenas as linhas que têm correspondências (de chaves) nas duas tabelas.
res_ij = clientes.join(pedidos, on="cliente_id", how="inner")
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/RIGHT JOIN

#Retorna todas as linhas da tabela à esquerda [direita] e as correspondentes da direita [esquerda] (se houver).
res_lj = clientes.join(pedidos, on="cliente_id", how="left")
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   │
└────────────┴────────┴───────────┴────────┘
#Retorna todas as linhas da tabela à esquerda [direita] e as correspondentes da direita [esquerda] (se houver).
res_rj = clientes.join(pedidos, on="cliente_id", how="right")
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

#Retorna todas as linhas quando há uma correspondência em uma das tabelas.
res_oj = clientes.join(pedidos, on="cliente_id", how="outer")
<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

#Retorna o produto cartesiano de ambas as tabelas.
res_cj = clientes.join(pedidos, how="cross")
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? Como responder P1? print(clientes)

print(clientes)
shape: (4, 2)
┌────────────┬────────┐
│ cliente_id ┆ nome   │
│ ---        ┆ ---    │
│ i64        ┆ str    │
╞════════════╪════════╡
│ 1          ┆ Ana    │
│ 2          ┆ Bruno  │
│ 3          ┆ Clara  │
│ 4          ┆ Daniel │
└────────────┴────────┘
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   │
└───────────┴────────────┴────────┘
res = res_ij.group_by(["nome", "cliente_id"]).agg(pl.col("valor").mean())
print(res)
shape: (3, 3)
┌───────┬────────────┬────────┐
│ nome  ┆ cliente_id ┆ valor  │
│ ---   ┆ ---        ┆ ---    │
│ str   ┆ i64        ┆ f64    │
╞═══════╪════════════╪════════╡
│ Ana   ┆ 1          ┆ 115.25 │
│ Clara ┆ 3          ┆ 75.0   │
│ Bruno ┆ 2          ┆ 250.75 │
└───────┴────────────┴────────┘

P2: Informe os nomes e a quantidade de compras com valor mínimo de $100.00 realizadas por cada cliente.

print(clientes)
shape: (4, 2)
┌────────────┬────────┐
│ cliente_id ┆ nome   │
│ ---        ┆ ---    │
│ i64        ┆ str    │
╞════════════╪════════╡
│ 1          ┆ Ana    │
│ 2          ┆ Bruno  │
│ 3          ┆ Clara  │
│ 4          ┆ Daniel │
└────────────┴────────┘
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   │
└───────────┴────────────┴────────┘
res = (res_oj.with_columns(pl.col("valor") > 100)
       .group_by("nome")
       .agg(pl.col("valor").sum()))
print(res)
shape: (5, 2)
┌────────┬───────┐
│ nome   ┆ valor │
│ ---    ┆ ---   │
│ str    ┆ u32   │
╞════════╪═══════╡
│ null   ┆ 0     │
│ Daniel ┆ 0     │
│ Clara  ┆ 0     │
│ Ana    ┆ 2     │
│ Bruno  ┆ 1     │
└────────┴───────┘

JOIN com Múltiplas Colunas como Chave

vendas = pl.DataFrame({
    "id_venda": [1, 2, 3],
    "id_cl": [1, 2, 1],
    "id_prod": [101, 102, 103],
    "qtde": [2, 1, 1]
})

detalhes_pedidos = pl.DataFrame({
    "id_ped": [201, 202, 203],
    "cl_id": [1, 2, 1],
    "id_prod": [101, 102, 104],
    "valor": [50.00, 75.00, 100.00]
})
#detalhes das tabelas
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 │
└────────┴───────┴─────────┴───────┘

Realizando um JOIN com Múltiplas Colunas

final = vendas.join(detalhes_pedidos,
                    left_on = ["id_cl", "id_prod"],
                    right_on = ["cl_id", "id_prod"],
                    how = "inner")
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  │
└──────────┴───────┴─────────┴──────┴────────┴───────┘