Ejercicios-clase-02-datos

Siria Sadeddin

Ejercicio No. 3 - Amigos congueros

  • 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.
  • 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”.
In [17]:
#UNCOMENT TO INSTALL UNIDECODE
#!pip install unidecode 

## HE CREADO UNA FUNCION QUE TOMA UN DICCIONARIO DE VALORES Y LO AGREGA AL DICIONARIO "COMPAS" DE ACUERDO A UNA LLAVE "USUARIO"
## PARA ASEGURAR QUE LOS DATOS SEAN CONSISTENTES SE HA HECHO UNA NORMALIZACION DE TEXTOS DE ENTRADA, USANDO LA LIBRERIA UNIDECODE, 
## ESTO ELIMINA LAS MAYUSCULAS Y LOS ACENTOS EN EL TEXTO DE ENTRADA, ASEGURANDO QUE SE PUEDA HACER UN ANALISIS DE DATOS POSTERIOR 


## FUNCION QUE AGREGA MAS DATOS AL DICCIONARIO "COMPAS", ESTA FUNCION VERIFICA QUE TODOS LOS CAMPOS REQUERIDOS ESTEN EN LA LISTA DE ENTRADA Y QUE SEAN VALIDOS
def add_values_in_dict(compas, key, values):
    """adds new item to compas dictionary 

    Args:
        arg[0]: compas old dictionary
        arg[1]: new item (single) 
        arg[2]: new item's information

    Returns:
        dictionary: new dictionary of compas
    """

    import unidecode
    class bcolors:
        FAIL = '\033[91m'
        ENDC = '\033[0m'

    valid_items=['nombres', 'apellidos', 'edad', 'pais','residencia', 'especialidad cientifica', 'institucion', 'hobbie']
    
    values=dict((k.lower(), v.lower()) for k,v in values.items())
    
    values=dict((unidecode.unidecode(k), unidecode.unidecode(v)) for k,v in values.items())
            
    if all([k in valid_items for k in  values.keys()]) and all([k in values.keys() for k in valid_items]):
        
        if key not in compas:
            compas[key]=dict()
            compas[key]=dict(values)
            return compas
        
        else:
            print(f"{bcolors.FAIL}FALLO: el usuario {key} ya fue registrado{bcolors.ENDC}")
    
    else: 
        if not all([k in values.keys() for k in valid_items]):
            if len([k for k in valid_items if k not in values.keys()])==1:
                print(f"{bcolors.FAIL}FALLO: el valor {[k for k in valid_items if k not in values.keys()]} es requerido{bcolors.ENDC}")
            else:
                print(f"{bcolors.FAIL}FALLO: los valores {[k for k in valid_items if k not in values.keys()]} son requeridos{bcolors.ENDC}")

        if not all([k in valid_items for k in values.keys()]):
            if len([ k for k,v in values.items() if k not in valid_items])==1:
                print(f"{bcolors.FAIL}FALLO: el valor {[ k for k,v in values.items() if k not in valid_items]} no es valido{bcolors.ENDC}")
            else:
                print(f"{bcolors.FAIL}FALLO: los valores {[ k for k,v in values.items() if k not in valid_items]} no son validos{bcolors.ENDC}")

compas=dict({'@sadeddins':
        dict({'nombres':'siria',
         'apellidos':'Saddedin',
         'edad':'30',
         'pais':'Venezuela',
         'residencia':'Colombia',
         'especialidad cientifica':'data science',
         'institucion':'Universidad Simon Bolivar',
         'hobbie':'Ciencia de datos'
         })
        })
In [18]:
## crearemos una funcion que acepte tanto la inclusion de usuarios individuales como de archivos de datos

def compas_add(*arg):
    """adds new compas to compas dictionary 

    Args:
        arg: 2 or 3 arguments
        2 arguments:
            arg[0]: compas old dictionary
            arg[1]: csv file with new items to add
        3 arguments:
            arg[0]: compas old dictionary
            arg[1]: new item (single) 
            arg[2]: new item's information

    Returns:
        dictionary: new dictionary of compas
    """


    import os
    import pandas as pd

    class bcolors:
        FAIL = '\033[91m'
        ENDC = '\033[0m'

    if (len(arg)==3) and all([isinstance(x,str) for x in arg],str):
        
        return add_values_in_dict(arg[0],arg[1],arg[2])
    
    elif (len(arg)==2) and (os.path.isfile(arg[1])) and (arg[1].endswith('.csv')):
        
        users=pd.read_csv(arg[1])
        data=[]
        compas=arg[0]
        
        for i in range(len(users)):
            datai=[users.loc[i,'Usuario de Mattermost'],[{str(k):str(v) for k,v in zip(users.columns[1:],users.iloc[i,1:])}][0]]
            data.append(datai)
        
        for user in data:
            compas=add_values_in_dict(compas,user[0],user[1])
            if compas==None:
                break
        return compas
    else:
        print(f"{bcolors.FAIL}FALLO: los valores de entrada no son validos, revise documentacion{bcolors.ENDC}")
In [19]:
info='C:/Users/ECF0124A/Downloads/info.csv'
compas_add(compas,info)
Out[19]:
{'@sadeddins': {'nombres': 'siria',
  'apellidos': 'Saddedin',
  'edad': '30',
  'pais': 'Venezuela',
  'residencia': 'Colombia',
  'especialidad cientifica': 'data science',
  'institucion': 'Universidad Simon Bolivar',
  'hobbie': 'Ciencia de datos'},
 '@malamboj': {'nombres': 'jorge enrique',
  'apellidos': 'malambo martinez',
  'edad': '39',
  'pais': 'colombia',
  'residencia': 'bogota dc',
  'especialidad cientifica': 'modelaje y simulacion de materiales',
  'institucion': 'universidad nacional de colombia',
  'hobbie': 'talla en madera y ecoturismo'},
 '@bermudezj': {'nombres': 'jesus david',
  'apellidos': ' bermudez sanchez',
  'edad': '25',
  'pais': 'colombia',
  'residencia': ' bogota dc',
  'especialidad cientifica': 'nan',
  'institucion': 'universidad nacional de colombia',
  'hobbie': 'senderismo y bicicleta'},
 '@andreatugores': {'nombres': 'andrea carolina',
  'apellidos': 'tugores hernandez',
  'edad': '24',
  'pais': 'venezuela',
  'residencia': 'caracas',
  'especialidad cientifica': 'nan',
  'institucion': 'universidad central de venezuela',
  'hobbie': 'tennis'},
 '@fernadezn': {'nombres': 'nicolas',
  'apellidos': ' fernandez cinquepalmi',
  'edad': '24',
  'pais': 'argentina',
  'residencia': 'peru',
  'especialidad cientifica': 'ciencia de materiales',
  'institucion': 'universidad nacional mayor de san marcos',
  'hobbie': 'tocar el piano'},
 '@grisalej': {'nombres': 'jennifer',
  'apellidos': 'grisales casadiegos',
  'edad': '27',
  'pais': 'colombia',
  'residencia': 'bucaramanga',
  'especialidad cientifica': 'astroparticulas',
  'institucion': 'universidad insdustrial de santander',
  'hobbie': 'rugby y yoga'},
 '@mamaniy': {'nombres': 'yhony',
  'apellidos': 'mamani arce',
  'edad': '26',
  'pais': 'peru',
  'residencia': 'lima',
  'especialidad cientifica': 'fisica del estado solido',
  'institucion': 'universidad nacional mayor de san marcos',
  'hobbie': 'correr'},
 '@acerot': {'nombres': 'tatiana',
  'apellidos': 'acero cuellar',
  'edad': '23',
  'pais': 'colombia',
  'residencia': 'bogota dc',
  'especialidad cientifica': 'mecanica celeste',
  'institucion': 'universidad nacional de colombia',
  'hobbie': 'ver anime, cocinar y senderismo'},
 '@cristian.velandia': {'nombres': 'cristian',
  'apellidos': 'velandia',
  'edad': '27',
  'pais': 'colombia',
  'residencia': 'nan',
  'especialidad cientifica': 'optica',
  'institucion': 'universidad nacional de colombia',
  'hobbie': 'ver anime y los videojuegos'},
 '@carrilloj': {'nombres': 'juan guillermo',
  'apellidos': 'carrillo reyes',
  'edad': '25',
  'pais': 'colombia',
  'residencia': 'bogota dc',
  'especialidad cientifica': 'astronomia',
  'institucion': 'universidad nacional de colombia',
  'hobbie': 'basket y videojuegos'},
 '@teofilo': {'nombres': 'teofilo',
  'apellidos': 'vargas auccalla',
  'edad': '54',
  'pais': 'peru',
  'residencia': 'lima',
  'especialidad cientifica': 'cosmologia',
  'institucion': 'universidad nacional mayor de san marcos',
  'hobbie': 'wing chun kuen'},
 '@juan-pineda': {'nombres': 'juan carlos',
  'apellidos': 'basto pineda',
  'edad': '37',
  'pais': 'colombia',
  'residencia': 'bucaramanga',
  'especialidad cientifica': 'astronomia',
  'institucion': 'universidad insdustrial de santander',
  'hobbie': 'dibujar y caminatas'}}
  • 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)
In [20]:
## CALCULA LA EDAD PROMEDIO DE LOS COMPAS FILTRADO POR PAIS
def ages(dic,pais):
    """ mean ages of compas given a country 
    Args:
        dic (dictionary): compas dictionary
        pais (string): country of interest 

    Returns:
        float: mean age of compas for pais  
        """
    class bcolors:
        FAIL = '\033[91m'
        ENDC = '\033[0m'
     
    if isinstance(dic,dict) and isinstance(pais,str):
        
        import pandas as pd
        import numpy as np 
        import unidecode

        pais=unidecode.unidecode(pais.lower())
        df=pd.DataFrame(compas).transpose()
        
        return np.mean(np.array(df[df.pais==pais].edad,dtype=int))
        
    else:
        print(f"{bcolors.FAIL}FALLO:valores de entrada invalidos{bcolors.ENDC}")

ages(compas,"Colombia")
Out[20]:
29.0
In [7]: