[Python] Power Bi en Tiempo Real - Lote con pandas

Algo no tan explotado en las comunidades y de mucha utilidad es la posibilidad de controlar paneles de power bi en tiempo real. Hoy por hoy el usuario final siempre pide un Bi en tiempo real hasta que se le explica la situación y en realidad ellos quieren tener información actualizada. La negociación de hasta 8 veces por día de un import mode suele ganar la conversación. Sin embargo, hay casos que realmente son de tiempo real. Cuando el deseo es de ver el estado actual de una transacción respecto de productos, tiendas, etc. Lo más tradicional es cuando buscan mostrar en un televisor la situación actual de algo en particular.

Lo difícil de explicar suele ser que no toda la data que solemos trabajar para un bi estaría disponible en tiempo real. El verdadero tiempo real que nos pide la información más reciente de algo suele ser concreta y sencilla, sino probablemente no sea una solución de tiempo real. Llamaremos streaming o tiempo real a todo esa información concreta que es necesario tener presente en intervalos menores a 15 minutos (tiempo de cache de direct query)

Hoy por hoy Power Bi tiene un solo modo de representar un tablero en tiempo real y es mediante Paneles. Estos pizarrones que contienen capturas de un momento del tiempo de nuestros datos van a actualizarse instantáneamente según el ingreso de datos que reciban. No voy a ponerme explicar los tipos de realtime que tiene power bi (que podemos encontrar en la documentación) sino que me voy a enfocar en el que yo considero mejor y más recomendado. El Push Dataset o también conocido como Hybrid dataset. La razón que me hace seleccionarlo por encima de los demás es porque con esta opción podremos tener la flexibilidad de creación de informes de Power Bi junto con Medidas en DAX para darnos una mayor fortaleza de Data Visualization.

Éste post nos acompañará en la creación del conjunto de datos en tiempo real hasta ejecutar un código python pandas para insertar datos en lote sobre nuestro tablero.

Empecemos entonces:

Tengamos en cuenta que para poder concretar este proyecto necesitaremos de una cuenta de Power Bi Free o Pro y un espacio donde correr código Python (puede ser local, vm o Azure Functions / AWS Lambdas). 

Lo primero que necesitamos para llevar a cabo nuestro ejemplo es crear un conjunto de datos streaming. Éste se comportará como una Live Connection (más detalles de conexiones aquí). Es decir que cuando nos conectemos a ella por Power Bi Desktop solo tendremos acceso a la estética visual de informes y medidas en dax.

Bajo el menú de creación teniendo seleccionado los conjuntos de datos veremos la opción de Streaming.

image

Existen tres métodos conocidos para hacer éstas soluciones. El que yo recomiendo porque tiene más flexibilidad y vamos a utilizar es el API:

image

Si quieren conocer más detalles sobre los otros y las diferencias les sugiero leer ésta documentación.

Finalmente tendremos un par de configuración que nos facilitarían toda la construcción de una API puesto que Power Bi nos va a brindar una para insertar nuestras filas.

image

Como se puede apreciar el conjunto de datos de tiempo real necesitará un nombre. Muy importante es la definición de valores. Aquí vamos a poder describir nuestra única tabla que estará disponible en el reporte de Power Bi para construir visualizaciones en tiempo real. Debemos ser conscientes de como vamos a traer los datos del origen ya cruzados para que en una única tabla podamos resolver nuestras inquietudes. En ella definiremos también el tipo de datos los cuales son tres posibles como muestra la imagen. 

Power Bi nos sigue ayudando mostrando un ejemplo del body que tendrá que enviar nuestro HTTP Post para insertar las filas. Antes de crearlo vemos que tiene una opción de almacenar información histórica lo cual nos abre dos posibilidades:

  1. Generar una única entrada de datos que se pisaría por cada HTTP Post que enviemos a Power Bi para disponer de resultados previamente calculados de la condición actual a mostrar.
  2. Dejar disponible no solamente la última entrada sino también las anteriores que enviamos con HTTP Post en caso que necesitemos cruzar los últimos resultados actuales contra cierta cantidad pequeña del pasado (día, semana, mes, etc). Importante tener en cuenta que solo permite 1 millón de filas históricas. Llegado a este tope el streaming dejará de funcionar hasta que limpiemos la memoria para empezar de cero. Ésto lo logramos editando el streaming y quitando/re-activando la opción de datos históricos.

Una vez creado el conjunto de datos en tiempo real veremos la dirección que nos generó la API de Power Bi a la cual vamos a ejecutar el HTTP Post.

image

A partir de éste momento existe en nuestra Área de Trabajo de Power Bi Service un Conjunto de Datos de Streaming. Así mismo podremos ver unos ejemplos de como ejecutarla con código cURL y PowerShell. En nuestro caso vamos a ver como ejecutarla en Python y no en una sola fila de json sino en lote nutriéndonos de la librería más usada en para análisis y transformación de datos que es Pandas.

Pueden ver el script en mi github. El mismo va a mostrar un primer espacio para hacer nuestras llamadas, transformaciones, limpiezas y cruces de datos con pandas. Luego el script mostrará dos detalles muy importantes como formatear la fecha y parsear el body para completar el request sin que falle. Finalmente hay un sencillo control de errores.

En caso que quieran ejecutar el código de forma local, puede usar la última parte del código y si van a utilizar Azure Functions u otro servicio; espero conozcan como ejecutar el código para ubicarlo de forma correcta.

Ahora que tenemos nuestro conjunto de datos en el portal y recibiendo datos cada N tiempo, nos queda construir nuestro informe de Power Bi. Abrimos nuestro querido Power Bi Desktop y obtenemos datos de un conjunto disponible como muestra la documentación.

De este modo podremos construir nuestras visualizaciones y calcular nuestras medidas. Todo aquello que luego pinneemos a los paneles se actualizará en el margen de tiempo que corre nuestro script de python.

Recordemos que solo el PANEL actualizará automáticamente. Para que actualice el informe visto desde el servicio de Power Bi hay que dar al botón "Actualizar" de visualizaciones en el menú superior.

¡Ya tenemos nuestro tablero listo para reproducir en un Televisor o donde nos guste!