Siria Sadeddin
#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'
})
})
## 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}")
info='C:/Users/ECF0124A/Downloads/info.csv'
compas_add(compas,info)
## 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")