Power Bi WebScrap - Taxa de Juros Selic. Da Receita para sua "Mesa".

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

Postar um comentário