En este artículo, le guiaremos a través de los pasos de cómo Importar Datos en MS Excel Power BI con MS Excel Power Query utilizando Secure Code Warrior API.
- Autenticación
- Recuperación de Datos
- Paginación (Bucle Do-While)
- Creación de informes y visualizaciones
- Ejemplos prácticos
Paso 1: Autenticación
El primer paso para utilizar la API de Secure Code Warrior es la autenticación. Para obtener una clave API, siga los pasos que se indican en este artículo de .
Paso 2: Recuperación de datos
El siguiente paso es recuperar los datos que desea analizar. La API de Secure Code Warrior le permite
recuperar datos en formato JSON. Estos datos se pueden analizar y utilizar para crear informes
y visualizaciones en Power BI.
Paso 3: Paginación (Bucle Do-While)
La API limita el número de registros que se pueden recuperar en una sola solicitud. Esto significa que es posible que
tenga que realizar varias solicitudes para recuperar todos los datos que necesita. Para superar este problema,
puede utilizar un bucle do-while.
Nota: Un bucle do-while es una construcción de programación que permite repetir un conjunto de acciones hasta que se cumpla una
determinada condición. En este caso, la condición es la ausencia de datos. Puede utilizar un bucle do-while
para recuperar datos por lotes hasta que se hayan recuperado todos los datos.
Cómo envolver la consulta con un bucle 'do-while':
Paso 3.1:
Cree la consulta get Data como lo haría para cualquier extracción de datos de la API.
Paso 3.2:
Construya el contenido de la consulta con los datos (columnas) y tipos de datos que desee. En este punto, sólo obtendrá la primera página de datos (por ejemplo, los primeros 500 ó 1000 registros) pero, sobre todo, en la forma deseada.
Paso 3.3:
Convierta su(s) Power Query(s) en una función editando el código M para añadir esto como primera línea:
(page as number) as table = y cambie page=1 en su url a page= y añada & Number.ToText(page) al final de su URL para que sepa dónde añadir el número de página incremental.
Nombra la consulta (ahora una función - fx) como "GetData" - el nombre de la función se menciona en el siguiente paso, ¡así que deben coincidir!
Tu consulta (que ahora es una función) tendrá este aspecto:
(page as number) as table =
let
Source = Json.Document(
Web.Contents(
"https://portal-api.securecodewarrior.com/api/v2/training/developerleaderboard?report_period=30&page="
& Number.ToText(page),
[Headers = [#"X-API-Key" = "_put_a_real_api_key_here_"]]
)
),
leaderboard = Source[leaderboard],
#"Converted to Table" = Table.FromList(
leaderboard,
Splitter.SplitByNothing(),
null,
null,
ExtraValues.Error
),
#"Expanded Column1" = Table.ExpandRecordColumn(
#"Converted to Table",
"Column1",
{"rank", "developer", "overall_stats_over_report_period", "challenges", "challenges_summary"},
{"rank", "developer", "overall_stats_over_report_period", "challenges", "challenges_summary"}
),
#"Expanded developer" = Table.ExpandRecordColumn(
#"Expanded Column1",
"developer",
{
"email",
"status",
"company",
"team",
"tags",
"roles",
"name",
"member_since",
"last_logged_in"
},
{
"email",
"status",
"company",
"team",
"tags",
"roles",
"name",
"member_since",
"last_logged_in"
}
)
xml
Paso 3.4:
Cree una nueva consulta en blanco que utilizará esta nueva función (fx) que creó en el paso 3
la nueva consulta debe ser:
= List.Generate( ()=
[Result= try GetData(1) otherwise null, page = 1],
each [Result] <> null,
each [Result = try GetData([page]+1) otherwise null, page = [page]+1],
each [Result])<></></>
Paso 3.5:
Ejecute la nueva consulta, y cargue los datos en una tabla/pivote/BI -- obtendrá los datos que desee, tal y como se expuso
en Paso 3.2, y ejecute un bucle "do-while" con la función que creó en Paso 3.3.
Paso 3.4 es sólo el bucle "do-while" utilizando la práctica función List.Generate. Esta simple pieza de código M sólo evalúa para la siguiente página de datos y luego se detiene cuando no obtiene más.
Paso 4: Creación de informes y visualizaciones
Una vez recuperados los datos, puede utilizar Power BI para crear informes y visualizaciones.
Power BI proporciona diversas herramientas para crear diagramas, gráficos y tablas. Puede utilizar estas herramientas de
para crear informes que proporcionen información sobre sus datos.
Ejemplos prácticos
A continuación se muestran ejemplos prácticos de consultas & Funciones utilizadas en MS Excel con un punto final de la API SCW basado en POST ( https://portal-api.securecodewarrior.com/api/v2/assessments/attempts/search) para permitir
la extracción recursiva de todas las páginas de datos, haciendo frente así al límite de paginación de la API.
1 y 2 constituyen un bucle Do-While para recuperar todas las páginas hasta que no haya más, mientras que 1 y 3
constituyen un bucle Fixed para recuperar un número determinado de páginas.
1. La FUNCIÓN denominada "GetData" (convertida a partir de una CONSULTA) en la vista Advanced Editor
(pageNum as number) as table =
let
pageString = Number.ToText(pageNum),
formdata = "{""page"":" & pageString & "}",
Source = Json.Document(
Web.Contents(
"https://portal-api.securecodewarrior.com/api/v2/assessments/atte
mpts/search",
[
Cabeceras = [
#"x-api-key" = "API_KEY****0ff****c6****ea6****b731****API_KEY",
#"Content-Type" = "application/json"
],
Contenido = Text.ToBinary(formdata)
]
)
),
attempts = Source[attempts],
#"Converted to Table" = Table.FromList(
attempts,
Splitter.SplitByNothing(),
null,
null,
ExtraValues.Error
),
#"Expanded Column1" = Table.ExpandRecordColumn(
#"Converted to Table",
"Column1",
{
"developer",
"status",
"language",
"completed",
"started",
"deadline",
"time_spent_ms",
"completed_in",
"progress",
"score",
"accuracy",
"passing_grade",
"pass_status",
"_id",
"_assessment",
"name",
"challenges"
},
{
"Column1.developer",
"Column1.status",
"Column1.language",
"Column1.completed",
"Column1.started",
"Column1.deadline",
"Column1.time_spent_ms",
"Column1.completed_in",
"Column1.progress",
"Column1.score",
"Column1.accuracy",
"Column1.passing_grade",
"Column1.pass_status",
"Column1._id",
"Column1._assessment",
"Column1.name",
"Column1.challenges"
}
),
#"Expanded Column1.developer" = Table.ExpandRecordColumn(
#"Expanded Column1",
"Column1.developer",
{"name"},
{"Column1.developer.name"}
)
in
#"Expanded Column1.developer"
2. La QUERY llamada "GetAllData" en la vista AE para sacar TODAS las páginas recursivamente:
let Fuente = List.Generate( () = [Resultado = try GetData(1) otherwise null, page = 1], each [Resultado] <> null, each [Resultado = try GetData([página] + 1) otherwise null, página = [página] + 1], each [Resultado] ), #"Convertido a tabla" = Tabla.FromList( Fuente, Splitter.SplitByNothing(), null, null, ExtraValores.Error ), #"Expanded Column1" = Table.ExpandTableColumn( #"Convertido a Tabla "Columna1", { "Column1.developer", "Column1.status", "Column1.language", "Column1.completed", "Column1.started", "Column1.deadline", "Column1.accuracy", "Column1.passing_grade", "Column1.pass_status", "Column1._id", "Column1._assessment", "Column1.name" "Column1.challenges", "Column1.time_spent_ms", "Column1.completed_in", "Column1.progress", "Column1.score" }, { "Column1.developer", "Column1.status", "Column1.language", "Column1.completed", "Column1.started", "Column1.deadline", "Column1.accuracy", "Column1.passing_grade", "Column1.pass_status", "Column1._id", "Column1._assessment", "Column1.name", "Column1.challenges", "Column1.time_spent_ms", "Column1.completed_in", "Column1.progress", "Column1.score" } ) en #"Columna1 ampliada" <></></>
3. La QUERY llamada "GetSomeData" en la vista AE para extraer un número (4 en este caso) de páginas:
let ObtenerAlgunosDatos = List.Generate( () = [página = 1, evaluaciones = GetData(página)], each [página] <> 5, cada [página = [página] + 1, evaluaciones = GetData(página)] ), #Convertido a tabla" = Tabla.FromList( GetSomeData, Splitter.SplitByNothing(), null, null, ExtraValores.Error ), #"Expanded Column1" = Table.ExpandRecordColumn( #"Convertido a Tabla "Columna1", {"página", "evaluaciones"}, {"página", "evaluaciones"} ), #"Columnas eliminadas" = Table.RemoveColumns(#"Columna1 ampliada", {"página"}), #"Evaluaciones ampliadas" = Table.ExpandTableColumn( #"Columnas eliminadas "evaluaciones", { "Column1.developer.name", "Column1.status", "Column1.language", "Column1.completed", "Column1.started", "Column1.deadline", "Column1.time_spent_ms", "Column1.completed_in", "Column1.progress", "Column1.score", "Column1.accuracy", "Column1.passing_grade", "Column1.pass_status", "Column1._id", "Column1._assessment", "Column1.name", "Column1.challenges" }, { "Column1.developer.name", "Column1.status", "Column1.language", "Column1.completed", "Column1.started", "Column1.deadline", "Column1.time_spent_ms", "Column1.completed_in", "Column1.progress", "Column1.score", "Column1.accuracy", "Column1.passing_grade", "Column1.pass_status", "Column1._id", "Column1._assessment", "Column1.name", "Column1.challenges" } ) en #Evaluaciones ampliadas<></></>
Enlaces relacionados:
Comentarios
0 comentarios
Inicie sesión para dejar un comentario.