{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "qC9XbgbBzYgV" }, "source": [ "# Ejercicios-clase-02-datos" ] }, { "cell_type": "markdown", "metadata": { "id": "CEiGCo_FzQp7" }, "source": [ "***Siria Sadeddin*** " ] }, { "cell_type": "markdown", "metadata": { "id": "nhSYUDX3fNYu" }, "source": [ "# Ejercicio No. 3 - Amigos congueros\n", "\n", "* Entre en contacto con 10 estudiantes del curso de datos y 2 profesores o personal de soporte\n", "de LaConga, uno del curso de datos y otro de afuera, y consulte su nombre completo, su\n", "nombre de usuario en mattermost, edad, pais de origen, ciudad donde residen, su especialidad\n", "científica, nombre del instituto en que estudian/laboran, y un hobbie o afición.\n", "* Cree un diccionario llamado “compas”, donde la llave sea el nombre de usuario en mattermost,\n", "y si depliego el valor almacenado, por ejemplo en compas[“juan-pineda”], lo que obtengo es\n", "a la vez otro diccionario, con las llaves “nombre”, “apellido”, “país”, “residencia”, “edad”,\n", "“institución”, “hobbie”." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "wxxnPu9Hei_w" }, "outputs": [], "source": [ "#UNCOMENT TO INSTALL UNIDECODE\n", "#!pip install unidecode \n", "\n", "## HE CREADO UNA FUNCION QUE TOMA UN DICCIONARIO DE VALORES Y LO AGREGA AL DICIONARIO \"COMPAS\" DE ACUERDO A UNA LLAVE \"USUARIO\"\n", "## PARA ASEGURAR QUE LOS DATOS SEAN CONSISTENTES SE HA HECHO UNA NORMALIZACION DE TEXTOS DE ENTRADA, USANDO LA LIBRERIA UNIDECODE, \n", "## ESTO ELIMINA LAS MAYUSCULAS Y LOS ACENTOS EN EL TEXTO DE ENTRADA, ASEGURANDO QUE SE PUEDA HACER UN ANALISIS DE DATOS POSTERIOR \n", "\n", "\n", "## 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\n", "def add_values_in_dict(compas, key, values):\n", " \"\"\"adds new item to compas dictionary \n", "\n", " Args:\n", " arg[0]: compas old dictionary\n", " arg[1]: new item (single) \n", " arg[2]: new item's information\n", "\n", " Returns:\n", " dictionary: new dictionary of compas\n", " \"\"\"\n", "\n", " import unidecode\n", " class bcolors:\n", " FAIL = '\\033[91m'\n", " ENDC = '\\033[0m'\n", "\n", " valid_items=['nombres', 'apellidos', 'edad', 'pais','residencia', 'especialidad cientifica', 'institucion', 'hobbie']\n", " \n", " values=dict((k.lower(), v.lower()) for k,v in values.items())\n", " \n", " values=dict((unidecode.unidecode(k), unidecode.unidecode(v)) for k,v in values.items())\n", " \n", " if all([k in valid_items for k in values.keys()]) and all([k in values.keys() for k in valid_items]):\n", " \n", " if key not in compas:\n", " compas[key]=dict()\n", " compas[key]=dict(values)\n", " return compas\n", " \n", " else:\n", " print(f\"{bcolors.FAIL}FALLO: el usuario {key} ya fue registrado{bcolors.ENDC}\")\n", " \n", " else: \n", " if not all([k in values.keys() for k in valid_items]):\n", " if len([k for k in valid_items if k not in values.keys()])==1:\n", " print(f\"{bcolors.FAIL}FALLO: el valor {[k for k in valid_items if k not in values.keys()]} es requerido{bcolors.ENDC}\")\n", " else:\n", " print(f\"{bcolors.FAIL}FALLO: los valores {[k for k in valid_items if k not in values.keys()]} son requeridos{bcolors.ENDC}\")\n", "\n", " if not all([k in valid_items for k in values.keys()]):\n", " if len([ k for k,v in values.items() if k not in valid_items])==1:\n", " 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}\")\n", " else:\n", " 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}\")\n", "\n", "compas=dict({'@sadeddins':\n", " dict({'nombres':'siria',\n", " 'apellidos':'Saddedin',\n", " 'edad':'30',\n", " 'pais':'Venezuela',\n", " 'residencia':'Colombia',\n", " 'especialidad cientifica':'data science',\n", " 'institucion':'Universidad Simon Bolivar',\n", " 'hobbie':'Ciencia de datos'\n", " })\n", " })" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "aYCzQ1cRUwfR" }, "outputs": [], "source": [ "## crearemos una funcion que acepte tanto la inclusion de usuarios individuales como de archivos de datos\n", "\n", "def compas_add(*arg):\n", " \"\"\"adds new compas to compas dictionary \n", "\n", " Args:\n", " arg: 2 or 3 arguments\n", " 2 arguments:\n", " arg[0]: compas old dictionary\n", " arg[1]: csv file with new items to add\n", " 3 arguments:\n", " arg[0]: compas old dictionary\n", " arg[1]: new item (single) \n", " arg[2]: new item's information\n", "\n", " Returns:\n", " dictionary: new dictionary of compas\n", " \"\"\"\n", "\n", "\n", " import os\n", " import pandas as pd\n", "\n", " class bcolors:\n", " FAIL = '\\033[91m'\n", " ENDC = '\\033[0m'\n", "\n", " if (len(arg)==3) and all([isinstance(x,str) for x in arg],str):\n", " \n", " return add_values_in_dict(arg[0],arg[1],arg[2])\n", " \n", " elif (len(arg)==2) and (os.path.isfile(arg[1])) and (arg[1].endswith('.csv')):\n", " \n", " users=pd.read_csv(arg[1])\n", " data=[]\n", " compas=arg[0]\n", " \n", " for i in range(len(users)):\n", " datai=[users.loc[i,'Usuario de Mattermost'],[{str(k):str(v) for k,v in zip(users.columns[1:],users.iloc[i,1:])}][0]]\n", " data.append(datai)\n", " \n", " for user in data:\n", " compas=add_values_in_dict(compas,user[0],user[1])\n", " if compas==None:\n", " break\n", " return compas\n", " else:\n", " print(f\"{bcolors.FAIL}FALLO: los valores de entrada no son validos, revise documentacion{bcolors.ENDC}\")\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "927dMxyYYHCl", "outputId": "d1f25b17-47b9-4eeb-b46b-23f6a94c3b22" }, "outputs": [ { "data": { "text/plain": [ "{'@sadeddins': {'nombres': 'siria',\n", " 'apellidos': 'Saddedin',\n", " 'edad': '30',\n", " 'pais': 'Venezuela',\n", " 'residencia': 'Colombia',\n", " 'especialidad cientifica': 'data science',\n", " 'institucion': 'Universidad Simon Bolivar',\n", " 'hobbie': 'Ciencia de datos'},\n", " '@malamboj': {'nombres': 'jorge enrique',\n", " 'apellidos': 'malambo martinez',\n", " 'edad': '39',\n", " 'pais': 'colombia',\n", " 'residencia': 'bogota dc',\n", " 'especialidad cientifica': 'modelaje y simulacion de materiales',\n", " 'institucion': 'universidad nacional de colombia',\n", " 'hobbie': 'talla en madera y ecoturismo'},\n", " '@bermudezj': {'nombres': 'jesus david',\n", " 'apellidos': ' bermudez sanchez',\n", " 'edad': '25',\n", " 'pais': 'colombia',\n", " 'residencia': ' bogota dc',\n", " 'especialidad cientifica': 'nan',\n", " 'institucion': 'universidad nacional de colombia',\n", " 'hobbie': 'senderismo y bicicleta'},\n", " '@andreatugores': {'nombres': 'andrea carolina',\n", " 'apellidos': 'tugores hernandez',\n", " 'edad': '24',\n", " 'pais': 'venezuela',\n", " 'residencia': 'caracas',\n", " 'especialidad cientifica': 'nan',\n", " 'institucion': 'universidad central de venezuela',\n", " 'hobbie': 'tennis'},\n", " '@fernadezn': {'nombres': 'nicolas',\n", " 'apellidos': ' fernandez cinquepalmi',\n", " 'edad': '24',\n", " 'pais': 'argentina',\n", " 'residencia': 'peru',\n", " 'especialidad cientifica': 'ciencia de materiales',\n", " 'institucion': 'universidad nacional mayor de san marcos',\n", " 'hobbie': 'tocar el piano'},\n", " '@grisalej': {'nombres': 'jennifer',\n", " 'apellidos': 'grisales casadiegos',\n", " 'edad': '27',\n", " 'pais': 'colombia',\n", " 'residencia': 'bucaramanga',\n", " 'especialidad cientifica': 'astroparticulas',\n", " 'institucion': 'universidad insdustrial de santander',\n", " 'hobbie': 'rugby y yoga'},\n", " '@mamaniy': {'nombres': 'yhony',\n", " 'apellidos': 'mamani arce',\n", " 'edad': '26',\n", " 'pais': 'peru',\n", " 'residencia': 'lima',\n", " 'especialidad cientifica': 'fisica del estado solido',\n", " 'institucion': 'universidad nacional mayor de san marcos',\n", " 'hobbie': 'correr'},\n", " '@acerot': {'nombres': 'tatiana',\n", " 'apellidos': 'acero cuellar',\n", " 'edad': '23',\n", " 'pais': 'colombia',\n", " 'residencia': 'bogota dc',\n", " 'especialidad cientifica': 'mecanica celeste',\n", " 'institucion': 'universidad nacional de colombia',\n", " 'hobbie': 'ver anime, cocinar y senderismo'},\n", " '@cristian.velandia': {'nombres': 'cristian',\n", " 'apellidos': 'velandia',\n", " 'edad': '27',\n", " 'pais': 'colombia',\n", " 'residencia': 'nan',\n", " 'especialidad cientifica': 'optica',\n", " 'institucion': 'universidad nacional de colombia',\n", " 'hobbie': 'ver anime y los videojuegos'},\n", " '@carrilloj': {'nombres': 'juan guillermo',\n", " 'apellidos': 'carrillo reyes',\n", " 'edad': '25',\n", " 'pais': 'colombia',\n", " 'residencia': 'bogota dc',\n", " 'especialidad cientifica': 'astronomia',\n", " 'institucion': 'universidad nacional de colombia',\n", " 'hobbie': 'basket y videojuegos'},\n", " '@teofilo': {'nombres': 'teofilo',\n", " 'apellidos': 'vargas auccalla',\n", " 'edad': '54',\n", " 'pais': 'peru',\n", " 'residencia': 'lima',\n", " 'especialidad cientifica': 'cosmologia',\n", " 'institucion': 'universidad nacional mayor de san marcos',\n", " 'hobbie': 'wing chun kuen'},\n", " '@juan-pineda': {'nombres': 'juan carlos',\n", " 'apellidos': 'basto pineda',\n", " 'edad': '37',\n", " 'pais': 'colombia',\n", " 'residencia': 'bucaramanga',\n", " 'especialidad cientifica': 'astronomia',\n", " 'institucion': 'universidad insdustrial de santander',\n", " 'hobbie': 'dibujar y caminatas'}}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "info='./info.csv'\n", "compas_add(compas,info)" ] }, { "cell_type": "markdown", "metadata": { "id": "DNJSQjosfgP1" }, "source": [ "* Cree una función que reciba como entrada el diccionario y un país de origen, y retorne las\n", "informaciones completas de todas las personas de ese país, tabuladas en una forma fácil de\n", "entender. -Busque una forma de calcular, a partir del diccionario, el promedio de edad de\n", "todas las personas en él, y una forma de mostrar todas las instituciones (sin repetición)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "M-XLZrpDffhX", "outputId": "45d8c208-4440-4d50-aaa8-ae1fa3f81b54" }, "outputs": [ { "data": { "text/plain": [ "29.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## CALCULA LA EDAD PROMEDIO DE LOS COMPAS FILTRADO POR PAIS\n", "def ages(dic,pais):\n", " \"\"\" mean ages of compas given a country \n", " Args:\n", " dic (dictionary): compas dictionary\n", " pais (string): country of interest \n", "\n", " Returns:\n", " float: mean age of compas for pais \n", " \"\"\"\n", " class bcolors:\n", " FAIL = '\\033[91m'\n", " ENDC = '\\033[0m'\n", " \n", " if isinstance(dic,dict) and isinstance(pais,str):\n", " \n", " import pandas as pd\n", " import numpy as np \n", " import unidecode\n", "\n", " pais=unidecode.unidecode(pais.lower())\n", " df=pd.DataFrame(compas).transpose()\n", " \n", " return np.mean(np.array(df[df.pais==pais].edad,dtype=int))\n", " \n", " else:\n", " print(f\"{bcolors.FAIL}FALLO:valores de entrada invalidos{bcolors.ENDC}\")\n", "\n", "ages(compas,\"Colombia\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "oAUgJGN9vku3" }, "outputs": [], "source": [] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "Tareas_Clase_2", "provenance": [], "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 1 }