Pular para conteúdo

Início

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

Setembro de 2024

  • Tiny Awards

What are these awards?

Tiny Awards exist to celebrate the personal internet, what we described last year as ‘the other web, the one that is small and handmade and isn’t trying to sell you anything or monetise anything but which instead is about people using the digital tools we all have access to to make the sorts of small, personal experiences that you tend not to see ‘in feed’’. https://tinyawards.net/