El problema de casi todos los ejercicios de Power BI es que los datos son de mentira: la típica tabla de ventas de una tienda que no existe, con números que nunca cambian. Así se aprende a hacer clic, pero no a resolver lo que pasa con datos reales: tipos que no cuadran, columnas anidadas, valores que se actualizan y medidas que tienen que responder a una pregunta concreta.
En este proyecto vas a trabajar con datos que sí cambian. La web Tu Ayudante Fantasy publica cada día su lista de chollos de Fantasy LaLiga: jugadores de menos de 10 millones con buena media y buena predicción de puntos. La misma lista está disponible en formato JSON en una dirección pública, que es justo lo que necesitamos para practicar.
| Área del examen | Qué haces en este proyecto |
|---|---|
| Preparar los datos | Conectar a un origen web JSON, expandir registros, asignar tipos y crear columnas en Power Query |
| Modelar los datos | Medidas DAX con DIVIDE, RANKX, CALCULATE y TOPN |
| Visualizar y analizar | Tabla con formato condicional, gráfico de dispersión, segmentación y tarjetas |
| Implementar y mantener | Publicar en el servicio y programar la actualización (sin puerta de enlace) |
En Power BI Desktop: Obtener datos → Web, pega esta dirección y acepta el acceso anónimo:
https://www.tuayudantefantasy.com/api/especulacion/chollos
Power Query abrirá un registro con tres campos: jugadores (la lista que nos interesa), max_precio y total_candidatos. Cada jugador trae nombre, equipo, posición (1 portero, 2 defensa, 3 centrocampista, 4 delantero), precio en euros, media de puntos, partidos jugados, puntos previstos para la próxima jornada, porcentaje de titularidad, cambio de precio de la semana, precio máximo recomendado y una nota de chollo.
Puedes hacerlo con clics (convertir la lista en tabla, expandir la columna y cambiar tipos), pero merece la pena ver el código M completo, porque en el examen te preguntarán qué hace cada paso. Abre el Editor avanzado y pega:
let
Origen = Json.Document(Web.Contents("https://www.tuayudantefantasy.com/api/especulacion/chollos")),
Jugadores = Origen[jugadores],
Tabla = Table.FromList(Jugadores, Splitter.SplitByNothing(), {"Registro"}),
Expandida = Table.ExpandRecordColumn(Tabla, "Registro",
{"name", "team", "position", "precio", "media", "partidos", "pts_pred", "titular_pct", "cambio_pct", "max_pagar", "nota"},
{"Jugador", "Equipo", "Posicion", "Precio", "Media", "Partidos", "PtsPrevistos", "Titularidad", "CambioPrecio", "MaxPagar", "Nota"}),
Tipos = Table.TransformColumnTypes(Expandida, {
{"Jugador", type text}, {"Equipo", type text}, {"Posicion", Int64.Type}, {"Precio", Int64.Type},
{"Media", type number}, {"Partidos", Int64.Type}, {"PtsPrevistos", Int64.Type}, {"Titularidad", Int64.Type},
{"CambioPrecio", type number}, {"MaxPagar", Int64.Type}, {"Nota", type number}}),
Puesto = Table.AddColumn(Tipos, "Puesto", each
if [Posicion] = 1 then "Portero" else if [Posicion] = 2 then "Defensa"
else if [Posicion] = 3 then "Centrocampista" else "Delantero", type text),
PrecioM = Table.AddColumn(Puesto, "Precio (M€)", each [Precio] / 1000000, type number)
in
PrecioM
Llama a la consulta Chollos. Fíjate en tres detalles que caen en el examen:
Table.ExpandRecordColumn solo expande los campos que le pides: si el origen añade columnas nuevas, tu informe no se rompe.Con una sola tabla no hay relaciones que crear, así que el trabajo de modelado está en las medidas. Crea una tabla de medidas y añade estas cinco:
Media de puntos = AVERAGE ( Chollos[Media] )
Puntos por millón =
DIVIDE ( SUM ( Chollos[PtsPrevistos] ), SUM ( Chollos[Precio (M€)] ) )
Ranking por rentabilidad =
RANKX ( ALL ( Chollos[Jugador] ), [Puntos por millón], , DESC, DENSE )
Jugadores subiendo de precio =
CALCULATE ( COUNTROWS ( Chollos ), Chollos[CambioPrecio] > 0 )
Mejor chollo =
VAR Mejor = TOPN ( 1, Chollos, Chollos[Nota], DESC )
RETURN CONCATENATEX ( Mejor, Chollos[Jugador], ", " )
Puntos clave para el examen:
DIVIDE en lugar de /: devuelve vacío en vez de error si el divisor es cero.RANKX con ALL(Chollos[Jugador]): sin el ALL, cada fila de la tabla vería solo a su propio jugador y todos quedarían en el puesto 1. Es uno de los errores más preguntados.Mejor chollo responde al contexto de filtro: si segmentas por Defensa, te devuelve el mejor defensa.Una página basta para cubrir lo importante:
Comprueba que la segmentación filtra las tarjetas y que Ranking por rentabilidad se recalcula dentro de cada puesto. Si no lo hace, revisa el ALL del paso anterior.
Publica en un área de trabajo del servicio de Power BI y, en la configuración del modelo semántico, activa la actualización programada (por ejemplo, una vez al día). Este origen es una URL pública con acceso anónimo, así que no necesita puerta de enlace; la puerta de enlace solo hace falta para orígenes locales o en una red privada, y esa diferencia es pregunta típica del examen.
Al día siguiente verás valores distintos: los precios y las predicciones cambian según los resultados reales. Si quieres entender de dónde salen esos puntos previstos, la web explica cómo mide la precisión de su modelo de predicción.
DATESINPERIOD.