Pular para o conteúdo principal

PBI Pilot – Teste grátis sem custos um assistente de IA para o seu Power BI

Power Bi - Capturando Taxa de Juros Selic

Olá jovens desbravadores do conhecimento e da angustia (quando passamos um tempo tentando descobrir o que ocasionou determinado bug).

Hoje vamos falar de Juros Selic, que é a taxa referencial de juros utilizada pelo governo para balizar algumas operações e pagamentos de juros da dívida interna, correção de valores da restituição de imposto de renda, juros sobre impostos entre outras coisas.

Bem, o nosso objetivo é capturar e deixar a taxa selic disponível para uso no nosso Power BI e que sempre que houver atualizações no site da Receita Federal essa atualizações sejam capturadas pelo Power BI.

Os dados criados desse webscrap poderão ser enviados para o Serviço do Power BI na nuvem e configurados no seu gateway para atualização programada.

Antesss de mais nada, se você ainda não é inscrito no meu canal no youtube, não deixa de dar uma passada lá e conferir outros vídeos sobre webscrap entre outras brincadeiras. Link AQUI

Para a captura vamos utilizar o site da receita que tem uma página direta para o link da selic.

http://idg.receita.fazenda.gov.br/orientacao/tributaria/pagamentos-e-parcelamentos/taxa-de-juros-selic

Vamos então em Obter Dados>WEB


E vamos informar na URL o link que informei acima.

Após processar o PowerQuery vai te mostrar uma lista de tabelas e você vai selecionar APENAS 1 delas e vai clicar em editar.


Você será direcionado ao powerquery e muito provavelmente terá uma nova Consulta, com 3 etapas já aplicadas como a seguir:





Precisamos apenas da primeira etapa "Fonte" ou "Source" (se seu PBI estiver em inglês), então vamos excluir as duas últimas e manter apenas a primeira.

Você verá que aparecerão todas as tabelas mostradas na etapa anterior, logo após informarmos a URL.

Temos as seguintes colunas:

Caption, Source, ClassName, Id, Data.

Na coluna Data (dados em inglês), temos em algumas delas a seguinte tabela como mostrada abaixo (basta você clicar ao lado do nome "Table" não em cima do nome, mas ao lado dentro da "célula")


Essas tabelas são as tabelas do nosso site da receita que possuem os dados de SELIC, tanto mensal (linhas 2 a 4) quanto acumuladas (linhas 5 a 8) em tabelas encapsuladas. (Você já pode ter lido sobre isso aqui no blog no artigo sobre dCalendario AQUI)

Outro detalhe que podemos perceber é que apenas as linhas que na coluna "ClassName" está preenchida com "listing" possuem os dados de SELIC.

Vamos então filtrar a class name para que apenas fiquemos com as linhas que possuem Tabelas com dados da SELIC. Basta ir no cabeçalho da coluna "ClassName" clicar na seta pra baixo que tem ao lado do nome da coluna e desmarcar "nulo" e ok.

Nossa nova consulta filtrada ficará assim:




Tenho agora duas necessidades:

1) Extrair os dados para que possamos transforma-los em dados tabulares.

2) Separar as tabelas que possuem Selic Mensal e Selic Acumulada.

Como diria "Jack, o Estripador", vamos por partes. (piada de tiozão).

Extraindo os dados.
Vamos iniciar trabalhando com alterações nas próprias tabelas encapsuladas, para deixa-las mais fáceis de trabalhar posteriormente.

Vamos trazer a primeira linha de cada tabela encapsulada na coluna "Data" para o cabeçalho dessa tabela, utilizando a Função Table.PromoteHeaders.

Vamos lá então, Menu>Adicionar Coluna>Coluna Personalizada:

A expressão Table.PromoteHeaders nos pede um argumento obrigatório que é uma TABELA. As minhas tabelas serão a linha da minha coluna "Data".

Com isso, iremos criar uma COLUNA com tabelas encapsuladas com os mesmos dados da coluna "Data" mas com o cabeçalho sendo a primeira linha de cada tabela encapsulada.



Primeira Parte concluída com sucesso... vamos agora transformar cada coluna que possui ANO no cabeçalho como uma nova Linha da nossa tabela encapsulada e teremos então novas tabelas em que todas possuirão apenas 3 colunas, Mes, Ano, Taxa.

Para fazer isso precisamos utilizar a função Table.UnpivotOtherColumns, que vai transformará a coluna de anos em novas linhas.


Para essa função são necessários pelo menos 3 Argumentos, uma Tabela (nossa coluna "CabeçalhoPromovidos"), O nome da coluna ou colunas que desejamos que funcionem como eixo da nossa alteração (Coluna Mês/Ano) que deve ser informada como texto em uma lista ou seja entre chaves e entre aspas duplas {"Mês/Ano"}, nome da nova linha que trará os valores das colunas como texto e nome da nova coluna que conterá os dados.

Teremos a seguinte expressão completa.

= Table.UnpivotOtherColumns([CabeçalhosPromovidos], {"Mês/Ano"}, "Ano", "Taxa %")

E novamente a usaremos em uma nova coluna personalizada, resultando em uma nova coluna com dados agora de uma forma que poderemos, até que enfim, extrair.


Mas antes de extrair vamos excluir as demais colunas que não nos servem para nada e manter apenas a coluna "Despivotada" que tem nossos dados tratados.

Após isso vamos então clicar no símbolo de duas setas contrárias ao lado do nome da Coluna, desmarca a opção "Use o nome da coluna original como prefixo" e depois só clicar em OK.

Temos agora o nosso tabelão, com juros selic, tanto mensal quanto acumulado.


Separando Mensal e Acumulado.
"Conhecereis os teus dados e os teus dados o libertará"

Analisando esse tabelão que criamos, para separar os dados podemos tentar identificar algum detalhe que separe Mensal e Acumulado.

Eu consegui analisar e identificar 3 dados que são diferentes da mensal para a acumulada.

1) Na mensal os nomes dos meses iniciam com letra maiúscula e na acumulada com letra minúscula.
2) Na mensal os valores da Taxa terminam com o símbolo % e na acumulada não.
3) Na mensal os valores são sempre menores que na acumulada no mesmo período.

Podemos então escolher qualquer uma das três. Eu particularmente prefiro escolher aquela que eu tenha certeza que por uma vontade da pessoa que programou o site não possa ser alterada, que é a terceira situação. Isso me garante que eu vá ter menos necessidade de alterar meu ETL e gerar menos risco de trazer dados errados.

Inicialmente eu vou começar fazendo alguns tratamentos na coluna "Taxa %"

Vamos substituir "%" por nada para que todos os números apareçam como número de fato, e vamos substituir "---" por 0.

Basta clicar com o botão direito no cabeçalho da coluna taxa e clicar em substituir valores.





Feito isso teremos então uma coluna apenas com VALORES, e podemos alterar o tipo dela para DECIMAL.

Também vamos deixar todos os nomes dos meses como minúsculo para que na próxima etapa possamos ter sucesso. Botão direito na coluna "Mês/Ano", Transformar>minúscula.

Precisamos agora identifica a cada conjunto "Mes/Ano" - "Ano" qual linha é acumulada e qual é mensal.

Podemos então criar um agrupamento por "Mes/Ano" e "Ano" que nos trará uma coluna de Tabelas, com os dados de cada mês e ano. Basta Selecionar as duas primeiras colunas, clicar com o botão direito do mouse no cabeçalho de uma delas, e selecionar "Agrupar por...".

Abrirá uma caixa que escolheremos Nome da Nova Coluna, escolhi "Encapsulada", e a Operação que é obrigatoriamente "Todas as Linhas".


Nossa coluna de valores foi substituída pela coluna de tabelas encapsuladas, que em cada tabela possui nome do mês, ano e valores mensal e acumulado em duas linhas.

Olhando com mais atenção, você vai perceber que cada tabela encapsulada na primeira linha o valor será sempre menor que na segunda linha, o que nos mostra que teremos na primeira linha o valor mensal e na segunda o valor acumulado.

Vamos inserir então um INDEX dentro de cada uma das tabelas encapsuladas iniciando de 1, depois vamos expandir essas tabelas, e saberemos que onde tivermos 1 em index será o valor mensal e onde tiver 2 em index será o valor acumulado.

Como já vimos anteriormente para trabalhar com tabela encapsulada criamos uma nova "Coluna Personalizada". 


Vamos então utilizar a função Table.AddIndexColumn, que nos pedirá 4 argumentos, Tabela (Coluna "Encapsulada"), Nome da nova coluna como texto "Indice", número inicial do meu índice que vai ser 1 e incremento do meu índice que também será 1 pois queremos um índice de 1 em 1.

Table.AddIndexColumn([Encapsulada], "Indice", 1, 1)


E pronto, nossa nova coluna de tabelas está pronta e linda de morrer.

Podemos novamente excluir as novas colunas que não precisamos, manter so a última coluna adicionada "Personalizar", e expandi-la como fizemos no final da etapa de extração dos dados.

Nossa nova e linda tabela com as informações de 1 para mensal e 2 para acumulado.


A partir daqui é com você, se quiser manter apenas o mensal, filtra pelo índice 1, se quiser manter acumulado filtra pelo índice 2, ou até se quiser ter duas tabelas uma com mensal e outra acumulado, apenas duplica a query e filtra cada nova query como você desejar.

Grande abraço e até a próxima.


E para você que chegou até aqui segura aí o código gerado nesse nosso artigo para você estudar. Basta criar uma nova consulta nula, vai no editor avançado apaga tudo que tiver lá e copia esse código abaixo.
let
    Fonte = Web.Page(Web.Contents("http://idg.receita.fazenda.gov.br/orientacao/tributaria/pagamentos-e-parcelamentos/taxa-de-juros-selic")),
    #"Linhas Filtradas" = Table.SelectRows(Fonte, each ([ClassName] = "listing")),
    #"Personalização Adicionada" = Table.AddColumn(#"Linhas Filtradas", "CabeçalhosPromovidos", each Table.PromoteHeaders([Data])),
    #"Personalização Adicionada1" = Table.AddColumn(#"Personalização Adicionada", "Despivotada", each Table.UnpivotOtherColumns([CabeçalhosPromovidos], {"Mês/Ano"}, "Ano", "Taxa %")),
    #"Outras Colunas Removidas" = Table.SelectColumns(#"Personalização Adicionada1",{"Despivotada"}),
    #"Despivotada Expandido" = Table.ExpandTableColumn(#"Outras Colunas Removidas", "Despivotada", {"Mês/Ano", "Ano", "Taxa %"}, {"Mês/Ano", "Ano", "Taxa %"}),
    #"Valor Substituído" = Table.ReplaceValue(#"Despivotada Expandido","%","",Replacer.ReplaceText,{"Taxa %"}),
    #"Valor Substituído1" = Table.ReplaceValue(#"Valor Substituído","---","0",Replacer.ReplaceText,{"Taxa %"}),
    #"Tipo Alterado" = Table.TransformColumnTypes(#"Valor Substituído1",{{"Taxa %", type number}}),
    #"Texto em Minúscula" = Table.TransformColumns(#"Tipo Alterado",{{"Mês/Ano", Text.Lower, type text}}),
    #"Linhas Agrupadas" = Table.Group(#"Texto em Minúscula", {"Mês/Ano", "Ano"}, {{"Encapsulada", each _, type table}}),
    #"Personalização Adicionada2" = Table.AddColumn(#"Linhas Agrupadas", "Personalizar", each Table.AddIndexColumn([Encapsulada], "Indice", 1, 1)),
    #"Outras Colunas Removidas1" = Table.SelectColumns(#"Personalização Adicionada2",{"Personalizar"}),
    #"Personalizar Expandido" = Table.ExpandTableColumn(#"Outras Colunas Removidas1", "Personalizar", {"Mês/Ano", "Ano", "Taxa %", "Indice"}, {"Mês/Ano", "Ano", "Taxa %", "Indice"})
in

    #"Personalizar Expandido"

Comentários

  1. Muito legal!!! Rafael, vc é fera!!! Excelente artigo!!!

    ResponderExcluir
  2. Show...parabéns Rafael ficou top...obrigado por compartilhar.

    ResponderExcluir
  3. Este site é protegido por reCAPTCHA. A Política de Privacidade e os Termos de Serviço do Google se aplicam.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

[Power BI] O totalizador da minha Tabela ou Matriz "NÃO BATE" e agora?

Olá amantes de visuais de tabela e matriz no Power BI, tudo bem? Hoje vamos falar de um caso que vejo bastante nos grupos do Power BI. “O calculo na linha está batendo mas no total não e agora?” Mas antes de iniciarmos, que tal deixar aquela sua inscrição marota no meu canal no youtube que está recheado de vídeos legais, vai lá seu pão duro de like youtube.com/rafaelmendonca Agora que você já aliviou sua pão-durice você merece conteúdo .... kkkkkkkk Vamos lá, temos então a seguinte tabela gerada no meu conjunto de dados Essa tabela possui uma lista de vendas realizadas por dois vendedores com o numero da ordem da venda, um valor unitário e uma quantidade de itens em cada venda. O que queremos é bem simples meu jovem, calcular o valor total de cada venda e ter um total de todas as vendas... Aí você muito garotão usa a seguinte expressão DAX: E depois joga isso numa tabela. Lindo neh??? Mas o totalizador trouxe um valor que não tem...

Como usar o Web.Contents do Power Query: guia completo

Como usar o Web.Contents do Power Query para acessar dados online O Power Query é uma ferramenta poderosa para obter, transformar e analisar dados de diferentes fontes. Uma dessas fontes é a web, que contém uma grande variedade de dados online que podem ser úteis para os seus projetos. Para acessar dados online a partir de uma URL, você pode usar a função Web.Contents do Power Query. Essa função retorna o conteúdo binário baixado da URL especificada e permite que você use opções adicionais para personalizar a sua consulta. Neste artigo, vamos mostrar como usar o Web.Contents para obter dados de diferentes tipos de arquivos online, como CSV, Excel ou JSON. Também vamos discutir as vantagens e desvantagens dessa função em comparação com outras funções do Power Query. O que é o Web.Contents? O Web.Contents é uma função do Power Query que permite acessar dados online a partir de uma URL. Você pode usar essa função para obter dados de diferentes fontes da web, como arquivos CSV, Excel, JSON...

[Power BI] Transformando Latitude e Longitude de Graus para Decimal

Olá amiguinhos que adoram mapas nos seus paineis tudo bem? Hoje bate papo rapidão sobre uma dúvida de uma colega no nosso grupo do telegram, e se você não está nele pode ir agora tirar duvida com um grupo de quase 1700 pessoas e super ativo. https://t.me/planilheiros Bem, a dúvida dela era bem simples e já tinha visto outra vez alguém perguntando em outro grupo mas estava na correria e não pude ajudar, isso acontece infelizmente bastante. Ela tem dados de latitude e longitude em Grau e gostaria de passar isso para DECIMAL para poder utilizar nos visuais de Mapa do Power BI. A dúvida é bem legal e precisa entender um pouco a lógica matemática de transformar Grau para Decimal e ela é bem simples. Quando um dado em Grau, temos 3 informações: - Grau - Minutos - Segundos. Grau é o valor inteiro e ele por si só já me da o dado do meu inteiro do Decimal. Minuto é isso mesmo Minuto, para eu chegar num valor decimal de minutos eu preciso dividir ele por 60. Segundo seg...