import polars as pl
import sqlite3
Desafio 12
Slide 10: SQLite e Polars
# Iniciando a conexão com o banco
= sqlite3.connect('data.db')
conn = conn.cursor() cursor
#Exclui a tabela caso exista, para garantir que ao rodar este chunck novamente os resultados não sejam alterados
'DROP TABLE IF EXISTS vendas') cursor.execute(
<sqlite3.Cursor object at 0x000001EBEA33F0C0>
# Criação manual de uma tabela
'''
cursor.execute(CREATE TABLE vendas (
id INTEGER PRIMARY KEY,
vendedor TEXT,
produto TEXT,
valor REAL,
data_venda DATE
)
''')
<sqlite3.Cursor object at 0x000001EBEA33F0C0>
# Inserção de dados em uma tabela
'''
cursor.execute(INSERT INTO vendas (vendedor, produto, valor, data_venda)
VALUES
('Ana', 'Produto A', 120.5, '2024-09-01'),
('Carlos', 'Produto B', 200.0, '2024-10-02'),
('Ana', 'Produto C', 150.0, '2024-09-03'),
('Bruno', 'Produto A', 300.0, '2024-11-04'),
('Carlos', 'Produto C', 100.0, '2024-10-05');
''')
<sqlite3.Cursor object at 0x000001EBEA33F0C0>
conn.commit()
# Consulta simples no SQLite
"SELECT * FROM vendas") cursor.execute(
<sqlite3.Cursor object at 0x000001EBEA33F0C0>
= cursor.fetchall()
rows for row in rows:
print(row)
(1, 'Ana', 'Produto A', 120.5, '2024-09-01')
(2, 'Carlos', 'Produto B', 200.0, '2024-10-02')
(3, 'Ana', 'Produto C', 150.0, '2024-09-03')
(4, 'Bruno', 'Produto A', 300.0, '2024-11-04')
(5, 'Carlos', 'Produto C', 100.0, '2024-10-05')
# Integração com Polars
= pl.read_database("SELECT * FROM vendas", conn)
dados print(dados)
shape: (5, 5)
┌─────┬──────────┬───────────┬───────┬────────────┐
│ id ┆ vendedor ┆ produto ┆ valor ┆ data_venda │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ str ┆ f64 ┆ str │
╞═════╪══════════╪═══════════╪═══════╪════════════╡
│ 1 ┆ Ana ┆ Produto A ┆ 120.5 ┆ 2024-09-01 │
│ 2 ┆ Carlos ┆ Produto B ┆ 200.0 ┆ 2024-10-02 │
│ 3 ┆ Ana ┆ Produto C ┆ 150.0 ┆ 2024-09-03 │
│ 4 ┆ Bruno ┆ Produto A ┆ 300.0 ┆ 2024-11-04 │
│ 5 ┆ Carlos ┆ Produto C ┆ 100.0 ┆ 2024-10-05 │
└─────┴──────────┴───────────┴───────┴────────────┘
# Qual é o total de vendas por vendedor?
= pl.read_database('''
vendas_total SELECT vendedor, SUM(valor) as total_vendas
FROM vendas
GROUP BY vendedor;
''', conn)
print(vendas_total)
shape: (3, 2)
┌──────────┬──────────────┐
│ vendedor ┆ total_vendas │
│ --- ┆ --- │
│ str ┆ f64 │
╞══════════╪══════════════╡
│ Ana ┆ 270.5 │
│ Bruno ┆ 300.0 │
│ Carlos ┆ 300.0 │
└──────────┴──────────────┘
#Qual é o valor médio de venda por vendedor?
= pl.read_database('''
vendas_medias SELECT vendedor, AVG(valor) as total_vendas
FROM vendas
GROUP BY vendedor;
''', conn)
print(vendas_medias)
shape: (3, 2)
┌──────────┬──────────────┐
│ vendedor ┆ total_vendas │
│ --- ┆ --- │
│ str ┆ f64 │
╞══════════╪══════════════╡
│ Ana ┆ 135.25 │
│ Bruno ┆ 300.0 │
│ Carlos ┆ 150.0 │
└──────────┴──────────────┘
# Criando uma tabela contendo o nome do vendedor, o número de vendas realizadas, o total vendido e o valor médio por venda
= pl.read_database("""
vendas_comb SELECT vendedor,
COUNT(*) as numero_vendas,
SUM(valor) as total_vendas,
AVG(valor) as media_vendas
FROM vendas
GROUP BY vendedor;
""", conn)
print(vendas_comb)
shape: (3, 4)
┌──────────┬───────────────┬──────────────┬──────────────┐
│ vendedor ┆ numero_vendas ┆ total_vendas ┆ media_vendas │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ f64 ┆ f64 │
╞══════════╪═══════════════╪══════════════╪══════════════╡
│ Ana ┆ 2 ┆ 270.5 ┆ 135.25 │
│ Bruno ┆ 1 ┆ 300.0 ┆ 300.0 │
│ Carlos ┆ 2 ┆ 300.0 ┆ 150.0 │
└──────────┴───────────────┴──────────────┴──────────────┘
# Quais foram as vendas de, pelo menos, $200.00?
= pl.read_database("""
ticket_alto SELECT * FROM vendas WHERE valor >= 200
""", conn)
print(ticket_alto)
shape: (2, 5)
┌─────┬──────────┬───────────┬───────┬────────────┐
│ id ┆ vendedor ┆ produto ┆ valor ┆ data_venda │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ str ┆ f64 ┆ str │
╞═════╪══════════╪═══════════╪═══════╪════════════╡
│ 2 ┆ Carlos ┆ Produto B ┆ 200.0 ┆ 2024-10-02 │
│ 4 ┆ Bruno ┆ Produto A ┆ 300.0 ┆ 2024-11-04 │
└─────┴──────────┴───────────┴───────┴────────────┘
# Qual foi o volume mensal de vendas?
= pl.read_database("""
vendas_mensais SELECT strftime('%Y-%m', data_venda) AS mes, SUM(valor) AS total_vendas
FROM vendas GROUP BY mes ORDER BY mes
""", conn)
print(vendas_mensais)
shape: (3, 2)
┌─────────┬──────────────┐
│ mes ┆ total_vendas │
│ --- ┆ --- │
│ str ┆ f64 │
╞═════════╪══════════════╡
│ 2024-09 ┆ 270.5 │
│ 2024-10 ┆ 300.0 │
│ 2024-11 ┆ 300.0 │
└─────────┴──────────────┘
#Exclui a tabela caso exista, para garantir que ao rodar este chunck novamente os resultados não sejam alterados
'DROP TABLE IF EXISTS produtos') cursor.execute(
<sqlite3.Cursor object at 0x000001EBEA33F0C0>
# Criando a tabela de produtos
'''
cursor.execute(CREATE TABLE IF NOT EXISTS produtos (
id INTEGER PRIMARY KEY,
nome TEXT NOT NULL,
categoria TEXT NOT NULL,
preco REAL NOT NULL,
estoque INTEGER NOT NULL
);
''')
<sqlite3.Cursor object at 0x000001EBEA33F0C0>
'''
cursor.execute(INSERT INTO produtos (nome, categoria, preco, estoque) VALUES
('Produto A', 'Categoria 1', 100.0, 50),
('Produto B', 'Categoria 2', 150.0, 30),
('Produto C', 'Categoria 1', 200.0, 20),
('Produto D', 'Categoria 2', 250.0, 10),
('Produto E', 'Categoria 3', 300.0, 0);
''')
<sqlite3.Cursor object at 0x000001EBEA33F0C0>
conn.commit()
# Consultando a tabela de produtos
= pl.read_database("SELECT * FROM produtos", conn)
prods print(prods)
shape: (5, 5)
┌─────┬───────────┬─────────────┬───────┬─────────┐
│ id ┆ nome ┆ categoria ┆ preco ┆ estoque │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ str ┆ f64 ┆ i64 │
╞═════╪═══════════╪═════════════╪═══════╪═════════╡
│ 1 ┆ Produto A ┆ Categoria 1 ┆ 100.0 ┆ 50 │
│ 2 ┆ Produto B ┆ Categoria 2 ┆ 150.0 ┆ 30 │
│ 3 ┆ Produto C ┆ Categoria 1 ┆ 200.0 ┆ 20 │
│ 4 ┆ Produto D ┆ Categoria 2 ┆ 250.0 ┆ 10 │
│ 5 ┆ Produto E ┆ Categoria 3 ┆ 300.0 ┆ 0 │
└─────┴───────────┴─────────────┴───────┴─────────┘
# JOINs de vendas e produtos
= pl.read_database("""
lucros SELECT produto, valor AS compra, preco AS venda, preco-valor AS lucro
FROM vendas
INNER JOIN produtos ON vendas.produto = produtos.nome
""", conn)
print(lucros)
shape: (5, 4)
┌───────────┬────────┬───────┬────────┐
│ produto ┆ compra ┆ venda ┆ lucro │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ f64 ┆ f64 │
╞═══════════╪════════╪═══════╪════════╡
│ Produto A ┆ 120.5 ┆ 100.0 ┆ -20.5 │
│ Produto B ┆ 200.0 ┆ 150.0 ┆ -50.0 │
│ Produto C ┆ 150.0 ┆ 200.0 ┆ 50.0 │
│ Produto A ┆ 300.0 ┆ 100.0 ┆ -200.0 │
│ Produto C ┆ 100.0 ┆ 200.0 ┆ 100.0 │
└───────────┴────────┴───────┴────────┘
# Qual foi o lucro médio por vendedor?
= pl.read_database("""
lucro_medio SELECT vendedor, produto, AVG(preco-valor) AS lucro_medio
FROM vendas
INNER JOIN produtos ON vendas.produto = produtos.nome
GROUP BY vendedor
""", conn)
print(lucro_medio)
shape: (3, 3)
┌──────────┬───────────┬─────────────┐
│ vendedor ┆ produto ┆ lucro_medio │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ f64 │
╞══════════╪═══════════╪═════════════╡
│ Ana ┆ Produto A ┆ 14.75 │
│ Bruno ┆ Produto A ┆ -200.0 │
│ Carlos ┆ Produto B ┆ 25.0 │
└──────────┴───────────┴─────────────┘
# Registra quando o html foi gerado
cat(paste0("Este HTML foi gerado em: ", Sys.time()))
Este HTML foi gerado em: 2025-10-09 10:51:00.426257