Este relatório foi compilado em: `r format(Sys.time(), "%d/%m/%Y %H:%M:%S")`.

# Introdução ao Polars

```{r}
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__)")

#instalar pacotes dentro desse Python, apenas se o chunk logo abaixo não funcionar
py_install("pip", pip = TRUE)
py_install("numpy", pip = TRUE)
py_install("pyarrow", pip = TRUE)
py_install("polars[pyarrow]", pip = TRUE)
```

```{python}
#instalando os pacotes necessários do python
#!pip install polars
#!pip install fastexcel
#!pip install pyarrow
```

```{python}
import polars as pl #importando polars
import fastexcel    #importando fastexcel
```

```{python}
#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
```

```{python}
#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)
```

```{python}
#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
```

```{python}
#operando em valor1
df["valor1"]
df["valor1"].mean()

#tirando os nulls em valor1
df["valor1"].drop_nulls()
df["valor1"].drop_nulls().mean()
```

```{python}
#operando em colunas
df.select([
  pl.col("valor1").mean().alias("media_v1"),
  pl.col("valor2").mean()
])
```

```{python}
#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")

```


```{python}
#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
voos.head(3)
```


```{python}
#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")
```

# Dados Relacionais

```{python}
#dados clientes
#criando um data frame
clientes = pl.DataFrame({
    "cliente_id": [1, 2, 3, 4],
    "nome": ["Ana", "Bruno", "Clara", "Daniel"]
})

print(clientes)

```


```{python}
#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)

```

# INNER JOIN
```{python}
#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)
```

# LEFT/RIGHT JOIN
```{python}
#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)
```


```{python}
#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)
```

# OUTER JOIN
```{python}
#Retorna todas as linhas quando há uma correspondência em uma das tabelas.
res_oj = clientes.join(pedidos, on="cliente_id", how="outer")
print(res_oj)
```

# CROSS JOIN
```{python}
#Retorna o produto cartesiano de ambas as tabelas.
res_cj = clientes.join(pedidos, how="cross")
print(res_cj)
```


P1: Qual é o valor médio das compras realizadas para cada cliente identificado?
Como responder P1?
print(clientes)
```{python}
print(clientes)
print(pedidos)
res = res_ij.group_by(["nome", "cliente_id"]).agg(pl.col("valor").mean())
print(res)
```

P2: Informe os nomes e a quantidade de compras com valor mínimo de $100.00 realizadas por cada cliente.
```{python}
print(clientes)
print(pedidos)
res = (res_oj.with_columns(pl.col("valor") > 100)
       .group_by("nome")
       .agg(pl.col("valor").sum()))
print(res)
```

JOIN com Múltiplas Colunas como Chave
```{python}
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)
print(detalhes_pedidos)
```


Realizando um JOIN com Múltiplas Colunas
```{python}
final = vendas.join(detalhes_pedidos,
                    left_on = ["id_cl", "id_prod"],
                    right_on = ["cl_id", "id_prod"],
                    how = "inner")
print(final)
```
