P A T H

Como enriquecer a base de dados com API utilizando Python Script

O que você vai aprender?

No mundo atual, onde os dados são o ativo mais valioso para organizações de todos os setores, a utilização de API’s (Application Programming Interfaces) tornou-se essencial. API’s permitem que diferentes sistemas e aplicações se comuniquem de forma eficiente, possibilitando a integração de diversas fontes de dados e facilitando o acesso a informações externas, como serviços financeiros, meteorológicos, geolocalização, redes sociais, entre outros.

Introdução:

A possibilidade de acessar dados em tempo real e integrá-los nos mais diferentes sistemas de análise também configuram uma vantagem na sua utilização. Como abordado na dica <link da dica>, muitas funcionalidades não existem nativamente no Tableau Prep, mas isso não quer dizer que seja impossível de executá-las na ferramenta se utilizarmos python, por exemplo.

Na dica de hoje, iremos exemplificar como fazer o enriquecimento de uma base de dados utilizando dados externos (via API) com python script.

O que é uma API?

De forma resumida, API é um intermediário que permite que dois sistemas diferentes interajam de forma padronizada, trocando dados ou realizando ações sem que os usuários precisem interagir diretamente com os sistemas de origem.

Imagine que uma API funciona como um garçom em um restaurante. Você (o cliente) pede algo do cardápio (faz uma solicitação) e o garçom (a API) leva seu pedido para a cozinha (o servidor). A cozinha prepara sua comida (processa o pedido) e o garçom traz o prato de volta para você (resposta da API).

 

Componentes de uma API:

  1. Solicitação (Request): O sistema que está requisitando alguma informação ou ação faz um pedido, que inclui parâmetros como a URL de destino e, às vezes, dados adicionais.
  2. Resposta (Response): O sistema que recebe a solicitação processa e retorna os dados ou resultados solicitados em um formato padronizado, geralmente JSON ou XML.

Qual o desafio?

Temos uma base de dados conforme imagem abaixo:

A diretoria deseja trazer o valor de venda de cada produto da base de dados em dólar, considerando o valor de cotação de fechamento da data de realização da venda. Uma solução paliativa seria buscar na internet uma base de cotação de dólar e cruzar os dados posteriormente com a base de dados principal. Além de ser uma solução não escalável a depender do volume de dados, incorreria na necessidade de algum usuário precisar fazer essa busca e validação dos dados com o passar do tempo.

Alternativamente, poderíamos utilizar a API do banco central, para retornar os valores em dólar e fazer o enriquecimento da base de dados.

Como funciona a API do banco central?

A plataforma do Banco Central do Brasil está disponível nesse link: https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/aplicacao#!/recursos

Nela, estão disponíveis diversas API’s que executam diferentes operações. Para o exemplo desta dica, utilizaremos a API que retorna a cotação do dólar em um dia específico, conforme imagem abaixo:

Ao clicar no link da API, somos redirecionados para uma segunda página, onde podemos simular como ela funciona.

É possível alterar os parâmetros e ver como a URL de pesquisa modifica. Também é possível executá-la e ver o resultado que ela retorna. No exemplo abaixo, escolhi uma data de cotação e pedi para executar a API. Repare que na parte inferior da página, aparece uma tabela com 3 colunas: Cotação de compra, Cotação de venda e Data e hora da cotação.

Agora que já verificamos como a API se comporta, vamos montar esse script.

Passo a passo lógico

Primeiramente, vamos pensar no output desejado. Iremos fornecer uma tabela com 3 colunas e desejamos trazer uma quarta coluna, que vai ter como base a multiplicação do valor de venda pelo valor de cotação de dólar que iremos consultar na API.

O input dessa etapa no tableau prep será, via de regra, a tabela fornecida na etapa imediatamente anterior à etapa de script. O output deverá também ser em formato de tabela, podendo (ou não) ser diferente da tabela input.

Preparando o script python

Abaixo segue o script completo, dividido em 11 passos, onde fornecemos a tabela via tableau prep e o script devolve a tabela com a coluna do valor de venda em dólar, considerando o valor de fechamento da data da venda.

import pandas as pd # Biblioteca para manipulação de dados

import requests # Biblioteca para requisições web

from datetime import datetime # Biblioteca para manipulação de datas

 

def calcular_valor_dolar(df):

    “””

    Essa função recebe uma tabela no Tableau Prep.

    Baseado na coluna data_venda, faz requisições na plataforma do Banco Central e retorna a cotação diária do dólar comercial.

    A saída dessa função é um dataframe

 

    Args:

    df (dataframe): dataframe do Tableau Prep que contenha uma coluna data_venda, valor_venda e nome_produto

 

    Returns:

    Dataframe

        Um dataframe que retorna as colunas data_venda, valor_venda, nome_produto, valor_dolar

    “””

 

    # Passo 1: Extrai da coluna data_venda o caractere ‘Z’. Essa etapa é importante pois a coluna está formatada no padrão de data UTC

    df[‘data_venda’] = df[‘data_venda’].str.replace(‘Z’, ”, regex=False)

   

    # Passo 2: Converter a coluna data_venda para o padrão da API -> mm-dd-yyyy

    df[‘data_venda_formatada’] = pd.to_datetime(df[‘data_venda’]).dt.strftime(‘%m-%d-%Y’)

 

    # Passo 3 – Listar todas as datas únicas da nova coluna criada utilizando a função unique

    datas_unicas = df[‘data_venda_formatada’].unique()

 

    # Passo 4 –  Lista vazia para armazenar os resultados

    resultados = []

 

    # Passo 5 – Criar um loop de repetição que faz a requisição na API para cada data da lista ‘datas_unicas’

    for i in datas_unicas:

        # Url Base

        url = f”https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDolarDia(dataCotacao=@dataCotacao)?@dataCotacao='{i}’&$top=1000&$format=json”

       

        # Obter a resposta do request

        response = requests.get(url)

       

        # Status da requisição

        response.raise_for_status()

       

        # A resposta da requisição retorna um Json

        dados = response.json()

       

        # Acessando o Json para obter a coluna cotacaoVenda

        cotacao_dolar = dados[‘value’][0][‘cotacaoVenda’]        

       

        # Ao final, a cotação da data é incluída na lista ‘resultados’

        resultados.append([i, cotacao_dolar])

 

    # Passo 6 – Criar um Dataframe Pandas com as colunas data_formatada e cotacao_dolar

    df_cotacoes = pd.DataFrame(resultados, columns=[‘data_formatada’, ‘cotacao_dolar’])

   

    # Passo 7: Realizar o join da base principal com a base de cotações

    df_final = pd.merge(df, df_cotacoes, left_on=’data_venda_formatada’, right_on=’data_formatada’)

 

    # Passo 8: Criar uma nova coluna com o valor da venda em dólar

    df_final[‘valor_dolar’] = df_final[‘valor_venda’] * df_final[‘cotacao_dolar’]

 

    # Passo 9: Selecionar apenas as colunas desejadas

    df_final = df_final[[‘data_venda’, ‘valor_venda’, ‘nome_produto’, ‘valor_dolar’]]

   

    # Passo 10: Realizar a saída da função que calcula o valor em dólar

    return df_final

 

# Passo 11: Definir quais colunas irão para o dataframe final

def get_output_schema():

    “””

    A função get_output_schema é essencial se a tabela final tiver colunas diferentes da tabela input do Tableau Prep. É ela que define quais colunas irão aparecer na tabela final.

 

    Returns:

        Dataframe: O schema desejado para a tabela final que será apresentada no Tableau Prep.

    “””

    return pd.DataFrame({

        ‘data_venda’ : prep_date(),

        ‘valor_venda’ : prep_int(),

        ‘nome_produto’ : prep_string(),

        ‘valor_dolar’ : prep_decimal()

    })

Resumo do código

Nessa seção iremos abordar as etapas que estão sendo executadas em cada parte do código.

  • Importação de bibliotecas

Nesta dica, precisaremos apenas de 3 bibliotecas do python: pandas, requests e datetime.

import pandas as pd # Biblioteca para manipulação de dados

import requests # Biblioteca para requisições web

from datetime import datetime # Biblioteca para manipulação de datas

 

 

  • Criação da função no python

Via de regra, todo script python dentro do tableau prep precisa de uma função principal, que deve ser passada na configuração da step. Definimos o nome da função como “calcular_valor_dolar” e ela tem um argumento chamado “df”.

def calcular_valor_dolar(df):

    “””

    Essa função recebe uma tabela no Tableau Prep.

    Baseado na coluna data_venda, faz requisições na plataforma do Banco Central e retorna a cotação diária do dólar comercial.

    A saída dessa função é um dataframe

 

    Args:

    df (dataframe): dataframe do Tableau Prep que contenha uma coluna data_venda, valor_venda e nome_produto

 

    Returns:

    Dataframe

        Um dataframe que retorna as colunas data_venda, valor_venda, nome_produto, valor_dolar

    “””

 

 

  • Conversão da coluna de data

A primeira etapa do script envolve a conversão da coluna data_venda. A função “str.replace” é capaz de substituir caracteres específicos por outro. Essa tratativa se faz necessária devido ao padrão de data que a coluna possui. Nesse caso, estamos atribuindo esse ajuste na própria coluna data_venda.

    # Passo 1: Extrai da coluna data_venda o caractere ‘Z’. Essa etapa é importante pois a coluna está formatada no padrão UTC

    df[‘data_venda’] = df[‘data_venda’].str.replace(‘Z’, ”, regex=False)

 

 

  • Conversão da coluna data_venda para o padrão da API

Como foi possível observar na url de consulta, o padrão de data da API segue o padrão mm-dd-yyyy. Nessa etapa, estamos criando uma nova coluna chamada “data_venda_formatada”

    # Passo 2: Converter a coluna data_venda para o padrão da API – mm-dd-yyyy

    df[‘data_venda_formatada’] = pd.to_datetime(df[‘data_venda’]).dt.strftime(‘%m-%d-%Y’)

 

 

  • Seleção de todas as datas únicas

Nessa etapa, criamos uma variável que armazena todas as datas únicas da coluna “data_venda_formatada” com a função “unique”.

    # Passo 3 – Listar todas as datas únicas da nova coluna criada

    datas_unicas = df[‘data_venda_formatada’].unique()

 

 

  • Criação de uma lista que armazena os resultados de consulta à API

a próxima etapa envolve a criação de uma lista vazia que armazena os resultados para cada consulta à API. Ela será incrementada à cada consulta que será realizada.

    # Passo 4 –  Lista para armazenar os resultados

    resultados = []

 

 

  • Aplicação de um loop para realizar a consulta

a próxima etapa envolve a criação de um evento de repetição que executa uma sequência de atividades. Com base na lista de datas únicas criada na etapa 5, o loop faz a consulta à API, retornando em formato json. Acessando o json gerado, obtém a coluna “cotacaoVenda “ e inclui o registro na lista criada na etapa 6, de forma incremental.

    # Passo 5 – Criar um for loop que faz a requisição na API para cada data da lista ‘datas_unicas’

    for i in datas_unicas:

        # Url Base

        url = f”https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDolarDia(dataCotacao=@dataCotacao)?@dataCotacao='{i}’&$top=1000&$format=json”

       

        # Obter a resposta do request

        response = requests.get(url)

       

        # Status da requisição

        response.raise_for_status()

       

        # A resposta da requisição retorna um Json

        dados = response.json()

       

        # Acessando o Json para obter a coluna cotacaoVenda

        cotacao_dolar = dados[‘value’][0][‘cotacaoVenda’]       

       

        # Ao final, a cotação da data é incluída na lista ‘resultados’

        resultados.append([i, cotacao_dolar])

 

 

  • Criar uma tabela no python com base na lista “resultados”

Nessa etapa, foi criada uma tabela chamada df_cotacoes com base na lista criada na etapa anterior.

    # Passo 6 – Criar um Dataframe Pandas com as colunas data_formatada e cotacao_dolar

    df_cotacoes = pd.DataFrame(resultados, columns=[‘data_formatada’, ‘cotacao_dolar’])

 

 

  • Mesclar a tabela criada na etapa 8 com a base principal

Utilizando a coluna de data de cada tabela, realizamos a mesclagem dos dados utilizando a função “merge”, utilizando a base principal como base.

    # Passo 7: Realizar o merge da base principal com a base de cotações

    df_final = pd.merge(df, df_cotacoes, left_on=’data_venda_formatada’, right_on=’data_formatada’)

 

 

  • Criar a nova coluna de valor de venda em dólar

Agora resta atribuir uma nova coluna, chamada “valor_dolar”, que irá receber a multiplicação do valor_venda pelo valor da cotação_dolar do dia respectivo.

    # Passo 8: Criar uma nova coluna com o valor da venda em dólar

    df_final[‘valor_dolar’] = df_final[‘valor_venda’] * df_final[‘cotacao_dolar’]

 

 

  • Selecionar as colunas que irão compor a tabela final

    # Passo 9: Selecionar apenas as colunas desejadas

    df_final = df_final[[‘data_venda’, ‘valor_venda’, ‘nome_produto’, ‘valor_dolar’]]

 

 

  • Definição do formato de saída da função

Aqui definimos qual a saída da função “calcular_valor_dolar”. No exemplo abaixo, definimos que a saída é o dataframe “df_final”, que foi atribuído na etapa 11.

    # Passo 10: Realizar a saída da função que calcula o valor em dólar

    return df_final

 

 

  • Definição do schema (colunas e tipo de dados)

Aqui utilizamos a função get_output_schema, presente na documentação do tableau prep. Essa função é necessária sempre que a tabela final criada no python script for diferente da tabela fornecida na etapa anterior do tableau prep. A documentação pode ser encontrada nesse link: Usar scripts de Python no seu fluxo – Tableau.

Nela, basicamente informamos um dataframe com os nomes das colunas e quais tipos de dados eles serão. Aqui cabe um cuidado para que o formato de saída das colunas do python script seja compatível com o tipo de dado esperado e aceito pelo tableau prep.

# Passo 11: Definir quais colunas irão para o dataframe final

def get_output_schema():

    “””

    A função get_output_schema é essencial se a tabela final tiver colunas diferentes da tabela input do Tableau Prep. É ela que define quais colunas irão aparecer na tabela final.

 

    Returns:

        Dataframe: O schema desejado para a tabela final que será apresentada no Tableau Prep.

    “””

    return pd.DataFrame({

        ‘data_venda’ : prep_date(),

        ‘valor_venda’ : prep_int(),

        ‘nome_produto’ : prep_string(),

        ‘valor_dolar’ : prep_decimal()

    })

Visão geral do fluxo

Abaixo iremos dar um overview das configurações no Tableau Prep.

O input é um arquivo de excel com 3 colunas, conforme demonstrado abaixo.

Na configuração do script, é importante indicar a função correta criada no python script.

09 de Outubro de 2024

Pronto! Agora você sabe como enriquecer a sua base de dados utilizando python.

Language