Get M! Contornando limites em API

Olá comunidade do BI! Antes de Iniciar com as publicações eu gostaria de explicar qual o objetivo das postagens Get M!

Para os artigos dessa categoria, estarei focando única e exclusivamente na linguagem M, nada de layouts bonitos e fazer os olhos brilharem. Essa é a parte que eu particularmente acho mais importante dentro de um projeto de BI. Evidentemente em um projeto grande, como em grandes empresas com Gigabytes de dados, você estará trabalhando com um DW (Data Warehouse) bem elaborado em SQL provavelmente utilizando o SSMS (SQL Server Management Studio), mas o foco destes artigos é demonstrar a capacidade da Liguagem M até mesmo utilizando o Power Query no Excel.

Limites em API

Neste Exemplo, estamos tentando determinar se existe uma relação entre o preços de diversos componentes eletrônicos, e o Dólar. Para isso vamos precisar de bases históricas, preferencialmente de fontes confiáveis. Nosso objetivo Final é montar um único gráfico contendo as variações percentuais (valor do produto no período / média do valor do produto no histórico) de todos os produtos e do dólar.

Métodos de modelagem que veremos:

Lista de aquisição de dados, vamos às compras?
Dólar

Vamos então começar pelo mais simples. Para nossa sorte o Banco Central do Brasil possui uma API aberta para consultarmos os dados. Você pode ver toda a documentação aqui.

Neste caso, vamos precisar da base histórica a partir de 2018 até a data de hoje. Entretanto a documentação da API nos informa que ela a API só retorna dados de no máximo 6 meses. Por algum motivo, em meus testes os dados vieram somente para 5 meses, então para evitar problemas e arredondar o número de consultas por ano, vamos precisar realizar uma consulta para cada 4 meses.

Nossos passos são:

1. Adicionar uma Query em Branco no Excel ou Power BI, e nomea-la como Dolar;

2. Adicionar a Seguinte Fórmula:
=List.Numbers(0, Number.RoundUp(((Date.Year(DateTime.LocalNow()) – 2018) * 12 + Date.Month(DateTime.LocalNow())) /4),4)
Como Funciona


Essa fórmula serve para puxar uma lista de quantos Meses existem entre 01/01/2018 e a data de hoje.
Para entender o comando vamos precisar depurar a Fórmula como se fosse o Excel.
A. O primeiro comando a ser executado será o DateTime.LocalNow(), que irá nos retornar a data e hora de hoje neste caso 05/03/2020 20:22:02.
B. Em seguida iremos fazer a conversão de formato para o Campo Date.Year e Date.Month.
C.Agora, vamos ver calcular a diferença de anos entre cada ano.
D. E multiplicar por 12, para saber quantos meses 2 anos correspondem.
E. Somar a quantidade de meses correspondetes aos anos com a diferença de meses.
F. Dividir por 4, pois iremos consultar de 4 em quatro meses
G. Arredondar para cima, pois caso contrário os últimos meses ficarão de fora
H. E por fim, gerar uma Lista Contendo 7 números, iniciando do 0 e acrescentando 4 em 4.
A.=List.Numbers(0,Number.RoundUp(((Date.Year(#datetime(2020,3,5,20,22,2))-2018)*12+Date.Month( #datetime(2020,3,5,20,22,2) ))/4),4)
B. =List.Numbers(0,Number.RoundUp((2020-2018)*12+3)/4),4)
C. =List.Numbers(0,Number.RoundUp(2*12+3)/4),4)
D. =List.Numbers(0,Number.RoundUp(24+3)/4),4)
E. =List.Numbers(0,Number.RoundUp(27/4),4)
F. =List.Numbers(0,Number.RoundUp(6,75),4)
G. =List.Numbers(0,7,4)
H. = {0,4,8,12,16,20,24}

3. Converter a Lista em uma Tabela
Como


Na Ribbon “Transformar”, No Grupo “Converter” Clique em “Para Tabela”.

A Fórmula deve ficar similar à essa: = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
Onde Basicamente “Table.FromList” converte a consulta anterior “Source” de Lista para uma Tabela.

4. Agora vamos adicionar uma Nova Coluna Chamada “Início” com a Fórmula Date.AddMonths(#date(2018,1,1),[Column1])
Como


Na aba “Adicionar Coluna”, Selecionamos “Coluna Personalizada”

E preenchemos as configurações conforme abaixo:

A formula final fica parecida com essa:
= Table.AddColumn(#”Converted to Table”, “Inicio”, each Date.AddMonths(#date(2018,1,1),[Column1]))
Onde “Table.AddColumn” adiciona uma nova coluna na nossa tabela com o seguinte valor calculado com base na fórmula que informamos manualmente:
Essa fórmula funciona adicionando meses na data informada no parâmetro, Vamos ver 2 exemplos:
Linha 1: vamos adicionar 0 meses à data 01/01/2018 = 01/01/2018
Linha 2: vamos adicionar 4 meses à data 01/01/2018 = 01/05/2018

5. Vamos adicionar mais uma Coluna, desta vez com a Fórmula: List.Min({DateTime.Date(DateTime.LocalNow()), Date.AddDays(Date.AddMonths([Inicio], 4),-1)})
Como


O processo para adicionar uma nova coluna é o mesmo do passo anterior. A fórmula acima pretende definir a data final da para a nossa API. Mas para evitar possíveis erros da API, vamos precisar delimitar uma data máxima para o dia de hoje. Sendo assim a fórmula fica assim para a última linha da planilha:
A. Obter a data hora de hoje DateTime.LocalNow()
B. Converter a data hora para apenas data (em comparações o formato deve ser sempre o mesmo), DateTime.Date.
C. Obter o valor da coluna Início, [Início]
D. Adicionar 4 meses na data da coluna início, Date.AddMonths.
E. Remover um dia da data calculada no passo anterior, Date.AddDays, assim teremos a última data possível do mês anterior à data da próxima linha
F. Verificar qual data é a menor, List.Min. Esse passo é importante apenas para a última linha, já que queremos evitar colocar uma data maior do que a data de hoje.
A. List.Min({DateTime.Date( #datetime(2020,3,5,20,22,2) ), Date.AddDays(Date.AddMonths([Inicio], 4),-1)})
B. List.Min({#date(2020,3,5), Date.AddDays(Date.AddMonths([Inicio], 4),-1)})
C. List.Min({#date(2020,3,5), Date.AddDays(Date.AddMonths(#date(2020,1,1), 4),-1)})
D. List.Min({#date(2020,3,5), Date.AddDays(#date(2020,5,1),-1)})
E. List.Min({#date(2020,3,5), #date(2020,4,30)})
F. #date(2020,3,5)

6. Antes de consultar o banco central, vamos converter o formato das nossas datas para o layout da API “MM-dd-yyyy”. Isso pode ser feito editando uma Query de adição de Prefixo subtituindo a formula each por: “Date.ToText(_, “MM-dd-yyyy”)”.
Como


Existem outras formas de realizar esse procedimento que inclusive são mais rápidas. Entretanto realizei o processo dessa forma, pelo simples fato se der diferente e agregar mais conhecimento para o leitor.
Para realizar esse procedimento vamos:
A. Vamos iniciar editando a Coluna Inicio adicionando um prefixo qualquer, em “Transformar” > “Coluna de Texto” > “Formato” > “Adicionar Prefixo”.

B. Preencher um valor qualquer no parâmetro, Exemplo: a letra “a” e dar “OK”.
C. Em seguida vamos editar a sintaxe M que foi retornada.
De: = Table.TransformColumns(#”Added Custom1″, {{“Inicio”, each “a” & Text.From(_, “pt-BR”), type text}})
Para: = Table.TransformColumns(#”Added Custom1″, {{“Inicio”, each Date.ToText(_, “MM-dd-yyyy”), type text}}) .
A sintaxe Original concatenava para cada linha, a letra “a”, com a data convertida para tipo texto, no formato padrão Brasileiro. Na nova sintaxe, convertemos cada linha para o formato “MM-dd-yyyy”.
D. Por fim, copiamos a mesma alteração feita na coluna “Inicio” para a coluna “Fim”. Com a seguinte alteração:
De: = Table.TransformColumns(#”Added Custom1″, {{“Inicio”, each Date.ToText(_, “MM-dd-yyyy”), type text}}) .
Para: = Table.TransformColumns(#”Added Custom1″, {{“Inicio”, each Date.ToText(, “MM-dd-yyyy”), type text},{“Fim”, each Date.ToText(, “MM-dd-yyyy”), type text}}).

7. Hora de consultar os dados do Banco Central, vamos adicionar mais uma coluna personalizada com a fórmula de consumo da API do Banco, com modificações nos parâmetros da data. A forma mais fácil de se obter essa fórmula é adicionando uma nova Query de consulta de site do Banco Central.

7.1. Obter um link de teste no site do Banco Central. Isso pode ser feito Clicando aqui. No meu caso o meu resultado foi a URL: https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDolarPeriodo(dataInicial=@dataInicial,dataFinalCotacao=@dataFinalCotacao)?@dataInicial=’01-01-2020’&@dataFinalCotacao=’02-29-2020’&$top=100&$format=json

7.2. Consumir a API em uma nova consulta.
Como


A. Navegue em Página Inicial > Nova Consulta > Web (a posição vai variar dependendo da Versão do seu Power Query).

B. Cole a URL obtida no passo 7.1 e dê “OK”. O Power query fará o resto.

7.3. Copie o Resultado da Query do passo 7.2, e adicione ele como uma nova coluna, que será nomeada “Dólar”, alterando os campos de data na Query para que utilizem as demais colunas.

Antes: Json.Document(Web.Contents( “https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDolarPeriodo(dataInicial=@dataInicial,dataFinalCotacao=@dataFinalCotacao)? @dataInicial=’01-01-2020′& @dataFinalCotacao=’02-29-2020′&$top=100&$format=json”))
Depois: Json.Document(Web.Contents( “https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDolarPeriodo(dataInicial=@dataInicial,dataFinalCotacao=@dataFinalCotacao)? @dataInicial=‘” & [Inicio] & “‘& @dataFinalCotacao=‘” & [Fim] & “‘&$top=100&$format=json”))

7.4. Excluir a Query do passo 7.2, pois ela não será mais utilizada.
Como

8. Voltando na consulta que estamos montando, vamos remover as colunas que não Chamam “Dolar”
Como


Na Pré-Visualização da tabela, clique no cabeçalho da coluna Dolar com o botão direito do mouse e selecione “Remover Outras Colunas”

9. Expandir a coluna “Dolar” selecionando apenas a coluna “value”.
Como


A. Na pré-visualização da tabela clique no ícone ao Lado do nome da Coluna Dolar.
B. Marque apenas a coluna “value”, Desmarque a função “Use o nome da coluna original como prefixo, e Clique em “OK”.

10. Adicionar uma fórmula personalizada, para converter a lista de registros em uma tebela com a fórmula Table.FromRecords(_). A fórmula completa deve ficar parecida com essa: Table.TransformColumns(#”Expanded Dolar”, {{“value”, each Table.FromRecords(_), type table}})”
Como


A. Adicione uma fórmula personalizada

B. Assim que a fórmula for adicionada, ela irá fazer referência a etapa anterior, neste caso o nome da minha função anterior é “#”Expanded Dolar”” mas o nome da sua etapa anterior pode estar diferente dependendo do seu Idioma no editor M. Antes dessa referência vamos inserir a expressão Table.TransformColumns( e após vamos inserir a expressão , {{“value”, each Table.FromRecords(_), type table}})
C. O Resultado será então:

11. Expandir a coluna “value”, com os campos cotacaoCompra e dataHoraCotacao, que iremos utilizar. Se preferir pode utilizar o campo cotacaoVenda ao invés do cotacaoCompra. Vamos aproveitar e renomear as colunas para “Valor” e “Data”.
Como


A. Vamos expandir a tabela “value” conforme abaixo:

B. Vamos alterar a fórmula M que nos é retornada, trocando os nomes das colunas, na segunda lista, conforme destacado abaixo:

12. Aplicar uma formatação sugerida nas novas colunas.
Como


Em Transformar > Detectar Tipos de dados.

13. Aplicar uma nova etapa de formatação trocando a coluna “Data” para o formato tipo date.
Como


Clique com o botão direito na coluna “Data” e vá em “Alterar Tipo” > “Data”.

Selecione “Adicionar nova etapa”.

14. Remover possíveis Duplicatas, usando a Table.Distinct. Isso é importante pois não sabemos se nesse banco de dados do Banco Central fora salvo mais de uma Cotação de Dólar no mesmo dia, como o formato de origem veio como Data Hora, é melhor nos resguardar e aplicar essa fórmula, já que só temos interesse em um valor por data.
Como


Na coluna Data vamos clicar com o botão direito do mouse e selecionar “Remover Duplicatas”

15. Adicionar uma coluna chamada “Produto”, com o texto fixo “Dólar”. Iremos precisar pois essa Query será unida com a Query dos nossos produtos. Vamos aproveitar e formata-la como texto. Com uma rápida edição na função M.
Como


Em “Adicionar Coluna” > Coluna personalizada O nome da coluna será “Produto” e seu valor será “Dólar”.
Agora vamos editar para deixar a fórmula assim:


O código ficará assim:

let
    Custom1 = List.Numbers(0,Number.RoundUp(((Date.Year(DateTime.LocalNow())-2018)*12+Date.Month(DateTime.LocalNow()))/4),4),
    #"Converted to Table" = Table.FromList(Custom1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Added Custom5" = Table.AddColumn(#"Converted to Table", "Inicio", each Date.AddMonths(#date(2018,1,1),[Column1])),
    #"Added Custom1" = Table.AddColumn(#"Added Custom5", "Fim", each List.Min({DateTime.Date(DateTime.LocalNow()), Date.AddDays(Date.AddMonths([Inicio], 4),-1)})),
    #"Added Prefix" = Table.TransformColumns(#"Added Custom1", {{"Inicio", each Date.ToText(_, "MM-dd-yyyy"), type text},{"Fim", each Date.ToText(_, "MM-dd-yyyy"), type text}}),
    #"Added Custom" = Table.AddColumn(#"Added Prefix", "Dolar", each Json.Document(Web.Contents("https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDolarPeriodo(dataInicial=@dataInicial,dataFinalCotacao=@dataFinalCotacao)?@dataInicial='" & [Inicio] & "'&@dataFinalCotacao='" & [Fim] & "'&$top=100&$format=json"))),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom",{"Dolar"}),
    #"Expanded Dolar" = Table.ExpandRecordColumn(#"Removed Other Columns", "Dolar", {"value"}, {"value"}),
    #"Added Prefix2" = Table.TransformColumns(#"Expanded Dolar", {{"value", each Table.FromRecords(_), type table}}),
    #"Expanded value" = Table.ExpandTableColumn(#"Added Prefix2", "value", {"cotacaoCompra", "dataHoraCotacao"}, {"Valor", "Data"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Expanded value",{{"Valor", type number}, {"Data", type datetime}}),
    #"Tipo Alterado" = Table.TransformColumnTypes(#"Changed Type2",{{"Data", type date}}),
    #"Removed Duplicates" = Table.Distinct(#"Tipo Alterado", {"Data"}),
    #"Added Custom2" = Table.AddColumn(#"Removed Duplicates", "Produto", each "Dólar", type text)
in
    #"Added Custom2"

Histórico de Preços (Scraping)

Infelizmente não temos um site confiável para buscar o histórico de preços. Então para ao menos termos o que comparar localizei um site que faz o acompanhamento de preços e que conseguiremos extrair os dados utilizando o método de scraping, já que não conseguimos uma API. O site é baixou.com.br. Então vamos iniciar.

Função para consultar os preços

Basicamente o método de Scraping consiste em buscar as informações dentro o código HTML, tentando ao máximo manter o nosso código o mais genérico o possível, já que pretendemos usar essa primeira consulta para replicar em outras páginas.

1. Vamos começar consultando o site https://www.baixou.com.br/produtom/1594689/Memoria-Ram-8gb-Ddr3-1333mhz-Corsair. E nomear essa query como TesteSite.
Como


A. Adicionar uma nova consulta de site.

B. Colar a URL citada acima e pressionar OK.
C. Selecionar Document e pressionar OK.

2. Vamos excluir a etapa “Navegation” inserida pelo Power query automaticamente.

3. Vamos Alterar a fórmula “Web.Page” para “Text.FromBinary”.
Essa etapa se faz necessária pois o site não tem esses dados dentro de uma tabela e sim dentro de um gráfico. Vamos obter as informações diretamente deste gráfico.
Como

4. Vamos adicionar um parâmetro tipo texto chamado Site, usa-lo na na primeira etapa e criar uma função personalizada.
Como


A. Página Inicial > Parâmetros > Gerenciar Parâmetros > Novo Parâmetro

B. Preenhcer os campos da seguinte forma:

C. Voltar na Quey TesteSite e na primeira etapa alterar a fórmula trocando a URL entre aspas pelo parâmetro Site, Sem aspas. Ficará assim:

D. Criar uma Função com base na consulta TesteSite. nomeando-a como FnSite.

E. Suas Queys deverão ficar assim:

5. Em seguida vamos adicionar esta fórmula personalizada: = Text.Split(Text.Replace(Text.Split(Text.Split(Fonte, ” var prodId = “){1}, “”){0}, “‘”, “”),”;”)
Essa etapa é similar à etapa 10 da Query Dolar.
Porquê


Se abrirmos o site pelo Google Chome e inspecionarmos o seu código (Ctrl+I), podemos observar que existe um intervalo de código onde o histórico de valores aparece em um padrão. Este padrão pode ser convertido para uma tabela então tentaremos obter este intervalo.

A. A primeira parte do nosso código Text.Split(Fonte, ” var prodId = “){1} vai quebrar o código HTML, usando como base o texto ” var prodId = ” e iremos pegar a 2ª parte da lista que for retornada {1}.
B. Em seguida a próxima parte do nosso código Text.Split(Etapa A, “</script>”){0}, irá quebrar o código HTML da página e separar utilizando o texto “</script>” e pegaremos a 1ª parte desta lista {0}.
C. Nesta parte do código Text.Replace(Parte B, “‘”, “”), vamos remover as aspas simples do texto.
D. Por fim vamos separar os dados utilizando a fórmula Text.Split(Parte C, ,”;”).

6. Vamos converter a lista em tabela, Igual fizemos no passo 3 da Query Dolar.
7. Vamos filtrar as linhas que contenham o caracter “[“.
Como


8. Vamos Substituir o valor “[” por nada na única coluna da nossa tabela.
Como

Em Transformar > Qualquer Coluna > Substituir Valores


9. Vamos quebrar a coluna por delimitador utilizando o delimitador “[“.
Como

Em Transformar > Colunas de Texto > Dividir Coluna > Por Delimitador.


10. Vamos alterar a coluna “Column1.2″ com a fórmula personalizada each Text.Split(_,”,”). Similar ao que fizemos no passo 6 da Query Dolar.
11. Em seguida iremos adicionar mais uma fórmula personalizada similar ao passo 10 da tabela Dolar: = Table.FromColumns(#”Prefixo Adicionado”[Column1.2])
12. Similar ao passo 7, vamos filtrar as linhas onde a Column1 é diferente de “00/00/00” e “” (vazio).
13. Vamos renomear as colunas Column1 e Column2 para Data e Valor.
Como

Isso pode ser feito dando um duplo clique no cabeçalho da nossa tabela, uma vez para cada coluna.


14. Novamente substituiremos um valor, desta vez o ponto da coluna “Valor” por vírgula. Esse procedimento é similar ao item 8.
15. Por fim, vamos detectar o tipo de dados. Deverá ser Data como date e Valor como number.
O código ficará assim:

let
    Fonte = Text.FromBinary(Web.Contents(Site)),
    Personalizar2 = Text.Split(Text.Replace(Text.Split(Text.Split(Fonte, " var prodId = "){1}, "</script>"){0}, "'", ""),";"),
    #"Convertido para Tabela1" = Table.FromList(Personalizar2, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Linhas Filtradas" = Table.SelectRows(#"Convertido para Tabela1", each Text.Contains([Column1], "[")),
    #"Valor Substituído" = Table.ReplaceValue(#"Linhas Filtradas","]","[",Replacer.ReplaceText,{"Column1"}),
    #"Dividir Coluna por Delimitador" = Table.SplitColumn(#"Valor Substituído", "Column1", Splitter.SplitTextByDelimiter("[", QuoteStyle.Csv), {"Column1.1", "Column1.2", "Column1.3"}),
    #"Tipo Alterado1" = Table.TransformColumnTypes(#"Dividir Coluna por Delimitador",{{"Column1.1", type text}, {"Column1.2", type text}, {"Column1.3", type text}}),
    #"Prefixo Adicionado" = Table.TransformColumns(#"Tipo Alterado1", {{"Column1.2", each Text.Split(_,","), type list}}),
    #"Outras Colunas Removidas" = Table.FromColumns(#"Prefixo Adicionado"[Column1.2]),
    #"Linhas Filtradas2" = Table.SelectRows(#"Outras Colunas Removidas", each ([Column1] <> "00/00/00")),
    #"Colunas Renomeadas" = Table.RenameColumns(#"Linhas Filtradas2",{{"Column1", "Data"}, {"Column2", "Valor"}}),
    #"Valor Substituído1" = Table.ReplaceValue(#"Colunas Renomeadas",".",",",Replacer.ReplaceText,{"Valor"}),
    #"Tipo Alterado2" = Table.TransformColumnTypes(#"Valor Substituído1",{{"Data", type date}, {"Valor", type number}}),
    #"Linhas Filtradas1" = Table.SelectRows(#"Tipo Alterado2", each ([Data] <> null))
in
    #"Linhas Filtradas1"
Tabela para invocar a função criada

Essa query servirá para incovar a função personalizada que criamos na etapa anterior. Essa consulta deve se chamar “Dados”.

1. Criamos uma tabela contendo a descrição do produto, o tipo, o fabricante e a URL do site baixou.com.br
Como fazer no Power BI


Vamos sair do editor Power Query e ir no Power BI para. Em Home > Dados Externos > Inserir Dados

E preenchemos da Seguinte forma:


Como fazer no Excel

Vamos sair do Editor Power Query e voltar ao Excel. Adicionamos uma nova planilha na pasta de trabalho e preenchemos com nossos dados.

Em seguida com os dados selecionados, vamos clicar em Dados > Obter e Transformar Dados > Da tabela Intervalo (esse caminho pode variar dependendo da versão do Excel).


2. Agora vamos adicionar uma coluna de Invocação da Fórmula FnSite.
Como

Em Adicionar Coluna > Geral > Invocar Função Personalizada.

Preenchemos da Seguinte forma:


3. Agora vamos expandir a coluna que adicionamos, similar ao passo 9 da Query Dolar.
4. Vamos detectar o tipo de dados das colunas Data e Valor (date e number).
5. Por fim vamos adicionar uma função personalizada: = Table.Combine({ #”Tipo Alterado1″, Dolar})
O código ficará assim:

let
     Fonte = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("nZPNboJAFIVf5Ya11xmYGYTutCRqjAkRuzIuQBolFTCAtelr9RH6Yr0D4u/GupnM7/nOnDuzWBhB4MEkydZllWfQl5yDdPhwYHT0CrXtGnU3VbUrXxg7HA7dKEy+8n13lafdqGC7Io/3VZ4yyxS2LU02ijEoYySpdYT+dl9iEGZxUn4Yy87CGMVAq3CcgrdtVYQwtGywJO0/odsjj5GlsmxLtOTjWay1kbSx0a7xHuhbm/MBBB71+mjOOdebAOEMfcaEkj3lkAkP6TTJDvCGcJVDG4AOowlhnDQZgFIcFefp02lYPeko1sagI2miGCdNEngm1FYu6lFXra6HEiqNWPmkB+GaJpfsshzNg9A51NJlzZ6+p78/RRLCLEzBIbQXFwJMIUS6+YbXvCjDpCDmrD+l9jx+wIOpXGk7LiNETgQkAhIBNQGPBGwV77yc/sWtqZOZf/4ORa/DkVduWoV7W+ivaMBtejg4+Sz0dCwy11mjH1Ih/ZWxXP4B", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Produto = _t, Tipo = _t, Fabricante = _t, Site = _t]),
     #"Tipo Alterado" = Table.TransformColumnTypes(Fonte,{{"Produto", type text}, {"Tipo", type text}, {"Fabricante", type text}, {"Site", type text}}),
     #"Função Personalizada Invocada" = Table.AddColumn(#"Tipo Alterado", "FnSite", each FnSite([Site])),
     #"FnSite Expandido" = Table.ExpandTableColumn(#"Função Personalizada Invocada", "FnSite", {"Data", "Valor"}, {"Data", "Valor"}),
     #"Tipo Alterado1" = Table.TransformColumnTypes(#"FnSite Expandido",{{"Data", type date}, {"Valor", type number}}),
     Personalizar1 = Table.Combine({#"Tipo Alterado1", Dolar})
 in
     Personalizar1
Resultado Final

O objetivo desse projeto foi Concluído. A tabela “Dados” é o nosso objetivo final. Podemos criar uma media personalizado em DAX da seguinte forma

Média Histórica = DIVIDE(
    SUM(Dados[Valor]);
    CALCULATE(AVERAGE(Dados[Valor]);ALLEXCEPT(Dados;Dados[Produto]));0)

Com esse medida Podemos plotar nossos dados em um gráfico de linhas onde o Eixo é a data, a legenda é o Produto e o valor é a média Histórica.

Chegamos ao nosso objetivo final agora podemos analisar as informações para ver se o preço do dólar tem uma relação com o preço de compra dos produtos.

No exemplo acima vemos o Dólar em azul claro e os demais produtos listados no gráfico. Ao meu ver o resultado é inconclusivo. Nossa base de dados não é completa o suficiente para para podermos ter informações conclusivas sobre o preço dos produtos. Precisamos de uma base de dados com mais produtos e com o preço em um intervalo de datas menor.

De qualquer forma espero que possam retirado alguma técnica diferente para obtenção de dados através deste artigo. Obrigado!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *