Pular para conteúdo

2025

Meu mapa da Web

Teste

stateDiagram-v2 [*] --> select_time select_time --> current_status current_status --> cancel: status_available current_status --> [*]: status_over cancel --> [*]
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js">
</script>
<script>
    mermaid.initialize({ startOnLoad: true });
</script>

Python, Pandas e DuckDB

Neste estudo DuckDB está sendo usado como intermediário para tratamento de arquivos de dados como csv. O DuckDB também permite trabalhar com arquivos parquet, json, entre outros.

Com ele é possível executar consultas SQL diretamente no arquivo csv ou no dataframe Pandas. SQL é bem conhecido, com uma sintaxe já consolidada, o que permite manipular os dados de forma mais prática.

Algumas manipulações, mesmo as simples, são mais complexas de fazer usando Pandas. Dificultando ainda mais a curva de aprendizagem ou até mesmo adoção por parte de novos analistas.

# Bibliotecas
import pandas as pd
import duckdb
from pathlib import Path
from datetime import datetime


# Locais e Arquivos
today = datetime.today()
in_file = Path.cwd() / "dados" / "original" / "votacao_ce.csv"
summary_file = Path.cwd() / "dados" / "processado" / f"votacao_dep_fed_ce_{today:%b-%d-%Y}.csv"
out_file_votacao_datawarehouse = Path.cwd() / "dados" / "processado" / "votacao_datawarehouse.db"
out_file_votacao_dep_fed = Path.cwd() / "dados" / "processado" / "votacao_dep_fed_ce.csv"
out_file_report = Path.cwd() / "dados" / "report" / "report.xlsx"


# Investigando as colunas
df = pd.read_csv(in_file)
print(df.columns)


# Selecionando as colunas
colunas = ['ANO_ELEICAO',
'SG_UE',
'NM_UE',
'CD_MUNICIPIO',
'NM_MUNICIPIO',
'CD_CARGO',
'DS_CARGO',
'SQ_CANDIDATO',
'NR_CANDIDATO',
'NM_CANDIDATO',
'NM_URNA_CANDIDATO',
'CD_SITUACAO_CANDIDATURA',
'DS_SITUACAO_CANDIDATURA',
'CD_DETALHE_SITUACAO_CAND',
'DS_DETALHE_SITUACAO_CAND',
'NR_PARTIDO',
'SG_PARTIDO',
'NM_PARTIDO',
'QT_VOTOS_NOMINAIS',
'QT_VOTOS_NOMINAIS_VALIDOS',
'CD_SIT_TOT_TURNO',
'DS_SIT_TOT_TURNO',
'CD_GEOCODM',
'MUNICIPIO_NOME_3']

df = df[colunas]


# Executando consulta no dataframe
results = duckdb.sql("SELECT DISTINCT MUNICIPIO_NOME_3 FROM df ORDER BY 1").df()
results.head()


# Contagem da quantidade de linhas
# Executando a consulta diretamente no arquivo csv
conn = duckdb.connect()
sql_query = f"""
SELECT
    COUNT(*) as row_count
FROM read_csv('{in_file}')  
"""

result = conn.execute(sql_query).df()
result.head()



# Municípios
# Executando a consulta diretamente no arquivo csv
conn = duckdb.connect()
sql_query = f"""
SELECT DISTINCT MUNICIPIO_NOME_3
FROM read_csv('{in_file}')  
ORDER BY 1
"""
result = conn.execute(sql_query).df()
conn.close()
result.head()



# Como salvar dados no DuckDB
# Nesse exemplo os dados são consumidos diretamente do dataframe
con = duckdb.connect(out_file_votacao_datawarehouse)
con.sql("CREATE TABLE votacao_ce AS SELECT * FROM df")
con.close()


# Para ler os dados salvos no duckdb
con = duckdb.connect(out_file_votacao_datawarehouse)
duck_df = con.sql("SELECT DISTINCT MUNICIPIO_NOME_3 FROM votacao_ce ORDER BY 1 LIMIT 10").df()
con.close()

duck_df.head()