Enviar dados para um streaming dataset do Power BI a partir de um ficheiro CSV
Dentro do universo analytics, uma das áreas que mais chama a minha atenção (e cada vez mais) é a dos dados em real-time. Pelo facto de se produzirem em quantidade e qualidade crescente e pela utilidade da tomada de decisões “no momento” em que os eventos ocorrem, esta é uma área em crescimento.
O desafio que veremos neste post é o de criar um streaming dataset no Power BI a partir de um ficheiro CSV, disponível a partir de uma API de uma aplicação que recebe dados ao segundo.
Streaming datasets do Power BI
Os streaming datasets são conjuntos de dados um pouco diferentes dos usuais. A principal diferença reside no facto de se expandirem em tempo real no momento em que determinados eventos ocorrem.
Ou seja, a cada ocorrência de um determinado evento, seja, por exemplo, a criação de uma nova encomenda, o streaming dataset acrescenta imediatamente uma nova linha ao dataset. Se visualizarmos os dados deste streaming dataset num dashboard, as visualizações atualizam-se também em tempo real.
Portanto, ao contrário dos datasets normais do Power BI, os streaming datasets não se atualizam a momentos fixos no tempo nem a pedido, mas antes quando algo acontece.
Uma outra característica importante dos streaming datasets do Power BI é a possibilidade de se preservar o histórico. Se esta opção estiver selecionada, a entrada de um novo registo no conjunto de dados não vai implicar a saída do mais antigo. Esta questão é relevante se tivermos interesse em, não só, visualizar os dados em streaming, mas também analisar séries longas usando medidas DAX complexas por exemplo.
O tempo real não existe realmente
Na verdade, quando nos referimos “tempo real” estamos (realmente) a referir-nos a uma latência baixa. Isto significa que o evento ocorre e o streaming dataset reage em poucos segundos. As visualizações do dashboard vão reagir poucos segundos depois.
Para a maioria dos cenários, isto não é problemático, mas, para ser rigoroso, o tempo real não existe, pois é impossível que algo aconteça num determinado momento no tempo e ocorra simultaneamente uma representação gráfica desse evento.
Alguns desafios técnicos a considerar
Num cenário real-time, existem bastantes dois desafios técnicos que não podemos ignorar:
- O mais óbvio é o que lida com a inclusão de novas linhas no dataset. Este é particularmente difícil de resolver se estivermos a lidar com a ocorrência de muitos eventos em simultâneo.
- Outro desafio, que pode não parecer tão óbvio, é como analisar os dados se estes chegam a todo o momento?
Para o cálculo de determinados indicadores, como por exemplo, médias, valores mínimos e máximos, só para referir alguns simples, requer uma certa capacidade computacional que pode consumir mais tempo do que está disponível para a atualização dos cálculos e das visualizações. Existem algumas novidades neste domínio a que voltarei num artigo mais tarde.
O nosso caso prático: enviar os dados de um CSV para um streaming dataset
Neste desafio, a aplicação produz um conjunto de dados de grande dimensão, disponível através de um ficheiro CSV, que pode ser acedido a partir de um determinado URL. Pretende-se enviar uma linha para o streaming dataset de cada vez que uma encomenda (uma linha do CSV) seja criada – o mais rápido possível.
O CSV tem a seguinte estrutura:
Como podemos ver acima, o ficheiro contém uma série de colunas que estão separadas por vírgulas. Destas, temos interesse apenas nas seguintes:
- ORDERNUMBER
- QUANTITY
- PRICEEACH
- SALES
- STATUS
- CITY
O primeiro passo consiste em criar o streaming dataset no Power BI Service. Para tal, escolhemos uma workspace e selecionamos “New -> Streaming dataset”.
De seguida, selecionamos a caixa “API” e prosseguimos:
A definição do dataset surge na caixa seguinte e nela introduzimos os nomes das colunas pretendidas e o respetivo tipo:
Às colunas anteriormente identificadas, acrescentamos a coluna DATETIME, que será a identificação do “timestamp” de cada encomenda, ou seja, a data-hora da mesma.
Na parte inferior do painel, podemos validar que o schema deste dataset é o correto, e marcar a opção de preservação dos dados históricos.
O streaming dataset é criado e na página seguinte podemos ver o Push URL que será necessário mais à frente para enviarmos (“empurrarmos”) os dados do CSV para cá. Convém guardar este URL num local seguro porque ele contém a chave de acesso ao streaming dataset.
O trabalho pesado é realizado em Python e não vou detalhar muito neste post. Se tiver realmente interesse, contacte-me e poderei fornecer o script, ou então escrever um post mais detalhado sobre esta operação.
Para elaborar o script, utilizei o Google Colab, um serviço gratuito da Google que permite correr scripts de Python na cloud sem ser necessário qualquer trabalho de preparação.
O Google Colab interage facilmente com o Google Drive e, para este caso particular, isso é importante pois precisamos de guardar no script o número da encomenda mais recente já carregada no streaming dataset. O trabalho do script será posteriormente carregar as encomendas cujo número de identificação, dado pela variável ORDERNUMBER é superior.
Genericamente, o script recolhe os dados do ficheiro CSV e converte-os num data frame do Python e seleciona as linhas a carregar no streaming dataset. Posteriormente, define uma data class com 3 propriedades:
- O endpoint (anteriormente obtido no Power BI através do Push URL)
- O dados a enviar para o Power BI (sob a forma de dicionário do Python)
- O tempo em segundos pretendido para espaçar cada uma das linhas do CSV
Portanto, se definirmos os dados como o caminho para o CSV e um delay de 1 segundo, os ddos serão enviados para o Power BI streaming dataset a cada segundo uma nova linha.
As visualizações em tempo real no Power BI Dashboard
Resta-nos testar a solução criando um dashboard no Power BI com algumas visualizações gráficas. Apenas algumas visualizações permitem visualizar dados em tempo real no dashboard:
- Gráficos de linhas
- Gráficos de colunas
- Cartões
- Gráficos de barras
- Medidores (Gauge)
Vamos começar por criar o dashboard apontando para o streaming dataset criado anteriormente, como demonstra a imagem abaixo:
De seguida, vamos selecionar um gráfico de linhas, com os seguintes parâmetros:
- No eixo horizontal, o timestamp
- No eixo vertical, o valor das vendas
- Deixando uma janela temporal de 10 minutos para a visualização
Vamos dar-lhe um título e um subtítulo à escolha e visualizar o resultado no dashboard, expandindo a largura do gráfico a meia página:
A construção do dashboard no Power BI é bastante simples e intuitiva. É basicamente uma questão de experimentar e testar até acertarmos no resultado pretendido. Para esta prova de conceito, cheguei a um dashboard ainda bastante modesto:
Haveria ainda bastante a fazer, nomeadamente em termos de análise e melhoria desta solução. Talvez num próximo post volte a este projeto. Obrigado pela atenção!