Power BI com PostgreSQL
A integração com o Power BI é mais robusta quando utilizamos um banco de dados como intermediário. Este guia demonstra como extrair dados da nossa API, carregá-los em um banco de dados PostgreSQL e, em seguida, conectar o Power BI a esse banco de dados para visualização e análise.
Pré-requisitos
- Python 3.6+: Certifique-se de que você tenha o Python instalado.
- Bibliotecas Python: Instale as bibliotecas necessárias:
pip install requests pandas psycopg2-binary - PostgreSQL: Tenha um servidor PostgreSQL em execução e as credenciais de acesso (usuário, senha, host, porta e nome do banco de dados).
- Power BI Desktop: Instale a aplicação Power BI Desktop.
- Token de Acesso: Obtenha um token de acesso para a nossa API.
Exemplo de Código
O script Python abaixo realiza as seguintes ações:
- Busca de Proposições: Faz uma requisição para o endpoint
recuperaProposicoesda nossa API. - Conexão com o PostgreSQL: Estabelece uma conexão com o banco de dados.
- Criação da Tabela: Garante que a tabela para armazenar as proposições exista.
- Carregamento de Dados: Insere as proposições na tabela do PostgreSQL.
- Python
import requests
import pandas as pd
import psycopg2
from psycopg2.extras import execute_values
import json
# --- Configuração ---
# Substitua com seu token de acesso
ACCESS_TOKEN = "SEU_TOKEN_DE_ACESSO"
# URL da nossa API
API_URL = "https://api-public.sigalei.com/graphql"
# --- Configuração do Banco de Dados PostgreSQL ---
DB_CONFIG = {
"dbname": "seu_banco_de_dados",
"user": "seu_usuario",
"password": "sua_senha",
"host": "localhost",
"port": "5432"
}
# --- 1. Buscar Proposições ---
def fetch_propositions():
"""Busca proposições da nossa API."""
query = """
query RecuperaProposicoes {
recuperaProposicoes(
filter: {
siglaTipo: "PL"
ano: 2023
}
first: 50 # Aumentando o número de proposições
) {
edges {
node {
id
siglaTipo
numero
ano
ementa
}
}
}
}
"""
headers = {
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Content-Type": "application/json"
}
response = requests.post(API_URL, json={"query": query}, headers=headers)
response.raise_for_status()
return [p["node"] for p in response.json()["data"]["recuperaProposicoes"]["edges"]]
# --- 2. Carregar Dados no PostgreSQL ---
def load_data_to_postgres(propositions):
"""Conecta ao PostgreSQL e carrega os dados das proposições."""
df = pd.DataFrame(propositions)
if df.empty:
print("Nenhuma proposição encontrada para carregar.")
return
conn = None
try:
print("Conectando ao banco de dados PostgreSQL...")
conn = psycopg2.connect(**DB_CONFIG)
cursor = conn.cursor()
print("Criando a tabela 'proposicoes' se não existir...")
cursor.execute("""
CREATE TABLE IF NOT EXISTS proposicoes (
id VARCHAR(255) PRIMARY KEY,
sigla_tipo VARCHAR(50),
numero INT,
ano INT,
ementa TEXT
);
""")
print("Inserindo/Atualizando dados na tabela 'proposicoes'...")
# Usando INSERT ... ON CONFLICT para evitar duplicatas e atualizar registros existentes
table_columns = ['id', 'sigla_tipo', 'numero', 'ano', 'ementa']
df_columns = ['id', 'siglaTipo', 'numero', 'ano', 'ementa']
# Preparando os dados para inserção
values = df[df_columns].values.tolist()
insert_query = f"""
INSERT INTO proposicoes ({', '.join(table_columns)}) VALUES %s
ON CONFLICT (id) DO UPDATE SET
sigla_tipo = EXCLUDED.sigla_tipo,
numero = EXCLUDED.numero,
ano = EXCLUDED.ano,
ementa = EXCLUDED.ementa;
"""
execute_values(cursor, insert_query, values)
conn.commit()
print(f"{len(df)} registros foram inseridos/atualizados com sucesso!")
except psycopg2.Error as e:
print(f"Erro no banco de dados: {e}")
finally:
if conn:
cursor.close()
conn.close()
print("Conexão com o PostgreSQL fechada.")
# --- Execução ---
if __name__ == "__main__":
try:
print("Buscando proposições...")
propositions = fetch_propositions()
if propositions:
print(f"{len(propositions)} proposições encontradas.")
load_data_to_postgres(propositions)
else:
print("Nenhuma proposição foi retornada pela API.")
except requests.exceptions.RequestException as e:
print(f"Erro na requisição: {e}")
except KeyError as e:
print(f"Erro ao processar os dados da API: {e}")
except Exception as e:
print(f"Ocorreu um erro inesperado: {e}")
Instruções de Implementação
Substitua os Placeholders:
- No script Python, substitua
SEU_TOKEN_DE_ACESSOpelo seu token de acesso à nossa API. - Atualize o dicionário
DB_CONFIGcom as credenciais do seu banco de dados PostgreSQL.
- No script Python, substitua
Execute o Script:
- Salve o código em um arquivo (por exemplo,
carregar_dados.py) e execute-o:python carregar_dados.py - O script buscará os dados e os carregará na tabela
proposicoesdo seu banco de dados.
- Salve o código em um arquivo (por exemplo,
Conectando o Power BI ao PostgreSQL
Depois que os dados estiverem no PostgreSQL, você pode conectá-lo ao Power BI:
- Abra o Power BI Desktop.
- Na guia Página Inicial, clique em Obter Dados e selecione Mais....
- Na janela Obter Dados, pesquise por PostgreSQL e selecione Banco de dados PostgreSQL. Clique em Conectar.
- Insira as Informações do Servidor:
- Servidor: O host do seu banco de dados (ex:
localhost). - Banco de Dados: O nome do banco de dados (ex:
seu_banco_de_dados). - Deixe o Modo de Conectividade de Dados como Importar.
- Servidor: O host do seu banco de dados (ex:
- Forneça as Credenciais:
- Na próxima tela, você precisará fornecer o Nome de usuário e a Senha para se conectar ao seu banco de dados PostgreSQL.
- Selecione a Tabela:
- Após a conexão ser estabelecida, o Power BI mostrará uma lista de tabelas disponíveis. Marque a caixa de seleção ao lado da tabela
proposicoes. - Clique em Carregar.
- Após a conexão ser estabelecida, o Power BI mostrará uma lista de tabelas disponíveis. Marque a caixa de seleção ao lado da tabela
Agora, os dados da tabela proposicoes estão disponíveis no Power BI. Você pode começar a criar relatórios, gráficos e dashboards para analisar as proposições legislativas.