Pular para o conteúdo principal

[Power BI e PowerAutomate] Versionamento e Publicação Automática dos seus arquivos PBIX

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

Postar um comentário

Postagens mais visitadas deste blog

[Power BI] Atualização MARÇO 2020 !!!!

Atualização Power BI Março de 2020!
Olá meus queridos, saiu agorinha a pouco a atualização do nosso Power BI Desktop de Março de 2020.

A atualização você pode fazer aqui:

https://www.microsoft.com/pt-BR/download/details.aspx?id=58494

Alguns itens você pode acompanhar aqui nesse rápido artigo pra sair brincando hoje mesmo com a sua atualização.

1) Botão de "pesquisar" nos filtros laterais
Muitas vezes você tem uma série de filtros em uma página ou relatório e é dificil encontrar aquele filtro específico, bem agora você com o botão de pesquisa pode procura-lo muito mais fácil utilizando o nome dele. Por enquanto ainda não é possível utiliza os "sinônimos" que você pode criar para cara coluna, tabela, ou medida na área de modelo, mas quem sabe em breve né?

2) Ordenar Tabela por mais de uma Coluna 
Esse é um dos grandes pedidos da comunidade, e veio através do ideas.powerbi.com , agora você pode, como no excel, ordenar uma tabela por mais de uma coluna bastando utiliza…

[Power Query] Código M para Dataset sobre Covid19 no Brasil e a Função Value.Metada

Muita gente tem feito alguns relatórios legais sobre covid19, como não sou tão fã de fazer relatórios bonitos pra ficar postando, prefiro trabalhar behind the scenes e trazer na verdade um Dataset do ministério da saúde sobre Covid19 nos estados.
PS. Foi feita uma alteração no Código por conta de alterações no nome do arquivo o abaixo é o mais atual então algumas coisas no artigo podem estar diferentes mas a ideia central é a mesma.
O grande detalhe dessa consultá é que utilizei uma função em PowerQuery conhecida por poucos a Value.Metadata.
Essa função permite trazer informações específicas sobre os nossos dados, ela só tem um argumento que é um valor qualquer. 
Se utilizamos como argumento uma tabela, por exemplo, na Value.Metadata ele vai me trazer informações sobre QueryFolding que você já viu aqui nesse VÍDEO.


Além disso vai me trazer informações de qual é a fonte de dados, bem como meu "Path" ou Caminho dessa fonte. No caso como era uma fonte SQL o Path seria servidor e ban…

Power BI Service - O Publicar na Web não está disponível para mim, e agora?

Olá seus pão duro que adoram publicar link público, tudo bem com vocês?

Hoje vamos dar uma mãozinha para você que por algum motivo arrancou todos os fios de cabelo da cabeça porque não viu mais a opção de Publicar na Web disponível no seu Power BI.

Antes também gostaria de te fazer dois convites:

O segundo, como sempre te convido a conhecer meu canal no YouTube, se inscrever e compartilhar os conteúdos que faço sempre com muito carinho para todos vocês (coisa melosa),

https://youtube.com/rafaelmendonca

Dados os recados vamos para nosso problema...

1) Seu dia amanheceu assim...
Numa bela manha você decide publicar seu relatório e compartilhar para toda a rede e se depara com essa situação:


Cara quem roubou meu botão de "Publicar na Web"?

Mas não se desespere isso pode ser uma configuração que o administrador do tenant (do seu site no serviço do PBI) ou até mesmo você desavisadamente alterou.

2) Verificando a Opção Desabilitada...
A partir daqui você precisa ter acesso de admi…