Increíble Visualización de Datos con Power BI Python

¿Quiere la dirección de su empresa conocer todos los detalles sobre las finanzas y productividad, pero no está dispuesto a gastar ni un centavo en herramientas de gestión de IT de alta calidad? No termine recurriendo a diferentes herramientas para inventario, facturación y sistemas de tickets. Solo necesita un sistema central. ¿Por qué no considerar Power BI Python?

Power BI puede convertir tareas tediosas y que consumen mucho tiempo en un proceso automatizado. Y en este tutorial, aprenderá a segmentar y combinar sus datos de formas que no podría imaginar.

¡Vamos, ahorre el estrés de revisar informes complejos visualmente!

Prerrequisitos

Este tutorial será una demostración práctica. Si desea seguirlo, asegúrese de tener lo siguiente:

  • A Windows Server – This tutorial uses a Windows Server 2022.
  • Power BI Desktop instalado en su servidor Windows – Este tutorial utiliza Power BI Desktop v2.105.664.0.
  • Servidor MySQL instalado – Este tutorial utiliza MySQL Server v8.0.29.
  • Un gateway de datos local instalado en dispositivos externos que planean utilizar una versión de escritorio.
  • Python v3.6 o posterior instalado – Este tutorial utiliza Python v3.10.5.
  • DBeaver instalado – Este tutorial utiliza DBeaver v22.0.2.

Creación de una base de datos MySQL

Power BI puede visualizar datos de manera excelente, pero necesitas obtenerlos y almacenarlos antes de llegar a la visualización de los datos. Una de las mejores formas de almacenar datos es en una base de datos. MySQL es una herramienta de base de datos gratuita y potente.

1. Abre el símbolo del sistema como administrador, ejecuta el comando mysql que se muestra a continuación e introduce el nombre de usuario root (-u) y la contraseña (-p) cuando se te solicite.

Por defecto, solo el usuario root tiene permiso para realizar cambios en la base de datos.

mysql -u root -p
Logging into MySQL as the root

2. A continuación, ejecuta la consulta siguiente para crear un nuevo usuario de base de datos (CREATE USER) con una contraseña (IDENTIFIED BY). Puedes nombrar al usuario de manera diferente, pero la elección de este tutorial es ata_levi.

CREATE USER 'ata_levi'@'localhost' IDENTIFIED BY 'Password';
Creating a new database user

3. Después de crear un usuario, ejecuta la consulta siguiente para CONCEDER permisos al nuevo usuario (ALL PRIVILEGES), como la creación de una base de datos en el servidor.

GRANT ALL PRIVILEGES ON . TO 'ata_levi'@'localhost' WITH GRANT OPTION;
Granting privileges to the newly-created user

4. Ahora, ejecuta el comando \q a continuación para cerrar sesión en MySQL.

Logging out from MySQL as root

5. Ejecuta el comando mysql a continuación para iniciar sesión como el usuario de base de datos recién creado (ata_levi).

mysql -u ata_levi -p
Logging in to MySQL as ata_levi

6. Por último, ejecuta la siguiente consulta para CREAR una nueva BASE DE DATOS llamada ata_database. Pero, por supuesto, puedes nombrar la base de datos de manera diferente.

CREATE DATABASE ata_database;
Creating a new database (ata_database)

Gestión de bases de datos MySQL con DBeaver

Al gestionar bases de datos, normalmente necesitas tener conocimientos de SQL. Pero con DBeaver, tienes una interfaz gráfica para gestionar tus bases de datos en unos pocos clics, y DBeaver se encargará de las instrucciones SQL por ti.

1. Abre DBeaver desde tu escritorio o el menú de inicio.

2. Cuando DBeaver se abre, haz clic en el menú desplegable Nueva Conexión a Base de Datos y selecciona MySQL para iniciar la conexión a tu servidor MySQL.

Accessing MySQL via DBeaver

3. Inicia sesión en tu servidor MySQL local con lo siguiente:

  • Mantén el Host del Servidor como localhost y el Puerto en 3306 ya que te estás conectando a un servidor local.
  • Proporciona las credenciales del usuario ata_levi (Nombre de usuario y Contraseña) del paso dos de la sección “Creación de una Base de Datos MySQL”, y haz clic en Finalizar para iniciar sesión en MySQL.
Logging in to MySQL

4. Ahora, amplía tu base de datos (ata_database) en el Navegador de Base de Datos (panel izquierdo) → haz clic derecho en Tablas y selecciona Crear Nueva Tabla para iniciar la creación de una nueva tabla.

Creating a new database table with DBeaver GUI.

5. Nombre tu nueva tabla, aunque la elección de este tutorial es ata_Table, como se muestra a continuación.

Asegúrate de que el nombre de la tabla coincida con el nombre de tabla que especificarás en el método to_sql (“Nombre de la tabla”) en el paso siete de la sección “Obtención y Consumo de Datos de la API”.

Naming the new table

6. A continuación, amplía la nueva tabla (ata_table) → haz clic derecho en Columnas → Crear Nueva Columna para crear una nueva columna.

Initiating creating a new column

7. Proporciona un Nombre de columna, como se muestra a continuación, marca la casilla de No Nulo y haz clic en Aceptar para crear la nueva columna.

Idealmente, querrás agregar una columna llamada “id”. ¿Por qué? La mayoría de las APIs tendrán un id, y el marco de datos de pandas de Python llenará automáticamente las otras columnas.

Creating a column

8. Haz clic en Guardar (abajo a la derecha) o presiona Ctrl+S para guardar los cambios una vez que hayas verificado tu columna recién creada (id), como se muestra a continuación.

Verifying newly-created column

9. Por último, haz clic en Persistir para guardar los cambios que realizaste en la base de datos.

Persisting the database changes

Obtención y Consumo de Datos de la API

Ahora que has creado la base de datos para almacenar datos, necesitas obtener los datos de tu proveedor de API respectivo y enviarlos a tu base de datos utilizando Python. Obtendrás tus datos para visualizarlos en Power BI.

Para conectarte a tu proveedor de API, necesitarás tres piezas clave de información: el método de autorización, la URL base de la API y el punto final de la API. Si tienes dudas sobre cómo obtener esta información, visita el sitio de documentación de tu proveedor de API.

A continuación se muestra una página de documentación de Syncro.

Overviewing Syncro API documentation

1. Abre VS Code, crea un archivo Python y nómbralo según los datos de la API esperados del archivo. Este archivo será responsable de obtener y enviar los datos de la API a tu base de datos (conexión de base de datos).

Existen varias bibliotecas de Python disponibles para ayudar con la conexión de la base de datos, pero en este tutorial utilizarás SQLAlchemy.

Ejecuta el siguiente comando pip en la terminal de VS Code para instalar SQLAlchemy en tu entorno.

pip install SQLAlchemy
Installing SQLAlchemy

2. A continuación, crea un archivo llamado connection.py, completa el código a continuación, reemplaza los valores correspondientes y guarda el archivo.

Una vez que comiences a escribir scripts para comunicarte con tu base de datos, es necesario establecer una conexión con la base de datos antes de que esta acepte cualquier comando.

Pero en lugar de volver a escribir la cadena de conexión de la base de datos para cada script que escribas, el código a continuación se dedica a realizar esta conexión para que pueda ser llamada/referenciada por otros scripts.

# Importar módulos
# Motor de conexión de SQLAlchemy
from sqlalchemy import create_engine
import sqlalchemy as db
from sqlalchemy.exc import SQLAlchemyError

# Usar lógica try/except para crear una conexión a una base de datos MySQL
# Proporciona las credenciales del servidor MySQL a continuación:
# db: nombre de la base de datos
# user: nombre de usuario
# pw: contraseña
try:
    engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
    .format(
        db="ata_database",
        user="ata_levi",
        pw="password"
    ))
    print("Connected")
except SQLAlchemyError as e:
    error = str(e.dict['orig'])
print(error)

3. Abra la terminal de Visual Studio (Ctrl+Shift+`), y ejecute los siguientes comandos para instalar pandas y requests.

pip install pandas
pip install requests
Installing pandas and requests

4. Cree otro archivo Python llamado invoices.py (o nombrelo de manera diferente), y agregue el siguiente código al archivo.

Añadirás fragmentos de código al archivo invoices.py en cada paso subsiguiente, pero puedes ver el código completo en ATA’s GitHub.

El script invoices.py se ejecutará desde el script principal descrito en la siguiente sección, que extrae los datos de su primer API.

El código a continuación realiza lo siguiente:

  • Consumir datos de su API y escribirlos en su base de datos.
  • Reemplazar el método de autorización, la clave, la URL base y los puntos finales de la API con las credenciales de su proveedor de API.
# Importando módulos esenciales
import pymysql
from pandas.core.frame import DataFrame
import requests
import pandas as pd
from requests.api import get
from sqlalchemy.dialects.mysql import LONGTEXT

import os
import schedule
import time
import asyncio

# Importando la cadena de conexión desde connection.py
from connection import engine

5. Agregue el fragmento de código a continuación al archivo invoices.py para definir los encabezados, por ejemplo:

  • El tipo de formato de datos que espera recibir de su API.
  • La URL base y el punto final deben acompañar al método de autorización y a la clave respectiva.

Asegúrese de cambiar los valores a continuación con los suyos.

# Definir parámetros de solicitud.
headers = {
'accept':'application/json',
'authorization':'Bearer *Your-bearer-code if the authentication is Bearer*'
}
baseurl = 'https://*your base url*'
endpoint  = 'your endpoint' 

6. A continuación, agrega la siguiente función asíncrona al archivo invoices.py.

El código a continuación utiliza AsyncIO para gestionar varios scripts desde un script principal, como se detalla en la sección siguiente. Cuando tu proyecto crece y abarca múltiples puntos finales de API, es buena práctica tener scripts de consumo de API en sus propios archivos.

# Envuelve el código con una función asíncrona para hacerlo asíncrono.
async def get_invoices():
	print("Going through the invoices")
	def main_request(baseurl,endpoint,x,headers):
	# Utilizando el método get de request para extraer datos utilizando parámetros definidos.
	# Utilizando f string para iterar páginas cuando se llama a la función.
	r = requests.get(baseurl + endpoint + f'?page={x}',headers=headers)
	return r.json()

7. Finalmente, agrega el código siguiente al archivo invoices.py, donde una función get_pages maneja la paginación de tu API.

Esta función devuelve el número total de páginas en tu API y ayuda a la función de rango a iterar a través de todas las páginas.

Contacta a los desarrolladores de tu API sobre el método de paginación utilizado por tu proveedor de API.

  def get_pages(response):
			return response['meta']['total_pages']

	def parse_json(response):
	    charlist =[]
	    for item in response['invoices']:
	        charlist.append(item)
	    return charlist
	# Llamando a la función principal con parámetros predefinidos.
	data = main_request(baseurl=baseurl,endpoint=endpoint,x=1,headers=headers)
	
	main_invoices = []
	# Iterando/paginando a través de los datos de la API.
  # Es posible que su proveedor de API esté utilizando un 
	# Método diferente para la paginación.
	for x in range(1,get_pages(data)+1):
	
	    print(x)
	    main_invoices.extend(parse_json(main_request(baseurl,endpoint,x,headers)))
	df_invoices = pd.DataFrame(main_invoices)
	
	# Escribiendo nuevos datos a la base de datos SQL.
	# Nota: Asegúrese de que el nombre de la tabla de la base de datos coincida con el nombre de la tabla proporcionado aquí.
	df_invoices.to_sql('invoices',con=engine,if_exists='replace',index=False)
	
  # Esta función espera la función get_invoices,
	# ejecuta la función get_invoices() cuando se llama,
	# y será llamada por un archivo externo para invocar su llamada a la API.

async def call_invoices():
	await get_invoices()

Si prefiere agregar más puntos finales de API a sus datos:

  • Repita los pasos cuatro a seis de la sección “Gestión de bases de datos MySQL con DBeaver”.
  • Repita todos los pasos bajo la sección “Obtención y Consumo de Datos de API”.
  • Cambie el punto final de la API a otro que desee consumir.

Sincronización de Puntos Finales de API

Ahora tiene una conexión a la base de datos y a la API, y está listo para comenzar el consumo de la API ejecutando el código en el archivo invoices.py. Pero al hacerlo, se limitaría a consumir un punto final de API simultáneamente.

¿Cómo ir más allá del límite? Crearás otro archivo de Python como archivo central que llame a las funciones de la API desde varios archivos de Python y ejecute las funciones de forma asíncrona utilizando AsyncIO. De esta manera, mantendrás tu programación limpia y te permitirá agrupar varias funciones juntas.

1. Crea un nuevo archivo de Python llamado central.py y agrega el siguiente código.

Similar al archivo invoices.py, agregarás fragmentos de código al archivo central.py en cada paso, pero puedes ver el código completo en ATA’s GitHub.

El siguiente código importa módulos esenciales y scripts de otros archivos utilizando la sintaxis from <nombre de archivo> import <nombre de función>.

from datetime import datetime
from numpy import product
# Importar la función de API para obtener facturas desde invoices.py
from invoices import call_invoices
import asyncio
import time
import schedule
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from datetime import datetime
import os

2. A continuación, agrega el siguiente código para controlar los scripts de invoices.py en el archivo central.py.

Necesitas hacer referencia/llamar a la función call_invoices de invoices.py a una tarea AsyncIO (invoice_task) en central.py.

# Crear la función principal
async def chain():
	def _handle_task_result(task: asyncio.Task) -> None:
		try:
				task.result()
		except asyncio.CancelledError:
				pass
		except Exception:
				logging.exception('Exception raised by task %r',task)
	start = time.perf_counter()
	# Crear tarea para la función importada desde invoices.py
	invoice_task = asyncio.create_task(call_invoices())

3. Después de crear la tarea AsyncIO, espera a que la tarea obtenga y ejecute la función call_invoices de invoice.py una vez que la función chain (en el paso dos) comience a ejecutarse.

	# Esperando la tarea creada
	await invoice_task
	# Manteniendo un seguimiento de los tiempos de la tarea
	end = time.perf_counter()-start
	l_time =  time.localtime()
	human_time = time.asctime(l_time)
	print (f"chained result took {end:0.2f} seconds")
	print(f"Current time is {human_time}")
	

4. Crea un AsyncIOScheduler para programar un trabajo en el script. El trabajo agregado en este código ejecuta la función chain en intervalos de un segundo.

Este trabajo es importante para asegurar que tu programa siga ejecutando tus scripts y mantenga tus datos actualizados.

if name == "main":
# El programador permite que el código haga un bucle infinito y tome descansos entre los bucles.
    scheduler = AsyncIOScheduler()
scheduler.add_job(chain,'interval',seconds=1)
scheduler.start()
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

try:
	asyncio.get_event_loop().run_forever()
except (KeyboardInterrupt,SystemExit):
    pass

5. Por último, ejecuta el script central.py en VS Code, como se muestra a continuación.

Running the central.py script

Después de ejecutar el script, verás la salida en la terminal como la siguiente.

Viewing central.py script outputs

A continuación, la salida confirma que las facturas se han añadido a la base de datos.

Verifying invoices are added to the database

Desarrollando Visualizaciones de Power BI

Después de codificar un programa que se conecta y consume datos de la API y envía estos datos a una base de datos, casi estás listo para cosechar tus datos. Pero primero, enviarás los datos de la base de datos a Power BI para su visualización, el objetivo final.

Un montón de datos no sirve de nada si no puedes visualizarlos y establecer conexiones profundas. Afortunadamente, las visualizaciones de Power BI son como los gráficos que pueden hacer que las ecuaciones matemáticas complicadas parezcan simples y predecibles.

1. Abre Power BI desde tu escritorio o menú de inicio.

2. Haz clic en el icono de origen de datos sobre el menú desplegable Obtener datos en la ventana principal de Power BI. Aparecerá una ventana emergente donde podrás seleccionar la fuente de datos a utilizar (paso tres).

Accessing data sources

3. Busca mysql, selecciona la base de datos MySQL y haz clic en Conectar para iniciar la conexión a tu base de datos MySQL.

Selecting MySQL as the data source to connect

4. Ahora, conecta con tu base de datos MySQL con lo siguiente:

  • Ingresa localhost:3306 ya que te estás conectando a tu servidor MySQL local en el puerto 3306.
  • Proporciona el nombre de tu base de datos, en este caso, ata_db.
  • Haz clic en OK para conectar con tu base de datos MySQL.
Connecting to MySQL database

5. Ahora, haz clic en Transformar datos (esquina inferior derecha) para ver la descripción general de los datos en el editor de consultas de Power BI (paso cinco).

Initiating transforming data

6. Después de previsualizar la fuente de datos, haz clic en Cerrar y aplicar para volver a la aplicación principal y confirmar si se aplicaron cambios.

El editor de consultas muestra tablas de tu fuente de datos en la parte izquierda. Al mismo tiempo, puedes verificar el formato de los datos antes de proceder a la aplicación principal.

Previewing the data source

7. Haz clic en la pestaña de herramientas de tabla, selecciona cualquier tabla en el panel de campos y haz clic en Administrar relaciones para abrir el asistente de relaciones.

Antes de crear visuales, debes asegurarte de que tus tablas estén relacionadas, así que especifica cualquier relación entre tus tablas de manera explícita. ¿Por qué? Power BI aún no detecta automáticamente correlaciones complejas entre tablas.

Opening relationships wizard

8. Marca las casillas de las relaciones existentes para editar y haz clic en Editar. Aparecerá una ventana emergente, donde podrás editar las relaciones seleccionadas (paso nueve).

Pero si prefieres agregar una nueva relación, haz clic en Nuevo en su lugar.

Selecting relationships to edit

9. Edita las relaciones con lo siguiente:

  • Haz clic en el campo desplegable de tablas y selecciona una tabla.
  • Haz clic en los encabezados para seleccionar las columnas que se usarán.
  • Marca la casilla Hacer esta relación activa para asegurar que las relaciones sean válidas.
  • Haz clic en Aceptar para establecer la relación y cerrar la ventana de Edición de relación.
Editing existing relationship

10. Ahora, haz clic en el tipo visual de Tabla bajo el panel Visualizaciones (más a la derecha) para crear tu primera visualización, y aparecerá una visualización de tabla vacía (paso 11).

Adding the table visual

11. Selecciona la visualización de tabla y los campos de datos (en el panel Campos) para agregar a tu visualización de tabla, como se muestra a continuación.

Adding data fields to the table visual

12. Finalmente, haz clic en el tipo visual de Cortador para agregar otra visual. Como su nombre indica, el visual de cortador corta los datos filtrando otras visualizaciones.

Después de agregar el cortador, selecciona datos desde el panel Campos para agregar al visual de cortador.

Adding a slicer visual and adding a data field

Cambiar Visualizaciones

La apariencia predeterminada de las visualizaciones es bastante decente. Pero ¿no sería genial si pudieras cambiar la apariencia de las visualizaciones a algo no tan soso? Deja que Power BI haga el truco.

Haz clic en el icono Formatear tu visualización bajo visualización para acceder al editor de visualización, como se muestra a continuación.

Dedica un tiempo a jugar con la configuración de visualización para obtener la apariencia deseada para tus visualizaciones. Tus visualizaciones se correlacionarán siempre y cuando establezcas una relación entre las tablas que involucres en tus visualizaciones.

Accessing the Power BI visualization editor

Después de cambiar la configuración de visualización, puedes generar informes como los siguientes.

Ahora, puedes visualizar y analizar tus datos sin complejidades ni dañar tus ojos.

Testing Power BI visualizations

En la siguiente visualización, al observar el gráfico de tendencias, notarás que algo salió mal en abril de 2020. Ese fue el momento en que comenzaron los confinamientos por Covid-19 en Sudáfrica.

Este resultado solo demuestra la eficacia de Power BI al proporcionar visualizaciones de datos precisas.

Testing Power BI visualizations

Conclusión

Este tutorial tiene como objetivo mostrarte cómo establecer un canal de datos dinámico en tiempo real mediante la obtención de datos de puntos finales de API. Además, procesar y enviar datos a tu base de datos y a Power BI utilizando Python. Con este conocimiento recién adquirido, ahora puedes consumir datos de API y crear tus propias visualizaciones de datos.

Cada vez más empresas están creando aplicaciones web con API Restful. Y en este punto, te sientes seguro/a al consumir APIs con Python y crear visualizaciones de datos con Power BI, lo que puede influir en las decisiones comerciales.

Source:
https://adamtheautomator.com/power-bi-python/