27 julio, 2026

EVALUACIÓN Y RANKING DE CANDIDATOS USANDO AZURE FUNCTIONS

Después de construir varios post centrados en nubes de palabras y clima laboral, hoy me apetecía hacer algo sobre selección de personal.

Y quiero hacerlo utilizando Azure functions con python y con Automate. Esto lo vamos a mostrar todo en Power Apps. Bien para esto vamos empezar por plantear lo que queremos:

Vamos a seleccionar a un Responsable o Director de departamento de IA en una gran empresa. Para ello tendremos que evaluar una serie de competencias clave:

  • Visión estratégica
  • Experiencia técnica en IA
  • Liderazgo de equipos
  • Impacto en negocio
  • Gobernanza y ética en IA
  • Comunicación ejecutiva

Y la evaluación va a ser la siguiente para cada una de ellas:

1. Visión estratégica (1–10)

No se mide con una conversación inspiradora. Se mide con un ejercicio estructurado.
La prueba consiste en pedir al candidato que diseñe una hoja de ruta de IA a tres años para una empresa grande.

La evaluación se centra en la claridad de las prioridades, la identificación de dependencias reales (datos, personas y gobierno), el realismo del planteamiento y la capacidad de secuenciar iniciativas en el tiempo.

Las evidencias aparecen en un documento bien estructurado, un roadmap con fases claras y decisiones justificadas.
Lo importante no es acertar con la “estrategia perfecta”, sino cómo piensa, cómo ordena y cómo decide.

2. Experiencia técnica en IA (1–10)

No se mide con discursos técnicos ni con conocimiento teórico. Se mide construyendo algo real.

La prueba consiste en implementar un caso práctico, como un modelo desplegado, una Azure Function que consuma un modelo o un pipeline sencillo de ML o IA generativa.

La evaluación se centra en la capacidad de llevar una solución a producción, en las decisiones técnicas tomadas, en la comprensión de los trade-offs, en la arquitectura propuesta y en el control de costes.

No se busca código perfecto ni modelos de investigación, sino capacidad real de ejecución.

Aquí, quien solo “habla de IA” queda expuesto rápidamente.

3. Liderazgo de equipos (1–10)

No se mide con afirmaciones del tipo “he liderado equipos”. Se mide en situaciones de tensión real.

La prueba plantea un caso de conflicto dentro de un equipo senior de IA, con perfiles muy técnicos, desacuerdos fuertes y presión del negocio.

La evaluación se centra en cómo toma decisiones, cómo comunica, cómo protege al equipo y cómo gestiona talento senior en contextos complejos.

Este criterio revela liderazgo auténtico, no jerarquía ni cargo.

4. Impacto en negocio (1–10)

No se mide por la sofisticación técnica del modelo. Se mide por el impacto generado.

La prueba consiste en describir un caso real de IA que haya producido un resultado tangible.

La evaluación exige un problema inicial claro, una métrica de negocio definida, una decisión tomada y un resultado medible, ya sea en reducción de costes, aumento de eficiencia, mejora de calidad o reducción de riesgo.

Si no hay métricas, el impacto no puntúa alto.

5. Gobernanza y ética en IA (1–10)

No se mide con buenas intenciones. Se mide con una visión de control y responsabilidad.

La prueba consiste en explicar cómo implantaría un marco de gobierno, ética y gestión del riesgo en IA dentro de una organización.

La evaluación se centra en el conocimiento normativo, el control de sesgos, la explicabilidad de los modelos, la definición de roles y responsabilidades y la existencia de procesos de revisión.

Este criterio distingue a un Director de IA de un perfil puramente técnico.

6. Comunicación ejecutiva (1–10)

No se mide en entornos técnicos. Se mide frente a un comité de decisión.

La prueba consiste en explicar un proyecto de IA en diez minutos a un comité ejecutivo.

La evaluación se centra en la claridad del mensaje, la capacidad de síntetis, el uso de un lenguaje no técnico y el foco en decisiones, riesgos e impacto.

Un Director de IA habla para el comité, no para los notebooks.

Todo puntúa de 1 a 10 de menor puntuación a mayor. Una vez que tenemos esta puntuación de una serie de candidatos, por ejemplo 100 empleados (de la empresa o del exterior).

Algo como esto:

Aquí tenéis todos los datos, ordenados por empleados y dispuestos en columnas. Si os fijáis, al final hay tres columnas sin datos. Estos datos son los que vamos a calcular con Azure Functions: La puntuación final, el percentil y el ranking.

Para ello vamos incluir aquí la función que vamos a utilizar en VSC y que desplegaremos en Azure:

import json
import azure.functions as func
import numpy as np

def main(req: func.HttpRequest) -> func.HttpResponse:
    try:
        body = req.get_json()
        candidatos = body.get("candidatos", [])

        if not candidatos:
            return func.HttpResponse(
                "No se recibieron candidatos",
                status_code=400
            )

        resultados = []

        # Calculamos score de cada candidato según los pesos asignados a cada competencia
        for c in candidatos:
            score = (
                c.get("VisionEstrategica", 0) * 0.20 +
                c.get("ExperienciaTecnicaIA", 0) * 0.25 +
                c.get("LiderazgoEquipos", 0) * 0.15 +
                c.get("ImpactoNegocio", 0) * 0.20 +
                c.get("GobernanzaEticaIA", 0) * 0.10 +
                c.get("ComunicacionEjecutiva", 0) * 0.10
            )

            resultados.append({
                "ID": c["ID"],
                "ScoreFinal": round(score, 2)
            })

        # Obtenemos Percentiles
        scores = [r["ScoreFinal"] for r in resultados]

        for r in resultados:
            r["Percentil"] = int(
                round(
                    sum(s <= r["ScoreFinal"] for s in scores) / len(scores) * 100
                )
            )

        # Rankeamos (1 = mejor)
        resultados.sort(key=lambda x: x["ScoreFinal"], reverse=True)

        for idx, r in enumerate(resultados, start=1):
            r["Ranking"] = idx

        return func.HttpResponse(
            json.dumps(resultados),
            mimetype="application/json",
            status_code=200
        )

    except Exception as e:
        return func.HttpResponse(
            f"Error: {str(e)}",
            status_code=500
        )

Aquí podéis ver los pesos que le he dado a cada competencia, y obviamente podréis cambiar y ajustar es que consideréis más adecuado:

            score = (
                c.get("VisionEstrategica", 0) * 0.20 +
                c.get("ExperienciaTecnicaIA", 0) * 0.25 +
                c.get("LiderazgoEquipos", 0) * 0.15 +
                c.get("ImpactoNegocio", 0) * 0.20 +
                c.get("GobernanzaEticaIA", 0) * 0.10 +
                c.get("ComunicacionEjecutiva", 0) * 0.10
            )

El siguiente paso es incluir los datos del Excel en una lista de SharePoint, (podría ser perfectamente en Dataverse):

Y una vez en SharePoint, debemos construir un flujo en Automate que nos permita pasar los datos de SharePoint a la función de Python para que, con los resultados podamos mostrar información en las tres últimas columnas y obtener así a nustro candidato.

El flujo:

Os dejo el json:

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "ID": {
                "type": "integer"
            },
            "ScoreFinal": {
                "type": "number"
            },
            "Percentil": {
                "type": "number"
            },
            "Ranking": {
                "type": "number"
            }
        },
        "required": [
            "ID",
            "ScoreFinal",
            "Percentil",
            "Ranking"
        ]
    }
}

Con estos datos ya podemos montar nuestra app:

Si pulsamos en el botón calcular, se ejecutará el flujo y grabar la información en los campos vacíos del SP. Aquí os dejo la ejecución realizada:

Y aquí tenéis el resultado. He colocado en la propiedad Items de la galería:

If(
    varOrdenRanking;
    SortByColumns(
        Candidatos_DirectorIA;
        "Ranking";
        SortOrder.Ascending
    );
    Candidatos_DirectorIA
)

Y en el botón para ordenar OnSelect:

Set(varOrdenRanking; true)

Y bueno, el de actualizar es un refresh

Refresh(Candidatos_DirectorIA)

Y esto es todo. Es importante, ver las posibilidades que ofrece Functions porque permite cálculos que en Apps son mucho más lentos o, sencillamente, no son posibles.

Espero que os sea de utilidad.

Comparte este post

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies