Datos en tiempo real y Power BI

Publicado por Jose L. Dolz el

BIPower BITiempo Real

En este artículo vamos a ver cómo conectar un sistema de información en tiempo real al servicio de Power BI para mostrar un cuadro de mandos personalizado. El post esta estructurado en 3 grandes bloques:

  1. Tipos de conjuntos de datos
  2. Creación de un conjunto de datos en streaming
    2.1. Creación de la API en Power BI
    2.2. Código para enviar datos a la API
  3. Visualización de los datos

1. Tipos de conjuntos de datos

Actualmente, existen tres tipos de conjuntos de datos en tiempo real: la inserción, streaming y el servicio PubNub. En el primero, como su nombre indica, los datos se insertan en el conjunto de datos y las visualizaciones son actualizadas cuando se detecta esta actualización; en el segundo, los datos son almacenados de forma temporal y no se pueden utilizar informes aunque sí paneles; el último tipo es un servicio de streaming, parecido al tipo anterior, y debe configurarse en su origen (se puede probar en pubnub.com).

El cuadro siguiente describe los tres tipos, sus limitaciones y funcionalidades (más información aquí):

Captura de pantalla de una tabla, en la que se muestra la matriz del conjunto de datos de transmisión

2. Creación de un conjunto de datos en streaming

En esta sección vamos a crear un streaming personalizado para Power BI.

2.1. Creación de la API en Power BI

En nuestro área de trabajo, seleccionamos Nuevo → Conjunto de datos de streaming. Entre las opciones que nos aparecerán en el panel derecho que se abre, elegimos API.

creacion API

A continuación, le damos un nombre a nuestro conjunto de datos y empezamos a escribir el nombre de los campos que necesitaremos y su tipo. Aquí NO se creará una conexión a otra API. En su lugar, se crea una API que debe recibir datos. Es decir, hacia la que enviar los datos y que utilizaremos como conjuntos de datos. En la siguiente captura se puede ver un ejemplo para un conjunto de datos sobre vuelos comerciales. Es importante marcar la opción de Análisis de historial de datos.

campos API

A continuación, una vez creada la API, se nos mostrará información de acceso como, por ejemplo, la URL donde enviar la información deseada:

API creada

Es muy importante enviar la información tal y como se muestra para poder utilizar el análisis histórico. Es decir, como un array de objetos JSON:

[ 
  {
   "campo1": "id1",
   "campo2": "objeto1"
  },
  {
   "campo1": "id2",
   "campo2": "objeto2"
  }
]

2.2. Código para enviar datos a la API

A continuación, se muestra un ejemplo de código en Python para enviar datos de la API desde otra API. En este ejemplo, se conecta a la API de Aviation Stack para extraer datos de vuelos en tiempo real que van al aeropuerto del Prat. Emplea un bucle infinito dejando 5 segundos entre llamadas y envíos a las APIS.

import requests
import json
from time import sleep

# AVIATION API parameters
access_key = "<INTRODUCIR CLAVE DE ACCESO>"
limit = "100"
flight_status = "active"
arr_iata = "BCN"

aviation_url = "http://api.aviationstack.com/v1/flights" + \
            "?access_key=" + access_key + \
            "&flight_status=" + flight_status + \
            "&arr_iata=" + arr_iata
            # "&limit=" + limit  

# Power BI API Parameters
powerbi_api_url = "https://api.powerbi.com/beta/" +\
"fa97be54-b037-491c-93bc-61111ddb87d9/" + \
"datasets/c82fd018-d42c-4f4a-a620-d8e94a156f54/rows" + \
"?key=R0lKCelxzoIsS1SnbEGR51eiGhr55wi9gMnFUA6o72hl1tbxrR%2BIS1XJAvT8e45KlWK4IllE3w9rVyPAKoAlaw%3D%3D"

headers = {'Content-Type': 'application/json', 'Accept':'application/json'}

# Main code
while True:
    # Get all flights
    response = requests.get(aviation_url)

    if response.status_code != 200:
        print("Algo ocurrió. ERROR: ", response.status_code)
        print(response.json)
        exit()

    json_text = response.text

    python_obj = json.loads(json_text)

    data_array = []
    for flight in python_obj['data']:
        data = {}

        # Only flight in the air
        if flight['live'] != None:

            data['vuelo'] = flight['flight']['iata']
            data['aerolinea'] = flight['airline']['name']
            data['fecha_vuelo'] = flight['flight_date']
            data['origen'] = flight['departure']['airport']
            data['destino'] = flight['arrival']['airport']           
            data['latitud'] = flight['live']['latitude']
            data['longitud'] = flight['live']['longitude']
            data['altitud'] = flight['live']['altitude']
            data['velocidad'] = flight['live']['speed_horizontal']
            data['timestamp'] = flight['live']['updated']

            print("Enviando información del vuelo " + data['vuelo'])
            data_array.append(data)

    print("\nEnviando array: ")
    print(data_array)
    x = requests.post(powerbi_api_url, data = json.dumps(data_array), headers = headers)
    print("Status code: ",   x.status_code, " - Respuesta: ", x.text)
    print("\n")

    # Wait till next refresh    
    sleep(5)

3. Visualización de los datos

A partir del conjunto de datos en streaming podemos crear tanto informes como paneles en Power BI Service, pero conviene saber las diferencias.

El informe es el mismo tipo de cuadro de mandos que podemos crear usando Power BI Desktop. Podemos añadir mapas, gráficos de cascada, circulares, KPI, etc. El único inconveniente es que los datos no se actualizan automáticamente. Así que, para refrescarlos, tendremos que hacerlo manualmente sobre el icono de la flecha circular que se encuentra a la derecha de la barra superior.

informe aviation

Por otro lado, el panel permite crear un cuadro de mando muy sencillo. Aquí, a diferencia del informe, tenemos muy pocos elementos visuales: tarjetas, gráficos de barra, de columna, de línea y el medidor. La parte positiva es que el panel se va actualizando a medida que llegan los datos en tiempo real. La calidad de la visualización dependerá, obviamente, de la velocidad de actualización y la variabilidad de los datos. Además, podemos añadir iconos -nombre que reciben las visualizaciones en los paneles- con datos en tiempo real de otras fuentes, como la temperatura ambiente.

panel aviation

Conclusión

Tras dar nuestros primeros pasos en Power BI, ampliamos la capacidad analítica con datos en tiempo real. Ahora depende de nosotros imaginar sus casos de uso: control de una flota logística sobre mapa, evolución de la preparación de pedidos, valores de mercado, etc.

Esperamos que os haya gustado. Si es así, ¡síguenos en Twitter para estar al día de próximos posts!

Autor

Jose L. Dolz

Consultor de Business Intelligence del C.E. de la Comunidad Big Data - B.I en atSistemas. Dando pasos hacia la Ciencia de Datos. Actor a tiempo completo.