Clase 9-10: Funciones, diccionarios y condicionales

#Importar librería
import numpy as np

En esta classe vamos a ejercitar respondiendo las siguientes preguntas

  1. Utilice las funciones de numpy linspace() y arange() para crear dos vectores entre 0-100. El primer vector tiene 1000 elementos entre el rango 0-100 y el segundo se encuentra separado por 1.5 (ejm: 0, 1.5, 3, …).

#Crear vector entre 0-100 con 1000 elementos
vector1 = np.linspace(0, 100, 1000)
print("len(vector1):", len(vector1))

#Crear vector entre 0-100 separados por 1.5
vector2 = np.arange(0, 100, 1.5)
print("len(vector2):", len(vector2))

#Vectores
print("vector1:", vector1[0:10])
print("vector2:", vector2[0:10])
len(vector1): 1000
len(vector2): 67
vector1: [0.        0.1001001 0.2002002 0.3003003 0.4004004 0.5005005 0.6006006
 0.7007007 0.8008008 0.9009009]
vector2: [ 0.   1.5  3.   4.5  6.   7.5  9.  10.5 12.  13.5]
  1. Utilizando los vectores de 1. crear un loop anidado para calcular la multiplicación entre cada elemento de los vectores. Guarde los resultados en una lista.

#Lista vacía
lista = []

#Loop
for i in vector1: 
    for j in vector2: 
        lista.append(i*j)
        
print("len(lista):", len(lista))
print("len(vector1)*len(vector2):", len(vector1)*len(vector2))
len(lista): 67000
len(vector1)*len(vector2): 67000
  1. Mediante un print() muestre la suma, el promedio, la mediana y la desviación estándar de la lista guardada en 2.

#Suma
print("suma:", np.sum(lista))
#Promedio
print("promedio:", np.mean(lista))
#Mediana
print("mediana:", np.median(lista))
#Desviación estandar
print("Std:", np.std(lista))
suma: 165825000.0
promedio: 2475.0
mediana: 1839.3393393393394
Std: 2202.8088300489767
  1. Utilice la función input() para solicitar la cantidad de mascotas.

#Solicitar input
input("¿Cuántas mascotas tiene?")
---------------------------------------------------------------------------
StdinNotImplementedError                  Traceback (most recent call last)
<ipython-input-5-1e0ab58c6baf> in <module>
      1 #Solicitar input
----> 2 input("¿Cuántas mascotas tiene?")

~/miniconda3/lib/python3.9/site-packages/ipykernel/kernelbase.py in raw_input(self, prompt)
    843         """
    844         if not self._allow_stdin:
--> 845             raise StdinNotImplementedError(
    846                 "raw_input was called, but this frontend does not support input requests."
    847             )

StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.
  1. Crear una rutina que permita las siguientes operaciones:

    1. Solicitar el número de mascotas (con input()), guardar en una variable.

    2. Si el número de mascotas es cero: imprimir “No tiene mascotas.”

    3. Si el número es entre 1-3: imprimir “Tiene entre 1-3 mascotas.”

    4. Si el número es entre 4-6: imprimir “Tiene entre 4-6 mascotas.”

    5. Si el número es mayor que 6: imprimir “Tiene más de 6 mascotas”.

    6. Si el número es negativo: imprimir “No corresponde”.

    *Probar que su rutina cumple bien todas las condiciones. *

mascotas = int(input("¿Cuántas mascotas tiene?"))
if mascotas == 0: 
    print("No tiene mascotas")
elif mascotas >0 and mascotas <=3 : 
    print("Tiene entre 1-3 mascotas")
elif mascotas>3 and mascotas <=6:
    print("Tiene entre 4-6 mascotas")
elif mascotas>6: 
    print("Tiene mas de 6 mascotas")
elif mascotas<0: 
    print("No corresponde")
else: 
    print("otro caso")
    
¿Cuántas mascotas tiene? 0
No tiene mascotas
  1. Crear dos listas, una con estilo musical (blues, rock, rap, trap, pop) y otra con grupos (Nina Simone, Led Zeppelin, Makiza, Pablo Chill-e, Dua Lipa). Luego crear una función que tenga como input “estilo” y output “recomendacion”. La función debe permitir:

    1. Leer el input estilo y compararlo con la lista de estilo musical.

    2. Utilizar if/elif/else para crear condiciones que recomiende música. Por ejemplo, si estilo es igual a Blues, recomendar Nina Simone.

    3. Si el estilo no está en la lista de estilo musical, debe mostrar “No tenemos recomendación para su estilo musical”.

    4. El output debe ser la recomendación.

    Evaluar si la función se ejecuta correctamente para cada estilo musical

Opción 1

def recomendacion(estilo): 
    if estilo == "blues": 
        print("Nina Simone")
    elif estilo == "rock": 
        print("Led Zeppelin")
    elif estilo == "rap": 
        print("Makiza")
    elif estilo == "trap": 
        print("Pablo Chill-e")
    elif estilo == "pop":
        print("Dua Lipa")
    else: 
        print("No tenemos recomendación para su estilo musical.")
        
recomendacion('rap')
Makiza

Opción 2

def recomendacion(estilo): 
    if estilo == "blues": 
        recomend = "Nina Simone"
    elif estilo == "rock": 
        recomend = "Led Zeppelin"
    elif estilo == "rap": 
        recomend = "Makiza"
    elif estilo == "trap": 
        recomend = "Pablo Chill-e"
    elif estilo == "pop":
        recomend = "Dua Lipa"
    else: 
        recomend = "No tenemos recomendación para su estilo musical."
    return recomend
        
#Podemos guardar la recomendación en una variable
recomendacion('blues')
'Nina Simone'

Opción 3

estilos = ["blues", "rock", "rap", "trap", "pop"]
grupos = ["Nina Simone", "Led Zeppelin", "Makiza", "Pablo Chill-e", "Dua Lipa"]

def recomendacion(estilo): 
    for i in range(0, len(estilos)): 
        if estilo == estilos[i]:
            recomend = grupos[i]
            break
        else: 
            recomend = "No tenemos recomendación"
    return recomend

recomendacion("rock")
'Led Zeppelin'
  1. Crear una función que permita evaluar hasta tres estilos musicales y entregue una lista con las recomendaciones. Por ejemplo, si le entrego una lista con [rock, rap, pop] me debe retornar [Led Zeppelin, Makiza, Dua Lipa]. Adicionalmente:

    • Si le entrego una lista con 1 o 2 estilos musicales debe entregar 1 o 2 recomendaciones respectivamente.

    • Si le entrego una lista del tipo [trap, musica clasica] debe retornar la recomendación para trap [Pablo Chill-e].

    • Si le entrego una lista del tipo [musica clasica] debe retornar un mensaje “no tenemos recomendación para su estilo musical”.

Pasos de la iteración

  1. “blues”: igual a la pregunta 6

  2. [“blues”]:

    • si el lago del input == 1

    • iteramos sobre el total de estilos

    • si input (estilo) en la posición cero (primer elemento) es igual al valor de los estilos (sobre lo que estamos iterando)

    • entonces guardar el output como el grupo en la posición “i”.

    • cierre

  3. [“blues”, “rock”]:

    • si el largo del input es igual a 2

    • creamos lista vacía para guardar las recomendaciones

    • iteramos sobre el total de elementos de estilos

    • Comparamos el primer elemento del input con los estilos ejm: si input[“blues”, rock”], comparamos “blues” con cada elemento de estilos.

    • Si son iguales, guardamos la recomendación (grupos[i]) en la lista, en caso contrario no hacemos nada.

    • Repetimos para el segundo elemento del input (“rock”).

  4. [“rock”, “blues”, “pop”]

    • La lógica es la misma que en 3., sólo que ahora agregamos un tercer elemento y con ello una tercera condición.

estilos = ["blues", "rock", "rap", "trap", "pop"]
grupos = ["Nina Simone", "Led Zeppelin", "Makiza", "Pablo Chill-e", "Dua Lipa"]

def recomendacion(estilo): 
    #Entrada como texto: ejm "rock"
    if type(estilo) == str: 
        for i in range(0, len(estilos)): 
            if estilo == estilos[i]:
                recomend = grupos[i]
                break
            else: 
                recomend = "No tenemos recomendación" 
                
    #Entrada como lista ej ["rock"] o ["rock", "blues"]
    else:
        #1 estilo musical
        if len(estilo) == 1:
            for i in range(0, len(estilos)): 
                if estilo[0] == estilos[i]:
                    recomend = grupos[i]
                    break
                else: 
                    recomend = "No tenemos recomendación"           

        #2 estilos musicales
        elif len(estilo) == 2:
            recomend = []
            for i in range(0, len(estilos)): 
                if estilo[0] == estilos[i]:
                    recomend.append(grupos[i])
                elif estilo[1] == estilos[i]:
                    recomend.append(grupos[i])
        #3 estilos musicales: 
        elif len(estilo) == 3:
            recomend = []
            for i in range(0, len(estilos)): 
                if estilo[0] == estilos[i]:
                    recomend.append(grupos[i])
                elif estilo[1] == estilos[i]:
                    recomend.append(grupos[i])    
                elif estilo[2] == estilos[i]:
                    recomend.append(grupos[i])          
        
    return recomend
gustos = ["rap", "rock", "blues"]
recomendacion(gustos)
['Nina Simone', 'Led Zeppelin', 'Makiza']
  1. Crear una diccionario a partir de las dos listas donde la llave sea el estilo musical y el valor sea el grupo, ej: {‘rap’:’makiza’…}.

musica_dic = {'blues':'Nina Simone', 'rock':'Led Zeppelin', 'rap':'Makiza', 'trap':'Pablo Chill-e', 'pop':'Dua Lipa'  }
print("diccionario:", musica_dic)
print("llaves:", musica_dic.keys())
print("valores:", musica_dic.values())
print("items:", musica_dic.items())
diccionario: {'blues': 'Nina Simone', 'rock': 'Led Zeppelin', 'rap': 'Makiza', 'trap': 'Pablo Chill-e', 'pop': 'Dua Lipa'}
llaves: dict_keys(['blues', 'rock', 'rap', 'trap', 'pop'])
valores: dict_values(['Nina Simone', 'Led Zeppelin', 'Makiza', 'Pablo Chill-e', 'Dua Lipa'])
items: dict_items([('blues', 'Nina Simone'), ('rock', 'Led Zeppelin'), ('rap', 'Makiza'), ('trap', 'Pablo Chill-e'), ('pop', 'Dua Lipa')])
  1. Replicar la función 6. pero ahora utilizando diccionarios donde la función haga lo siguiente:

    1. Evaluar si el input (estilo) está en las llaves del diccionario.

    2. Si el input está en llave del diccionario recomendar el grupo musical respectivo.

    3. Si no está en la llave del diccionario retornar “No tenemos recomendación para su estilo musical”.

Opción 1

musica_dic = {'blues':'Nina Simone', 'rock':'Led Zeppelin', 'rap':'Makiza', 'trap':'Pablo Chill-e', 'pop':'Dua Lipa'  }

def recomendacion(estilo): 
    for k in musica_dic.keys(): 
        if estilo == k:
            recomend = musica_dic[k]
            break
        else: 
            recomend = "No tenemos recomendación"
    return recomend

recomendacion("pop")
'Dua Lipa'

Opción 2

def recomendacion(estilo): 
    for k,v in musica_dic.items(): 
        if estilo == k:
            recomend = v
            break
        else: 
            recomend = "No tenemos recomendación"
    return recomend

recomendacion("rap")
'Makiza'
  1. Replicar la función de 7. utilizando diccionarios.

musica_dic = {'blues':'Nina Simone', 'rock':'Led Zeppelin', 'rap':'Makiza', 'trap':'Pablo Chill-e', 'pop':'Dua Lipa'  }
def recomendacion(estilo): 
    #Entrada como texto: ejm "rock"
    if type(estilo) == str: 
        for k, v in musica_dic.items(): 
            if estilo == k:
                recomend = v
                break
            else: 
                recomend = "No tenemos recomendación" 
                
    #Entrada como lista ej ["rock"] o ["rock", "blues"]
    else:
        #1 estilo musical
        recomend = []
        if len(estilo) == 1:
            for k, v in musica_dic.items(): 
                if estilo[0] == k:
                    recomend = v
                    break
                else: 
                    recomend = "No tenemos recomendación"     

        #2 estilos musicales
        elif len(estilo) == 2:
            recomend = []
            for k, v in musica_dic.items(): 
                if estilo[0] == k:
                    recomend.append(v)
                elif estilo[1] == k:
                    recomend.append(v)
        #3 estilos musicales: 
        elif len(estilo) == 3:
            recomend = []
            for k, v in musica_dic.items(): 
                if estilo[0] == k:
                    recomend.append(v)
                elif estilo[1] == k:
                    recomend.append(v)    
                elif estilo[2] == k:
                    recomend.append(v)          
        
    return recomend
gustos = ["AA"]
recomendacion(gustos)
'No tenemos recomendación'
  1. Crear una función que entregue una edad como un valor aleatorio entre 15-65 años y educación como otro valor aleatorio entre 0-22, pero tiene que ser menor que la edad.

import random
import numpy as np
#Caso 1: una sola persona
def fun_edad_educ(eda_in, eda_end, edu_in, edu_end):
    edad = random.randint(eda_in, eda_end)
    educ = random.randint(edu_in, edu_end)
    if edad<educ:
        educ = random.randint(edu_in, edu_end)
            
    return edad, educ
fun_edad_educ(15, 65, 0, 22) #->que pasa si el if no es suficiente
(43, 7)
#Caso 1: una sola persona
def fun_edad_educ(eda_in, eda_end, edu_in, edu_end):
    edad = random.randint(eda_in, eda_end)
    educ = random.randint(edu_in, edu_end)
    while edad<educ:
        edad = random.randint(eda_in, eda_end)
        educ = random.randint(edu_in, edu_end)
            
    return edad, educ
fun_edad_educ(15, 65, 50, 100)
(62, 57)
#Caso 3: varias persona
def fun_edad_educ(n, eda_in, eda_end, edu_in, edu_end):
    edad_list = []
    educ_list = []
    for i in range(n):
        edad = random.randint(eda_in, eda_end)
        educ = random.randint(edu_in, edu_end)
        if edad<educ:
            educ = random.randint(edu_in, edu_end)
        edad_list.append(edad)
        educ_list.append(educ)
    return np.array(edad_list), np.array(educ_list)
edad_list, educ_list = fun_edad_educ(20, 15, 65, 0, 22)
#Caso 4: varias persona
def fun_edad_educ(n, eda_in, eda_end, edu_in, edu_end):
    edad_list = []
    educ_list = []    
    for i in range(n):
        edad = random.randint(eda_in, eda_end)
        educ = random.randint(edu_in, edu_end)
        while edad<educ:
            edad = random.randint(eda_in, eda_end)
            educ = random.randint(edu_in, edu_end)
            
        edad_list.append(edad)
        educ_list.append(educ)            
            
    return np.array(edad_list), np.array(educ_list)
edad_list, educ_list = fun_edad_educ(20, 15, 65, 50, 100)
(array([56, 58, 63, 58, 58, 54, 64, 57, 62, 61, 65, 64, 59, 62, 55, 54, 65,
        65, 65, 54]),
 array([51, 52, 60, 50, 52, 54, 64, 52, 53, 56, 60, 52, 55, 53, 50, 52, 54,
        50, 58, 53]))
  1. Crear una función que calcule la experiencia como edad-educación

def fun_exp(edad, educ):
    return edad-educ
exp = fun_exp(edad_list, educ_list)
  1. Crear una función que calcule la estimación del ingreso según la ecuación de Mincer: \(Ln(Y) = \beta_0 + \beta_1 S + \beta_2 Exp + \beta_3 Exp^2\) Donde:

  • \(S\): años de educación

  • \(Exp\): experiencia

  • \(Exp^2\): experiencia al cuadrado

Utilice: \(\beta_0=9.7\), \(\beta_1=0.14\), \(\beta_2=0.07\), \(\beta_3=-0.001\)

def mincer(S, Exp):
    β0 = 9.7
    β1 = 0.14
    β2 = 0.07
    β3 = -0.001
    return β0 + β1*S + β2*Exp + β3*Exp**2

ln_y = mincer(educ_list, exp)
import matplotlib.pyplot as plt
plt.plot(educ_list, ln_y, 'o')
[<matplotlib.lines.Line2D at 0x7f8d284574c0>]
_images/Clase9_10_43_1.png

Actividad 1

Instrucciones:

  • Cada pregunta la debe responder en una celda diferente (en total 4 celdas de código).

  • Antes de cada celda de código debe ir un markdown que muestre la pregunta que está respondiendo.

  • En la celda de código debe agregar un breve comentario de qué está haciendo.

  • Mandar el archivo PDF al correo felix.ordonez@usach.cl con el asunto “Actividad 1”.

  • Fecha de entrega: antes de la clase del 09/11.

  • En caso que no respete las instrucciones se le descontará puntaje de la nota

Nombre:

  1. Crear una función que entregue una edad como un valor aleatorio entre 15-65 años, educación como otro valor aleatorio entre 0-22 (tiene que ser menor que la edad) y sexo igual a una variable dicotómica (0 o 1) aleatoria.

  2. Crear una función que calcule la experiencia como edad-educación

  3. Crear una función que calcule la estimación del ingreso según la ecuación de Mincer: \(Ln(y)=\beta_0+\beta_1S+\beta_2Exp+\beta_3Exp^2 + \beta_4 Sexo + \beta_5(Sexo*S)\)

Donde:

  • \(S\): años de educación

  • \(Exp\): experiencia

  • \(Exp^2\): experiencia al cuadrado

Utilice: \(\beta_0=9.7\), \(\beta_1=0.15\), \(\beta_2=0.08\), \(\beta_3=-0.0011\), \(\beta_4=-0.15\), \(\beta_5=-0.0136\)

  1. Relice el proceso en una iteración para N = 100 personas, guarde los resultados mediante un diccionario que la llave sea la persona (\(n=1,\cdots,N\)) y el valor sea una lista del tipo: [S, Exp, Exp2, Sexo, Sexo*S, Ln(y)]. Muestre los resultados de su diccionario.