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()