Autor: Edison Del Rosario

  • 1Eva_IIT2017_T4 Prueba de escritorio, listas

    1ra Evaluación II Término 2017-2018, Diciembre 1, 2017. CCPG001

    Tema 4. (10 puntos)
    1. Indique la salida por pantalla del siguiente código. Justifique su respuesta.

    f = ['a', 'c', 'z', 'm', 'k']
    g = [3,4,5,6,5,7]
    t = ''
    
    for c in f:
        a = f.index(c)
        b = g[:a]
        t = t + (c*len(b))
        
    print(t)
    

    2. Indique la salida por pantalla del siguiente código. Justifique su respuesta.

    import numpy as np
    
    vector = np.array([1,5,6,6,5,2,1,3,7,9,0,0,1,4,8])
    
    print(np.unique(vector[vector%2==0]).size)
    

    a = vector[vector%2==0]
    b = np.unique(a)
    
    print(a)
    print(b)
    print(b.size)
    

    Referencia: Archivo original 1Eva_IIT2017.pdf

  • 1Eva_IIT2017_T3 Venta combustibles

    1ra Evaluación II Término 2017-2018, Diciembre 1, 2017. CCPG001 – FIEC

    (Editado para tarea, se mantiene el objetivo de aprendizaje)

    Tema 3. (40 puntos) Las ventas anuales (en galones) para las estaciones de gasolina en el país  se muestran en la matriz siguiente:

    Ventas Primax Alborada PS Los Rios Mobil Cumbayá Lutexsa Cia Ltda Ps Remigio Crespo
    Regular 239034 678493 896321 32438 554213
    Extra 4568321 6745634 9754008 3242342 3456123
    Super 234773 56743 123678 4783 90874
    Premium 45672 45212 90781 3904 90431

    Las filas representan el tipo de gasolina y las columnas representan las estaciones de gasolina.

    Adicionalmente  dispone de los vectores (en Numpy):

    tipoGasolina = np.array(['Regular',
                             'Extra',
                             'Super',
                             ...,
                             'Premium'])
    
    gasolinera = np.array(['Primax Alborada',
                           'PS Los Ríos',
                           'Móbil Cumbayá',
                           'Lutexa Cia Ltda',
                           ...,
                           'PS Remigio Crespo'])
    distrito = np.array(['distrito1',
                         'distrito2',
                         'distrito1',
                         'distrito2',
                         ...,
                         'distrito4'])
    ciudad = np.array(['Guayaquil',
                       'Babahoyo',
                       'Quito',
                       'Guayaquil',
                       ...,
                       'Cuenca'])

    El vector tipoGasolina contiene los nombres de los tipos de gasolina comercializadas en el país.

    Los vectores: gasolinera, distrito y ciudad, contienen el nombre de la estación, el distrito y la ciudad en la que se encuentra cada estación. Una ciudad se divide en varios distritos y tiene varias gasolineras, resultando en que los nombres en  distritos y ciudades se pueden repetir en los vectores.

    Implemente un programa para responder a las siguientes preguntas:

    a) Dado un tipo de gasolina, muestre por pantalla los nombres de todas las gasolineras que han vendido en el año más del promedio de venta en galones para ese tipo.

    b) Dada una ciudad, y calcule cuántas de sus gasolineras en el año han vendido más de 15 millones de galones en total , considere todas las ventas para todos los tipos de gasolinas.

    c) Muestre por pantalla el nombre de la ciudad que más galones ha vendido en el año de gasolina tipo 'EcoPais' en el distrito1.

    Nota: Para los literales a y b, los valores de selección se deben ingresar por teclado. El programa se debe realizar en Python.

    Rúbrica: literal a (12 puntos), b (13 puntos), c (20 puntos).


    venta = np.array([
        [ 239034,  678493,  896321,   32438,  554213],
        [4568321, 6745634, 9754008, 3242342, 3456123],
        [ 234773,   56743,  123678,    4783,   90874],
        [  45672,   45212,   90781,    3904,   90431]])
    
    
    tipoGasolina = np.array(['Regular',
                             'Extra',
                             'Super',
                             'Premium'])
    
    gasolinera  = np.array(['Primax Alborada',
                            'PS Los Ríos',
                            'Móbil Cumbayá',
                            'Lutexa Cia Ltda',
                            'PS Remigio Crespo'])
    distrito = np.array(['distrito1',
                         'distrito2',
                         'distrito1',
                         'distrito2',
                         'distrito4'])
    ciudad =  np.array(['Guayaquil',
                        'Babahoyo',
                        'Quito',
                        'Guayaquil',
                        'Cuenca'])

    Referencia: Archivo original 1Eva_IIT2017.pdf

  • s1Eva_IIT2017_T3 Venta combustibles

    Ejercicio: 1Eva_IIT2017_T3 Venta combustibles

    Propuesta de solución en Python:

    Se usan datos de prueba para probar la ejecución del algoritmo por cada literal. En el bloque de ingreso se pide solo un tipo de combustible (literal a) y una ciudad (literal b).

    Se usa vector.index(dato) para ubicar la posición de un dato en el vector.

    # literal a
    cual     = tipoGasolina.index(untipo)
    cantidad = venta[cual,:]
    prom_anual =  np.sum(cantidad)/m
    menosprom  = []
    for c in range(0,m,1):
        if (cantidad<prom_anual):
            menosprom.append(gasolinera)
    

    Como algunas respuestas tienen un número indeterminado de elementos se usan listas, al inicio vacías. Revise el uso de np.concatenate() para hacerlo con arreglos.


    Algoritmo en Python

    # CCPG1001 Fundamentos de Programación FIEC-ESPOL
    # 1Eva_IIT2017_T3 Venta combustibles
    import numpy as np
    
    # INGRESO
    venta = np.array([
        [ 239034,  678493,  896321,   32438,  554213],
        [4568321, 6745634, 9754008, 3242342, 3456123],
        [ 234773,   56743,  123678,    4783,   90874],
        [  45672,   45212,   90781,    3904,   90431]])
    
    tipoGasolina = np.array(['Regular',
                             'Extra',
                             'Super',
                             'Premium'])
    
    gasolinera  = np.array(['Primax Alborada',
                            'PS Los Ríos',
                            'Móbil Cumbayá',
                            'Lutexa Cia Ltda',
                            'PS Remigio Crespo'])
    
    distrito = np.array(['distrito1',
                         'distrito2',
                         'distrito1',
                         'distrito2',
                         'distrito4'])
    
    ciudad =  np.array(['Guayaquil',
                        'Babahoyo',
                        'Quito',
                        'Guayaquil',
                        'Cuenca'])
    
    meta = 5000000
    
    untipo    = input('un tipo de gasolina: ')
    unaciudad = input('una ciudad: ')
    
    # PROCEDIMIENTO
    tipoGasolina = list(tipoGasolina)
    gasolinera   = list(gasolinera)
    distrito = list(distrito)
    ciudad   = list(ciudad)
    
    tamano = np.shape(venta)
    n = tamano[0]
    m = tamano[1]
    
    # literal a
    cual     = tipoGasolina.index(untipo)
    cantidad = venta[cual,:]
    prom_anual =  np.sum(cantidad)/m
    menosprom  = []
    for c in range(0,m,1):
        if (cantidad<prom_anual):
            menosprom.append(gasolinera)
    
    # literal b
    cual  = ciudad.index(unaciudad)
    anual = np.sum(venta, axis=0)
    menosciudad = []
    for c in range(0,m,1):
        if (ciudad == unaciudad  and anual<meta):
            menosciudad.append(gasolinera)
    cuantas = len(menosciudad)
    
    # literal c
    cual = tipoGasolina.index('Premium')
    cantidad = venta[cual,:]
    nombres = []
    valores = []
    for c in range(0,m,1):
        if (distrito == 'distrito2'):
            nombres.append(ciudad)
            valores.append(cantidad)
    
    k = len(nombres)
    mayor = np.argmax(np.array(valores))
    mejorendistrito = nombres[mayor]
    
    # SALIDA
    print('literal a')
    print('con menos ventas anuales que promedio: ')
    print(menosprom)
    
    print('literal b')
    print('cantidad de estaciones de ' + unaciudad + ': ')
    print(cuantas)
    
    print('literal c')
    print(nombres)
    print(valores)
    print(mejorendistrito)
    

    Resultado del algoritmo

    un tipo de gasolina: Regular
    una ciudad: Guayaquil
    literal a
    con menos ventas anuales que promedio: 
    ['Primax Alborada', 'Lutexa Cia Ltda']
    literal b
    cantidad de estaciones de Guayaquil: 
    1
    literal c
    ['Babahoyo', 'Guayaquil']
    [45212, 3904]
    Babahoyo
    >>> 
    
  • 1Eva_IIT2017_T2 Texto de examen de sangre

    1ra Evaluación II Término 2017-2018, Diciembre 1, 2017. CCPG001 – FIEC

    Tema 2. (30 puntos) Un asistente de médico tiene la tarea de generar un informe de indicadores a partir del resultado de un examen de sangre  que lo recibe como una cadena de texto.

    Los indicadores, por ejemplo: INR, WBC, RBC, TA, etc.,  se pueden identificar por estar siempre en mayúsculas. Todo indicador va seguido de un espacio, un número con decimales, otro espacio y las unidades de medida. Al final del reporte se encuentra el nombre del médico responsable.

    Ejemplos:

    resultado = "Resultado de Laboratorio 'Su Salud' Nombre del paciente: José Aimas E-mail del paciente: jose.aimas@gmail.com Resultados del laboratorio: INR 1.25 segundos BGT 180.12 mmol/dL HGB 13 g/dL ESR 3.2 mm/hora RBC 4000024.2 cel/ul TA 1.5 ng/dL WBC 123233.23 cel/uL. Los valores de éste informe no representan un diagnóstico. Firma médico responsable: Dr. Juan Pozo"

    resultado = "Resultado de Laboratorio 'Sana' Nombre del paciente: Ginger Irene Cruz Jurado Edad: 25 años E-mail: giircrju@espol.edu.ec Resultados: Azucar BGT 180.12 mmol/dL Hemoglobina HGB 13 g/dL Hormonal TA 1.5 ng/dL Médico responsable Dr. Karina Elizabeth Plaza"

    Nota: La cantidad de indicadores puede variar. Los puntos no solo aparecen en los decimales, sino también para separar párrafos o en otras ocasiones como las direcciones de e-mail.

    Escriba un programa que muestre la información desglosada, el nombre del médico, una recomendación mostrada como doble asterisco en el indicador y descrita al final

    Se recomienda al paciente ir al endocrinólogo si su nivel de azúcar (BGT), está por encima de los 150 mmol/dL.

    Ejemplo:
    
    INFORME DE LABORATORIO
    **********************
    INR	     1.25 	segundos
    BGT 	   180.12 	mmol/dL
    HGB	    13		g/dL
    ESR	     3.2 	mm/hora
    RBC	4000024.2 	cel/ul
    TA 	     1.5 	ng/dL
    WBC 	123233.23 	cel/uL
    Médico: Juan Pozo
    
    ** Su nivel de azúcar es alto, se recomienda ir al endocrinólogo .
    

    Rúbrica: Descomponer y recorrer texto (4 puntos), revisar mayúsculas (5 puntos), valor indicador (4 puntos), unidad indicador (4 puntos), nombre de médico (5 puntos), recomendación (3 puntos), salida (5).

    No es necesario presentar el informe en el formato descrito, pero si lo hace, obtendrá 2 puntos extras en el examen.

    Referencia: Archivo original 1Eva_IIT2017.pdf

  • 1Eva_IIT2017_T1 Taller de juguetes en polo norte

    1ra Evaluación II Término 2017-2018, Diciembre 1, 2017. CCPG001 – FIEC

    (Editado para tarea, se mantiene el objetivo de aprendizaje)

    Tema 1 (20 puntos)
    Para una época muy agitada en el taller de "Papá Noél" del Polo Norte, se contrata un nuevo administrador.

    Se deben realizar varias tareas, cuyos  tiempos de inicio y duración se registran en minutos.

    tareas = ['pintar soldados',
              'hornear galletas',
              'armar muñecos',
              'cortar papel de regalo',
               ..., ]
    
    inicio   = [678, 200, 240, 423, ...]
    duracion = [300, 800, 456, 112, ...]
    
    Por ejemplo, la tarea 'pintar soldados'
    empieza en el minuto 678 del día y 
    tiene duración de 300 minutos.

    Se debe planificar la mayor cantidad de tareas que se pueden realizar en un día de 1440 minutos, considerando los tiempos de finalización y con preferencia por las tareas que terminan más temprano en el día.

    El tiempo de finalización de tarea se calcula como el minuto de inicio+ los minutos de duración.

    Ejemplo:
    la tarea 'pintar soldados' termina en el minuto
     978 = (678+300) del día.

    Escriba un programa que dada la información de tareas, inicio y duración, permita planificar y mostrar el orden de ejecución de las tareas:

    +--------------+
    |Tareas del día|
    +--------------+
    1. Cortar papel de regalos
    2. Vestir muñecas
    3. ...

    Nota: asuma que:

    • no existen tareas que finalizan en el mismo minuto
    • en el taller trabajan muchos duendes, no es problema planificar tareas simultáneas.
    • no es necesario que se planifiquen todas las tareas en un mismo dia.

    Rúbrica: vector finalización (3 puntos), ordenar (4 puntos) y seleccionar tarea (5 puntos),  verificar limite dia (2 puntos), buscar nombres de tarea (4 puntos), salida (4 puntos),

    Referencia: Archivo original 1Eva_IIT2017.pdf

  • s1Eva_IIT2017_T1 Taller de juguetes en polo norte

    Ejercicio: 1Eva_IIT2017_T1 Taller de juguetes en polo norte

    Propuesta de solución en Python:

    Los tiempos para finalizar las tareas se obtienen como la suma de los tiempos de inicio mas los tiempos de duración.

    Para realizar la mayor cantidad de tareas, se usan los tiempos para finalizarlas, buscando la posición en la lista de la mayor. Al encontrarla se puede establecer el orden.

    El proceso se repite para el resto de tareas. Para que no se utilice la primera encontrada se elimina de la lista asignando el tiempo final con cero.


    Algoritmo en Python

    # CCPG1001 Fundamentos de Programación FIEC-ESPOL
    # 1Eva_IIT2017_T1 Taller de juguetes en polo norte
    import numpy as np
    
    # INGRESO
    tareas = ['pintar soldados',
              'hornear galletas',
              'armar muñecos',
              'cortar papel de regalo']
    inicio   = [ 678, 200, 240, 423]
    duracion = [ 300, 800, 456, 112]
    
    # PROCEDIMIENTO
    n = len(tareas)
    
    # tiempo finaliza tarea
    final = np.zeros(n,dtype=int)
    i = 0
    while not(i>=n):
        final[i] = inicio[i] + duracion[i]
        i = i + 1
    
    # Determina el orden
    finaliza = np.copy(final)
    orden = np.zeros(n,dtype = int)
    j = 0
    while not(j>=n):
        
        mayor = 0
        i = 1
        while not(i>=n):
            if (final[i]>final[mayor]):
                mayor = i
            i = i + 1
        
        orden[j] = mayor
        final[mayor] = 0
        j = j + 1
        
    # dias de trabajo
    dia  = np.zeros(n,dtype = int)
    cual = 1
    suma = 0
    j = 0
    while not(j>=n):
        suma = suma + finaliza[j]
        if (suma>=1440):
            cual = cual + 1
            suma = finaliza[j]
        dia[j] = cual
        j = j + 1
       
    # SALIDA
    print('finaliza')
    print(finaliza)
    
    print('Tareas del dia')
    s = 0
    i = 0
    while not(i>=n):
        cual = orden[i]
        s = s + finaliza[cual]
        print(i, cual, tareas[cual], s, dia[i])
        i = i + 1
    

    Resultado del algoritmo

    finaliza
    [ 978 1000  696  535]
    Tareas del dia
    0 1 hornear galletas 1000 1
    1 0 pintar soldados 1978 2
    2 2 armar muñecos 2674 3
    3 3 cortar papel de regalo 3209 3
    >>> 
    
  • s1Eva_IIT2017_T2 Texto de examen de sangre

    Ejercicio: 1Eva_IIT2017_T2 Texto de Examen de sangre

    Propuesta de solución en Python:

    Para simplificar el ejercicio, se supondrá que el resultado corresponde al texto del ejemplo en el enunciado:

    resultado = "Resultado de Laboratorio 'Su Salud' Nombre del paciente: José Aimas E-mail del paciente: jose.aimas@gmail.com Resultados del laboratorio: INR 1.25 segundos BGT 180.12 mmol/dL HGB 13 g/dL ESR 3.2 mm/hora RBC 4000024.2 cel/ul TA 1.5 ng/dL WBC 123233.23 cel/uL. Los valores de éste informe no representan un diagnóstico. Firma médico responsable: Dr. Juan Pozo"

    El texto se analiza separando las partes usando los espacios '  '.

    >>> partes = resultado.split(' ')
    >>> partes
    ['Resultado', 'de', 'Laboratorio', "'Su", "Salud'",
     'Nombre', 'del', 'paciente:', 'José', 'Aimas',
    ...
    ]
    >>> 
    

    Se analiza cada una de las partes, considerando que los "indicadores buscados" tienen todas las letras en mayúsculas a diferencia del resto de partes o palabras. Por lo que se compara la conversión de la parte en mayúsculas y su forma original o sinconvertir, si son iguales se encontró un indicador.
    Considere que si la parte es numérica, no se afecta al convertir en mayúscula.

    >>> i=0
    >>> mayusculas = partes[i].upper()
    >>> sinconvertir = partes[i]
    >>> mayusculas
    'RESULTADO'
    >>> sinconvertir
    'Resultado'
    >>> mayusculas == sinconvertir
    False
    >>> 
    

    Al encontrar un indicador, se lo separa en otra lista de solo indicadores.


    Algoritmo en Python

    # CCPG1001 Fundamentos de Programación FIEC-ESPOL
    # 1Eva_IIT2017_T2 Examen de sangre
    # Tarea: Encontrar nombre del médico
    
    # INGRESO
    resultado = "Resultado de Laboratorio 'Su Salud' Nombre del paciente: José Aimas E-mail del paciente: jose.aimas@gmail.com Resultados del laboratorio: INR 1.25 segundos BGT 180.12 mmol/dL HGB 13 g/dL ESR 3.2 mm/hora RBC 4000024.2 cel/ul TA 1.5 ng/dL WBC 123233.23 cel/uL. Los valores de éste informe no representan un diagnóstico. Firma médico responsable: Dr. Juan Pozo"
    
    # PROCEDIMIENTO
    partes = resultado.split(' ')
    n = len(partes)
    
    # Encontrar indicadores
    numero = '0123456789'
    indicador = []
    i = 0
    while not(i>=n):
        mayusculas   = partes[i].upper()
        sinconvertir = partes[i]
        unapalabra   = partes[i]
        unaletra     = unapalabra[0]
        if (mayusculas==sinconvertir and not(unaletra in numero)):
            indicador.append(partes[i])
        i = i + 1
    m = len(indicador)
    
    # Busca por indicadores
    valor  = []
    unidad = []
    k = 0
    while not(k>=m):
        i = 0
        while not(i>=n):
            if (partes[i]==indicador[k]):
                valor.append(partes[i+1])
                unidad.append(partes[i+2])
            i = i + 1
        k = k + 1
    
    # SALIDA
    print('INFORME DE LABORATORIO')
    print('**********************')
    i = 0
    while not(i>=m):
        print(indicador[i],valor[i],unidad[i])
        i = i + 1
    

    Resultado del algoritmo

    INFORME DE LABORATORIO
    **********************
    INR 1.25 segundos
    BGT 180.12 mmol/dL
    HGB 13 g/dL
    ESR 3.2 mm/hora
    RBC 4000024.2 cel/ul
    TA 1.5 ng/dL
    WBC 123233.23 cel/uL.
    >>> 
    
  • 3Eva_IT2017_T1 Archivos de notas por semestre

    3ra Evaluación I Término 2017-2018. Septiembre 16, 2017 /CCPG001

    (Editado para tarea, se mantiene el objetivo de aprendizaje)

    TEMA 1 (45 puntos). Considere que tiene varios archivos cuyos nombres tienen el formato
    notas-año-término.csv
    y su contenido en cada linea es:

    matrícula,materia,nota_parcial,nota_final,nota_mejoramiento,AP/RP

    Ejemplos de los archivos:

    notas-2015-I.csv

    201521342,Fundamentos de Programación,80,95,99,AP
    201321454,Economía,12,21,33,RP
    201321454,Fundamentos de Programación,45,76,89,AP
    …

    notas-2013-II.csv

    200901456,Física I,80,91,73,AP
    201321454,Química,45,57,73,AP
    201121372,Economía,73,82,83,AP
    201321454,Fundamentos de Programación,11,9,9,RP
     …

    Desarrolle los siguientes literales:

    a) Elabore la función academico(narchivos) recibe los nombres de los archivos de notas (tupla) para cada semestre y retorna un diccionario de notas con la estructura mostrada.

    narchivos = (notas-2013-II.csv, notas-2015-I.csv)
    
    notas =
    {201321454: {'2013-II': [('Química', 45, 57, 73, 'AP'),
                             ('Fundamentos de Programación', 
                                11,9,9, 'RP')],
                 '2015-I': [('Economía', 12, 21, 33, 'RP'),
                            ('Fundamentos de Programación', 
                                45,76,89, 'AP')],
                 ...},
     200901456: {'2013-II': [('Física I', 80, 91, 73, 'AP'),
                             ...],
                 ...},
     ...}
    

    b) Implemente la función semestres(notas, matricula) que recibe las notas (diccionario) y un número de matrícula  de un estudiante para entregar todos los semestres en que ha tomado materias (tupla) .

    c) Realice la función nota_academico(notas, matricula, materia) que recibe las notas (en diccionario), una matrícula y el nombre de una materia y determina la nota total para esa materia.

    La nota total se calcula como el promedio de las dos notas más altas entre parcial, final y mejoramiento. Si el estudiante aún no ha tomado la materia, se presenta como nota cero (0). Si el estudiante en más de una ocasión ha tomado la materia se obtiene la nota con el promedio más alto.

    d)  Elabore la función mas_aprobados(notas, semestre) que devuelve el nombre de la materia con mayor cantidad de estudiantes aprobados (estado AP) en el semestre indicado.

    Rúbrica: Literal a (10 puntos + 5 puntos de bono) b (5 puntos), c y d (15 puntos)


    Ejemplo:

    narchivos=('notas-2015-I.csv',
               'notas-2013-II.csv')
    matricula = 201321454
    materia = 'Fundamentos de Programación'
    semestre = '2015-I'
    Se obtiene:
    --- para 201321454: 
    semestres que estudió: ('2015-I', '2013-II')
    notas final para Fundamentos de Programación: 82.5
    --- En el semestre 2015-I: 
    la materia con alto indice de aprobación es: Fundamentos de Programación

    Referencia: Archivo original 3Eva_IT2017.pdf

  • s3Eva_IT2017_T1 Archivos de notas por semestre

    Ejercicio: 3Eva_IT2017_T1 Archivos de notas por semestre

    Propuesta de solución en Python:

    Para la prueba del algoritmo, se requiere los archivos:

    notas-2015-I.csv

    notas-2013-II.csv

    Algoritmo en Python

    # CCPG1001-Fundamentos de Programación - FIEC-ESPOL
    # 3Eva_IT2017_T1 Archivos de notas por semestre
    # Tarea: una vez comprendido los pasos, 
    #        simplificar de ser posible
    import numpy as np
    
    def academico(narchivos):
        notas = {}
        n = len(narchivos)
        for i in range(0,n,1):
            archivo = open(narchivos[i],'r')
    
            # semestre en el nombre
            nombre = narchivos[i]
            partes = nombre.split('.')
            semestre = partes[0][6:]
    
            # Datos del archivo
            linea = archivo.readline()
            while not(linea==''):
                linea   = linea.strip('\n')
                partes  = linea.split(',')
                quien   = int(partes[0])
                materia = partes[1]
                nota1   = int(partes[2])
                nota2   = int(partes[3])
                nota3   = int(partes[4])
                estado  = partes[5]
                califica = (materia,nota1,nota2,
                            nota3,estado)
    
                # Revisar estudiante creado
                estudiantes = notas.keys()
                if not(quien in estudiantes):
                    notas[quien] = {semestre:[califica]}
                else:
                    cuando = notas[quien].keys()
                    if (semestre in cuando):
                        notas[quien][semestre].append(califica)
                    else:
                        notas[quien][semestre] = [califica]
    
                linea = archivo.readline()
            archivo.close()
        return(notas)
    
    def semestres(notas,matricula):
        estudiantes = notas.keys()
        cuando = ()
        if (matricula in estudiantes):
            cuando = notas[matricula].keys()
        cuando = tuple(cuando)
        return(cuando)
    
    def nota_academico(notas,matricula,materia):
        califica = []
        estudiantes = notas.keys()
        # Desarrollar tarea
            
        return(nota_final)
    
    def mas_aprobados(notas,semestre):
        # Separa dictadas y aprobadas en el semestre
        dictadas = []
        estudiantes = notas.keys()
        for quien in estudiantes:
            cuando = notas[quien].keys()
            if (semestre in cuando):
                registradas = notas[quien][semestre]
                n = len(registradas)
                for i in range(0,n,1):
                    if (registradas[i][4] == 'AP'):
                        dictadas.append(registradas[i][0])
    
        # Cuenta las repetidas
        m = len(dictadas)
        lista = list(set(dictadas))
        conteo = {}
        for j in range(0,m,1):
            una = dictadas[j]
            if (una in conteo):
                conteo[una] = conteo[una]+1
            else:
                conteo[una] = 1
    
        # busca la mas aprobada
        mejor = ''
        if (len(conteo)>0):
            llaves  = list(conteo.keys())
            valores = np.array(conteo.values())
            mejor   = llaves[np.argmax(valores)]
        return(mejor)
    
    # PROGRAMA
    # INGRESO /siguiendo ejemplo de examen
    narchivos = ['notas-2015-I.csv',
               'notas-2013-II.csv']
    matricula = 201321454
    materia   = 'Fundamentos de Programación'
    semestre  = '2015-I'
    
    # PROCEDIMIENTO
    notas = academico(narchivos)
    semestres  = semestres(notas, matricula)
    nota_final = nota_academico(notas, matricula, materia)
    alto_AP = mas_aprobados(notas, semestre)
    
    # SALIDA
    print('las notas son: ')
    print(notas)
    print('--- para '+str(matricula) + ': ')
    print('semestres que estudió: ',semestres)
    print('notas final para '+materia+': ',nota_final)
    print('--- En el semestre '+semestre + ': ' )
    print('la materia con alto indice de aprobación es: ',
          alto_AP)
    
  • 3Eva_IT2017_T2 Huracanes en Atlántico Norte

    3ra Evaluación I Término 2017-2018. Septiembre 16, 2017 /CCPG001

    (Editado para tarea, se mantiene el objetivo de aprendizaje)

    TEMA 2 (45 puntos). Para el Atlántico Norte, los meteorólogos registran los parámetros que describen a los huracanes .

    La tabla muestra los datos en una matriz M para cada año y nombre asignado al huracan:

    El encabezado de la matriz se describe en el diccionario huracanes que contiene el año (clave tipo entero) y los nombres  de huracanes en ese año (texto en tupla).

    huracanes = {..., 
                 2015:('Ana', ..., 'Kate'),
                 2016:('Alex', ..., 'Otto'),
                 2017:('Ariene', ..., 'Harvey','Irma', ...), 
                 ... }
    

    Los nombres no se repiten y se almacenan en el mismo orden que en la matriz M.

    Por la velocidad del viento, los huracanes se categorízan en :

    categoria Velocidad del Viento
    1 menor a 100 km/h
    2 100 a 150 km/h
    3 150 a 200 km/h
    4 200 a 250 km/h
    5 mas de 250 km/h

    Desarrolle los siguientes literales:

    a) Elabore la función total_marejada(M, cat) que retorna el total de marejadas en metros causadas por los huracanes que tengan categoria cat.

    b) Implemente la función indices_año(huracanes, año) que retorna una tupla con los índices de columna donde empieza y termina año en la matriz M.

    c) Escriba la función velocidad_superior(M, huracanes, año) que retorna la cantidad de huracanes en año que tienen la Velocidad de Desplazamiento (Vd) superior a la Velocidad de Desplazamiento promedio del año dado como parámetro.

    d)  Realice la función ACE(M, huracanes, año) que devuelve la cantidad de energía liberada por todos los huracanes de la temporada año.
    Esto se calcula usando:

    CantidadEnergia = 10 ^{-4} (VV_{1}^{2} + VV_{2}^{2} \text{+ ... + }VV_{n}^{2} )

    Donde VVi es la Velocidad de Viento (en km/h) de cada huracan.

    e) Implemente la función lluvia(M, huracanes, nombre_huracan, año) que devuelve la cantidad de lluvia en centímetros (cm) generada por el nombre_huracan en ese año.

    Rúbrica: literales a,c y d (11 puntos cada uno), literal b (5 puntos), literal e (7 puntos)

    Referencias:
    - Irma: ¿cómo y quién decide el nombre de los huracanes?, http://www.bbc.com/mundo/noticias-37591575,
    http://www.infobae.com/america/mundo/2017/09/07/por-que-bautizan-a-los-huracanes-con-nombres-de-personas/
    - ¿Cómo se clasifican los huracanes en el Atlántico?, https://es.wikipedia.org/wiki/Escala_de_huracanes_de_Saffir-Simpson


    Ejemplo:

    M = np.array([[20, 30, 19, 15, 18],
                  [89,195,120,150,240],
                  [65,165,100,110,200],
                  [30, 49, 35, 89, 67],
                  [ 5, 1.8,  1,  2,  5]])
    
    huracanes = {2016:('Alex', 'Otto'),
                 2017:('Ariene', 'Harvey','Irma'),
                 }
    Se obtiene:
    ---
    categorias:  [1 3 2 2 4]
    Marejadas cat[2]:  3.0
    indices:  [2, 4]
    velocidad superior:  2
    Energia liberada:  0.091
    lluvia en mm:  89.0
    

    Referencia: Archivo original 3Eva_IT2017.pdf