{
 "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
}