Identificación

Usuario: vivasm.
Nombre: Mariana Vivas.
Institución: Universidad Central de Venezuela.

Ejercicio 3 - Amigos congueros

  1. Entre en contacto con 10 estudiantes del curso de datos y 2 profesores o personal de soporte de LaConga, uno del curso de datos y otro de afuera, y consulte su nombre completo, su nombre de usuario en mattermost, edad, pais de origen, ciudad donde residen, su especialidad científica, nombre del instituto en que estudian/laboran, y un hobbie o afición.
  2. Cree un diccionario llamado “compas”, donde la llave sea el nombre de usuario en mattermost, y si depliego el valor almacenado, por ejemplo en compas[“juan-pineda”], lo que obtengo es a la vez otro diccionario, con las llaves “nombre”, “apellido”, “país”, “residencia”, “edad”, “institución”, “hobbie”.
  3. Cree una función que reciba como entrada el diccionario y un país de origen, y retorne las informaciones completas de todas las personas de ese país, tabuladas en una forma fácil de entender. -Busque una forma de calcular, a partir del diccionario, el promedio de edad de todas las personas en él, y una forma de mostrar todas las instituciones (sin repetición)

Solución

Insertamos los datos en el diccionario llamado 'compas':

In [1]:
compas={
    'hernandezj':{
    'nombre': 'Juan',
    'apellido': 'Hernández',
    'país': 'Colombia',
    'residencia': 'Bogotá',
    'edad': '24',
    'institución': 'Universidad Nacional de Colombia',
    'hobbie': 'leer'},
    
    'malamboj':{
    'nombre': 'Jorge',
    'apellido': 'Malambo',
    'país': 'Colombia',
    'residencia': 'Bogotá',
    'edad': '39',
    'institución': 'Universidad Nacional de Colombia',
    'hobbie': 'tallar madera'}, 
    
    'nicole':{
    'nombre': 'Angie',
    'apellido': 'Hernández',
    'país': 'Colombia',
    'residencia': 'Bucaramanga',
    'edad': '23',
    'institución': 'Universidad Industrial de Santander',
    'hobbie': 'pintar'}, 
    
    'navasa':{
    'nombre': 'Alfonso',
    'apellido': 'Navas',
    'país': 'Colombia',
    'residencia': 'Bogotá',
    'edad': '24',
    'institución': 'Universidad Nacional de Colombia',
    'hobbie': 'crossfit'},
    
    'ladinoj': {
    'nombre': 'José',
    'apellido': 'Ladino',
    'país': 'Colombia',
    'residencia': 'Bogotá',
    'edad': '24',
    'institución': 'Universidad Nacional de Colombia',
    'hobbie': 'skate'},
    
    'cristian.velandia':{
    'nombre': 'Cristian',
    'apellido': 'Velandia',
    'país': 'Colombia',
    'residencia': 'Bogotá',
    'edad': '27',
    'institución': 'Universidad Nacional de Colombia',
    'hobbie': 'anime'},
    
    'fernandezn':{
    'nombre': 'Nicolás',
    'apellido': 'Fernández',
    'país': 'Argentina',
    'residencia': 'Lima',
    'edad': '27',
    'institución': 'Universidad Nacional Mayor de San Marcos',
    'hobbie': 'piano'},
    
    'carrilloj':{
    'nombre': 'Juan',
    'apellido': 'Carrillo',
    'país': 'Colombia',
    'residencia': 'Bogotá',
    'edad': '25',
    'institución': 'Universidad Nacional de Colombia',
    'hobbie': 'basket'}, 
    
    'yohany':{
    'nombre': 'Yohany',
    'apellido': 'Rodríguez',
    'país': 'Colombia',
    'residencia': 'Bogotá',
    'edad': '46',
    'institución': 'Universidad Antonio Mariño',
    'hobbie': 'montar bicicleta'}
}

Comprobamos que al buscar un usuario en el diccionario, obtenemos otro diccionario con sus datos:

In [2]:
compas['hernandezj']
Out[2]:
{'nombre': 'Juan',
 'apellido': 'Hernández',
 'país': 'Colombia',
 'residencia': 'Bogotá',
 'edad': '24',
 'institución': 'Universidad Nacional de Colombia',
 'hobbie': 'leer'}

Creamos la función que filtre los usuarios de las personas por país:

In [3]:
def findbylocation(pais):
    #agregamos a la lista si el pais colocado concuerda con el pais del usuario
    lista=[user for user in compas if pais == compas[user]['país']] 
    return(lista)

Probamos para varios países:

In [4]:
findbylocation('Colombia')
Out[4]:
['hernandezj',
 'malamboj',
 'nicole',
 'navasa',
 'ladinoj',
 'cristian.velandia',
 'carrilloj',
 'yohany']
In [5]:
findbylocation('Argentina')
Out[5]:
['fernandezn']
In [6]:
findbylocation('Venezuela')
Out[6]:
[]

Utilizando esta función, creamos la tabla de datos de cada usuario en ese país:

In [7]:
def bycountrydata():
    #Pedimos al usuario que indique un país
    pais=input('Indique un país: ')
    
    #Obtenemos los usuarios de las personas en ese país
    compasbycountry=findbylocation(pais)
    
    #Para la tabla, obtenemos los nombres de los keys de los diccionarios de cada persona
    keylist=list(compas['hernandezj'].keys())
    keylist.remove('país') #eliminamos el país, porque estamos escogiendo con esa etiqueta
    
    #str formating para obtener algo legible
    print("{:<17} | {:<8} | {:<10} | {:<12} | {:<4} | {:<38} | {:<30}".format('usuario', *keylist))
    print('_____________________________________________________________________________________________________________________________')
    
    #iteramos en los key (k) y los values (v) del diccionario
    for k, v in compas.items():
        if k in compasbycountry:
            listapersona=[] #lista para los valores de cada persona
            
            #volvemos a iterar en los diccionarios internos
            for ki,vi in v.items():
                if ki != 'país':
                    listapersona.append(vi) #introducimos cada valor del diccionario, menos el país.
            print("{:<17} | {:<8} | {:<10} | {:<12} | {:<4} | {:<38} | {:<30}".format(k, *listapersona))
        else: continue

Probamos con varios países:

In [8]:
bycountrydata()
Indique un país: Colombia
usuario           | nombre   | apellido   | residencia   | edad | institución                            | hobbie                        
_____________________________________________________________________________________________________________________________
hernandezj        | Juan     | Hernández  | Bogotá       | 24   | Universidad Nacional de Colombia       | leer                          
malamboj          | Jorge    | Malambo    | Bogotá       | 39   | Universidad Nacional de Colombia       | tallar madera                 
nicole            | Angie    | Hernández  | Bucaramanga  | 23   | Universidad Industrial de Santander    | pintar                        
navasa            | Alfonso  | Navas      | Bogotá       | 24   | Universidad Nacional de Colombia       | crossfit                      
ladinoj           | José     | Ladino     | Bogotá       | 24   | Universidad Nacional de Colombia       | skate                         
cristian.velandia | Cristian | Velandia   | Bogotá       | 27   | Universidad Nacional de Colombia       | anime                         
carrilloj         | Juan     | Carrillo   | Bogotá       | 25   | Universidad Nacional de Colombia       | basket                        
yohany            | Yohany   | Rodríguez  | Bogotá       | 46   | Universidad Antonio Mariño             | montar bicicleta              
In [9]:
bycountrydata()
Indique un país: Argentina
usuario           | nombre   | apellido   | residencia   | edad | institución                            | hobbie                        
_____________________________________________________________________________________________________________________________
fernandezn        | Nicolás  | Fernández  | Lima         | 27   | Universidad Nacional Mayor de San Marcos | piano                         

Podemos calcular el promedio de edades en el diccionario iterando:

In [10]:
sumatoria = 0 #inicializamos la variable para sumar
#iteramos en los key (k) y los values (v) del diccionario
for k,v in compas.items():
    
    #volvemos a iterar en los diccionarios internos
    for ki,vi in compas[k].items():
        if ki == 'edad': #obtenemos solo el valor en el key 'edad'
            sumatoria+=int(vi) #sumamos todos los valores en una variable
            
promedio=sumatoria/len(compas.keys()) #dividimos entre la cantidad de usuarios en compas
print(promedio)
28.77777777777778

Y podemos obtener una lista de las instituciones sin repetición iterando y utilizando sets:

In [11]:
instituciones=[] #inicializamos la lista donde irán las instituciones

#iteramos en los key (k) y los values (v) del diccionario
for k,v in compas.items():
    
    #volvemos a iterar en los diccionarios internos
    for ki,vi in compas[k].items():
        if ki == 'institución':
            instituciones.append(vi) #insertamos en la lista los valores correspondientes al key 'institución'
        else: continue
            
#utilizamos set para obtener variables sin repetición            
print(', '.join(set(instituciones))) #imprimimos con una coma y un espacio entre ellos     
Universidad Nacional Mayor de San Marcos, Universidad Industrial de Santander, Universidad Antonio Mariño, Universidad Nacional de Colombia

Una manera más eficiente de hacer esto es utilizando la libreria 'pandas':

In [12]:
import pandas as pd

compasdf=pd.DataFrame.from_dict(compas, orient='index')
In [13]:
compasdf
Out[13]:
nombre apellido país residencia edad institución hobbie
carrilloj Juan Carrillo Colombia Bogotá 25 Universidad Nacional de Colombia basket
cristian.velandia Cristian Velandia Colombia Bogotá 27 Universidad Nacional de Colombia anime
fernandezn Nicolás Fernández Argentina Lima 27 Universidad Nacional Mayor de San Marcos piano
hernandezj Juan Hernández Colombia Bogotá 24 Universidad Nacional de Colombia leer
ladinoj José Ladino Colombia Bogotá 24 Universidad Nacional de Colombia skate
malamboj Jorge Malambo Colombia Bogotá 39 Universidad Nacional de Colombia tallar madera
navasa Alfonso Navas Colombia Bogotá 24 Universidad Nacional de Colombia crossfit
nicole Angie Hernández Colombia Bucaramanga 23 Universidad Industrial de Santander pintar
yohany Yohany Rodríguez Colombia Bogotá 46 Universidad Antonio Mariño montar bicicleta

Podemos filtrar dando condiciones para las entradas en las filas:

In [14]:
compasdf[:][compasdf["país"] == 'Colombia']
Out[14]:
nombre apellido país residencia edad institución hobbie
carrilloj Juan Carrillo Colombia Bogotá 25 Universidad Nacional de Colombia basket
cristian.velandia Cristian Velandia Colombia Bogotá 27 Universidad Nacional de Colombia anime
hernandezj Juan Hernández Colombia Bogotá 24 Universidad Nacional de Colombia leer
ladinoj José Ladino Colombia Bogotá 24 Universidad Nacional de Colombia skate
malamboj Jorge Malambo Colombia Bogotá 39 Universidad Nacional de Colombia tallar madera
navasa Alfonso Navas Colombia Bogotá 24 Universidad Nacional de Colombia crossfit
nicole Angie Hernández Colombia Bucaramanga 23 Universidad Industrial de Santander pintar
yohany Yohany Rodríguez Colombia Bogotá 46 Universidad Antonio Mariño montar bicicleta
In [15]:
compasdf[:][compasdf["país"] == 'Argentina']
Out[15]:
nombre apellido país residencia edad institución hobbie
fernandezn Nicolás Fernández Argentina Lima 27 Universidad Nacional Mayor de San Marcos piano

El promedio se puede calcular con una función:

In [16]:
#cambiamos el tipo de la entrada a numérico
ageserie=pd.to_numeric(compasdf['edad'])
#calculamos la media de la serie
ageserie.mean() 
Out[16]:
28.77777777777778

Para saber los datos de una columna solo tenemos que usar .unique():

In [17]:
compasdf['institución'].unique()
Out[17]:
array(['Universidad Nacional de Colombia',
       'Universidad Nacional Mayor de San Marcos',
       'Universidad Industrial de Santander',
       'Universidad Antonio Mariño'], dtype=object)

O que países hay en la data con una línea de código, sin iterar:

In [18]:
compasdf['país'].unique()
Out[18]:
array(['Colombia', 'Argentina'], dtype=object)