diff --git a/LICENSE b/LICENSE index ae6c1ac..8326a8c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ -MIT License -Copyright (c) 2023 Raúl Vela +# MIT License + +## Copyright (c) 2023 RVS Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/PIA/CursoDeepLearning/1Presentacion/LibreriaGradio/t1_gradio_ejemplo.ipynb b/PIA/CursoDeepLearning/1Presentacion/LibreriaGradio/t1_gradio_ejemplo.ipynb new file mode 100644 index 0000000..a8718b6 --- /dev/null +++ b/PIA/CursoDeepLearning/1Presentacion/LibreriaGradio/t1_gradio_ejemplo.ipynb @@ -0,0 +1,202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## Ejemplo de Gradio\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: gradio in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (4.16.0)Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Requirement already satisfied: aiofiles<24.0,>=22.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (23.2.1)\n", + "Requirement already satisfied: altair<6.0,>=4.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (5.2.0)\n", + "Requirement already satisfied: fastapi in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.109.2)\n", + "Requirement already satisfied: ffmpy in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.3.1)\n", + "Requirement already satisfied: gradio-client==0.8.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.8.1)\n", + "Requirement already satisfied: httpx in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.26.0)\n", + "Requirement already satisfied: huggingface-hub>=0.19.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.20.3)\n", + "Requirement already satisfied: importlib-resources<7.0,>=1.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (6.1.1)\n", + "Requirement already satisfied: jinja2<4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (3.1.3)\n", + "Requirement already satisfied: markupsafe~=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (2.1.4)\n", + "Requirement already satisfied: matplotlib~=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (3.8.2)\n", + "Requirement already satisfied: numpy~=1.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (1.26.3)\n", + "Requirement already satisfied: orjson~=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (3.9.13)\n", + "Requirement already satisfied: packaging in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (23.2)\n", + "Requirement already satisfied: pandas<3.0,>=1.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (2.2.0)\n", + "Requirement already satisfied: pillow<11.0,>=8.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (10.2.0)\n", + "Requirement already satisfied: pydantic>=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (2.6.0)\n", + "Requirement already satisfied: pydub in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.25.1)\n", + "Requirement already satisfied: python-multipart in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.0.7)\n", + "Requirement already satisfied: pyyaml<7.0,>=5.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (6.0.1)\n", + "Requirement already satisfied: ruff>=0.1.7 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.2.0)\n", + "Requirement already satisfied: semantic-version~=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (2.10.0)\n", + "Requirement already satisfied: tomlkit==0.12.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.12.0)\n", + "Requirement already satisfied: typer<1.0,>=0.9 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio) (0.9.0)\n", + "Requirement already satisfied: typing-extensions~=4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (4.9.0)\n", + "Requirement already satisfied: uvicorn>=0.14.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio) (0.27.0.post1)\n", + "Requirement already satisfied: fsspec in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio-client==0.8.1->gradio) (2023.12.2)\n", + "Requirement already satisfied: websockets<12.0,>=10.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio-client==0.8.1->gradio) (11.0.3)\n", + "Requirement already satisfied: jsonschema>=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from altair<6.0,>=4.2.0->gradio) (4.21.1)\n", + "Requirement already satisfied: toolz in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from altair<6.0,>=4.2.0->gradio) (0.12.1)\n", + "Requirement already satisfied: filelock in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio) (3.13.1)\n", + "Requirement already satisfied: requests in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio) (2.31.0)\n", + "Requirement already satisfied: tqdm>=4.42.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio) (4.66.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio) (4.47.2)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio) (1.4.5)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas<3.0,>=1.0->gradio) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas<3.0,>=1.0->gradio) (2023.4)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic>=2.0->gradio) (0.6.0)\n", + "Requirement already satisfied: pydantic-core==2.16.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic>=2.0->gradio) (2.16.1)\n", + "Requirement already satisfied: click<9.0.0,>=7.1.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer<1.0,>=0.9->typer[all]<1.0,>=0.9->gradio) (8.1.7)\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio) (0.4.6)\n", + "Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio) (1.5.4)\n", + "Requirement already satisfied: rich<14.0.0,>=10.11.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio) (13.7.0)\n", + "Requirement already satisfied: h11>=0.8 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn>=0.14.0->gradio) (0.14.0)\n", + "Requirement already satisfied: starlette<0.37.0,>=0.36.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from fastapi->gradio) (0.36.3)\n", + "Requirement already satisfied: anyio in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio) (4.2.0)\n", + "Requirement already satisfied: certifi in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio) (2023.11.17)\n", + "Requirement already satisfied: httpcore==1.* in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio) (1.0.2)\n", + "Requirement already satisfied: idna in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio) (3.6)\n", + "Requirement already satisfied: sniffio in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio) (1.3.0)\n", + "Requirement already satisfied: attrs>=22.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (23.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (2023.12.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.33.0)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.13.1)\n", + "Requirement already satisfied: six>=1.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio) (1.16.0)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio) (2.17.2)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->huggingface-hub>=0.19.3->gradio) (3.3.2)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->huggingface-hub>=0.19.3->gradio) (2.1.0)\n", + "Requirement already satisfied: mdurl~=0.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from markdown-it-py>=2.2.0->rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio) (0.1.2)\n" + ] + } + ], + "source": [ + "%pip install gradio" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Gradio es una biblioteca \n", + "# que permite crear rápidamente interfaces de usuario para probar \n", + "# y compartir tus modelos de machine learning.\n", + "\n", + "# gr = alias para la biblioteca Gradio\n", + "import gradio as gr\n", + "\n", + "# Función que recibe un nombre y retorna un mensaje de bienvenida\n", + "def welcome(name):\n", + " # Devuelve un mensaje de bienvenida con el nombre ingresado\n", + " return f'Bienvenido a Python → , {name}!'\n", + "\n", + "# Interface → Clase en la biblioteca Gradio de Python \n", + "# Se utiliza para crear una nueva interfaz de usuario. \n", + "# Puedes proporcionarle varios argumentos para personalizar la interfaz, \n", + "# Como la función que se debe ejecutar cuando el usuario interactúa con la interfaz, \n", + "# los tipos de entrada y salida que debe manejar la interfaz \n", + "\n", + "# fn = funcion que ejecuta la logica del programa en este caso 'welcome'\n", + "# inputs = tipo de entrada en este caso de tipo texto\n", + "# outputs = tipo de salida \"lo que salga de la función\" en este caso de tipo texto\n", + "demo = gr.Interface(fn=welcome, inputs=\"text\", outputs=\"text\")\n", + "\n", + "# Lanzar la interfaz\n", + "demo.launch()" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/CursoDeepLearning/2UnidadLenguaje/t2_named_entity_recognition.ipynb b/PIA/CursoDeepLearning/2UnidadLenguaje/t2_named_entity_recognition.ipynb new file mode 100644 index 0000000..7cdd7ce --- /dev/null +++ b/PIA/CursoDeepLearning/2UnidadLenguaje/t2_named_entity_recognition.ipynb @@ -0,0 +1,234 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## Named Entity Recognition\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: transformers==4.36.2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (4.36.2)Note: you may need to restart the kernel to use updated packages.\n", + "\n", + "Requirement already satisfied: filelock in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (3.13.1)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (0.20.3)\n", + "Requirement already satisfied: numpy>=1.17 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (1.26.3)\n", + "Requirement already satisfied: packaging>=20.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (23.2)\n", + "Requirement already satisfied: pyyaml>=5.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (6.0.1)\n", + "Requirement already satisfied: regex!=2019.12.17 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (2023.12.25)\n", + "Requirement already satisfied: requests in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (2.31.0)\n", + "Requirement already satisfied: tokenizers<0.19,>=0.14 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (0.15.1)\n", + "Requirement already satisfied: safetensors>=0.3.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (0.4.2)\n", + "Requirement already satisfied: tqdm>=4.27 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (4.66.1)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub<1.0,>=0.19.3->transformers==4.36.2) (2023.12.2)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub<1.0,>=0.19.3->transformers==4.36.2) (4.9.0)\n", + "Requirement already satisfied: colorama in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tqdm>=4.27->transformers==4.36.2) (0.4.6)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->transformers==4.36.2) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->transformers==4.36.2) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->transformers==4.36.2) (2.1.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->transformers==4.36.2) (2023.11.17)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: numpy in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (1.26.3)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: torch in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (2.2.0)\n", + "Requirement already satisfied: filelock in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch) (3.13.1)\n", + "Requirement already satisfied: typing-extensions>=4.8.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch) (4.9.0)\n", + "Requirement already satisfied: sympy in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch) (1.12)\n", + "Requirement already satisfied: networkx in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch) (3.2.1)\n", + "Requirement already satisfied: jinja2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch) (3.1.3)\n", + "Requirement already satisfied: fsspec in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch) (2023.12.2)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jinja2->torch) (2.1.4)\n", + "Requirement already satisfied: mpmath>=0.19 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sympy->torch) (1.3.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + } + ], + "source": [ + "%pip install transformers==4.36.2\n", + "%pip install -U numpy\n", + "%pip install torch\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\transformers\\utils\\generic.py:441: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\n", + " _torch_pytree._register_pytree_node(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\keras\\src\\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\transformers\\utils\\generic.py:309: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\n", + " _torch_pytree._register_pytree_node(\n", + "model.safetensors: 100%|██████████| 539M/539M [00:11<00:00, 45.4MB/s] \n", + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\huggingface_hub\\file_download.py:149: UserWarning: `huggingface_hub` cache-system uses symlinks by default to efficiently store duplicated files but your machine does not support them in C:\\Users\\Robot\\.cache\\huggingface\\hub\\models--Davlan--distilbert-base-multilingual-cased-ner-hrl. Caching files will still work but in a degraded version that might require more space on your disk. This warning can be disabled by setting the `HF_HUB_DISABLE_SYMLINKS_WARNING` environment variable. For more details, see https://huggingface.co/docs/huggingface_hub/how-to-cache#limitations.\n", + "To support symlinks on Windows, you either need to activate Developer Mode or to run Python as an administrator. In order to see activate developer mode, see this article: https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development\n", + " warnings.warn(message)\n" + ] + } + ], + "source": [ + "# Importar las librerías necesarias para procesar texto\n", + "# En casi todas las tareas , con casi todos los tipos de datos primero hay que procesarlos\n", + "# Preparamos los datos crudos para el modelo para que los pueda trabajar con ellos\n", + "# Clase : AutoTokenizer → se encargara de dividir el texto en palabras \"tokens\" y convertirlo en un formato que el modelo pueda entender\n", + "# Clase : ModelForSequenceClassification → se encargara de clasificar el texto en una de las categorias que le hemos dado\n", + "from transformers import AutoTokenizer, AutoModelForTokenClassification\n", + "# Clase : pipeline → Concatenar los pasos de tokenización y clasificación para hacer la petición de golpe\n", + "from transformers import pipeline\n", + "\n", + "# Vamos a implementar nuestras clases construyendo nuestro pipeline\n", + "# 1º definiendo nuestro tokenizer\n", + "# 2º definiendo nuestro modelo \n", + "\n", + "# Como estamos trabajando con modelos de Huggin Face vamos a cargar el tokenizer\n", + "# Cargar un tokenizer entrenado por la persona que publico el modelo \n", + "tokenizer = AutoTokenizer.from_pretrained('Davlan/distilbert-base-multilingual-cased-ner-hrl')\n", + "\n", + "# Para el modelo vamos a hacer lo mismo\n", + "model = AutoModelForTokenClassification.from_pretrained('Davlan/distilbert-base-multilingual-cased-ner-hrl')\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'text': 'Mi nombre es David y soy de España',\n", + " 'entities': [{'entity': 'B-PER',\n", + " 'score': 0.9997391,\n", + " 'index': 4,\n", + " 'word': 'David',\n", + " 'start': 13,\n", + " 'end': 18},\n", + " {'entity': 'B-LOC',\n", + " 'score': 0.99918324,\n", + " 'index': 8,\n", + " 'word': 'España',\n", + " 'start': 28,\n", + " 'end': 34}]}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Definir la función que nos permita clasificar el texto de entrada y de salida a traves del pipeline con un diccionario con todas las apariciones de palabras clave que encuentra este texto\n", + "\n", + "# Recibe una cadena de caracteres \n", + "def ner(text):\n", + " # Definir el pipeline que nos permita clasificar el texto mediante la concatenacion el tokenizer y el modelo\n", + " ner_pipeline = pipeline('ner', model=model, tokenizer=tokenizer)\n", + " # Output : Vamos a hacer una llamada que sea el resultado de aplicar la pipeline a nuestro texto Clasificar el texto\n", + " output = ner_pipeline(text)\n", + " # Vamos a hacer un diccionario \n", + " return {'text': text , 'entities': output}\n", + "\n", + "# Hacemos una llamada y lo devolvemos como un tokenizador \n", + "ner('Mi nombre es David y soy de España')" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/CursoDeepLearning/2UnidadLenguaje/t2_named_entity_recognition_con_interface.ipynb b/PIA/CursoDeepLearning/2UnidadLenguaje/t2_named_entity_recognition_con_interface.ipynb new file mode 100644 index 0000000..24da4b6 --- /dev/null +++ b/PIA/CursoDeepLearning/2UnidadLenguaje/t2_named_entity_recognition_con_interface.ipynb @@ -0,0 +1,433 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## Named Entity Recognition\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.Requirement already satisfied: gradio==4.14.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (4.14.0)\n", + "Requirement already satisfied: aiofiles<24.0,>=22.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (23.2.1)\n", + "Requirement already satisfied: altair<6.0,>=4.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (5.2.0)\n", + "Requirement already satisfied: fastapi in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.109.2)\n", + "Requirement already satisfied: ffmpy in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.3.1)\n", + "Requirement already satisfied: gradio-client==0.8.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.8.0)\n", + "Requirement already satisfied: httpx in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.26.0)\n", + "Requirement already satisfied: huggingface-hub>=0.19.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.20.3)\n", + "Requirement already satisfied: importlib-resources<7.0,>=1.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (6.1.1)\n", + "Requirement already satisfied: jinja2<4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (3.1.3)\n", + "Requirement already satisfied: markupsafe~=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (2.1.4)\n", + "Requirement already satisfied: matplotlib~=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (3.8.2)\n", + "Requirement already satisfied: numpy~=1.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (1.26.3)\n", + "Requirement already satisfied: orjson~=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (3.9.13)\n", + "Requirement already satisfied: packaging in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (23.2)\n", + "Requirement already satisfied: pandas<3.0,>=1.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (2.2.0)\n", + "Requirement already satisfied: pillow<11.0,>=8.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (10.2.0)\n", + "Requirement already satisfied: pydantic>=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (2.6.0)\n", + "Requirement already satisfied: pydub in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.25.1)\n", + "Requirement already satisfied: python-multipart in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.0.7)\n", + "Requirement already satisfied: pyyaml<7.0,>=5.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (6.0.1)\n", + "Requirement already satisfied: semantic-version~=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (2.10.0)\n", + "Requirement already satisfied: tomlkit==0.12.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.12.0)\n", + "Requirement already satisfied: typer<1.0,>=0.9 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio==4.14.0) (0.9.0)\n", + "Requirement already satisfied: typing-extensions~=4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (4.9.0)\n", + "Requirement already satisfied: uvicorn>=0.14.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.27.0.post1)\n", + "Requirement already satisfied: fsspec in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio-client==0.8.0->gradio==4.14.0) (2023.12.2)\n", + "Requirement already satisfied: websockets<12.0,>=10.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio-client==0.8.0->gradio==4.14.0) (11.0.3)\n", + "Requirement already satisfied: jsonschema>=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from altair<6.0,>=4.2.0->gradio==4.14.0) (4.21.1)\n", + "Requirement already satisfied: toolz in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from altair<6.0,>=4.2.0->gradio==4.14.0) (0.12.1)\n", + "Requirement already satisfied: filelock in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio==4.14.0) (3.13.1)\n", + "Requirement already satisfied: requests in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio==4.14.0) (2.31.0)\n", + "Requirement already satisfied: tqdm>=4.42.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio==4.14.0) (4.66.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (4.47.2)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (1.4.5)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas<3.0,>=1.0->gradio==4.14.0) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas<3.0,>=1.0->gradio==4.14.0) (2023.4)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic>=2.0->gradio==4.14.0) (0.6.0)\n", + "Requirement already satisfied: pydantic-core==2.16.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic>=2.0->gradio==4.14.0) (2.16.1)\n", + "Requirement already satisfied: click<9.0.0,>=7.1.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer<1.0,>=0.9->typer[all]<1.0,>=0.9->gradio==4.14.0) (8.1.7)\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio==4.14.0) (0.4.6)\n", + "Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio==4.14.0) (1.5.4)\n", + "Requirement already satisfied: rich<14.0.0,>=10.11.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio==4.14.0) (13.7.0)\n", + "Requirement already satisfied: h11>=0.8 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn>=0.14.0->gradio==4.14.0) (0.14.0)\n", + "Requirement already satisfied: starlette<0.37.0,>=0.36.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from fastapi->gradio==4.14.0) (0.36.3)\n", + "Requirement already satisfied: anyio in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (4.2.0)\n", + "Requirement already satisfied: certifi in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (2023.11.17)\n", + "Requirement already satisfied: httpcore==1.* in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (1.0.2)\n", + "Requirement already satisfied: idna in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (3.6)\n", + "Requirement already satisfied: sniffio in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (1.3.0)\n", + "Requirement already satisfied: attrs>=22.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio==4.14.0) (23.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio==4.14.0) (2023.12.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio==4.14.0) (0.33.0)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio==4.14.0) (0.13.1)\n", + "Requirement already satisfied: six>=1.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio==4.14.0) (1.16.0)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio==4.14.0) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio==4.14.0) (2.17.2)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->huggingface-hub>=0.19.3->gradio==4.14.0) (3.3.2)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->huggingface-hub>=0.19.3->gradio==4.14.0) (2.1.0)\n", + "Requirement already satisfied: mdurl~=0.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from markdown-it-py>=2.2.0->rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio==4.14.0) (0.1.2)\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: transformers==4.36.2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (4.36.2)\n", + "Requirement already satisfied: filelock in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (3.13.1)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (0.20.3)\n", + "Requirement already satisfied: numpy>=1.17 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (1.26.3)\n", + "Requirement already satisfied: packaging>=20.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (23.2)\n", + "Requirement already satisfied: pyyaml>=5.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (6.0.1)\n", + "Requirement already satisfied: regex!=2019.12.17 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (2023.12.25)\n", + "Requirement already satisfied: requests in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (2.31.0)\n", + "Requirement already satisfied: tokenizers<0.19,>=0.14 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (0.15.1)\n", + "Requirement already satisfied: safetensors>=0.3.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (0.4.2)\n", + "Requirement already satisfied: tqdm>=4.27 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers==4.36.2) (4.66.1)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub<1.0,>=0.19.3->transformers==4.36.2) (2023.12.2)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub<1.0,>=0.19.3->transformers==4.36.2) (4.9.0)\n", + "Requirement already satisfied: colorama in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tqdm>=4.27->transformers==4.36.2) (0.4.6)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->transformers==4.36.2) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->transformers==4.36.2) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->transformers==4.36.2) (2.1.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->transformers==4.36.2) (2023.11.17)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: numpy in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (1.26.3)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in links: https://download.pytorch.org/whl/torch_stable.html\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR: Could not find a version that satisfies the requirement torch==1.10.0+cu113 (from versions: 2.0.0, 2.0.0+cpu, 2.0.0+cu117, 2.0.0+cu118, 2.0.1, 2.0.1+cpu, 2.0.1+cu117, 2.0.1+cu118, 2.1.0, 2.1.0+cpu, 2.1.0+cu118, 2.1.0+cu121, 2.1.1, 2.1.1+cpu, 2.1.1+cu118, 2.1.1+cu121, 2.1.2, 2.1.2+cpu, 2.1.2+cu118, 2.1.2+cu121, 2.2.0, 2.2.0+cpu, 2.2.0+cu118, 2.2.0+cu121)\n", + "ERROR: No matching distribution found for torch==1.10.0+cu113\n", + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: tensorflow in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (2.15.0)\n", + "Requirement already satisfied: tensorflow-intel==2.15.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow) (2.15.0)\n", + "Requirement already satisfied: absl-py>=1.0.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.1.0)\n", + "Requirement already satisfied: astunparse>=1.6.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.6.3)\n", + "Requirement already satisfied: flatbuffers>=23.5.26 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (23.5.26)\n", + "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (0.5.4)\n", + "Requirement already satisfied: google-pasta>=0.1.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (0.2.0)\n", + "Requirement already satisfied: h5py>=2.9.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (3.10.0)\n", + "Requirement already satisfied: libclang>=13.0.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (16.0.6)\n", + "Requirement already satisfied: ml-dtypes~=0.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (0.2.0)\n", + "Requirement already satisfied: numpy<2.0.0,>=1.23.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.26.3)\n", + "Requirement already satisfied: opt-einsum>=2.3.2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (3.3.0)\n", + "Requirement already satisfied: packaging in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (23.2)\n", + "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (4.23.4)\n", + "Requirement already satisfied: setuptools in c:\\program files\\windowsapps\\pythonsoftwarefoundation.python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (65.5.0)\n", + "Requirement already satisfied: six>=1.12.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.16.0)\n", + "Requirement already satisfied: termcolor>=1.1.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.4.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.6 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (4.9.0)\n", + "Requirement already satisfied: wrapt<1.15,>=1.11.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.14.1)\n", + "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (0.31.0)\n", + "Requirement already satisfied: grpcio<2.0,>=1.24.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.60.0)\n", + "Requirement already satisfied: tensorboard<2.16,>=2.15 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.15.1)\n", + "Requirement already satisfied: tensorflow-estimator<2.16,>=2.15.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.15.0)\n", + "Requirement already satisfied: keras<2.16,>=2.15.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.15.0)\n", + "Requirement already satisfied: wheel<1.0,>=0.23.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from astunparse>=1.6.0->tensorflow-intel==2.15.0->tensorflow) (0.42.0)\n", + "Requirement already satisfied: google-auth<3,>=1.6.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.27.0)\n", + "Requirement already satisfied: google-auth-oauthlib<2,>=0.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (1.2.0)\n", + "Requirement already satisfied: markdown>=2.6.8 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (3.5.2)\n", + "Requirement already satisfied: requests<3,>=2.21.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.31.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (0.7.2)\n", + "Requirement already satisfied: werkzeug>=1.0.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (3.0.1)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (5.3.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (0.3.0)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (4.9)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth-oauthlib<2,>=0.5->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (1.3.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.1.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2023.11.17)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from werkzeug>=1.0.1->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.1.4)\n", + "Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (0.5.1)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<2,>=0.5->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (3.2.2)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + } + ], + "source": [ + "%pip install gradio==4.14.0\n", + "%pip install transformers==4.36.2\n", + "%pip install -U numpy\n", + "# %pip install torch\n", + "%pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f https://download.pytorch.org/whl/torch_stable.html\n", + "%pip install tensorflow\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.2.0+cpu\n", + "WARNING:tensorflow:From C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\keras\\src\\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.\n", + "\n", + "2.15.0\n", + "tensor([[0.0937, 0.9350, 0.0570],\n", + " [0.1840, 0.4525, 0.5048],\n", + " [0.8987, 0.7170, 0.8021],\n", + " [0.3077, 0.5776, 0.5566],\n", + " [0.4702, 0.5037, 0.9864]])\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import torch\n", + "import tensorflow as tf\n", + "print(torch.__version__)\n", + "print(tf.__version__)\n", + "\n", + "x = torch.rand(5, 3)\n", + "print(x)\n", + "\n", + "torch.cuda.is_available()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\transformers\\utils\\generic.py:441: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\n", + " _torch_pytree._register_pytree_node(\n", + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\transformers\\utils\\generic.py:309: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\n", + " _torch_pytree._register_pytree_node(\n" + ] + }, + { + "data": { + "text/plain": [ + "{'text': 'Mi nombre es David y soy de España',\n", + " 'entities': [{'entity': 'B-PER',\n", + " 'score': 0.9997391,\n", + " 'index': 4,\n", + " 'word': 'David',\n", + " 'start': 13,\n", + " 'end': 18},\n", + " {'entity': 'B-LOC',\n", + " 'score': 0.99918324,\n", + " 'index': 8,\n", + " 'word': 'España',\n", + " 'start': 28,\n", + " 'end': 34}]}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Importar las librerías necesarias para procesar texto\n", + "# En casi todas las tareas , con casi todos los tipos de datos primero hay que procesarlos\n", + "# Preparamos los datos crudos para el modelo para que los pueda trabajar con ellos\n", + "# Clase : AutoTokenizer → se encargara de dividir el texto en palabras \"tokens\" y convertirlo en un formato que el modelo pueda entender\n", + "# Clase : ModelForSequenceClassification → se encargara de clasificar el texto en una de las categorias que le hemos dado\n", + "from transformers import AutoTokenizer, AutoModelForTokenClassification\n", + "# Clase : pipeline → Concatenar los pasos de tokenización y clasificación para hacer la petición de golpe\n", + "from transformers import pipeline\n", + "\n", + "# Vamos a implementar nuestras clases construyendo nuestro pipeline\n", + "# 1º definiendo nuestro tokenizer\n", + "# 2º definiendo nuestro modelo \n", + "\n", + "# Como estamos trabajando con modelos de Huggin Face vamos a cargar el tokenizer\n", + "# Cargar un tokenizer entrenado por la persona que publico el modelo \n", + "tokenizer = AutoTokenizer.from_pretrained('Davlan/distilbert-base-multilingual-cased-ner-hrl')\n", + "\n", + "# Para el modelo vamos a hacer lo mismo\n", + "model = AutoModelForTokenClassification.from_pretrained('Davlan/distilbert-base-multilingual-cased-ner-hrl')\n", + "\n", + "# Definir la función que nos permita clasificar el texto de entrada y de salida a traves del pipeline con un diccionario con todas las apariciones de palabras clave que encuentra este texto\n", + "\n", + "# Recibe una cadena de caracteres \n", + "def ner(text):\n", + " # Definir el pipeline que nos permita clasificar el texto mediante la concatenacion el tokenizer y el modelo\n", + " ner_pipeline = pipeline('ner', model=model, tokenizer=tokenizer)\n", + " # Output : Vamos a hacer una llamada que sea el resultado de aplicar la pipeline a nuestro texto Clasificar el texto\n", + " output = ner_pipeline(text)\n", + " # Vamos a hacer un diccionario \n", + " return {'text': text , 'entities': output}\n", + "\n", + "# Hacemos una llamada y lo devolvemos como un tokenizador \n", + "ner('Mi nombre es David y soy de España')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Vamos a hacer una interfaz para que el usuario pueda interactuar con el modelo con la librería gradio\n", + "import gradio as gr\n", + "\n", + "# Vamos a crear y definir la interfaz\n", + "# fn : función que vamos a utilizar para clasificar el texto\n", + "# input : tipo de entrada que vamos a tener\n", + "# output : tipo de salida que vamos a tener con texto resaltado\n", + "# theme : tema que vamos a utilizar para la interfaz con el estilo Glass\n", + "demo = gr.Interface(fn=ner,inputs='text', outputs=gr.HighlightedText() , theme=gr.themes.Glass())\n", + "\n", + "demo.launch()" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/CursoDeepLearning/3UnidadImagen/Explicacion.jpg b/PIA/CursoDeepLearning/3UnidadImagen/Explicacion.jpg new file mode 100644 index 0000000..a856ed2 Binary files /dev/null and b/PIA/CursoDeepLearning/3UnidadImagen/Explicacion.jpg differ diff --git a/PIA/CursoDeepLearning/3UnidadImagen/t3_1_segmentacion_semantica.ipynb b/PIA/CursoDeepLearning/3UnidadImagen/t3_1_segmentacion_semantica.ipynb new file mode 100644 index 0000000..92e1e34 --- /dev/null +++ b/PIA/CursoDeepLearning/3UnidadImagen/t3_1_segmentacion_semantica.ipynb @@ -0,0 +1,118 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## Introducción : Pair Programming 1 : Segmentación Semantica con Hugging Face\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Descargamos las versiones de las librerías que necesitamos\n", + "# Numpy se utiliza para el manejo de arreglos\n", + "%pip install numpy==1.23.5 \n", + "# Matplotlib se utiliza para la generación de gráficas\n", + "%pip install matplotlib==3.4.3" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Gradio es una biblioteca \n", + "# que permite crear rápidamente interfaces de usuario para probar \n", + "# y compartir tus modelos de machine learning.\n", + "\n", + "# gr = alias para la biblioteca Gradio\n", + "import gradio as gr\n", + "\n", + "# Función que recibe un nombre y retorna un mensaje de bienvenida\n", + "def welcome(name):\n", + " # Devuelve un mensaje de bienvenida con el nombre ingresado\n", + " return f'Bienvenido a Python → , {name}!'\n", + "\n", + "# Interface → Clase en la biblioteca Gradio de Python \n", + "# Se utiliza para crear una nueva interfaz de usuario. \n", + "# Puedes proporcionarle varios argumentos para personalizar la interfaz, \n", + "# Como la función que se debe ejecutar cuando el usuario interactúa con la interfaz, \n", + "# los tipos de entrada y salida que debe manejar la interfaz \n", + "\n", + "# fn = funcion que ejecuta la logica del programa en este caso 'welcome'\n", + "# inputs = tipo de entrada en este caso de tipo texto\n", + "# outputs = tipo de salida \"lo que salga de la función\" en este caso de tipo texto\n", + "demo = gr.Interface(fn=welcome, inputs=\"text\", outputs=\"text\")\n", + "\n", + "# Lanzar la interfaz\n", + "demo.launch(share=True)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/CursoDeepLearning/3UnidadImagen/t3_2_segmentacion_semantica.ipynb b/PIA/CursoDeepLearning/3UnidadImagen/t3_2_segmentacion_semantica.ipynb new file mode 100644 index 0000000..b0b0e3a --- /dev/null +++ b/PIA/CursoDeepLearning/3UnidadImagen/t3_2_segmentacion_semantica.ipynb @@ -0,0 +1,430 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## Introducción : Pair Programming 2 : Segmentación Semantica con Hugging Face\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: numpy==1.23.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (1.23.5)Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "^C\n", + "Note: you may need to restart the kernel to use updated packages.\n", + "Looking in links: https://download.pytorch.org/whl/torch_stable.htmlNote: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR: Could not find a version that satisfies the requirement torch==1.10.0+cu113 (from versions: 2.0.0, 2.0.0+cpu, 2.0.0+cu117, 2.0.0+cu118, 2.0.1, 2.0.1+cpu, 2.0.1+cu117, 2.0.1+cu118, 2.1.0, 2.1.0+cpu, 2.1.0+cu118, 2.1.0+cu121, 2.1.1, 2.1.1+cpu, 2.1.1+cu118, 2.1.1+cu121, 2.1.2, 2.1.2+cpu, 2.1.2+cu118, 2.1.2+cu121, 2.2.0, 2.2.0+cpu, 2.2.0+cu118, 2.2.0+cu121)\n", + "ERROR: No matching distribution found for torch==1.10.0+cu113\n", + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR: Ignored the following yanked versions: 4.14.0, 4.25.0\n", + "ERROR: Could not find a version that satisfies the requirement transformers==4.36.3 (from versions: 0.1, 2.0.0, 2.1.0, 2.1.1, 2.2.0, 2.2.1, 2.2.2, 2.3.0, 2.4.0, 2.4.1, 2.5.0, 2.5.1, 2.6.0, 2.7.0, 2.8.0, 2.9.0, 2.9.1, 2.10.0, 2.11.0, 3.0.0, 3.0.1, 3.0.2, 3.1.0, 3.2.0, 3.3.0, 3.3.1, 3.4.0, 3.5.0, 3.5.1, 4.0.0rc1, 4.0.0, 4.0.1, 4.1.0, 4.1.1, 4.2.0, 4.2.1, 4.2.2, 4.3.0rc1, 4.3.0, 4.3.1, 4.3.2, 4.3.3, 4.4.0, 4.4.1, 4.4.2, 4.5.0, 4.5.1, 4.6.0, 4.6.1, 4.7.0, 4.8.0, 4.8.1, 4.8.2, 4.9.0, 4.9.1, 4.9.2, 4.10.0, 4.10.1, 4.10.2, 4.10.3, 4.11.0, 4.11.1, 4.11.2, 4.11.3, 4.12.0, 4.12.1, 4.12.2, 4.12.3, 4.12.4, 4.12.5, 4.13.0, 4.14.1, 4.15.0, 4.16.0, 4.16.1, 4.16.2, 4.17.0, 4.18.0, 4.19.0, 4.19.1, 4.19.2, 4.19.3, 4.19.4, 4.20.0, 4.20.1, 4.21.0, 4.21.1, 4.21.2, 4.21.3, 4.22.0, 4.22.1, 4.22.2, 4.23.0, 4.23.1, 4.24.0, 4.25.1, 4.26.0, 4.26.1, 4.27.0, 4.27.1, 4.27.2, 4.27.3, 4.27.4, 4.28.0, 4.28.1, 4.29.0, 4.29.1, 4.29.2, 4.30.0, 4.30.1, 4.30.2, 4.31.0, 4.32.0, 4.32.1, 4.33.0, 4.33.1, 4.33.2, 4.33.3, 4.34.0, 4.34.1, 4.35.0, 4.35.1, 4.35.2, 4.36.0, 4.36.1, 4.36.2, 4.37.0, 4.37.1, 4.37.2)\n", + "ERROR: No matching distribution found for transformers==4.36.3\n", + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "^C\n", + "Note: you may need to restart the kernel to use updated packages.\n", + "Requirement already satisfied: Pillow==9.4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (9.4.0)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: gradio==4.14.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (4.14.0)Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.3.2 -> 24.0\n", + "[notice] To update, run: C:\\Users\\Robot\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Requirement already satisfied: aiofiles<24.0,>=22.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (23.2.1)\n", + "Requirement already satisfied: altair<6.0,>=4.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (5.2.0)\n", + "Requirement already satisfied: fastapi in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.109.2)\n", + "Requirement already satisfied: ffmpy in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.3.1)\n", + "Requirement already satisfied: gradio-client==0.8.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.8.0)\n", + "Requirement already satisfied: httpx in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.26.0)\n", + "Requirement already satisfied: huggingface-hub>=0.19.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.20.3)\n", + "Requirement already satisfied: importlib-resources<7.0,>=1.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (6.1.1)\n", + "Requirement already satisfied: jinja2<4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (3.1.3)\n", + "Requirement already satisfied: markupsafe~=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (2.1.4)\n", + "Requirement already satisfied: matplotlib~=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (3.8.2)\n", + "Requirement already satisfied: numpy~=1.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (1.23.5)\n", + "Requirement already satisfied: orjson~=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (3.9.13)\n", + "Requirement already satisfied: packaging in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (23.2)\n", + "Requirement already satisfied: pandas<3.0,>=1.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (2.2.0)\n", + "Requirement already satisfied: pillow<11.0,>=8.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (9.4.0)\n", + "Requirement already satisfied: pydantic>=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (2.6.0)\n", + "Requirement already satisfied: pydub in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.25.1)\n", + "Requirement already satisfied: python-multipart in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.0.7)\n", + "Requirement already satisfied: pyyaml<7.0,>=5.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (6.0.1)\n", + "Requirement already satisfied: semantic-version~=2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (2.10.0)\n", + "Requirement already satisfied: tomlkit==0.12.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.12.0)\n", + "Requirement already satisfied: typer<1.0,>=0.9 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio==4.14.0) (0.9.0)\n", + "Requirement already satisfied: typing-extensions~=4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (4.9.0)\n", + "Requirement already satisfied: uvicorn>=0.14.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio==4.14.0) (0.27.0.post1)\n", + "Requirement already satisfied: fsspec in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio-client==0.8.0->gradio==4.14.0) (2023.12.2)\n", + "Requirement already satisfied: websockets<12.0,>=10.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from gradio-client==0.8.0->gradio==4.14.0) (11.0.3)\n", + "Requirement already satisfied: jsonschema>=3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from altair<6.0,>=4.2.0->gradio==4.14.0) (4.21.1)\n", + "Requirement already satisfied: toolz in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from altair<6.0,>=4.2.0->gradio==4.14.0) (0.12.1)\n", + "Requirement already satisfied: filelock in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio==4.14.0) (3.13.1)\n", + "Requirement already satisfied: requests in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio==4.14.0) (2.31.0)\n", + "Requirement already satisfied: tqdm>=4.42.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub>=0.19.3->gradio==4.14.0) (4.66.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (4.47.2)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (1.4.5)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from matplotlib~=3.0->gradio==4.14.0) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas<3.0,>=1.0->gradio==4.14.0) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas<3.0,>=1.0->gradio==4.14.0) (2023.4)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic>=2.0->gradio==4.14.0) (0.6.0)\n", + "Requirement already satisfied: pydantic-core==2.16.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic>=2.0->gradio==4.14.0) (2.16.1)\n", + "Requirement already satisfied: click<9.0.0,>=7.1.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer<1.0,>=0.9->typer[all]<1.0,>=0.9->gradio==4.14.0) (8.1.7)\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio==4.14.0) (0.4.6)\n", + "Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio==4.14.0) (1.5.4)\n", + "Requirement already satisfied: rich<14.0.0,>=10.11.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer[all]<1.0,>=0.9->gradio==4.14.0) (13.7.0)\n", + "Requirement already satisfied: h11>=0.8 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn>=0.14.0->gradio==4.14.0) (0.14.0)\n", + "Requirement already satisfied: starlette<0.37.0,>=0.36.3 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from fastapi->gradio==4.14.0) (0.36.3)\n", + "Requirement already satisfied: anyio in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (4.2.0)\n", + "Requirement already satisfied: certifi in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (2023.11.17)\n", + "Requirement already satisfied: httpcore==1.* in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (1.0.2)\n", + "Requirement already satisfied: idna in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (3.6)\n", + "Requirement already satisfied: sniffio in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx->gradio==4.14.0) (1.3.0)\n", + "Requirement already satisfied: attrs>=22.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio==4.14.0) (23.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio==4.14.0) (2023.12.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio==4.14.0) (0.33.0)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio==4.14.0) (0.13.1)\n", + "Requirement already satisfied: six>=1.5 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio==4.14.0) (1.16.0)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio==4.14.0) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio==4.14.0) (2.17.2)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->huggingface-hub>=0.19.3->gradio==4.14.0) (3.3.2)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests->huggingface-hub>=0.19.3->gradio==4.14.0) (2.1.0)\n", + "Requirement already satisfied: mdurl~=0.1 in c:\\users\\robot\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from markdown-it-py>=2.2.0->rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio==4.14.0) (0.1.2)\n" + ] + } + ], + "source": [ + "# Descargamos las versiones de las librerías que necesitamos\n", + "\n", + "# Numpy se utiliza para el manejo de arreglos\n", + "%pip install numpy==1.23.5 \n", + "\n", + "# Matplotlib se utiliza para la generación de gráficas\n", + "%pip install matplotlib==3.4.3\n", + "\n", + "# Torch es la librería que utilizaremos para el entrenamiento de la red neuronal\n", + "%pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f https://download.pytorch.org/whl/torch_stable.html\n", + "\n", + "# Transformers es la librería que utilizaremos para la generación de texto , el procesamiento del lenguaje natural (PLN) y el manejo de modelos de lenguaje\n", + "%pip install transformers==4.36.3\n", + "\n", + "# Pillow es la librería que utilizaremos para el manejo de imágenes\n", + "%pip install Pillow==9.4.0\n", + "\n", + "# Gradio es la librería que utilizaremos para la creación de la interfaz de usuario\n", + "%pip install gradio==4.14.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Importa varias clases del módulo `transformers` de la biblioteca Hugging Face. \n", + "\n", + "Esta biblioteca proporciona una gran cantidad de modelos preentrenados para tareas de procesamiento del lenguaje natural (NLP).\n", + "\n", + "Aquí está lo que hace cada una de las clases que estás importando:\n", + "\n", + "- `AutoModelForSequenceClassification`: \n", + "\n", + "Esta es una clase de modelo que se utiliza para tareas de clasificación de secuencias, como la clasificación de texto. \n", + "\n", + "Puedes cargar un modelo preentrenado con esta clase y luego usarlo para clasificar secuencias de texto.\n", + "\n", + "- `AutoTokenizer`: \n", + "\n", + "Esta es una clase que se utiliza para tokenizar texto. \n", + "\n", + "La tokenización es el proceso de dividir el texto en piezas más pequeñas llamadas tokens. \n", + "\n", + "Los modelos de NLP necesitan que el texto se tokenice antes de que puedan procesarlo.\n", + "\n", + "- `pipeline`: \n", + "\n", + "Esta es una función que crea una tubería de procesamiento de texto. \n", + "\n", + "Una tubería es una secuencia de pasos de procesamiento que se aplican al texto. \n", + "\n", + "Por ejemplo, una tubería podría incluir la tokenización, el procesamiento del modelo y la conversión de las salidas del modelo en predicciones legibles por humanos.\n", + "\n", + "- `TrainingArguments` y `Trainer`: \n", + "\n", + "Estas son clases que se utilizan para entrenar modelos. \n", + "\n", + "`TrainingArguments` te permite especificar varios argumentos para el entrenamiento, como el número de épocas, el tamaño del lote, la tasa de aprendizaje, etc. \n", + "\n", + "`Trainer` es una clase que realiza el entrenamiento del modelo.\n", + "\n", + "En resumen, importamos varias clases que se utilizan para cargar modelos y tokenizadores, crear tuberías de procesamiento de texto, y entrenar modelos para tareas de clasificación de secuencias." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\transformers\\utils\\generic.py:441: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\n", + " _torch_pytree._register_pytree_node(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\keras\\src\\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\transformers\\models\\segformer\\image_processing_segformer.py:101: FutureWarning: The `reduce_labels` parameter is deprecated and will be removed in a future version. Please use `do_reduce_labels` instead.\n", + " warnings.warn(\n", + "C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\transformers\\utils\\generic.py:309: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\n", + " _torch_pytree._register_pytree_node(\n" + ] + } + ], + "source": [ + "# Al modelo lo vamos a alimentar con imagenes de diferentes tipos , formatos y codificaciones que sean compatible con el modelo\n", + "\n", + "# Retransformamos la imagen a un formato compatible con el modelo\n", + "\n", + "# Importamos la libreria transformers\n", + "from transformers import SegformerImageProcessor, AutoModelForSemanticSegmentation\n", + "\n", + "# Esta línea de código está utilizando la biblioteca `transformers` de Hugging Face para cargar un procesador de imágenes preentrenado llamado `SegformerImageProcessor`.\n", + "# El método `from_pretrained` se utiliza para cargar un modelo o procesador preentrenado desde el repositorio de modelos de Hugging Face. \n", + "# El argumento que se pasa a `from_pretrained` es el identificador del modelo o procesador en el repositorio de modelos. \n", + "# En este caso, el identificador es `\"mattmdjaga/segformer_b2_clothes\"`, que corresponde a un procesador de imágenes preentrenado para trabajar con el modelo SegFormer.\n", + "# Un procesador de imágenes es una herramienta que puede realizar varias transformaciones en las imágenes para prepararlas para el modelo. \n", + "# En este caso, el procesador ha sido entrenado junto con el modelo y sabe cómo transformar las imágenes de la manera que el modelo espera.\n", + "# La línea de código crea una instancia del procesador y la asigna a la variable `processoor`.\n", + "# Esta variable se puede utilizar luego para procesar imágenes antes de pasarlas al modelo para la inferencia.\n", + "# Creamos un objeto de la clase SegformerImageProcessor para procesar la imagen\n", + "processoor = SegformerImageProcessor.from_pretrained(\"mattmdjaga/segformer_b2_clothes\")\n", + "\n", + "# Esta línea de código en Python está utilizando la biblioteca `transformers` de Hugging Face para cargar un modelo preentrenado para la tarea de segmentación semántica.\n", + "# El método `from_pretrained` se utiliza para cargar un modelo preentrenado desde el repositorio de modelos de Hugging Face. \n", + "# El argumento que se pasa a `from_pretrained` es el identificador del modelo en el repositorio de modelos. \n", + "# En este caso, el identificador es `\"mattmdjaga/segformer_b2_clothes\"`, que corresponde a un modelo SegFormer preentrenado para la tarea de segmentación de ropa.\n", + "# La segmentación semántica es una tarea de visión por computadora que implica clasificar cada píxel en una imagen en una de varias clases. \n", + "# En este caso, el modelo que se está cargando ha sido entrenado para la tarea de segmentación de ropa, lo que significa que puede clasificar los píxeles de una imagen en varias categorías de ropa.\n", + "# La línea de código crea una instancia del modelo y la asigna a la variable `model`. \n", + "# Esta variable se puede utilizar luego para hacer inferencias en nuevas imágenes.\n", + "# Cargamos el modelo preentrenado\n", + "model = AutoModelForSemanticSegmentation.from_pretrained(\"mattmdjaga/segformer_b2_clothes\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# La diferencia entre librería y módulo es que una librería es un conjunto de módulos y un módulo es un archivo que contiene código de Python.\n", + "\n", + "# La librería PIL (Python Imaging Library) → librería gratuita que permite la edición de imágenes directamente desde Python\n", + "# Soporta una variedad de formatos, incluyendo los más utilizados como GIF, JPEG y PNG1. Una gran parte del código está escrito en C, para mejorar el rendimiento\n", + "# PIL = librería que utilizaremos para el manejo de imágenes \n", + "# Imagen = Se utiliza para abrir, manipular y guardar muchos tipos de archivos de imagen diferentes.\n", + "from PIL import Image\n", + "\n", + "# La librería requests → Es una librería de Python que permite enviar solicitudes HTTP/1.1.\n", + "# Se usa para enviar solicitudes a través de la red y obtener respuestas.\n", + "import requests\n", + "\n", + "# matplotlib → Es una biblioteca para la generación de gráficos a partir de datos contenidos en listas \n", + "# o arrays en el lenguaje de programación Python y su extensión matemática NumPy.\n", + "# pyplot → Es un módulo de matplotlib que proporciona una forma de graficar datos de forma rápida y sencilla.\n", + "# plt → Es una abreviatura de matplotlib.pyplot\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Torch es la librería que utilizaremos para el entrenamiento de la red neuronal se utiliza para el manejo de tensores\n", + "# nn → Es un módulo que contiene los bloques de construcción para crear y entrenar redes neuronales.\n", + "import torch.nn as nn\n", + "\n", + "# Definimos la url de la imagen que vamos a procesar\n", + "url = \"https://www.chio-lecca.edu.pe/cdn/shop/articles/chio-lecca-blog-estilo-y-moda.jpg?v=1673918894&width=1512\"\n", + "\n", + "# Vamos a construir esta imagen a partir de la url\n", + "# con la libreria requests vamos a hacer una petición a la url y con la libreria PIL vamos a construir la imagen\n", + "# Esta línea de código en Python está utilizando la biblioteca PIL (Pillow) para abrir una imagen desde una URL.\n", + "# Primero, utiliza la biblioteca requests para hacer una solicitud GET a la URL proporcionada. \n", + "# El argumento stream=True en la función get significa que la respuesta se descargará como un flujo de bytes, \n", + "# lo cual es útil cuando estás trabajando con archivos grandes que no quieres cargar completamente en la memoria.\n", + "# El atributo .raw de la respuesta de la solicitud es un objeto de archivo sin procesar que puedes pasar a Image.open. \n", + "# Esta función de la biblioteca PIL se utiliza para abrir una imagen y devolverla como un objeto de imagen de PIL.\n", + "# El resultado es que la imagen en la URL proporcionada se descarga y se abre como un objeto de imagen de PIL, \n", + "# que luego se puede utilizar para varias tareas de procesamiento de imágenes. \n", + "# La imagen abierta se asigna a la variable image.\n", + "image = Image.open(requests.get(url, stream=True).raw)\n", + "\n", + "# Definimos la entrada de la imagen de processoor que definimos anteriormente para procesar la imagen\n", + "# Esta línea de código en Python está utilizando el procesador de imágenes que se cargó anteriormente para procesar una imagen.\n", + "input = processoor(images=image, return_tensors=\"pt\")\n", + "\n", + "# La salida será la de aplicar el modelo a la imagen que procesamos mediante una inferencia a la entrada de la imagen eso se hace desde el modelo\n", + "# Esta línea de código en Python está utilizando el modelo cargado previamente para realizar una inferencia en los datos de entrada.\n", + "# El operador `**` en Python se utiliza para desempaquetar un diccionario en argumentos de palabras clave. En este caso, `input` es un diccionario que contiene los datos de entrada que se pasarán al modelo. Las claves del diccionario son los nombres de los argumentos que el modelo espera, y los valores son los datos correspondientes.\n", + "# La función `model` es una llamada al modelo que hemos cargado previamente (por ejemplo, un modelo de segmentación semántica). Esta función toma los datos de entrada y devuelve las salidas del modelo. En el caso de un modelo de segmentación semántica, las salidas serían las clasificaciones de los píxeles de la imagen de entrada.\n", + "# El resultado de la función `model` se asigna a la variable `outputs`. Esta variable contendrá las salidas del modelo, que luego se pueden utilizar para diversas tareas, como visualizar la segmentación de la imagen o calcular métricas de rendimiento del modelo.\n", + "outputs = model(**input)\n", + "\n", + "# logits = Es la salida del modelo antes de aplicar la función de activación se utiliza para calcular la pérdida y las métricas de rendimiento del modelo y para generar las predicciones.\n", + "# La salida de la imagen se va a visualizar\n", + "logits = outputs.logits.cpu()\n", + "\n", + "# Ahora vamos a hacer un preprocesamiento de la imagen para que sea compatible con el modelo que tenemos entrenado\n", + "\n", + "# upsampled_logits = nn.functional.interpolate(logits, size=image.size, mode=\"bicubic\", align_corners=False)\n", + "\n", + "# Esta línea de código en Python está utilizando la biblioteca PyTorch para realizar una interpolación en los logits de salida del modelo.\n", + "# Esta línea de código en Python está utilizando la función interpolate del módulo nn.functional de PyTorch para redimensionar la imagen de salida del modelo (denotada aquí como logits).\n", + "# La función interpolate se utiliza para cambiar el tamaño de una imagen (o, más generalmente, de un tensor). \n", + "# En este caso, se está utilizando para cambiar el tamaño de la imagen de salida del modelo para que coincida con el tamaño de la imagen original.\n", + "# Los argumentos de la función son los siguientes:\n", + "# logits → Este es el tensor de entrada que se va a redimensionar. En este caso, es la imagen de salida del modelo.\n", + "# size → Este es el tamaño deseado de la imagen de salida. Aquí, se está utilizando el tamaño de la imagen original, que se obtiene con image.size[::1]. \n", + "# El operador de segmentación ::1 se utiliza para invertir el orden de las dimensiones, ya que PyTorch espera las dimensiones en el orden (altura, anchura), mientras que las imágenes de PIL las proporcionan en el orden (anchura, altura).\n", + "# mode → Este es el algoritmo que se utilizará para el redimensionamiento. \n", + "# En este caso, se está utilizando el algoritmo \"bilinear\", que es un método de interpolación bilineal.\n", + "# align_corners → Este argumento determina cómo se alinean los bordes de la imagen de entrada y de salida durante la interpolación. \n", + "# Si es False, los bordes de la imagen de salida se alinean con los píxeles centrales de la imagen de entrada. \n", + "# Si es True, los bordes de la imagen de salida se alinean con los bordes de la imagen de entrada.\n", + "# El resultado de la función interpolate se asigna a la variable upsampled_logits. \n", + "# Esta variable contiene la imagen de salida del modelo redimensionada para que coincida con el tamaño de la imagen original.\n", + "upsampled_logits = nn.funcional.interpolate(logits, \n", + " size=image.size[::1], \n", + " mode=\"bilinear\", \n", + " align_corners=False\n", + " )\n", + "\n", + "# Esta línea de código en Python está utilizando la biblioteca PyTorch para realizar una interpolación en los logits de salida del modelo el cual calcula la probabilidad de que un píxel pertenezca a cada de las clases.\n", + "# Cuando hacemos argmax en la dimensión 1 estamos obteniendo la clase con mayor probabilidad para cada píxel.\n", + "pred_seg = upsampled_logits.argmax(dim=1)[0]\n", + "# Visualizamos la imagen procesada mediante plt.imshow el cual muestra el resultado de la segmentación semántica\n", + "plt.imshow(pred_seg)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/PlantillaBasica/PlantillaBasico.ipynb b/PIA/PlantillaBasica/PlantillaBasico.ipynb new file mode 100644 index 0000000..3d454ea --- /dev/null +++ b/PIA/PlantillaBasica/PlantillaBasico.ipynb @@ -0,0 +1,26 @@ +{ + "cells": [], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/UT01/.vscode/launch.json "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/.vscode/launch.json" similarity index 100% rename from PIA/UT01/.vscode/launch.json rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/.vscode/launch.json" diff --git a/PIA/UT01/1_Teoria/00_firsts_steps_with_python.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/00_firsts_steps_with_python.ipynb" similarity index 60% rename from PIA/UT01/1_Teoria/00_firsts_steps_with_python.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/00_firsts_steps_with_python.ipynb" index e6b3149..7e521e8 100644 --- a/PIA/UT01/1_Teoria/00_firsts_steps_with_python.ipynb +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/00_firsts_steps_with_python.ipynb" @@ -1,35 +1,19 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, "source": [ "## Primer programa con Python.\n", "\n", "Usaremos la función print() que veremos más adelante con profundidad." - ], - "metadata": { - "id": "X2Q3sYvlbzpm" - } + ] }, { "cell_type": "code", - "source": [ - "print('Hola Mundo')" - ], + "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -37,25 +21,60 @@ "id": "90Pbp_fZb4im", "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" }, - "execution_count": null, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Hola Mundo\n" ] } + ], + "source": [ + "print('Hola Mundo')" ] }, { "cell_type": "code", - "source": [], + "execution_count": 3, "metadata": { "id": "bCwMfoCvb6dq" }, - "execution_count": null, - "outputs": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Python\n" + ] + } + ], + "source": [ + "print(\"Python\")" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/UT01/1_Teoria/01_Datos_y_Tipos_de_Datos.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/01_Datos_y_Tipos_de_Datos.ipynb" similarity index 91% rename from PIA/UT01/1_Teoria/01_Datos_y_Tipos_de_Datos.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/01_Datos_y_Tipos_de_Datos.ipynb" index 3a4cb87..8ae8351 100644 --- a/PIA/UT01/1_Teoria/01_Datos_y_Tipos_de_Datos.ipynb +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/01_Datos_y_Tipos_de_Datos.ipynb" @@ -6,7 +6,8 @@ "id": "PaQOPX2RDbKx" }, "source": [ - "*Visto*\n", + "# ✅\n", + "\n", "## **Tipos de Datos Básicos** \n", "\n", "### Datos y Tipos de Datos\n", @@ -30,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -48,6 +49,7 @@ } ], "source": [ + "# ❤\n", "my_var = 5\n", "\n", "print(my_var)" @@ -70,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -89,6 +91,7 @@ } ], "source": [ + "# ❤\n", "a = 30\n", "b = 5\n", "\n", @@ -151,19 +154,11 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "False\n" - ] - } - ], + "outputs": [], "source": [ + "# ❤\n", "# Operadores de pertenencia\n", "\n", "lista = [1 , 2 , 3 , 4 , 5 ]\n", @@ -186,12 +181,16 @@ "* Tipos númericos\n", " * Tipo entero (int)\n", " * Tipo real (float)\n", + "\n", "* Tipos booleanos (bool)\n", + "\n", "* Tipo de datos secuencia\n", " * Tipo lista (list)\n", " * Tipo tuplas (tuple)\n", + "\n", "* Tipo de datos cadenas de caracteres\n", " * Tipo cadena (str)\n", + "\n", "* Tipo de datos mapas o diccionario (dict)" ] }, @@ -205,21 +204,9 @@ "id": "yB5Sf_jf8RV-", "outputId": "a2d9d019-8258-4e99-f092-757f42669d3d" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ + "# ❤\n", "print(type(5))\n", "\n", "print(type(5.5))\n", @@ -256,7 +243,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.11.7" } }, "nbformat": 4, diff --git a/PIA/UT01/1_Teoria/01x_Extructura_de_Datos_y_Tipos.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/01_Estructura_de_Datos_y_Tipos.ipynb" similarity index 99% rename from PIA/UT01/1_Teoria/01x_Extructura_de_Datos_y_Tipos.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/01_Estructura_de_Datos_y_Tipos.ipynb" index 30c09e5..ca4fab2 100644 --- a/PIA/UT01/1_Teoria/01x_Extructura_de_Datos_y_Tipos.ipynb +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/01_Estructura_de_Datos_y_Tipos.ipynb" @@ -6,7 +6,8 @@ "id": "PaQOPX2RDbKx" }, "source": [ - "**visto**\n", + "# ✅\n", + "\n", "## **Estructura de Datos**\n", "\n", "### Datos y Tipos de Datos\n", diff --git "a/PIA/UT01/1_Teoria/02_Tipos_de_Datos_Num\303\251ricos.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/02_Tipos_de_Datos_Num\303\251ricos.ipynb" similarity index 100% rename from "PIA/UT01/1_Teoria/02_Tipos_de_Datos_Num\303\251ricos.ipynb" rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/02_Tipos_de_Datos_Num\303\251ricos.ipynb" diff --git a/PIA/UT01/1_Teoria/03_Tipos_de_Datos_Booleanos.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/03_Tipos_de_Datos_Booleanos.ipynb" similarity index 100% rename from PIA/UT01/1_Teoria/03_Tipos_de_Datos_Booleanos.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/03_Tipos_de_Datos_Booleanos.ipynb" diff --git a/PIA/UT01/1_Teoria/04_Trabajo_con_variables_python.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/04_Trabajo_con_variables_python.ipynb" similarity index 100% rename from PIA/UT01/1_Teoria/04_Trabajo_con_variables_python.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/04_Trabajo_con_variables_python.ipynb" diff --git a/PIA/UT01/1_Teoria/05_Entrada_Salida_Standard_operaciones_de_cadena.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/05_Entrada_Salida_Standard_operaciones_de_cadena.ipynb" similarity index 100% rename from PIA/UT01/1_Teoria/05_Entrada_Salida_Standard_operaciones_de_cadena.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/05_Entrada_Salida_Standard_operaciones_de_cadena.ipynb" diff --git a/PIA/UT01/1_Teoria/07_Estructuras_de_control_alternativas.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/07_Estructuras_de_control_alternativas.ipynb" similarity index 100% rename from PIA/UT01/1_Teoria/07_Estructuras_de_control_alternativas.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/07_Estructuras_de_control_alternativas.ipynb" diff --git a/PIA/UT01/1_Teoria/09_Estructuras_de_control_repetitivas_while.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/09_Estructuras_de_control_repetitivas_while.ipynb" similarity index 100% rename from PIA/UT01/1_Teoria/09_Estructuras_de_control_repetitivas_while.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/09_Estructuras_de_control_repetitivas_while.ipynb" diff --git a/PIA/UT01/1_Teoria/10_Estructuras_de_control_repetitivas_for.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/10_Estructuras_de_control_repetitivas_for.ipynb" similarity index 100% rename from PIA/UT01/1_Teoria/10_Estructuras_de_control_repetitivas_for.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/10_Estructuras_de_control_repetitivas_for.ipynb" diff --git a/PIA/UT01/1_Teoria/11_Contadores_acumuladores_e_indicadores.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/11_Contadores_acumuladores_e_indicadores.ipynb" similarity index 79% rename from PIA/UT01/1_Teoria/11_Contadores_acumuladores_e_indicadores.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/11_Contadores_acumuladores_e_indicadores.ipynb" index f19b95b..aa64064 100644 --- a/PIA/UT01/1_Teoria/11_Contadores_acumuladores_e_indicadores.ipynb +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/11_Contadores_acumuladores_e_indicadores.ipynb" @@ -61,6 +61,23 @@ "print(\"Has introducido \",cont,\" números pares.\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "\n", + "cont = 0\n", + "for var in range(1,6):\n", + " num = random.randint(1,10)\n", + " print(\"Numero introducido : \" , num)\n", + " if num % 2 == 0:\n", + " cont += 1\n", + "print(\"Has introducido \" , cont , \" numeros pares\")" + ] + }, { "cell_type": "markdown", "metadata": { @@ -69,9 +86,13 @@ "source": [ "### Acumuladores\n", "\n", + "* Un acumulador es una variable que se utiliza para almacenar el resultado de una operación que se repite en un bucle\n", + "\n", "Siempre inicializado a 1 siempre\n", "\n", - "Un acumulador es una variable numérica que permite ir acumulando resultados de operaciones. **Me permite ir haciendo operaciones parciales**.\n", + "Un acumulador es una variable numérica que permite ir acumulando resultados de operaciones. \n", + " \n", + " * **Me permite ir haciendo operaciones parciales**.\n", "\n", "Un acumulador:\n", "\n", @@ -86,9 +107,19 @@ " acum += num\n", " ```\n", "\n", - " ### Ejemplo\n", + "### Ejemplo\n", + "\n", + "Introducir 5 números y sumar los números pares.\n", + "\n", + "* Ejemplos de uso de acumuladores:\n", + "\n", + "* Calcular la media de una lista de números\n", + "\n", + "* Calcular el número de elementos en una lista\n", + "\n", + "* Calcular el producto de los elementos de una lista\n", "\n", - " Introducir 5 números y sumar los números pares." + "* Calcular el factorial de un número\n" ] }, { diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/13_Cadenas_de_caracteres_en_Python.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/13_Cadenas_de_caracteres_en_Python.ipynb" new file mode 100644 index 0000000..01db887 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/13_Cadenas_de_caracteres_en_Python.ipynb" @@ -0,0 +1,883 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "W9Gdw-6MCll2" + }, + "source": [ + "# **Cadenas de Caracteres**\n", + "\n", + "Como vimos en sesiones anteriores, las cadenas de caracteres (str): Nos permiten guardar secuencias de caracteres.\n", + "\n", + "Además de realizar estas operaciones que ya hemos estudiado:\n", + "\n", + "* **Concatenación: +**: El operador + me permite unir datos de tipos secuenciales, en este caso dos cadenas de caracteres.\n", + "* **Repetición:*** : El operador * me permite repetir un dato de un tipo secuencial, en este caso de cadenas de caracteres.\n", + "* **Indexación**: Puedo obtener el dato de una secuencia indicando la posición en la secuencia. En este caso puedo obtener el carácter de la cadena indicando la posición (**empezando por la posición 0**).\n", + "\n", + "**Para obtener la longitud de una cadena** (número de caracteres que tiene), utilizamos la función **len**." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BqQDuQxXChOf", + "outputId": "33af9a91-b2f5-4e78-c8cc-3fecad5ea064" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Concatenación: Hola que talHola que tal\n", + "Repetición: Hola que talHola que talHola que tal\n", + "Indexación: Ho\n", + "Longitud de la cadena (len): 12\n" + ] + } + ], + "source": [ + "cadena = \"Hola que tal\"\n", + "\n", + "print('Concatenación: ' + cadena + cadena)\n", + "\n", + "print('Repetición: ' + cadena*3)\n", + "\n", + "print('Indexación: ' + cadena[0] + cadena[1])\n", + "\n", + "print('Longitud de la cadena (len): ' + str(len(cadena)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jeG5Y8-GDmkf" + }, + "source": [ + "### Tenemos más operaciones que podemos realizar:\n", + "\n", + "\n", + "\n", + "* Las cadenas se pueden recorrer\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mW1j36y5FhaS", + "outputId": "4fca5977-1dee-471d-cbfd-e29fa9c9b808" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "informática" + ] + } + ], + "source": [ + "cadena = 'informática'\n", + "\n", + "for caracter in cadena:\n", + " print(caracter, end=\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cadena larga" + ] + } + ], + "source": [ + "cadenas = 'cadena larga'\n", + "\n", + "for i in range(0,len(cadenas)):\n", + " print(cadenas[i], end=\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wtTzLLat-MyV" + }, + "source": [ + "\n", + "\n", + "* **Operadores de pertenencia**: Se puede comprobar si un elemento (subcadena) pertenece o no a una cadena de caracteres con los operadores **in** y **not in**.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Lyw9kMTQ-qHy", + "outputId": "6a5410e5-7991-4dfb-ff02-d59097ac6cd8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "cadena = 'informática'\n", + "cadena = 'String'\n", + "\n", + "print('a' in cadena)\n", + "\n", + "print('p' in cadena)\n", + "\n", + "print('p' not in cadena)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RvaiePCVO1PE" + }, + "source": [ + "* ``Slice`` (rebanada): Puedo obtener una subcadena de la cadena de caracteres.\n", + " * Se indica el carácter inicial, y el carácter final, además podemos indicar opcionalmente un salto. \n", + " * Si no se indica el carácter inicial se supone que es desde el primero, sino se indica el carácter final se supone que es hasta el final.\n", + " * Por último podemos usar salto negativo para empezar a contar desde el final.\n", + "\n", + "Como resumen de las distintas posibilidades podemos indicar:\n", + "\n", + " * **cadena[:]** # Todos Los elementos\n", + " * **cadena[start:]** # Elementos desde la posición ``start`` hasta el final\n", + " * **cadena[:end]** # Elementos desde el principio hasta la posición ``end-1``\n", + " * **cadena[start:end]** # Elementos desde la posición ``start`` hasta ``end-1``\n", + " * **cadena[start:end:step]** # Igual que el anterior pero dando ``step`` saltos.\n", + "\n", + " Veamos algunos ejemplos:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wkgi7mmBPn4A", + "outputId": "c2c60a04-47b8-42c3-8500-ace74d195163" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "for\n", + "frá\n", + "infor\n", + "mática\n", + "\n", + "acitámrofni\n" + ] + } + ], + "source": [ + "print(cadena[2:5])\n", + "\n", + "# posición 2 hasta la 6 dando saltos de 2 en 2\n", + "print(cadena[2:7:2])\n", + "\n", + "print(cadena[:5])\n", + "\n", + "print(cadena[5:])\n", + "# desde el final hasta el inició - inveso\n", + "print(cadena[-1:-3])\n", + "# Invertir la cadena\n", + "print(cadena[::-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Toda la cadena : Enumerating\n", + "Cadena inversa : gnitaremunE\n" + ] + } + ], + "source": [ + "# 012345\n", + "nueva_cadena = \"String\"\n", + "\n", + "print('Palabra a mostrar : ', nueva_cadena)\n", + "\n", + "print('Toda la cadena : ', nueva_cadena[:])\n", + "print('Cadena inversa : ', nueva_cadena[::-1])\n", + "print('Contar hasta la posicion 5 : ', nueva_cadena[5:])\n", + "print('Eliminar un caracter en concreto : ', nueva_cadena[:5])\n", + "print('Selecciona el principio y el final : ', nueva_cadena[-1:-5])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3g-VPkifQQ6o" + }, + "source": [ + "## Conversión de tipos\n", + "\n", + "Podemos convertir cualquier número en una cadena de caracteres utilizando la función **str**:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bVUlvFFhQWx0", + "outputId": "8ec63a12-10e2-41bd-cb28-169f4c77e693" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "7.8\n" + ] + } + ], + "source": [ + "strnum = str(7.8)\n", + "\n", + "print(type(strnum))\n", + "\n", + "print(strnum)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bUkTQx7QQvW7" + }, + "source": [ + "# **Las cadenas de caracteres son inmutables**\n", + "\n", + "Cuando creamos una variable de tipo cadena de caracteres, estamos creando un **objeto** de la clase **str**.\n", + "\n", + "Se trata de una clase especifica que podemos guardar en un tipo de datos y lleva asociados una serie de operaciones que pueden realizar.\n", + "\n", + "Cada vez que creamos una variable de una determinada clase, creamos un **objeto**, que además de guardar información ``(en nuestro caso los caracteres de la cadena)`` puede realizar distintas operaciones que llamamos **métodos**.\n", + "\n", + "**Nosotros ya hemos usado un método de la clase str**. El método **upper()** nos permite convertir la cadena a mayúsculas.\n", + "\n", + "## **Pero ¿Qué significa que las cadenas de caracteres son inmutables?**\n", + "No podemos cambiar los caracteres de una cadena de la siguiente forma:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 245 + }, + "id": "LRrqrhjPSJAB", + "outputId": "625d7614-bde7-47dd-8588-70cc8dea71cd" + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "ignored", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mcadena\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'informática'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mcadena\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'g'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcadena\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" + ] + } + ], + "source": [ + "cadena = 'informática'\n", + "\n", + "cadena[2] = 'g'\n", + "\n", + "print(cadena)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "q5t2lTZeSZ7F" + }, + "source": [ + "Esto implica que al usar un método la cadena original no cambia, el método devuelve otra cadena modificada.\n", + "\n", + "Veamos un ejemplo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eLguCt1LSbgR", + "outputId": "8d145400-5b5a-4837-af98-808887ac1f99" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFORMÁTICA\n", + "informática\n" + ] + } + ], + "source": [ + "cadena = 'informática'\n", + "\n", + "print(cadena.upper())\n", + "\n", + "print(cadena)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qjJ8EFcVTHJG" + }, + "source": [ + "# **Métodos principales de cadenas**\n", + "\n", + "Aunque las cadenas de caracteres tiene muchos métodos definidos, vamos a estudiar los más importantes:\n", + "\n", + "## **Métodos de Formato**\n", + "\n", + "* **capitalize()** nos permite devolver la cadena con el primer carácter en mayúsculas." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "W_NcQeTETXmn", + "outputId": "8519aea8-9c61-4983-8cc0-2a68bf729a91" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hola, ¿como estás?\n" + ] + } + ], + "source": [ + "cadena = \"hola, ¿como estás?\"\n", + "print(cadena.capitalize())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5Sc6n_h4TdkW" + }, + "source": [ + "* **lower() y upper()** convierte la cadena de caracteres en minúsculas y mayúsculas respectivamente." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FvDCu0aPTc2c", + "outputId": "aef14bbf-80b7-41a9-a0ed-dd4c6e034166" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hola mundo\n", + "HOLA MUNDO\n" + ] + } + ], + "source": [ + "cadena = \"Hola Mundo\"\n", + "\n", + "print(cadena.lower())\n", + "\n", + "print(cadena.upper())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tSQbhkCoT8ih" + }, + "source": [ + "* **swapcase()**: devuelve una cadena nueva con las minúsculas convertidas a mayúsculas y viceversa. (Yo no termino de verle la utilidad pero bueno, ahí está)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Qgx15JyYUFWG", + "outputId": "392c3920-f0a2-404c-d1f3-22f8a9eca472" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hOLA mUNDO\n" + ] + } + ], + "source": [ + "print(cadena.swapcase())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qUDQcMpVUOPk" + }, + "source": [ + "* **title()**: Devuelve una cadena con los primeros caracteres en mayúsculas de cada palabra." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cu_VsRWMUR__", + "outputId": "c7af228c-1954-4f28-c45a-f1b846871dda" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Esto Es Una Cadena De Caracteres\n" + ] + } + ], + "source": [ + "cadena = \"esto es una cadena de caracteres\"\n", + "\n", + "print(cadena.title())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zk-Al0tHVFKZ" + }, + "source": [ + "## **Métodos de Búsqueda**\n", + "\n", + "* **`count()`**: Es un método al que indicamos como parámetro una subcadena y cuenta cuantas apariciones hay de esa subcadena en la cadena." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hm71jlhmVOY3", + "outputId": "39711068-8eb3-418a-90e2-5b8a5d64be56" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n" + ] + } + ], + "source": [ + "cadena = \"bienvenido a mi aplicación\"\n", + "\n", + "print(cadena.count('a'))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "csWxUmafVZLA" + }, + "source": [ + "Además podemos indicar otro parámetro para indicar la posición desde la que queremos iniciar la búsqueda. Y otro parámetro optativo para indicar la posición final de búsqueda." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pc2i0lX7VjcA", + "outputId": "b9049351-4a9d-4cbe-9816-b8d584e1dbb7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n" + ] + } + ], + "source": [ + "print(cadena.count(\"a\",16))\n", + "print(cadena.count('a',10,16))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zRNvkXjlV03C" + }, + "source": [ + "* **find()** nos devuelve la posición de la subcadena que hemos indicado como parámetro. Si no se encuentra devuelve -1." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aui6tgN0WAH5", + "outputId": "e762806a-ce84-45f9-b551-035d82644eeb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13\n", + "-1\n" + ] + } + ], + "source": [ + "print(cadena.find('mi'))\n", + "print(cadena.find('hola'))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Zm4sZjoVWPIK" + }, + "source": [ + "## **Métodos de Validación**\n", + "\n", + "* **startswith()**: nos indica con un valor lógico si la cadena empieza por la subcadena que hemos indicado como parámetro. Podemos indicar también con otro parámetro la posición donde tiene que buscar." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Cs0v3ZpAWYaX", + "outputId": "26a3fcea-8148-418d-945f-8fc0696c6341" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "print(cadena.startswith('b'))\n", + "\n", + "print(cadena.startswith('m'))\n", + "\n", + "print(cadena.startswith('m',13))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vo4awgh_Wwz9" + }, + "source": [ + "* **endswith()** igual que la anterior pero indica si la cadena termina con la subcadena indicada. En este caso, se puede indicar la posición de inicio y final de búsqueda." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "w8npVeS3W1Ed", + "outputId": "d9b49a81-308c-489a-d8fb-fff79aaed3b2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "print(cadena.endswith('ción'))\n", + "\n", + "print(cadena.endswith(\"ción\",0,10))\n", + "\n", + "print(cadena.endswith(\"nido\",0,10))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aKToPap_XaIm" + }, + "source": [ + "## **Métodos de Sustitución**\n", + "\n", + "* **replace()**: Devuelve una cadena donde se ha sustituido las apariciones de la primera subcadena indicada por la segunda subcadena indicada como parámetro.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "YJAWF7P_XyA4", + "outputId": "d4e3a6c1-0ae8-479e-f22d-3946c0fcee1d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Estimado Sr. Manu Rodríguez:\n" + ] + } + ], + "source": [ + "buscar = \"nombre apellido\"\n", + "reemplazar = \"Manu Rodríguez\"\n", + "\n", + "print (\"Estimado Sr. nombre apellido:\".replace(buscar, reemplazar))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A0jLcE_Y7DUk" + }, + "source": [ + "* **strip()**: Devuelve una cadena donde se han quitado los espacios del principio y del final. Si indicamos una subcadena como parámetro quitará dicha subcadena del principio y del final." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "uzRw-Awc7IWu", + "outputId": "194b8437-66e4-4310-ad67-3326a1fb3746" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "www.iesalandalus.org\n", + "123\n" + ] + } + ], + "source": [ + "cadena = \" www.iesalandalus.org \"\n", + "\n", + "print(cadena.strip())\n", + "\n", + "cadena = \"00000000123000000000000\"\n", + "\n", + "print(cadena.strip('0'))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "46oRpZr67o1e" + }, + "source": [ + "## **Métodos de unión y división**\n", + "\n", + "aunque todavía no lo hemos estudiado, el método **split()** nos permite convertir una cadena en una lista. Lo usaremos más adelante.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Wkkj9Fzo8OnP", + "outputId": "b9e998ca-ee59-404c-b92d-9c38807857cf" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['14', '37', '23']\n", + "\n" + ] + } + ], + "source": [ + "hora = \"14:37:23\"\n", + "\n", + "print(hora.split(':')) \n", + "\n", + "print(type(hora.split(':')))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VF3guwA68gx_" + }, + "source": [ + "* **splitlines()**: Nos permite separar las líneas que hay en una cadena (indicada con el carácter \\n) en una lista." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "oUD4ScXp8lgr", + "outputId": "a9503147-4846-4cf4-fe16-62c11ccc9253" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cadena 1 \n", + " Cadena 2 \n", + " Cadena 3\n", + "['Cadena 1 ', ' Cadena 2 ', ' Cadena 3']\n" + ] + } + ], + "source": [ + "multi = \"Cadena 1 \\n Cadena 2 \\n Cadena 3\"\n", + "\n", + "print(multi)\n", + "\n", + "print(multi.splitlines())" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/15_Introducci\303\263n_a_las_Listas_en_Python.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/15_Introducci\303\263n_a_las_Listas_en_Python.ipynb" new file mode 100644 index 0000000..112dd1e --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/15_Introducci\303\263n_a_las_Listas_en_Python.ipynb" @@ -0,0 +1,488 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Accv8mAE1oP3" + }, + "source": [ + "# Listas en Python\n", + "\n", + "Si queremos guardar un conjunto de valores, en pseudocódigo utilizamos los arreglos.\n", + "\n", + "Un array (o arreglo) es una estructura de datos con elementos homogéneos, del mismo tipo, numérico o alfanumérico, reconocidos por un nombre en común.\n", + "\n", + "Hay muchos lenguajes que implementan los arrays, pero esta estructura tiene dos limitaciones: **son homogéneas**, es decir sólo se pueden guardar datos del mismo tipo, y **son estáticas**, a la hora de declarar se indican las posiciones y la longitud del array no se puede cambiar durante la ejecución del programa.\n", + "\n", + "**En Python no existen los arrays**, tenemos varios tipos de datos que nos permiten guardar conjuntos de informaciones.\n", + "\n", + "En este notebook vamos a estudiar las Listas.\n", + "\n", + "Las listas (list) **me permiten guardar un conjunto de datos que se pueden repetir y que pueden ser de distintos tipos**. Además esta estructura **es dinámica**, en cualquier momento de la ejecución del programa puedo añadir o eliminar elementos de la lista.\n", + "\n", + "## 1. Construcción de una lista\n", + "Para crear una lista puedo usamos los caracteres [ y ]:\n", + "\n", + "```\n", + "lista1 = []\n", + "lista2 = [\"a\",1,True]\n", + "```\n", + "\n", + "\n", + "## 2. Operaciones básicas con listas\n", + "\n", + "Las listas son secuencias, a las que podemos realizar las siguientes operaciones. Vamos a ver distintos ejemplos partiendo de la siguiente lista:\n", + "\n", + "\n", + "```\n", + "lista = [1,2,3,4,5,6]\n", + "```\n", + "\n", + "\n", + "### Las listas se pueden recorrer:\n", + "\n", + "\n", + "\n", + "```\n", + " for num in lista:\n", + " print(num,end=\"\")\n", + " 1123456\n", + "```\n", + "\n", + "\n", + "Con la instrucción for podemos recorrer más de una lista, utilizando la **función zip**. Veamos un ejemplo:\n", + "\n", + "\n", + "```\n", + " lista2 = [\"a\",\"b\",\"c\",\"d\",\"e\"]\n", + " for num,letra in zip(lista,lista2):\n", + " ... print(num,letra)\n", + " ...\n", + " 1 a\n", + " 2 b\n", + " 3 c\n", + " 4 d\n", + " 5 e\n", + "```\n", + "\n", + "\n", + "**Operadores de pertenencia**: Se puede comprobar si un elemento pertenece o no a una lista con los operadores in y not in.\n", + "\n", + " ```\n", + " >>> 2 in lista\n", + " True\n", + " >>> 8 not in lista\n", + " True\n", + " ```\n", + "**Concatenación**: El operador + me permite unir datos de tipos listas:\n", + "\n", + " ```\n", + " >>> lista + [7,8,9]\n", + " [1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + " ```\n", + "**Repetición**: El operador * me permite repetir un dato de una lista:\n", + "\n", + " ```\n", + " >>> lista * 2\n", + " [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]\n", + " ```\n", + "**Indexación**: Puedo obtener el dato de una secuencia indicando la posición en la secuencia.\n", + "\n", + " ```\n", + " >>> lista[3]\n", + " 4\n", + " ```\n", + "Cada elemento tiene un índice, empezamos a contar por el elemento en el índice 0. Si intento acceder a un índice que corresponda a un elemento que no existe obtenemos una excepción IndexError.\n", + "\n", + " ```\n", + " >>> lista1[12]\n", + " Traceback (most recent call last):\n", + " File \"\", line 1, in >> lista[-1]\n", + " 6\n", + " ```\n", + "\n", + "**Slice (rebanada)**: Puedo obtener una subsecuencia de los datos de una lista. Funciona de forma similar como en las cadenas, veamos algunos ejemplos:\n", + "\n", + " ```\n", + " >>> lista[2:4]\n", + " [3, 4]\n", + " >>> lista[1:4:2]\n", + " [2, 4]\n", + " >>> lista[:5]\n", + " [1, 2, 3, 4, 5]\n", + " >>> lista[5:]\n", + " [6, 1, 2, 3, 4, 5, 6]\n", + " >>> lista[::-1]\n", + " [6, 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1]\n", + " ```\n", + "## 3. Funciones predefinidas que trabajan con listas\n", + "\n", + "```\n", + ">>> lista1 = [20,40,10,40,50]\n", + ">>> len(lista1)\n", + "5\n", + ">>> max(lista1)\n", + "50\n", + ">>> min(lista1)\n", + "10\n", + ">>> sum(lista1)\n", + "150\n", + ">>> sorted(lista1)\n", + "[10, 20, 30, 40, 50]\n", + ">>> sorted(lista1,reverse=True)\n", + "[50, 40, 30, 20, 10]\n", + "```\n", + "## 4. Listas multidimensionales\n", + "A la hora de definir las listas hemos indicado que podemos guardar en ellas datos de cualquier tipo, y evidentemente podemos guardar listas dentro de listas.\n", + "\n", + "```\n", + ">>> tabla = [[1,2,3],[4,5,6],[7,8,9]]\n", + ">>> tabla[1][1]\n", + "5\n", + "\n", + ">>> for fila in tabla:\n", + "... for elem in fila:\n", + "... print(elem,end=\"\")\n", + "... print()\n", + "\n", + "123\n", + "456\n", + "789\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4LsLa2rotalG" + }, + "source": [ + "### Nota: Al igual que las cadenas el tipo de datos lista es una clase, cada vez que creamos una variable de la clase lista estamos creando un objeto que además de guardar un conjunto de datos, posee un conjunto de métodos que nos permiten trabajar con la lista." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kAi1Ieqvtsjd" + }, + "source": [ + "### ¿Qué significa que las listas son mutables?\n", + "\n", + "Los elementos de las listas se pueden modificar:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-bXEUIiH1jnR", + "outputId": "1e04440f-c8a2-4fdc-9ba7-15fcb09097c6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "[1, 5]\n" + ] + } + ], + "source": [ + "lista = [1,2,3]\n", + "lista[2] = 5\n", + "\n", + "print(lista[2])\n", + "\n", + "del lista[1] #eliminamos el elemento de la posición 2 de la lista\n", + "\n", + "print(lista)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mHLjmvznubM5" + }, + "source": [ + "Esto también ocurre cuando usamos los métodos, es decir, los métodos de las listas modifican el contenido de la lista, por ejemplo si usamos el método **append()** para añadir un elemento a la lista:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cL53b6I3ufxk", + "outputId": "753fa937-d99f-488d-c593-9c1fca9fa748" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 5, 7]\n" + ] + } + ], + "source": [ + "lista.append(7)\n", + "\n", + "print(lista)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AY-MaGSIuukv" + }, + "source": [ + "Podemos observar que la lista se ha modificado con la inserción de ese nuevo elemento.\n", + "\n", + "### ¿Cómo se copian las listas?\n", + "\n", + "Para copiar una lista en otra no podemos utilizar el operador de asignación:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Jx4P1r8xu5Dc", + "outputId": "493382e9-dbf3-452c-f217-14fa3bf05d14" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 10, 7]\n", + "[1, 10, 7]\n" + ] + } + ], + "source": [ + "lista = [1,5,7]\n", + "lista2 = lista\n", + "\n", + "lista[1] = 10\n", + "\n", + "print(lista)\n", + "print(lista2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "El operador de asignación no crea una nueva lista, sino que nombra con dos nombres distintos a la misma lista, por lo tanto la forma más fácil de copiar una lista en otra es:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0S5hIsjLvauv", + "outputId": "7c2aa0c4-ba56-4c78-ecea-56338898e528" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 50, 7]\n", + "[1, 10, 7]\n" + ] + } + ], + "source": [ + "lista2 = lista[:]\n", + "\n", + "lista[1] = 50\n", + "\n", + "print(lista)\n", + "print(lista2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ampliando conceptos\n", + "\n", + "* El ``método zip()`` en Python se utiliza para combinar dos o más secuencias en una sola secuencia de tuplas. \n", + "\n", + " Las tuplas resultantes contienen un elemento de cada secuencia.\n", + "\n", + "* Ejemplo de código\n", + "\n", + "```python\n", + "zip(secuencia1, secuencia2, ...)\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(1, 'Uno'), (2, 'Dos')]\n", + "\n", + "(1, 'Uno')\n", + "(2, 'Dos')\n" + ] + } + ], + "source": [ + "# Primera Lista\n", + "a = [1 , 2]\n", + "\n", + "# Segunda Lista\n", + "b = [\"Uno\" , \"Dos\"]\n", + "\n", + "# Tercera Lista\n", + "c = zip(a,b)\n", + "\n", + "# Unir listas\n", + "d = list(c)\n", + "\n", + "print(d)\n", + "print(type(d))\n", + "\n", + "for i in d:\n", + " print(i)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "y9XT-inuvLfU" + }, + "source": [ + "* Las ``listas`` lista1 y lista2 se combinan en una sola secuencia de ``tuplas``. \n", + "\n", + "Cada ``tupla`` contiene un elemento de cada ``lista``.\n", + "\n", + "**Usos:**\n", + "\n", + "El método ``zip()`` se puede utilizar para:\n", + "\n", + "1. Combinar dos o más listas en una sola ``lista``.\n", + "\n", + "2. Iterar sobre dos o más secuencias simultáneamente.\n", + "\n", + "3. Crear un ``diccionario`` a partir de dos ``listas``." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Combinar dos listas en una sola lista.\n", + "\n", + "lista1 = [\"a\", \"b\", \"c\"]\n", + "lista2 = [1, 2, 3]\n", + "\n", + "lista_combinada = list(zip(lista1, lista2))\n", + "\n", + "print(lista_combinada)\n", + "\n", + "# Salida:\n", + "# [('a', 1), ('b', 2), ('c', 3)]\n", + "\n", + "# Iterar sobre dos o más secuencias simultáneamente.\n", + "\n", + "lista1 = [\"a\", \"b\", \"c\"]\n", + "lista2 = [1, 2, 3]\n", + "\n", + "for a, b in zip(lista1, lista2):\n", + " print(a, b)\n", + "\n", + "# Salida:\n", + "# a 1\n", + "# b 2\n", + "# c 3\n", + "\n", + "# Crear un diccionario a partir de dos listas.\n", + "\n", + "nombres = [\"Juan\", \"María\", \"Pedro\"]\n", + "apellidos = [\"Pérez\", \"García\", \"Rodríguez\"]\n", + "\n", + "diccionario = dict(zip(nombres, apellidos))\n", + "\n", + "print(diccionario)\n", + "\n", + "# Salida:\n", + "# {'Juan': 'Pérez', 'María': 'García', 'Pedro': 'Rodríguez'}\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/17_Tuplas_en_Python.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/17_Tuplas_en_Python.ipynb" new file mode 100644 index 0000000..a7621cf --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/17_Tuplas_en_Python.ipynb" @@ -0,0 +1,150 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Accv8mAE1oP3" + }, + "source": [ + "# Tuplas / **(Tuple)**\n", + "\n", + "* Sirven para lo mismo que las ``listas`` (me permiten guardar un conjunto de datos que se pueden repetir y que pueden ser de distintos tipos), pero en este caso es un **tipo inmutable/no modificable**.\n", + "\n", + "## Construcción de una tupla\n", + "\n", + "* Para crear una ``lista`` puedo usar los caracteres ``()``" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "TVFKg2PvwDyZ" + }, + "outputs": [], + "source": [ + "tupla = ()\n", + "\n", + "tupla2 = ('a', 1, True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4LsLa2rotalG" + }, + "source": [ + "# Operaciones básicas con tuplas\n", + "\n", + "En las tuplas se pueden realizar las siguientes operaciones:\n", + "\n", + "* Las tuplas se pueden recorrer.\n", + "* Operadores de pertenencia: in y not in.\n", + "* Concatenación: +\n", + "* Repetición: *\n", + "* Indexación\n", + "* Slice\n", + "\n", + "Entre las funciones definidas podemos usar: **len, max, min, sum, sorted**\n", + "\n", + "Como hemos dicho con anterioridad:\n", + "\n", + "## Las tuplas son inmutables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 218 + }, + "id": "0fgpO1r8wxAQ", + "outputId": "a96c3e2a-f57b-416e-a54e-a871423039fc" + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "ignored", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mtupla\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mtupla\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" + ] + } + ], + "source": [ + "tupla = (1,2,3)\n", + "\n", + "tupla[1] = 5" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kAi1Ieqvtsjd" + }, + "source": [ + "# Método Principales\n", + "\n", + "#### Métodos de Búsqueda: count, index\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-bXEUIiH1jnR", + "outputId": "341c1c08-e355-45a0-8711-0b756fc0ab21" + }, + "outputs": [], + "source": [ + "tupla = (1,2,3,4,1,2,3)\n", + "\n", + "print(tupla.count(1))\n", + "\n", + "print(tupla.index(1))\n", + "\n", + "# Repite desde el rango 2 hasta el 6 el numero 1 que sería 4\n", + "print(tupla.index(1,2,6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "La línea de código `print(tupla.index(1,2,6))` está intentando usar el método `index()` de una tupla en Python. Este método tiene la siguiente sintaxis: `tupla.index(valor, inicio, fin)`, donde:\n", + "\n", + "- `valor` es el elemento que se busca en la tupla.\n", + "- `inicio` y `fin` son opcionales y definen el rango de índices donde se buscará el valor.\n", + "\n", + "Por lo tanto, `print(tupla.index(1,2,6))` está buscando el valor `1` en la tupla, comenzando desde el índice `2` hasta el índice `6`. Luego imprime el índice donde se encontró el valor `1`. Si el valor `1` no se encuentra en ese rango, se lanzará una excepción `ValueError`.\n", + "\n", + "Espero que esto aclare tu duda sobre esta línea de código. Si tienes más preguntas, no dudes en hacerlas. ¡Estoy aquí para ayudar! 😊" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/.ipynb_checkpoints/00_EjCod1DeclaracionesImpresiones-checkpoint.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/.ipynb_checkpoints/00_EjCod1DeclaracionesImpresiones-checkpoint.ipynb" new file mode 100644 index 0000000..98c35a3 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/.ipynb_checkpoints/00_EjCod1DeclaracionesImpresiones-checkpoint.ipynb" @@ -0,0 +1,137 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "# EJEMPLOS DE CODIGO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [], + "source": [ + "# Declaraciones \n", + "my_var = 5\n", + "print(\"Variable : \" , my_var)\n", + "entero = -23\n", + "print(\"Entero : \" , entero)\n", + "reales = 12.3 \n", + "print(\"Reales : \" , reales)\n", + "booleano = True\n", + "print(\"Boleano : \" , booleano)\n", + "literales = 'Hola'\n", + "print(\"Literal 1 : \",literales)\n", + "literales2 = \"Hola\"\n", + "print(\"Literal 2 : \",literales2)\n", + "literales3 = \"\"\"Hola\"\"\"\n", + "print(\"Literal 3 : \",literales3)\n", + "literales4 = '''Hola'''\n", + "print(\"Literal 4 : \",literales4)\n", + "literales5 = \"\"\"Salto de linea \\n para cambiar de linea\"\"\"\n", + "print(literales5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Salidas por consola" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Imprimir cadena de texto\n", + "print(\"Hola , mundo!\")\n", + "\n", + "# Imprimir variables\n", + "nombre = \"Juan\"\n", + "edad = 25\n", + "print(\"Nombre: \" , nombre , \"Edad : \" , edad)\n", + "\n", + "# Imprimir resultados de operaciones\n", + "a = 3 \n", + "b = 5\n", + "suma = a + b\n", + "print(\"La suma de : \" , a , \" y \" , b , \" es: \" , suma)\n", + "\n", + "# Formateo de cadenas con el metodo '.format()'\n", + "nombre = \"Ana\"\n", + "edad = 30\n", + "print(\"Nombre: {} , Edad: {} \".format(nombre,edad))\n", + "\n", + "pais = \"España\"\n", + "poblacion = 48000000\n", + "print(\"Pais: {} , Poblacion: {} \".format(pais,poblacion))\n", + "\n", + "# Formateo de cadenas con 'f'\n", + "nombre = \"Maria\" \n", + "edad = 22\n", + "print(f\"Nombre: {nombre} , edad: {edad}\")\n", + "\n", + "nom1 = \"Black\"\n", + "nom2 = \"Metal\"\n", + "print(f\"Estilo: {nom1} {nom2}\") \n", + "\n", + "# Salto de linea\n", + "print(\"Linea 1\\nLinea 2\\nLinea 3\")\n", + "\n", + "# Tabular texto\n", + "print(\"\"\"\n", + " Formateo de texto\n", + " \"\"\")\n", + "\n", + "# Uso de argumentos en la función print:\n", + "# sep = SEPARADOR\n", + "# end = FINAL DE LA IMPRESION\n", + "print(\"Hola\" , \"Mundo\" , sep=\"<>\")\n", + "print(\"Hola\" , \"Mundo\" , sep=\"<>\" , end=\"!!!\\n\")\n", + "print(\"Hola\" , \"Mundo\" , sep=\"||\" , end=\"|\\n\")\n", + "# Array\n", + "numeros = [1 , 2 ,3 , 4 , 5]\n", + "print(\"Salida normal array: \" , numeros)\n", + "print(\"Salida formateada: \")\n", + "print(*numeros, sep=\", \")\n", + "print(*numeros, sep=\" <-> \")\n", + "print(*numeros, end=\" <-- \")" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/.ipynb_checkpoints/00_EjCod3Operaciones-checkpoint.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/.ipynb_checkpoints/00_EjCod3Operaciones-checkpoint.ipynb" new file mode 100644 index 0000000..e2b5782 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/.ipynb_checkpoints/00_EjCod3Operaciones-checkpoint.ipynb" @@ -0,0 +1,375 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "# EJEMPLOS DE CODIGO" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Declaraciones & Asignaciones" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-01-27T23:32:05.557948800Z", + "start_time": "2024-01-27T23:32:05.505135500Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "-23\n", + "12.3\n", + "True\n", + "Hola\n", + "Hola\n", + "Hola\n", + "Hola\n", + "Salto de linea \n", + "para cambiar de linea\n" + ] + } + ], + "source": [ + "my_var = 5\n", + "print(my_var)\n", + "entero = -23\n", + "print(entero)\n", + "reales = 12.3\n", + "print(reales)\n", + "booleano = True\n", + "print(booleano)\n", + "literales = 'Hola'\n", + "print(literales)\n", + "literales2 = \"Hola\"\n", + "print(literales2)\n", + "literales3 = \"\"\"Hola\"\"\"\n", + "print(literales3)\n", + "literales4 = '''Hola'''\n", + "print(literales4)\n", + "literales5 = \"\"\"Salto de linea \\npara cambiar de linea\"\"\"\n", + "print(literales5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operadores" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 5 # Asignacion\n", + "b = 10 # Asignacion\n", + "\n", + "# Expresiones\n", + "c = a + b # Suma\n", + "print(\"Suma: \",c)\n", + "c = a - b # Resta\n", + "print(\"Resta: \", c)\n", + "c = a * b # Multiplicacion\n", + "print(\"Multiplicación: \",c)\n", + "c = a / b # Division\n", + "print(\"Division: \",c)\n", + "c = a % b # Modulo\n", + "print(\"Modulo: \",c)\n", + "c = a ** b # Potencia\n", + "print(\"Potencia: \",c)\n", + "c = a // b # Division entera\n", + "print(\"Division entera: \" ,c)\n", + "c = a == b # Igualdad\n", + "print(\"Igualdad: \",c)\n", + "c = a != b # Desigualdad\n", + "print(\"Desigualdad: \",c)\n", + "c = a < b # Menor que\n", + "print(\"Mayor que : \",c)\n", + "c = a >= b # Mayor o igual que\n", + "print(\"Mayor igual que : \",c)\n", + "c = a <= b # Menor o igual que\n", + "print(\"Menor igual que : \",c)\n", + "\n", + "c = a and b # Conjuncion\n", + "print(\"Conjuncion: \", c)\n", + "c = a or b # Disyuncion - Separacion\n", + "print(\"Disyuncion - Separacion: \", c)\n", + "c = not a # Negacion\n", + "print(\"Negacion: \", c)\n", + "c = a is b # Identidad\n", + "print(\"Identidad: \",c)\n", + "c = a is not b # No identidad\n", + "print(\"No Identidad: \", c)\n", + "\n", + "a = 5 # variable\n", + "c = 8 # variable\n", + "b = [1, 2, 3, 4, 5] # Lista\n", + "print(\"Lista: \", a in b , \" - \", *b) # Pertenece\n", + "print(\"Lista: \", c not in b , \" - \", *b) # No pertenece" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operaciones Aritmeticas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "is_executing": true + }, + "outputs": [], + "source": [ + "a = 5\n", + "b = 10\n", + "\n", + "a += b # Suma en asignacion\n", + "print(\"Suma en asignacion: \",a)\n", + "a -= b # Resta en asignacion\n", + "print(\"Resta en asignacion: \",a)\n", + "a *= b # Multiplicacion en asignacion\n", + "print(\"Multiplicación en asignacion: \",a)\n", + "a /= b # Division en asignacion\n", + "print(\"Division en asignacion\",a)\n", + "a %= b # Modulo en asignacion\n", + "print(\"Modulo en asignacion\",a)\n", + "a **= b # Potencia en asignacion\n", + "print(\"Potencia en asignacion\",a)\n", + "a //= b # Division entera en asignacion\n", + "print(\"Division entera en asignacion\",a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 3\n", + "b = 1\n", + "c = 4\n", + "\n", + "# Expresiones\n", + "# ____↓_____\n", + "c = a + b * c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = (a + b) * c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + (b * c) # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + b / c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = (a + b) / c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + (b / c) # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + b % c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = (a + b) % c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + b ** c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = (a + b) ** c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = ((a + b) ** c) # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + (b ** c) # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operaciones Booleanas\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operador Boleanas\n", + "# True = valor de : 1\n", + "# False = valor de : 0\n", + "a = True\n", + "b = False\n", + "c = True\n", + "\n", + "c = a == b == c # Comparacion de igualdad\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a < b < c # Comparacion de menor que\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a <= b <= c # Comparacion de menor o igual que\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "# Se aplica una especie de 'AND'\n", + "c = a > b > c # Comparacion de mayor que\n", + "\n", + "# Python las interpreta como (a > b) and (b > c)\n", + "print(\"1º Comparacion de c : \", c)\n", + "c = (a > b) and (b > c) # Comparacion de mayor que\n", + "print(\"2º Comparacion de c : \", c)\n", + "\n", + "# Cuando se encadenan comparaciones con >= o <=\n", + "# Sólo necesita que una de las comparaciones \n", + "# sea True para que toda la comparación sea True.\n", + "# Se aplica una especie de 'AND'\n", + "c = a >= b >= c # Comparacion de mayor o igual que\n", + "print(\"Comparacion de c = a >= b >= c : \", c)\n", + "\n", + "c = (a >= b) and (b >= c) # Comparacion de mayor o igual que\n", + "print(\"Comparacion de c = a >= b >= c : \", c)\n", + "\n", + "c = a is b is c # Comparacion de identidad\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a is not b is not c # Comparacion de no identidad\n", + "print(\"Comparacion de c : \", c)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operaciones Booleanas\n", + "a = True\n", + "b = False\n", + "print(a)\n", + "a &= b # AND en asignacion\n", + "print(a)\n", + "a ^= b # XOR en asignacion\n", + "print(a)\n", + "a |= b # OR en asignacion\n", + "print(a)\n", + "a <<= b # Desplazamiento a la izquierda en asignacion\n", + "print(a)\n", + "a <<= b # Desplazamiento a la izquierda en asignacion\n", + "print(a)\n", + "a >>= b # Desplazamiento a la derecha en asignacion\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operadores de cadenas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cadena1 = \"Hola\"\n", + "cadena2 = \"Mundo\"\n", + "resultado = cadena1 + \"-\" + cadena2\n", + "print(resultado)\n", + "\n", + "cadena1 = \"Hola \"\n", + "# Repite el mensaje 3 veces\n", + "resultado = cadena1 * 3\n", + "print(resultado)\n", + "\n", + "print(cadena1[0],cadena2[0])\n", + "print(cadena1[0:2],cadena1[0:2])\n", + "\n", + "print(cadena1.upper())\n", + "\n", + "print(cadena1.lower())\n", + "\n", + "print(cadena1.capitalize())\n", + "\n", + "print(cadena1.title())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operador de pertenencia\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operadores de bits\n", + "a = 3\n", + "b = [1, 2, 3, 4, 5]\n", + "\n", + "c = a in b # Pertenencia - Verificación de un iterable\n", + "print(f\"Verificación de un iterable: \", c, *b)\n", + "\n", + "c = a not in b # No pertenencia\n", + "print(f\"Verificación de un iterable: \", c, *b)\n", + "\n", + "aa = 4 \n", + "bb = 6\n", + "\n", + "c = aa << bb # Desplazamiento a la izquierda\n", + "print(f'Desplazamiento a la izquierda : ', c)\n", + "c = aa >> bb # Desplazamiento a la derecha\n", + "print(f'Desplazamiento a la derecha : ', c)\n", + "c = aa & bb # AND\n", + "print(f'Operador AND : ', c)\n", + "c = aa ^ bb # XOR\n", + "print('Operador XOR : {} '.format(c))\n", + "c = aa | bb # OR\n", + "print('Operador OR : {} '.format(c))" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "language": "python", + "display_name": "Python 3 (ipykernel)" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod1DeclaracionesImpresiones.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod1DeclaracionesImpresiones.ipynb" new file mode 100644 index 0000000..5e2c5a4 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod1DeclaracionesImpresiones.ipynb" @@ -0,0 +1,142 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## EJEMPLOS DE CODIGO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [], + "source": [ + "# Declaraciones \n", + "my_var = 5\n", + "print(\"Variable : \" , my_var)\n", + "entero = -23\n", + "print(\"Entero : \" , entero)\n", + "reales = 12.3 \n", + "print(\"Reales : \" , reales)\n", + "booleano = True\n", + "print(\"Boleano : \" , booleano)\n", + "literales = 'Hola'\n", + "print(\"Literal 1 : \",literales)\n", + "literales2 = \"Hola\"\n", + "print(\"Literal 2 : \",literales2)\n", + "literales3 = \"\"\"Hola\"\"\"\n", + "print(\"Literal 3 : \",literales3)\n", + "literales4 = '''Hola'''\n", + "print(\"Literal 4 : \",literales4)\n", + "literales5 = \"\"\"Salto de linea \\n para cambiar de linea\"\"\"\n", + "print(literales5)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hola , mundo!\n", + "Nombre: Juan Edad : 25\n", + "La suma de 3 y 5 es: 8\n", + "Nombre: Ana , Edad: 30 \n", + "Nombre: Carlos , edad: 22\n", + "Grupo Black Sabbath\n", + "Linea 1\n", + "Linea 2\n", + "Linea 3\n", + "Hola-mundo!!!\n" + ] + } + ], + "source": [ + "# Imprimir cadena de texto\n", + "print(\"Hola , mundo!\")\n", + "\n", + "# Imprimir variables\n", + "nombre = \"Juan\"\n", + "edad = 25\n", + "print(\"Nombre: \" , nombre , \"Edad : \" , edad)\n", + "\n", + "# Imprimir resultados de operaciones\n", + "a = 3 \n", + "b = 5\n", + "suma = a + b\n", + "print(\"La suma de : \" , a , \" y \" , b , \" es: \" , suma)\n", + "\n", + "# Formateo de cadenas con el metodo '.format()'\n", + "nombre = \"Ana\"\n", + "edad = 30\n", + "print(\"Nombre: {} , Edad: {} \".format(nombre,edad))\n", + "\n", + "pais = \"España\"\n", + "poblacion = 48000000\n", + "print(\"Pais: {} , Poblacion: {} \".format(pais,poblacion))\n", + "\n", + "# Formateo de cadenas con 'f'\n", + "nombre = \"Carlos\" \n", + "edad = 22\n", + "print(f\"Nombre: {nombre} , edad: {edad}\")\n", + "\n", + "nom1 = \"Black\"\n", + "nom2 = \"Sabbath\"\n", + "print(f\"Grupo {nom1} {nom2}\") \n", + "\n", + "# Salto de linea\n", + "print(\"Linea 1\\nLinea 2\\nLinea 3\")\n", + "\n", + "# Uso de argumentos en la función print:\n", + "# sep = SEPARADOR\n", + "# end = FINAL DE LA IMPRESION\n", + "print(\"Hola\" , \"Mundo\" , sep=\"<>\")\n", + "print(\"Hola\" , \"Mundo\" , sep=\"<>\" , end=\"!!!\\n\")\n", + "print(\"Hola\" , \"Mundo\" , sep=\"||\" , end=\"|\\n\")\n", + "# Array\n", + "numeros = [1 , 2 ,3 , 4 , 5]\n", + "print(\"Salida normal array: \" , numeros)\n", + "print(\"Salida formateada: \")\n", + "print(*numeros, sep=\", \")\n", + "print(*numeros, sep=\" <-> \")\n", + "print(*numeros, end=\" <-- \")" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod2Expresiones.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod2Expresiones.ipynb" new file mode 100644 index 0000000..4b7adfe --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod2Expresiones.ipynb" @@ -0,0 +1,120 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## EJEMPLOS DE CODIGO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [], + "source": [ + "# Expresiones\n", + "a = 5 # Asignacion\n", + "b = 10 # Asignacion\n", + "\n", + "c = a + b # Suma\n", + "print(\"Valor de Suma : \" , c)\n", + "\n", + "c = a - b # Resta\n", + "print(\"Valor de Resta : \" , c)\n", + "\n", + "c = a * b # Multiplicacion\n", + "print(\"Valor de Multiplicacion : \" , c)\n", + "\n", + "c = a / b # Division\n", + "print(\"Valor de Division : \" , c)\n", + "\n", + "c = a % b # Modulo\n", + "print(\"Valor de Modulo : \" , c)\n", + "\n", + "c = a ** b # Potencia\n", + "print(\"Valor de Potencia : \" , c)\n", + "\n", + "c = a // b # Division entera\n", + "print(\"Valor Division entera : \" , c)\n", + "\n", + "c = a == b # Igualdad\n", + "print(\"Valor Igualdad : \" , c)\n", + "\n", + "c = a != b # Desigualdad \n", + "print(\"Valor DesIgualdad : \" , c)\n", + "\n", + "c = a > b # Mayor que\n", + "print(\"Valor Mayor que : \" , c)\n", + "\n", + "c = a < b # Menor que \n", + "print(\"Valor Menor que : \" , c)\n", + "\n", + "c = a >= b # Mayor o igual que\n", + "print(\"Valor Mayor o igual que : \" , c)\n", + "\n", + "c = a <= b # Menor o igual que \n", + "print(\"Valor Menor o igual que : \" , c)\n", + "\n", + "# Booleanos\n", + "a = True\n", + "b = False\n", + "\n", + "c = a and b # Conjuncion\n", + "print(\"a and b : \", c)\n", + "\n", + "c = a or b # Disyuncion - Separacion\n", + "print(\"a or b : \" , c)\n", + "\n", + "c = not a # Negacion\n", + "print(\"not a : \", c)\n", + "\n", + "c = not b # Negacion\n", + "print(\"not b : \", c)\n", + "\n", + "c = a is b # Identidad\n", + "print(\"a is b : \", c)\n", + "\n", + "c = b is a # Identidad\n", + "print(\"b is a : \", c)\n", + "\n", + "c = a is not b # No identidad\n", + "print(\"a is not b : \",c)\n", + "\n", + "c = b is not c # No identidad\n", + "print(\"b is not c : \",c)\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod3Operaciones.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod3Operaciones.ipynb" new file mode 100644 index 0000000..604d705 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_EjCod3Operaciones.ipynb" @@ -0,0 +1,312 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## EJEMPLOS DE CODIGO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Declaraciones y asignaciones\n", + "my_var = 5\n", + "print(my_var)\n", + "entero = -23\n", + "print(entero)\n", + "reales = 12.3\n", + "print(reales)\n", + "booleano = True\n", + "print(booleano)\n", + "literales = 'Hola'\n", + "print(literales)\n", + "literales2 = \"Hola\"\n", + "print(literales2)\n", + "literales3 = \"\"\"Hola\"\"\"\n", + "print(literales3)\n", + "literales4 = '''Hola'''\n", + "print(literales4)\n", + "literales5 = \"\"\"Salto de linea \\npara cambiar de linea\"\"\"\n", + "print(literales5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Asignaciones" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 5 # Asignacion\n", + "b = 10 # Asignacion\n", + "\n", + "# Expresiones\n", + "c = a + b # Suma\n", + "print(c)\n", + "c = a - b # Resta\n", + "print(c)\n", + "a * b # Multiplicacion\n", + "print(a)\n", + "c = a / b # Division\n", + "print(c)\n", + "c = a % b # Modulo\n", + "print(c)\n", + "c = a ** b # Potencia\n", + "print(c)\n", + "c = a // b # Division entera\n", + "print(c)\n", + "c = a == b # Igualdad\n", + "print(c)\n", + "c = a != b # Desigualdad\n", + "print(c)\n", + "c = a > b # Mayor que\n", + "print(c)\n", + "c = a < b # Menor que\n", + "print(c)\n", + "c = a >= b # Mayor o igual que\n", + "print(c)\n", + "c = a <= b # Menor o igual que\n", + "print(c)\n", + "c = a and b # Conjuncion\n", + "print(c)\n", + "c = a or b # Disyuncion - Separacion\n", + "print(c)\n", + "c = not a # Negacion\n", + "print(c)\n", + "c = a is b # Identidad\n", + "print(c)\n", + "c = a is not b # No identidad\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Operadores" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operadores de bits\n", + "a = 3\n", + "b = [1, 2, 3, 4, 5]\n", + "\n", + "aa = 4\n", + "bb = 6\n", + "c = a in b # Pertenencia - Verificación de un iterable\n", + "print(f\" Verificación de un iterable: \", c, *b)\n", + "c = a not in b # No pertenencia\n", + "print(f\" Verificación de un iterable: \", c, *b)\n", + "c = aa << bb # Desplazamiento a la izquierda\n", + "print(f'Desplazamiento a la izquierda : ', c)\n", + "c = aa >> bb # Desplazamiento a la derecha\n", + "print(f'Desplazamiento a la derecha : ', c)\n", + "c = aa & bb # AND\n", + "print(f'Operador AND : ', c)\n", + "c = aa ^ bb # XOR\n", + "print('Operador XOR : {} '.format(c))\n", + "c = aa | bb # OR\n", + "print('Operador OR : {} '.format(c))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Operaciones Aritmeticas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Asignaciones\n", + "a = 5\n", + "b = 10\n", + "\n", + "a += b # Suma en asignacion\n", + "print(a)\n", + "a -= b # Resta en asignacion\n", + "print(a)\n", + "a *= b # Multiplicacion en asignacion\n", + "print(a)\n", + "a /= b # Division en asignacion\n", + "print(a)\n", + "a %= b # Modulo en asignacion\n", + "print(a)\n", + "a **= b # Potencia en asignacion\n", + "print(a)\n", + "a //= b # Division entera en asignacion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Operaciones Booleanas\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operaciones Booleanas\n", + "a = True\n", + "b = False\n", + "print(a)\n", + "a &= b # AND en asignacion\n", + "print(a)\n", + "a ^= b # XOR en asignacion\n", + "print(a)\n", + "a |= b # OR en asignacion\n", + "print(a)\n", + "a <<= b # Desplazamiento a la izquierda en asignacion\n", + "print(a)\n", + "a <<= b # Desplazamiento a la izquierda en asignacion\n", + "print(a)\n", + "a >>= b # Desplazamiento a la derecha en asignacion\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Operador de pertenencia\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operador de pertenencia\n", + "# True = 1\n", + "# False = 0\n", + "a = True\n", + "b = False\n", + "c = True\n", + "\n", + "c = a == b == c # Comparacion de igualdad\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a < b < c # Comparacion de menor que\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a <= b <= c # Comparacion de menor o igual que\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "# Se aplica una especie de 'AND'\n", + "c = a > b > c # Comparacion de mayor que\n", + "# Python las interpreta como (a > b) and (b > c)\n", + "print(\"1º Comparacion de c : \", c)\n", + "c = (a > b) and (b > c) # Comparacion de mayor que\n", + "print(\"2º Comparacion de c : \", c)\n", + "\n", + "# Cuando se encadenan comparaciones con >= o <=\n", + "# Sólo necesita que una de las comparaciones sea True para que toda la comparación sea True.\n", + "# Se aplica una especie de 'AND'\n", + "c = a >= b >= c # Comparacion de mayor o igual que\n", + "print(\"Comparacion de c = a >= b >= c : \", c)\n", + "c = (a >= b) and (b >= c) # Comparacion de mayor o igual que\n", + "print(\"Comparacion de c = a >= b >= c : \", c)\n", + "\n", + "c = a is b is c # Comparacion de identidad\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a is not b is not c # Comparacion de no identidad\n", + "print(\"Comparacion de c : \", c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Operador de pertenencia\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operador de pertenencia\n", + "a = 3\n", + "b = [1, 2, 3, 4, 5]\n", + "c = a in b\n", + "print(a, \" ¿ Pertenece a la array de 'b' ? \", c)\n", + "c = a in b in c # Comparacion de pertenencia\n", + "c = a not in b not in c # Comparacion de no pertenencia\n", + "c = a + b * c # Precedencia de operadores\n", + "c = (a + b) * c # Precedencia de operadores\n", + "c = a + (b * c) # Precedencia de operadores\n", + "c = a + b / c # Precedencia de operadores\n", + "c = (a + b) / c # Precedencia de operadores\n", + "c = a + (b / c) # Precedencia de operadores\n", + "c = a + b % c # Precedencia de operadores\n", + "c = (a + b) % c # Precedencia de operadores\n", + "c = a + (b % c) # Precedencia de operadores\n", + "c = a + b // c # Precedencia de operadores\n", + "c = (a + b) // c # Precedencia de operadores\n", + "c = a + (b // c) # Precedencia de operadores\n", + "c = a + b ** c # Precedencia de operadores\n", + "c = (a + b) ** c # Precedencia de operadores\n", + "c = a + (b ** c) # Precedencia de operadores\n", + "c = a + b << c # Precedencia de operadores\n", + "c = (a + b) << c # Precedencia de operadores\n", + "c = a + (b << c) # Precedencia de operadores\n", + "c = a + b >> c # Precedencia de operadores\n", + "c = (a + b) >> c # Precedencia de operadores\n", + "c = a + (b >> c) # Precedencia de operadores\n", + "c = a + b & c # Precedencia de operadores\n", + "c = (a + b) & c # Precedencia de operadores" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_Lecciones_Basicas/00_EjCod1DeclaracionesImpresiones.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_Lecciones_Basicas/00_EjCod1DeclaracionesImpresiones.ipynb" new file mode 100644 index 0000000..ff14031 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_Lecciones_Basicas/00_EjCod1DeclaracionesImpresiones.ipynb" @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "# EJEMPLOS DE CODIGO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [], + "source": [ + "# Declaraciones \n", + "my_var = 5\n", + "print(\"Variable : \" , my_var)\n", + "entero = -23\n", + "print(\"Entero : \" , entero)\n", + "reales = 12.3 \n", + "print(\"Reales : \" , reales)\n", + "booleano = True\n", + "print(\"Boleano : \" , booleano)\n", + "literales = 'Hola'\n", + "print(\"Literal 1 : \",literales)\n", + "literales2 = \"Hola\"\n", + "print(\"Literal 2 : \",literales2)\n", + "literales3 = \"\"\"Hola\"\"\"\n", + "print(\"Literal 3 : \",literales3)\n", + "literales4 = '''Hola'''\n", + "print(\"Literal 4 : \",literales4)\n", + "literales5 = \"\"\"Salto de linea \\n para cambiar de linea\"\"\"\n", + "print(literales5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Salidas por consola" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Imprimir cadena de texto\n", + "print(\"Hola , mundo!\")\n", + "\n", + "# Imprimir variables\n", + "nombre = \"Juan\"\n", + "edad = 25\n", + "print(\"Nombre: \" , nombre , \"Edad : \" , edad)\n", + "\n", + "# Imprimir resultados de operaciones\n", + "a = 3 \n", + "b = 5\n", + "suma = a + b\n", + "print(\"La suma de : \" , a , \" y \" , b , \" es: \" , suma)\n", + "\n", + "# Formateo de cadenas con el metodo '.format()'\n", + "nombre = \"Ana\"\n", + "edad = 30\n", + "print(\"Nombre: {} , Edad: {} \".format(nombre,edad))\n", + "\n", + "pais = \"España\"\n", + "poblacion = 48000000\n", + "print(\"Pais: {} , Poblacion: {} \".format(pais,poblacion))\n", + "\n", + "# Formateo de cadenas con 'f'\n", + "nombre = \"Maria\" \n", + "edad = 22\n", + "print(f\"Nombre: {nombre} , edad: {edad}\")\n", + "\n", + "nom1 = \"Black\"\n", + "nom2 = \"Metal\"\n", + "print(f\"Estilo: {nom1} {nom2}\") \n", + "\n", + "# Salto de linea\n", + "print(\"Linea 1\\nLinea 2\\nLinea 3\")\n", + "\n", + "# Tabular texto\n", + "print(\"\"\"\n", + " Formateo de texto\n", + " \"\"\")\n", + "\n", + "# Uso de argumentos en la función print:\n", + "# sep = SEPARADOR\n", + "# end = FINAL DE LA IMPRESION\n", + "print(\"Hola\" , \"Mundo\" , sep=\"<>\")\n", + "print(\"Hola\" , \"Mundo\" , sep=\"<>\" , end=\"!!!\\n\")\n", + "print(\"Hola\" , \"Mundo\" , sep=\"||\" , end=\"|\\n\")\n", + "\n", + "# Array\n", + "numeros = [1 , 2 ,3 , 4 , 5]\n", + "print(\"Salida normal array: \" , numeros)\n", + "print(\"Salida formateada: \")\n", + "\n", + "print(*numeros, sep=\", \")\n", + "print(*numeros, sep=\" <-> \")\n", + "print(*numeros, end=\" <-- \")" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_Lecciones_Basicas/00_EjCod2Expresiones.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_Lecciones_Basicas/00_EjCod2Expresiones.ipynb" new file mode 100644 index 0000000..c59f0b0 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/00_Lecciones_Basicas/00_EjCod2Expresiones.ipynb" @@ -0,0 +1,119 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "# Expresiones" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [], + "source": [ + "a = 5 # Asignacion\n", + "b = 10 # Asignacion\n", + "\n", + "c = a + b # Suma\n", + "print(\"Valor de Suma : \" , c)\n", + "\n", + "c = a - b # Resta\n", + "print(\"Valor de Resta : \" , c)\n", + "\n", + "c = a * b # Multiplicacion\n", + "print(\"Valor de Multiplicacion : \" , c)\n", + "\n", + "c = a / b # Division\n", + "print(\"Valor de Division : \" , c)\n", + "\n", + "c = a % b # Modulo\n", + "print(\"Valor de Modulo : \" , c)\n", + "\n", + "c = a ** b # Potencia\n", + "print(\"Valor de Potencia : \" , c)\n", + "\n", + "c = a // b # Division entera\n", + "print(\"Valor Division entera : \" , c)\n", + "\n", + "c = a == b # Igualdad\n", + "print(\"Valor Igualdad : \" , c)\n", + "\n", + "c = a != b # Desigualdad \n", + "print(\"Valor DesIgualdad : \" , c)\n", + "\n", + "c = a > b # Mayor que\n", + "print(\"Valor Mayor que : \" , c)\n", + "\n", + "c = a < b # Menor que \n", + "print(\"Valor Menor que : \" , c)\n", + "\n", + "c = a >= b # Mayor o igual que\n", + "print(\"Valor Mayor o igual que : \" , c)\n", + "\n", + "c = a <= b # Menor o igual que \n", + "print(\"Valor Menor o igual que : \" , c)\n", + "\n", + "# Booleanos\n", + "a = True\n", + "b = False\n", + "\n", + "c = a and b # Conjuncion\n", + "print(\"a and b : \", c)\n", + "\n", + "c = a or b # Disyuncion - Separacion\n", + "print(\"a or b : \" , c)\n", + "\n", + "c = not a # Negacion\n", + "print(\"not a : \", c)\n", + "\n", + "c = not b # Negacion\n", + "print(\"not b : \", c)\n", + "\n", + "c = a is b # Identidad\n", + "print(\"a is b : \", c)\n", + "\n", + "c = b is a # Identidad\n", + "print(\"b is a : \", c)\n", + "\n", + "c = a is not b # No identidad\n", + "print(\"a is not b : \",c)\n", + "\n", + "c = b is not c # No identidad\n", + "print(\"b is not c : \",c)\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/01_Leccion_EstructuraDeDatos/01_EjCod3Operaciones.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/01_Leccion_EstructuraDeDatos/01_EjCod3Operaciones.ipynb" new file mode 100644 index 0000000..c96b1a1 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/01_Leccion_EstructuraDeDatos/01_EjCod3Operaciones.ipynb" @@ -0,0 +1,453 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "# EJEMPLOS DE CODIGO" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Declaraciones & Asignaciones" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "my_var = 5\n", + "print(my_var)\n", + "entero = -23\n", + "print(entero)\n", + "reales = 12.3\n", + "print(reales)\n", + "booleano = True\n", + "print(booleano)\n", + "literales = 'Hola'\n", + "print(literales)\n", + "literales2 = \"Hola\"\n", + "print(literales2)\n", + "literales3 = \"\"\"Hola\"\"\"\n", + "print(literales3)\n", + "literales4 = '''Hola'''\n", + "print(literales4)\n", + "literales5 = \"\"\"Salto de linea \\npara cambiar de linea\"\"\"\n", + "print(literales5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operadores" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 5 # Asignacion\n", + "b = 10 # Asignacion\n", + "\n", + "# Expresiones\n", + "# ↓\n", + "# -----\n", + "c = a + b # Suma\n", + "print(\"Suma: \",c)\n", + "c = a - b # Resta\n", + "print(\"Resta: \", c)\n", + "c = a * b # Multiplicacion\n", + "print(\"Multiplicación: \",c)\n", + "c = a / b # Division\n", + "print(\"Division: \",c)\n", + "c = a % b # Modulo\n", + "print(\"Modulo: \",c)\n", + "c = a ** b # Potencia\n", + "print(\"Potencia: \",c)\n", + "c = a // b # Division entera\n", + "print(\"Division entera: \" ,c)\n", + "c = a == b # Igualdad\n", + "print(\"Igualdad: \",c)\n", + "c = a != b # Desigualdad\n", + "print(\"Desigualdad: \",c)\n", + "c = a < b # Menor que\n", + "print(\"Mayor que : \",c)\n", + "c = a >= b # Mayor o igual que\n", + "print(\"Mayor igual que : \",c)\n", + "c = a <= b # Menor o igual que\n", + "print(\"Menor igual que : \",c)\n", + "\n", + "# Operadores logicos\n", + "c = a and b # Conjuncion\n", + "print(\"Conjuncion: \", c)\n", + "c = a or b # Disyuncion - Separacion\n", + "print(\"Disyuncion - Separacion: \", c)\n", + "c = not a # Negacion\n", + "print(\"Negacion: \", c)\n", + "c = a is b # Identidad\n", + "print(\"Identidad: \",c)\n", + "c = a is not b # No identidad\n", + "print(\"No Identidad: \", c)\n", + "\n", + "a = 5 # variable\n", + "c = 8 # variable\n", + "b = [1, 2, 3, 4, 5] # Lista\n", + "\n", + "print(\"Lista: \", a in b , \" - \", *b) # Pertenece\n", + "print(\"Lista: \", c not in b , \" - \", *b) # No Pertenece" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operaciones Aritmeticas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 5\n", + "b = 10\n", + "\n", + "a += b # Suma en asignacion\n", + "print(\"Suma en asignacion: \",a)\n", + "a -= b # Resta en asignacion\n", + "print(\"Resta en asignacion: \",a)\n", + "a *= b # Multiplicacion en asignacion\n", + "print(\"Multiplicación en asignacion: \",a)\n", + "a /= b # Division en asignacion\n", + "print(\"Division en asignacion\",a)\n", + "a %= b # Modulo en asignacion\n", + "print(\"Modulo en asignacion\",a)\n", + "a **= b # Potencia en asignacion\n", + "print(\"Potencia en asignacion\",a)\n", + "a //= b # Division entera en asignacion\n", + "print(\"Division entera en asignacion\",a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 3\n", + "b = 1\n", + "c = 4\n", + "\n", + "# Expresiones\n", + "# ____↓_____\n", + "c = a + b * c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = (a + b) * c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + (b * c) # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + b / c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = (a + b) / c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + (b / c) # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + b % c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = (a + b) % c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + b ** c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = (a + b) ** c # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = ((a + b) ** c) # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)\n", + "c = a + (b ** c) # Operaciones aritmeticas basicas de operadores\n", + "print(\"Operaciones aritmeticas basicas de operadores: \", c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operaciones Booleanas\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operador Boleanas\n", + "# True = valor de : 1\n", + "# False = valor de : 0\n", + "a = True\n", + "b = False\n", + "c = True\n", + "\n", + "c = a == b == c # Comparacion de igualdad\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a < b < c # Comparacion de menor que\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a <= b <= c # Comparacion de menor o igual que\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "# Se aplica una especie de 'AND'\n", + "c = a > b > c # Comparacion de mayor que\n", + "# Python las interpreta como (a > b) and (b > c)\n", + "print(\"1º Comparacion de c : \", c)\n", + "\n", + "c = (a > b) and (b > c) # Comparacion de mayor que\n", + "print(\"2º Comparacion de c : \", c)\n", + "\n", + "# Cuando se encadenan comparaciones con >= o <=\n", + "# Sólo necesita que una de las comparaciones \n", + "# sea True para que toda la comparación sea True.\n", + "# Se aplica una especie de 'AND'\n", + "c = a >= b >= c # Comparacion de mayor o igual que\n", + "print(\"Comparacion de c = a >= b >= c : \", c)\n", + "\n", + "c = (a >= b) and (b >= c) # Comparacion de mayor o igual que\n", + "print(\"Comparacion de c = a >= b >= c : \", c)\n", + "\n", + "c = a is b is c # Comparacion de identidad\n", + "print(\"Comparacion de c : \", c)\n", + "\n", + "c = a is not b is not c # Comparacion de no identidad\n", + "print(\"Comparacion de c : \", c)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operaciones Booleanas\n", + "a = True\n", + "b = False\n", + "\n", + "print(a)\n", + "a &= b # AND en asignacion\n", + "print(a)\n", + "a ^= b # XOR en asignacion\n", + "print(a)\n", + "a |= b # OR en asignacion\n", + "print(a)\n", + "a <<= b # Desplazamiento a la izquierda en asignacion\n", + "print(a)\n", + "a <<= b # Desplazamiento a la izquierda en asignacion\n", + "print(a)\n", + "a >>= b # Desplazamiento a la derecha en asignacion\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operadores de cadenas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cadena1 = \"Hola\"\n", + "print(cadena1)\n", + "\n", + "cadena2 = \"Mundo\"\n", + "print(cadena2)\n", + "\n", + "resultado = cadena1 + \"-\" + cadena2\n", + "print(resultado)\n", + "\n", + "cadena1 = \"Hola \"\n", + "# Repite el mensaje 3 veces\n", + "resultado = cadena1 * 3\n", + "\n", + "print(resultado)\n", + "\n", + "print(cadena1[0] , cadena2[0])\n", + "\n", + "print(cadena1[0:2],cadena1[0:2])\n", + "\n", + "# Metodos de cadenas\n", + "\n", + "print(cadena1.capitalize())\n", + "\n", + "print(cadena1.upper())\n", + "\n", + "# Transforma todos los caracteres de la cadena a minúsculas,\n", + "# lo que permite realizar comparaciones entre cadenas indistintamente de su caso.\n", + "print(cadena1.casefold())\n", + "\n", + "print(cadena1.lower())\n", + "\n", + "cadena = \"Hola, Mundo\"\n", + "# Funciona iterando sobre la cadena, comenzando por el principio. \n", + "# Cada vez que encuentra el delimitador, divide la cadena en dos subcadenas. \n", + "# El método continúa iterando hasta que llegue al final de la cadena.\n", + "print(cadena.split(\",\"))\n", + "\n", + "print(cadena.split())\n", + "\n", + "cadena1 = \"Hola\"\n", + "\n", + "print(cadena1.ljust(3))\n", + "\n", + "print(cadena1.ljust(5))\n", + "\n", + "print(cadena1.ljust(10 , \"*\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operador de pertenencia\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Operadores de bits\n", + "\n", + "lista = [1 ,2 ,3 ,4 ,5]\n", + "\n", + "# Esta en la lista ?\n", + "print(3 in lista , \" - \".join(str(x) for x in lista))\n", + "\n", + "# Esta en la lista ?\n", + "print(6 in lista , \" - \".join(str(x) for x in lista))\n", + "\n", + "a = 3\n", + "b = [1, 2, 3, 4, 5]\n", + "\n", + "c = a in b # Pertenencia - Verificación de un iterable\n", + "print(f\"Verificación de un iterable:\", c , \" - \", *b)\n", + "\n", + "c = a not in b # No pertenencia\n", + "print(f\"Verificación de un iterable:\", c, \" - \" , *b)\n", + "\n", + "# Valores\n", + "aa = 4 \n", + "bb = 6\n", + "\n", + "# Simula multiplicacion por 2\n", + "x = 1\n", + "\n", + "print(x << 1)\n", + "# Salida: 2\n", + "\n", + "print(x << 2)\n", + "# Salida: 4\n", + "\n", + "print(x << 3)\n", + "# Salida: 8\n", + "\n", + "print(x << 8)\n", + "# Salida: 256\n", + "\n", + "c = aa << bb # Desplazamiento a la izquierda\n", + "print(f'Desplazamiento a la izquierda : ', c)\n", + "\n", + "# Simula division 2\n", + "x = 16\n", + "\n", + "print(x >> 1)\n", + "# Salida: 8\n", + "\n", + "print(x >> 2)\n", + "# Salida: 4\n", + "\n", + "print(x >> 3)\n", + "# Salida: 2\n", + "\n", + "print(x >> 8)\n", + "# Salida: 1\n", + "\n", + "c = aa >> bb # Desplazamiento a la derecha\n", + "print(f'Desplazamiento a la derecha : ', c)\n", + "\n", + "c = aa & bb # AND\n", + "print(f'Operador AND : ', c)\n", + "\n", + "c = aa ^ bb # XOR\n", + "print('Operador XOR : {} '.format(c))\n", + "\n", + "c = aa | bb # OR\n", + "print('Operador OR : {} '.format(c))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Ver Tipos de Elementos\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"tipo int: \",type(1))\n", + "\n", + "print(\"tipo float: \",type(5.5))\n", + "\n", + "print(\"tipo list: \",type([1,2,3,4,5]))\n", + "\n", + "print(\"tipo set: \",type({1,2,3,4,5}))\n", + "\n", + "print(\"tipo booleano: \",type(True))\n", + "\n", + "print(\"tipo cadena: \",type(\"Hola\"))\n", + "\n", + "print(\"tipo 'int':\",type(int))\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/01_Leccion_EstructuraDeDatos/02_Tipos_de_Datos_Estructurados.ipynb" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/01_Leccion_EstructuraDeDatos/02_Tipos_de_Datos_Estructurados.ipynb" new file mode 100644 index 0000000..203687b --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/1_Teoria/Repaso/01_Leccion_EstructuraDeDatos/02_Tipos_de_Datos_Estructurados.ipynb" @@ -0,0 +1,183 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tipos de Datos\n", + "\n", + "### Estructurados" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Array\n", + "\n", + "* En Python no existen los ``arrays`` como tales\n", + "\n", + " * Existen versiones" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}\n" + ] + } + ], + "source": [ + "## Esto no es un array al estilo Java , es una 'lista' de Python\n", + "# array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}\n", + "# print(array)\n", + "\n", + "import array as arreglo\n", + "import numpy as np\n", + "\n", + "ar = arreglo.array('i', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\n", + "print(\"Libreria Array\",ar)\n", + "\n", + "for i in range(0, len(ar)):\n", + " print(ar[i] , end=\" \")\n", + "\n", + "print(\"\\n\")\n", + "\n", + "ny = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\n", + "print(\"Libreria Numpy\",ny)\n", + "\n", + "for i in range(0, len(ny)):\n", + " print(ny[i] , end=\" \")\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Listas\n", + "\n", + "* Son **MUTABLES**\n", + "\n", + "* Colección ordenada y modificable de elementos\n", + "\n", + "* Pueden ser de cualquier tipo \n", + "\n", + " * Numeros \n", + "\n", + " * Cadenas\n", + "\n", + " * Otras listas\n", + "\n", + "* Pueden agregar , eliminar , cambiar elementos despues de crear la lista creada" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Lista basica → MUTABLES\n", + "lista = []\n", + "\n", + "lista = [1 ,2 ,3 ,4 ,5 ]\n", + "\n", + "# Operadores de pertenencia\n", + "\n", + "print('Pertenece a la lista ? ',3 in lista)\n", + "\n", + "print('No Pertenece a la lista ? ',3 not in lista)\n", + "\n", + "print(\"Pertenece a la lista ? \",6 in lista , *lista)\n", + "\n", + "print(\"No Pertenece a la lista ? \",6 not in lista , *lista)\n", + "\n", + "lista.append(6)\n", + "\n", + "print(\"Pertenece a la lista ? \", 6 in lista , *lista)\n", + "\n", + "# Uso de Rebanadas\n", + "lista[0 : 0] = [11]\n", + "print(\"Uso de Rebanada : \",lista)\n", + "\n", + "lista[0 : 0] = [11,12,13,14,15]\n", + "print(\"Uso de Rebanada : \",lista)\n", + "\n", + "lista[0 : 0] = [16,17,18,19,20]\n", + "print(\"Uso de Rebanada : \",lista)\n", + "\n", + "# Dimensiones\n", + "\n", + "lista_1D = [1, 2, 3 , 4, 5, 6, 7, 8, 9, 10]\n", + "print(\"Lista de 1 dimensión:\", lista_1D , end=\" \")\n", + "\n", + "for i in range(len(lista_1D)):\n", + " print(lista_1D[i] , end=\"\\n\")\n", + "\n", + "# Fijate en el numero de comas que contiene después de cada corchete\n", + "lista_2D = [[1, 2, 3], \n", + " [4, 5, 6], \n", + " [7, 8, 9]]\n", + "print(\"Lista de 2 dimensiones:\", lista_2D)\n", + "\n", + "for i in range(len(lista_2D)):\n", + " for j in range(len(lista_2D[i])):\n", + " print(lista_2D[i][j] , end=\"\\n\")\n", + "\n", + "# Fijate en el numero de comas que contiene después de cada corchete\n", + "lista_3D = [[[1, 2, 3], [4, 5, 6], [7, 8, 9]], \n", + " [[10, 11, 12], [13, 14, 15], [16, 17, 18]], \n", + " [[19, 20, 21], [22, 23, 24], [25, 26, 27]]]\n", + "print(\"Lista de 3 dimensiones:\", lista_3D , end=\"\\n\")\n", + "\n", + "for i in range(len(lista_3D)):\n", + " for j in range(len(lista_3D[i])):\n", + " for k in range(len(lista_3D[i][j])):\n", + " print(lista_3D[i][j][k] , end=\" \")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/UT01/2_Ejercicios/06_Ejercicios_estructura_secuencial.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/2_Ejercicios/06_Ejercicios_estructura_secuencial.ipynb" similarity index 100% rename from PIA/UT01/2_Ejercicios/06_Ejercicios_estructura_secuencial.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/2_Ejercicios/06_Ejercicios_estructura_secuencial.ipynb" diff --git a/PIA/UT01/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas.ipynb" similarity index 99% rename from PIA/UT01/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas.ipynb" index 7620fa4..82ae57f 100644 --- a/PIA/UT01/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas.ipynb +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas.ipynb" @@ -45,15 +45,15 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "5\n", - "5 Es Positivo\n" + "-14\n", + "-14 Es Negativo\n" ] } ], diff --git a/PIA/UT01/2_Ejercicios/12_Ejercicios_de_Estructuras_Iterativas.ipynb "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/2_Ejercicios/12_Ejercicios_de_Estructuras_Iterativas.ipynb" similarity index 100% rename from PIA/UT01/2_Ejercicios/12_Ejercicios_de_Estructuras_Iterativas.ipynb rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/2_Ejercicios/12_Ejercicios_de_Estructuras_Iterativas.ipynb" diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Aleatorios/Numeros_aleatorios.py" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Aleatorios/Numeros_aleatorios.py" new file mode 100644 index 0000000..fc7f316 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Aleatorios/Numeros_aleatorios.py" @@ -0,0 +1,4 @@ +import random as r + +numero = r.random() * 40 +print(numero) diff --git a/PIA/UT01/3_Practica/13_Cadena_Caracteres_Practica.py "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Caracteres/13_Cadena_Caracteres_Practica.py" similarity index 72% rename from PIA/UT01/3_Practica/13_Cadena_Caracteres_Practica.py rename to "PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Caracteres/13_Cadena_Caracteres_Practica.py" index c77ebf8..4243434 100644 --- a/PIA/UT01/3_Practica/13_Cadena_Caracteres_Practica.py +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Caracteres/13_Cadena_Caracteres_Practica.py" @@ -9,5 +9,5 @@ cadena = "nueva cadena" -cadena.capitalize() -print(cadena) \ No newline at end of file +cadena_capitalizada = cadena.capitalize() +print(cadena_capitalizada) \ No newline at end of file diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/EstructuraDeDatos/Diccionarios.py" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/EstructuraDeDatos/Diccionarios.py" new file mode 100644 index 0000000..0636bb0 --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/EstructuraDeDatos/Diccionarios.py" @@ -0,0 +1,58 @@ +# Crear un diccionario básico +diccionario = {} +diccionario = {'uno': 1, 'two': 2, 'three': 3} + +diccionario1 = {} +diccionario1['one'] = 1 +diccionario1['two'] = 2 +diccionario1['three'] = 3 + +print(type(diccionario)) +print(diccionario) +print("Valor de un elemento: ", diccionario['uno']) + +print(type(diccionario1)) +print(diccionario1) +print("Valor de un elemento: ", diccionario1['one']) +print(len(diccionario1)) +print("Aumentar en 1 el valor: ", diccionario1['one'] + 1) +del (diccionario1['one']) +print(diccionario1) +respuesta = 'three' in diccionario1 +print(respuesta) +respuesta = 'four' in diccionario1 +print(respuesta) +respuesta = 'four' in diccionario1 +print(respuesta) + +diccionario_base = dict(one=1, two=2, three=3) +print("Diccionario base: ", diccionario_base) + +# Copia +diccionario_copia = diccionario_base.copy() +diccionario_copia['one'] = 1000 +print("Diccionario mixto: ", diccionario_copia) + +# Actualización +diccionario_reemplazo = { + "cuatro": 4, "cinco": 5, "seis": 6, "siete": 7} +diccionario_copia.update(diccionario_reemplazo) +print(diccionario_copia) + +# Recorrer 'keys' diccionario +print('Recorrer llaves') +for llave in diccionario_copia.keys(): + print(llave, end=" ") + +# Recorrer 'values' diccionario +print('Recorrer valores') +for valor in diccionario_copia.values(): + print(valor, end=" ") + +# Recorrer 'llaves y valores' del diccionario +for llave, valor in diccionario_reemplazo.items(): + print(f'{llave} => {valor}') + +# Limpiar diccionario +diccionario_copia.clear() +print("\nDiccionario mixto: ", diccionario_copia) diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/EstructuraDeDatos/EstructuraDeDatos.py" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/EstructuraDeDatos/EstructuraDeDatos.py" new file mode 100644 index 0000000..575414f --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/EstructuraDeDatos/EstructuraDeDatos.py" @@ -0,0 +1,24 @@ +# Crear una lista básica + +lista = [] +print(type(lista)) +lista = [1, 2, 4, 5, 6] +print(lista) +print("Elemento Basico: ", lista[1]) + +# Crear una tupla básica + +tupla = () +print(type(tupla)) + +tupla = (1, 2, 3) +print(tupla) +print(tupla[1]) +print("Elemento Basico: ", tupla[1]) + +# Crear un diccionario básico +diccionario = {} +diccionario = {'uno': 1, 'two': 2, 'three': 3} +print(type(diccionario)) +print(diccionario) +print("Valor de un elemento: ", diccionario['uno']) diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Tuplas/17_Tuplas.py" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Tuplas/17_Tuplas.py" new file mode 100644 index 0000000..f1dd87d --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/Tuplas/17_Tuplas.py" @@ -0,0 +1,14 @@ +# Crear una lista básica +# Mutable +lista = [] +print(type(lista)) +lista = [1, 2, 3, 4, 5] +lista + +# Crear una tupla básica +# InMutable +tupla = () +print(type(tupla)) + +tupla = (1, 2, 3) +print(tupla[1]) diff --git "a/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/archivo.txt" "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/archivo.txt" new file mode 100644 index 0000000..1ecb0eb --- /dev/null +++ "b/PIA/UT01. Introducci\303\263n a la Programaci\303\263n de Inteligencia Artificial/3_Practica/archivo.txt" @@ -0,0 +1 @@ +Ejercicio 14 de Numpy es complicado \ No newline at end of file diff --git a/PIA/UT01/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas2.ipynb b/PIA/UT01/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas2.ipynb deleted file mode 100644 index cab760d..0000000 --- a/PIA/UT01/2_Ejercicios/08_Ejercicios_estructuras_de_control_alternativas2.ipynb +++ /dev/null @@ -1,606 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "PaQOPX2RDbKx" - }, - "source": [ - "### Ejercicio 1\n", - "\n", - "Algoritmo que pida dos números e indique si el primero es mayor que el segundo.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " - El primer numero 4.0 es mayor que el segundo numero 2.0 por lo que el resultado es : True\n" - ] - } - ], - "source": [ - "num1 = float(input(\"Introduce 1º numero\"))\n", - "num2 = float(input(\"Introduce 2º numero\"))\n", - "resultado = num1 > num2\n", - "print(\" - El primer numero \" , num1 ,\" es mayor que el segundo numero \", num2 , \" por lo que el resultado es : \" , resultado)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tIgSOopvQ74W" - }, - "source": [ - "### Ejercicio 2\n", - "\n", - "Algoritmo que pida un número y diga si es positivo, negativo o 0.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-14\n", - "-14 Es Negativo\n" - ] - } - ], - "source": [ - "import random as aleatorio\n", - "\n", - "numero1 = aleatorio.randint(- 100 , 100)\n", - "\n", - "print(numero1)\n", - "\n", - "if numero1 > 0 :\n", - " print(numero1 , \"Es Positivo\")\n", - "\n", - "if numero1 < 0 :\n", - " print(numero1 , \"Es Negativo\")\n", - "\n", - "if numero1 == 0 :\n", - " print(numero1 , \"Soy valor 0\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qHyTfynPVk3M" - }, - "source": [ - "### Ejercicio 3\n", - "\n", - "Escribe un programa que lea un número e indique si es par o impar.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "• Numero aleatorio 66\n", - "• Resultado : True\n" - ] - } - ], - "source": [ - "import random as aleatorio\n", - "\n", - "numero1 = aleatorio.randint(1 , 100)\n", - "\n", - "# Operador ternario\n", - "print(\"• Numero aleatorio \" , numero1)\n", - "\n", - "valor_si_verdadero = (numero1 % 2 == 0) if \"Par\" else \"Impar\"\n", - "\n", - "print(\"• Resultado : \" , valor_si_verdadero)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "DdC4E8zP38TI" - }, - "source": [ - "### Ejercicio 4\n", - "\n", - "Crea un programa que pida al usuario dos números y muestre su división si el segundo no es cero, o un mensaje de aviso en caso contrario." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Numero Introducido 10.0\n", - "Numero Introducido 0.0\n", - "El segundo número es 0 0.0\n" - ] - } - ], - "source": [ - "num1 = float(input(\"Introduce numero 1\"))\n", - "print(\"Numero Introducido \" , num1)\n", - "\n", - "num2 = float(input(\"Introduce numero 2\"))\n", - "print(\"Numero Introducido \" , num2)\n", - "\n", - "if (num2 != 0) :\n", - " print(\"El segundo número no es '0' → \" , num2 , (num1 - num2)) \n", - "else : \n", - " print(\"El segundo número es 0 → \" , num2)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "FfDcYcE5WBy4" - }, - "source": [ - "### Ejercicio 5\n", - "\n", - "Escribe un programa que pida un nombre de usuario y una contraseña y si se ha introducido \"pepe\" y \"asdasd\" se indica \"Has entrado al sistema\", sino se da un error." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error : Usuario o Contraseña erronea\n", - "Has entrado al sistema\n" - ] - } - ], - "source": [ - "usuario = \"pepe\"\n", - "contraseña = \"asdasd\"\n", - "\n", - "introUsuario = input(\"Introduce un Usuario\")\n", - "introPass = input(\"Introduce un Password\")\n", - "\n", - "if((usuario == introUsuario) & (introPass == introPass)) :\n", - " print(\"Has entrado al sistema\")\n", - "else : \n", - " while((usuario != introUsuario) | (introPass != introPass)):\n", - " print(\"Error : Usuario o Contraseña erronea\")\n", - " introUsuario = input(\"Introduce un Usuario\")\n", - " introPass = input(\"Introduce un Password\")\n", - "\n", - "print(\"Has entrado al sistema\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "k6eCxEUg48qd" - }, - "source": [ - "### Ejercicio 6\n", - "\n", - "Programa que lea una cadena por teclado y compruebe si está en mayúsculas." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "La cadena esta en mayuscula : DE\n" - ] - } - ], - "source": [ - "cadena = str(input(\"Introduce una cadena\"))\n", - "\n", - "cadenaMayus = cadena.upper()\n", - "\n", - "if(cadena == cadenaMayus):\n", - " print(\"La cadena SI esta en mayuscula : \", cadena )\n", - "else : \n", - " print(\"La cadena NO esta en mayuscula : \", cadena )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3ew9qX8m6G4u" - }, - "source": [ - "### Ejercicio 7\n", - "\n", - "Realiza un algoritmo que calcule la potencia, para ello pide por teclado la base y el exponente. Pueden ocurrir tres cosas:\n", - "* El exponente sea positivo, sólo tienes que imprimir la potencia.\n", - "* El exponente sea 0, el resultado es 1.\n", - "* El exponente sea negativo, el resultado es 1/potencia con el exponente positivo." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-1.0\n" - ] - } - ], - "source": [ - "import math as ops\n", - "\n", - "base = float(input(\"Base de la potencia\"))\n", - "exponente = float(input(\"Exponente de la potencia\"))\n", - "\n", - "if(exponente > 0):\n", - " print(\"Potencia es : \" , ops.pow(base,exponente))\n", - "if(exponente == 0):\n", - " print(\"Resultado es 1 \")\n", - "if(exponente < 0):\n", - " print(\"Exponente es negativo : \" , 1 / (ops.pow(base,exponente)))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ue2__J1LwH3l" - }, - "source": [ - "\n", - "\n", - "### Ejercicio 8\n", - "\n", - "Algoritmo que pida dos números ‘nota’ y ‘edad’ y un carácter ‘sexo’ y muestre el\n", - "mensaje ‘ACEPTADA’ si la nota es mayor o igual a cinco, la edad es mayor o igual a\n", - "dieciocho y el sexo es ‘F’. En caso de que se cumpla lo mismo, pero el sexo sea ‘M’, debe\n", - "imprimir ‘POSIBLE’. Si no se cumplen dichas condiciones se debe mostrar ‘NO ACEPTADA’." - ] - }, - { - "cell_type": "code", - "execution_count": 108, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MENOR DE EDAD\n", - "Edad: 16 Nota: 10 Sexo: F\n" - ] - } - ], - "source": [ - "import random as aleatorio\n", - "\n", - "nota = aleatorio.randint(1,10)\n", - "edad = aleatorio.randint(16,18)\n", - "caracter = aleatorio.randint(1,100)\n", - "sexo = ''\n", - "mensaje1 = \"ACEPTADA\"\n", - "mensaje2 = \"POSIBLE\"\n", - "mensaje3 = \"NO ACEPTADA\"\n", - "\n", - "if (caracter < 40):\n", - " sexo = 'F'\n", - "elif (caracter > 60):\n", - " sexo = 'M'\n", - "elif(caracter > 40 or caracter < 60):\n", - " sexo = 'N' \n", - "\n", - "if(edad >= 18):\n", - " if(nota >= 5):\n", - " if(sexo == 'F'):\n", - " print(mensaje1)\n", - " elif(sexo == 'M'):\n", - " print(mensaje2)\n", - " elif(sexo == 'M' or sexo == 'F'): \n", - " print(mensaje3)\n", - " else:\n", - " print(\"SUSPENSO\") \n", - "else:\n", - " print(\"MENOR DE EDAD\")\n", - "\n", - " \n", - "print(\"Edad:\" , edad , \"Nota:\" , nota , \"Sexo:\", sexo)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Al7VKlsS0Sva" - }, - "source": [ - "\n", - "\n", - "### Ejercicio 9\n", - "\n", - "Algoritmo que pida tres números y los muestre ordenados (de mayor a menor);" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nuevo valor 1 : 9\n", - "Nuevo valor 2 : 4\n", - "Nuevo valor 3 : 4\n", - "Num1 : 5 - Num2 : 5 - Num3 : 5\n" - ] - } - ], - "source": [ - "import random\n", - "\n", - "numAleatorio1 = random.randint(1,10)\n", - "numAleatorio2 = random.randint(1,10)\n", - "numAleatorio3 = random.randint(1,10)\n", - "\n", - "# print(numAleatorio1 , numAleatorio2 , numAleatorio3)\n", - "\n", - "num1 = numAleatorio1\n", - "num2 = numAleatorio2\n", - "num3 = numAleatorio3\n", - "\n", - "num1 = 5\n", - "num2 = 5\n", - "num3 = 5\n", - "\n", - "while(True):\n", - " if(num1 == num2 == num3):\n", - " numAle1 = random.randint(1,10)\n", - " print(\"Nuevo valor 1 : \" , numAle1)\n", - " numAle2 = random.randint(1,10)\n", - " print(\"Nuevo valor 2 : \" , numAle2)\n", - " numAle3 = random.randint(1,10)\n", - " print(\"Nuevo valor 3 : \" , numAle3)\n", - " if(num1 == num2) & (num1 == num3):\n", - " if (numAle1 == num1):\n", - " num1 = numAle1\n", - " if((num2 == num1) & (num2 == num3) | (numAle2 == num2)):\n", - " if (numAle2 == num2):\n", - " num2 = numAle2\n", - " if((num3 == num1) & (num3 == num2) | (numAle3 == num3)):\n", - " if (numAle3 == num3):\n", - " num3 = numAle3\n", - " break\n", - "\n", - "print(\"Num1 : \" , num1 , \" - Num2 : \" , num2 , \" - Num3 : \" , num3)\n", - "\n", - "# if(num1 > num2):\n", - "# if(num2 > num3):\n", - "# if(num1 > num3):\n", - "# print(\"Opcion 1: \",num1,num2,num3)\n", - "\n", - "# if(num1 > num3):\n", - "# if(num1 > num2):\n", - "# if(num3 > num2):\n", - "# print(\"Opcion 2: \", num1,num3,num2)\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-L_EzflO194g" - }, - "source": [ - "\n", - "\n", - "### Ejercicio 10\n", - "\n", - "Algoritmo que pida los puntos centrales x1,y1,x2,y2 y los radios r1,r2 de dos\n", - "circunferencias y las clasifique en uno de estos estados:\n", - "\n", - "* exteriores\n", - "* tangentes exteriores\n", - "* secantes\n", - "* tangentes interiores\n", - "* interiores\n", - "* concéntricas" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import random\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "t55i8IkV4xBG" - }, - "source": [ - "\n", - "\n", - "### Ejercicio 11\n", - "\n", - "Programa que lea 3 datos de entrada A, B y C. Estos corresponden a las dimensiones de los lados de un triángulo. El programa debe determinar que tipo de triangulo es, teniendo en cuenta los siguiente:\n", - "\n", - "* Si se cumple Pitágoras entonces es triángulo rectángulo\n", - "* Si sólo dos lados del triángulo son iguales entonces es isósceles.\n", - "* Si los 3 lados son iguales entonces es equilátero.\n", - "* Si no se cumple ninguna de las condiciones anteriores, es escaleno.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "owTQ_7A16so7" - }, - "source": [ - "\n", - "\n", - "### Ejercicio 12\n", - "\n", - "Escribir un programa que lea un año indicar si es bisiesto. Nota: un año es bisiesto si es un número divisible por 4, pero no si es divisible por 100, excepto que también sea divisible por 400." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "PAgNMbw-80_P" - }, - "source": [ - "\n", - "\n", - "### Ejercicio 13\n", - "\n", - "Escribe un programa que pida una fecha (día, mes y año) y diga si es correcta." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "QbUbuL5L-g-j" - }, - "source": [ - "### Ejercicio 14\n", - "La asociación de vinicultores tiene como política fijar un precio inicial al kilo de uva, la cual se clasifica en tipos A y B, y además en tamaños 1 y 2. Cuando se realiza la venta del producto, ésta es de un solo tipo y tamaño, se requiere determinar cuánto recibirá un productor por la uva que entrega en un embarque, considerando lo siguiente: si es de tipo A,\n", - "se le cargan 20 céntimos al precio inicial cuando es de tamaño 1; y 30 céntimos si es de tamaño 2. Si es de tipo B, se rebajan 30 céntimos cuando es de tamaño 1, y 50 céntimos cuando es de tamaño 2. Realice un algoritmo para determinar la ganancia obtenida." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bL1I2BhiMl8a" - }, - "source": [ - "### Ejercicio 15\n", - "\n", - "Dadas dos variables numéricas A y B, que el usuario debe teclear, se pide realizar un algoritmo que intercambie los valores de ambas variables y muestre cuanto valen al final las dos variables." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Xt8VLg2aOxSs" - }, - "source": [ - "### Ejercicio 16\n", - "\n", - "Dos vehículos viajan a diferentes velocidades (v1 y v2) y están distanciados por una distancia d. El que está detrás viaja a una velocidad mayor. Se pide hacer un algoritmo para ingresar la distancia entre los dos vehículos (km) y sus respectivas velocidades (km/h) y con esto determinar y mostrar en que tiempo (minutos) alcanzará el vehículo más rápido al otro.\n", - "\n", - "$ V = \\frac {e}{t} $ luego $ t = \\frac {e}{V} $" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uQZIjnj0Uqoc" - }, - "source": [ - "### Ejercicio 17\n", - "\n", - "Un ciclista parte de una ciudad A a las HH horas, MM minutos y SS segundos. El tiempo de viaje hasta llegar a otra ciudad B es de T segundos. Escribir un algoritmo que determine la hora de llegada a la ciudad B.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "xzY1tElFcKua" - }, - "source": [ - "### Ejercicio 18\n", - "\n", - "Pedir el nombre y los dos apellidos de una persona y mostrar las iniciales.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "B9E19a4EdCIm" - }, - "source": [ - "### Ejercicio 19\n", - "\n", - "Escribir un algoritmo para calcular la nota final de un estudiante, considerando que: por cada respuesta correcta 5 puntos, por una incorrecta -1 y por respuestas en blanco 0. Imprime el resultado obtenido por el estudiante." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5Z1GKvepeU7g" - }, - "source": [ - "### Ejercicio 20\n", - "\n", - "Diseñar un algoritmo que nos diga el dinero que tenemos (en euros y céntimos) después de pedirnos cuantas monedas tenemos (de 2€, 1€, 50 céntimos, 20 céntimos o 10 céntimos).\n", - "\n" - ] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [ - "PaQOPX2RDbKx", - "tIgSOopvQ74W", - "qHyTfynPVk3M", - "DdC4E8zP38TI" - ], - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/PIA/UT01/2_Ejercicios/18_Ejercicios_de_Listas_en_Python.ipynb b/PIA/UT01/2_Ejercicios/18_Ejercicios_de_Listas_en_Python.ipynb deleted file mode 100644 index a37199e..0000000 --- a/PIA/UT01/2_Ejercicios/18_Ejercicios_de_Listas_en_Python.ipynb +++ /dev/null @@ -1,580 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "Accv8mAE1oP3" - }, - "source": [ - "# Ejercicios de listas\n", - "\n", - "## Ejercicio 1\n", - "\n", - "Realizar un programa que inicialice una lista con 10 valores aleatorios (del 1 al 10) y posteriormente muestre en pantalla cada elemento de la lista junto con su cuadrado y su cubo." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import random as aleatorio\n", - "import math\n", - "\n", - "lista_aleatorios = [aleatorio.randint(0, 10) for _ in range(10)]\n", - "\n", - "for num in lista_aleatorios:\n", - " print(\n", - " f\"# calcula el cuadrado y el cubo de un número\\n\"\n", - " f'{math.pow(num,2), \" - \" , math.pow(num,3)}'\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Ejercicio 2\n", - "\n", - "Crea una lista e inicializala con 5 cadenas de caracteres leídas por teclado. Copia los elementos de la lista en otra lista pero en orden inverso, y muestra sus elementos por la pantalla." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lista = [None] * 5\n", - "for i in range(0, len(lista)):\n", - " lista[i] = str(input(\"Intro un nuevo caracter\"))\n", - "\n", - "lista.reverse()\n", - "\n", - "print(lista)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aMam1QSaJDCu" - }, - "source": [ - "## Ejercicio 3\n", - "\n", - "Se quiere realizar un programa que lea por teclado las 5 notas obtenidas por un alumno (comprendidas entre 0 y 10). A continuación debe mostrar todas las notas, la nota media, la nota más alta que ha sacado y la menor." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[5, 6, 7, 8, 9]\n", - "Notas media : 7.0\n", - "Nota más alta : 9\n" - ] - } - ], - "source": [ - "nota_media = 0\n", - "nota_alta = 0\n", - "notas = [None] * 5\n", - "\n", - "for i in range(len(notas)):\n", - " notas[i] = float(input(\"Introduce la nota numero {} : \".format(i)))\n", - "\n", - "print(\"Lista de notas: \",notas)\n", - "\n", - "nota_alta = notas[0]\n", - "\n", - "for i in range(0, len(notas)):\n", - " nota_media += notas[i]\n", - "\n", - "for i in range(0, len(notas)):\n", - " if nota_alta < notas[i]:\n", - " nota_alta = notas[i]\n", - "\n", - "# Nota media\n", - "print(\"Notas media : \", nota_media / len(notas))\n", - "print(\"Nota más alta : \", nota_alta)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IQHHht7GJJVs" - }, - "source": [ - "## Ejercicio 4\n", - "\n", - "Programa que declare una lista y la vaya llenando de números hasta que introduzcamos un número negativo. Entonces se debe imprimir el vector (sólo los elementos introducidos)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Añadir una lista vacia\n", - "lista = []\n", - "incr = 0\n", - "\n", - "while(True):\n", - " numero = int(input(\"Introduce un numero\"))\n", - " if (numero > 0):\n", - " lista.append(numero) \n", - " print('Negativo si no deseo continuar')\n", - " if (numero < 0):\n", - " break\n", - " \n", - "print(lista) " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2-Gt2ufCJPqy" - }, - "source": [ - "## Ejercicio 5\n", - "\n", - "Hacer un programa que inicialice una lista de números con valores aleatorios (10 valores), y posterior ordene los elementos de menor a mayor." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import random\n", - "\n", - "lista = [random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10)]\n", - "print(\"Longitud: \",len(lista))\n", - "print(\"Sin ordenación:\" ,lista)\n", - "lista.sort()\n", - "print(\"Con ordenación:\" , lista)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6lUuFkx9JUVZ" - }, - "source": [ - "## Ejercicio 6\n", - "\n", - "Crea un programa que pida un número al usuario un número de mes (por ejemplo, el 4) y diga cuántos días tiene (por ejemplo, 30) y el nombre del mes. Debes usar listas. Para simplificarlo vamos a suponer que febrero tiene 28 días." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mes = int(input(\"Numero de mes\"))\n", - "\n", - "while (mes < 1) or (mes > 12):\n", - " if(mes < 1 or mes > 12):\n", - " mes = int(input(\"Introduce un nuevo numero de mes\"))\n", - " else:\n", - " print(\"Mes correcto\")\n", - "\n", - "mes -= 1\n", - " \n", - "print(\"Numero escogido: \", mes+1)\n", - "lista_meses = [31,28,31,30,31,30,31,31,30,31,30,31]\n", - "nombre_meses = [\"Enero\" ,\"Febrero\" , \"Marzo\" , \"Abril\" , \"Mayo\" , \"Junio\" , \"Julio\" , \"Agosto\" , \"Septiembre\", \"Octubre\" , \"Noviembre\" , \"Diciembre\"]\n", - "print(\"El mes: \", nombre_meses[mes] ,\" tiene \" , lista_meses[mes] , \" dias\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Tri9usePJalD" - }, - "source": [ - "## Ejercicio 7\n", - "\n", - "Programa que declare tres listas ‘lista1’, ‘lista2’ y ‘lista3’ de cinco enteros cada uno, pida valores para ‘lista1’ y ‘lista2’ y calcule lista3=lista1+lista2." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 1º Metodo\n", - "lista_1 = [0] * 5\n", - "lista_2 = [0] * 5\n", - "lista_3 = [0] * 5\n", - "\n", - "for i in range(0,len(lista_3)):\n", - " lista_1[i] = int(input(\"Introduce un número lista 1\"))\n", - " lista_2[i] = int(input(\"Introduce un número lista 2\"))\n", - " lista_3[i] = lista_1[i] + lista_2[i]\n", - " print(lista_3[i])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 2º Metodo\n", - "# Pedir valores para lista1 y lista2\n", - "print(\"Introduce los valores para lista1:\")\n", - "lista1 = [int(input(\"Introduce un número: \")) for _ in range(5)]\n", - "\n", - "print(\"Introduce los valores para lista2:\")\n", - "lista2 = [int(input(\"Introduce un número: \")) for _ in range(5)]\n", - "\n", - "# Calcular lista3 = lista1 + lista2 utilizando comprensión de listas\n", - "lista3 = [lista1[i] + lista2[i] for i in range(5)]\n", - "\n", - "print(\"La suma de lista1 y lista2 es:\", lista3)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kxjDuluCJgQz" - }, - "source": [ - "## Ejercicio 8\n", - "\n", - "Queremos guardar los nombres y la edades de los alumnos de un curso. Realiza un programa que introduzca el nombre y la edad de cada alumno. El proceso de lectura de datos terminará cuando se introduzca como nombre un asterisco (*) Al finalizar se mostrará los siguientes datos:\n", - "\n", - "* Todos lo alumnos mayores de edad.\n", - "* Los alumnos mayores (los que tienen más edad)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nombre: 1\n", - "Cambio : 1\n", - "Cambio : 1\n", - "Cambio : 1\n", - "Cambio : 1\n", - "Cambio : 1\n", - "Cambio : 1\n" - ] - } - ], - "source": [ - "# edades = int(input(\"Edad del alumno:\"))\n", - "nombres = []\n", - "edades = []\n", - "# edad = input(\"Edad alumno: \")\n", - "\n", - "while(True):\n", - " nombre = input(\"Nombre del alumno:\")\n", - " if nombre == 'º':\n", - " break\n", - " else:\n", - " edad = int(input(\"Edad del alumno:\"))\n", - " nombres.append(nombre)\n", - " edades.append(edad)\n", - "\n", - "# Falta hacer las comprobaciones de edades\n", - "for i in range(0,len(nombres)):\n", - " print(nombres[i]) \n", - " \n", - "\n", - "print(\"Nombres: \",nombres)\n", - "print(\"Edades: \",edades)\n", - " \n", - " \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tSjIHZ2WJtUj" - }, - "source": [ - "## Ejercicio 9\n", - "\n", - "Queremos guardar la temperatura mínima y máxima de 5 días. Realiza un programa que de la siguiente información:\n", - "\n", - "* La temperatura media de cada día\n", - "* Los días con menos temperatura\n", - "* Se lee una temperatura por teclado y se muestran los días cuya temperatura máxima coincide con ella. si no existe ningún día se muestra un mensaje de información." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "nL8BLwAOJ4Wi" - }, - "source": [ - "## Ejercicio 10\n", - "\n", - "Diseñar el algoritmo correspondiente a un programa, que:\n", - "\n", - "* Crea una tabla (lista con dos dimensiones) de 5x5 enteros.\n", - "* Carga la tabla con valores numéricos enteros.\n", - "* Suma todos los elementos de cada fila y todos los elementos de cada columna visualizando los resultados en pantalla.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "DpDEKp4gKDFO" - }, - "source": [ - "## Ejercicio 11\n", - "\n", - "Diseñar el algoritmo correspondiente a un programa, que:\n", - "\n", - "* Crea una tabla bidimensional de longitud 5x5 y nombre ‘diagonal’.\n", - "* Carga la tabla de forma que los componentes pertenecientes a la diagonal de la matriz tomen el valor 1 y el resto el valor 0.\n", - "* Muestra el contenido de la tabla en pantalla." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "AKnNXsN4KRym" - }, - "source": [ - "## Ejercicio 12\n", - "\n", - "Diseñar el algoritmo correspondiente a un programa, que:\n", - "\n", - "* Crea una tabla bidimensional de longitud 5x15 y nombre ‘marco’.\n", - "* Carga la tabla con dos únicos valores 0 y 1, donde el valor uno ocupará las posiciones o elementos que delimitan la tabla, es decir, las más externas, mientras que el resto de los elementos contendrán el valor 0.\n", - "\n", - "\n", - "```\n", - "111111111111111\n", - "100000000000001\n", - "100000000000001\n", - "100000000000001\n", - "111111111111111\n", - "```\n", - "\n", - "* Visualiza el contenido de la matriz en pantalla" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "H7VlNaP5Kk2T" - }, - "source": [ - "## Ejercicio 13\n", - "\n", - "De una empresa de transporte se quiere guardar el nombre de los conductores que tiene, y los kilómetros que conducen cada día de la semana.\n", - "\n", - "Para guardar esta información se van a utilizar dos arrays:\n", - "\n", - "* Nombre: Lista para guardar los nombres de los conductores.\n", - "* kms: Tabla para guardar los kilómetros que realizan cada día de la semana.\n", - "\n", - "Se quiere generar una nueva lista (“total_kms”) con los kilómetros totales que realza cada conductor.\n", - "\n", - "Al finalizar se muestra la lista con los nombres de conductores y los kilómetros que ha realizado." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "QEDeTz8FKzfu" - }, - "source": [ - "## Ejercicio 14\n", - "\n", - "Crear un programa que lea los precios de 5 artículos y las cantidades vendidas por una empresa en sus 4 sucursales. Informar:\n", - "\n", - "* Las cantidades totales de cada articulo.\n", - "* La cantidad de artículos en la sucursal 2.\n", - "* La cantidad del articulo 3 en la sucursal 1.\n", - "* La recaudación total de cada sucursal.\n", - "* La recaudación total de la empresa.\n", - "* La sucursal de mayor recaudación." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6SMOp_uVK-b8" - }, - "source": [ - "## Ejercicio 15\n", - "\n", - "Crear un programa de ordenador para gestionar los resultados de la quiniela de fútbol. Para ello vamos a utilizar dos tablas:\n", - "\n", - "* Equipos: Que es una tabla de cadenas donde guardamos en cada columna el nombre de los equipos de cada partido. En la quiniela se indican 15 partidos.\n", - "* Resultados: Es una tabla de enteros donde se indica el resultado. También tiene dos columnas, en la primera se guarda el número de goles del equipo que está guardado en la primera columna\n", - "de la tabla anterior, y en la segunda los goles del otro equipo.\n", - "\n", - "El programa ira pidiendo los nombres de los equipos de cada partido y el resultado del partido, a continuación se imprimirá la quiniela de esa jornada.\n", - "\n", - "¿Qué modificación habría que hacer en las tablas para guardar todos los resultados de todas las jornadas de la temporada?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8lOcKOs5LLvS" - }, - "source": [ - "## Ejercicio 16\n", - "\n", - "Vamos a crear un programa que tenga el siguiente menú:\n", - "\n", - "\n", - "\n", - "1. Añadir número a la lista: Me pide un número de la lista y lo añade al final de la lista.\n", - "2. Añadir número de la lista en una posición: Me pide un número y una posición, y si la posición existe en la lista lo añade a ella (la posición se pide a partir de 1).\n", - "3. Longitud de la lista: te muestra el número de elementos de la lista.\n", - "4. Eliminar el último número: Muestra el último número de la lista y lo borra.\n", - "5. Eliminar un número: Pide una posición, y si la posición existe en la lista lo borra de ella (la posición se pide a partir de 1).\n", - "6. Contar números: Te pide un número y te dice cuantas apariciones hay en la lista.\n", - "7. Posiciones de un número: Te pide un número y te dice en que posiciones está (contando desde 1).\n", - "8. Mostrar números: Muestra los números de la lista.\n", - "9. Salir" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JJvxL8wVL3Zm" - }, - "source": [ - "## Ejercicio 17\n", - "\n", - "Crear un programa que añada números a una lista hasta que introducimos un número negativo. A continuación debe crear una nueva lista igual que la anterior pero eliminando los números duplicados. Muestra esta segunda lista para comprobar que hemos eliminados los duplicados." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "BZtFKJ8uL-vS" - }, - "source": [ - "## Ejercicio 18\n", - "\n", - "Escriba un programa que permita crear una lista de palabras y que, a continuación de tres opciones:\n", - "\n", - "* Contar: Me pide una cadena, y me dice cuantas veces aparece en la lista\n", - "* Modificar: Me pide una cadena, y otra cadena a modificar, y modifica todas las apariciones de la primera por la segunda en la lista.\n", - "* Eliminar: Me pide una cadena, y la elimina de la lista.\n", - "* Mostrar: Muestra la lista de cadenas\n", - "* Terminar" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/PIA/UT01/2_Ejercicios/20_Ejercicios_de_Diccionarios_en_Python.ipynb b/PIA/UT01/2_Ejercicios/20_Ejercicios_de_Diccionarios_en_Python.ipynb deleted file mode 100644 index 484739d..0000000 --- a/PIA/UT01/2_Ejercicios/20_Ejercicios_de_Diccionarios_en_Python.ipynb +++ /dev/null @@ -1,84 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "# Ejerccios de Diccionarios\n", - "\n", - "## Ejercicio 1\n", - "\n", - "Escribe un programa python que pida un número por teclado y que cree un diccionario cuyas claves sean desde el número 1 hasta el número indicado, y los valores sean los cuadrados de las claves." - ], - "metadata": { - "id": "j29sm1Ngi89V" - } - }, - { - "cell_type": "markdown", - "source": [ - "## Ejercicio 2\n", - "\n", - "Escribe un programa que lea una cadena y devuelva un diccionario con la cantidad de apariciones de cada carácter en la cadena." - ], - "metadata": { - "id": "Hc1OttpvjI40" - } - }, - { - "cell_type": "markdown", - "source": [ - "## Ejercicio 3\n", - "\n", - "Vamos a crear un programa en python donde vamos a declarar un diccionario para guardar los precios de las distintas frutas. El programa pedirá el nombre de la fruta y la cantidad que se ha vendido y nos mostrará el precio final de la fruta a partir de los datos guardados en el diccionario. Si la fruta no existe nos dará un error. Tras cada consulta el programa nos preguntará si queremos hacer otra consulta." - ], - "metadata": { - "id": "Aepr-8fAjNmm" - } - }, - { - "cell_type": "markdown", - "source": [ - "## Ejercicio 4\n", - "\n", - "Codifica un programa en python que nos permita guardar los nombres de los alumnos de una clase y las notas que han obtenido. Cada alumno puede tener distinta cantidad de notas. Guarda la información en un diccionario cuya claves serán los nombres de los alumnos y los valores serán listas con las notas de cada alumno.\n", - "\n", - "El programa pedirá el número de alumnos que vamos a introducir, pedirá su nombre e irá pidiendo sus notas hasta que introduzcamos un número negativo. Al final el programa nos mostrará la lista de alumnos y la nota media obtenida por cada uno de ellos. Nota: si se introduce el nombre de un alumno que ya existe el programa nos dará un error." - ], - "metadata": { - "id": "RGzZWQm5jVYG" - } - }, - { - "cell_type": "markdown", - "source": [ - "## Ejercicio 5\n", - "\n", - "Escribir un programa que implemente una agenda. En la agenda se podrán guardar nombres y números de teléfono. El programa nos dará el siguiente menú:\n", - "\n", - "* Añadir/modificar: Nos pide un nombre. Si el nombre se encuentra en la agenda, debe mostrar el teléfono y, opcionalmente, permitir modificarlo si no es correcto. Si el nombre no se encuentra, debe permitir ingresar el teléfono correspondiente.\n", - "* Buscar: Nos pide una cadena de caracteres, y nos muestras todos los contactos cuyos nombres comiencen por dicha cadena.\n", - "* Borrar: Nos pide un nombre y si existe nos preguntará si queremos borrarlo de la agenda.\n", - "* Listar: Nos muestra todos los contactos de la agenda.\n", - "\n", - "Implementar el programa con un diccionario." - ], - "metadata": { - "id": "6VVzevmsjbr-" - } - } - ] -} \ No newline at end of file diff --git a/PIA/UT01/3_Practica/Leer_archivo.py b/PIA/UT01/3_Practica/Leer_archivo.py deleted file mode 100644 index 91b21f9..0000000 --- a/PIA/UT01/3_Practica/Leer_archivo.py +++ /dev/null @@ -1,25 +0,0 @@ -# Lista basica - -lista = [1,2,3,4,5] - -for num in lista: - print(num , end=" ") - -print("") - -# Lista Multidimensiones - -lista = [[1,2,3,4,5] , [61,72,83,94,101]] - -print("-------------") -print("1- Dimension") -for num in lista: - print(num) - -print("-------------") -print("2- Dimension") - -for fila in lista: - for columna in fila: - print(columna,end="") - print() \ No newline at end of file diff --git a/PIA/UT01/2_Ejercicios/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Ejercicios/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb similarity index 97% rename from PIA/UT01/2_Ejercicios/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb rename to PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Ejercicios/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb index e7699ad..2326659 100644 --- a/PIA/UT01/2_Ejercicios/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb +++ b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Ejercicios/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb @@ -224,9 +224,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1- Cadena Normal: Hola Mundo - Longitud total: 10\n", + "2- Cadena Invertida: odnuM aloH - Longitud total: 10\n" + ] + } + ], "source": [ "cadena = \"Hola Mundo\"\n", "cadena_invertida = \"\"\n", diff --git a/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Ejercicios/18_Ejercicios_de_Listas_en_Python.ipynb b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Ejercicios/18_Ejercicios_de_Listas_en_Python.ipynb new file mode 100644 index 0000000..3081b67 --- /dev/null +++ b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Ejercicios/18_Ejercicios_de_Listas_en_Python.ipynb @@ -0,0 +1,1276 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Accv8mAE1oP3" + }, + "source": [ + "# Ejercicios de listas\n", + "\n", + "## Ejercicio 1\n", + "\n", + "Realizar un programa que inicialice una lista con 10 valores aleatorios (del 1 al 10) y posteriormente muestre en pantalla cada elemento de la lista junto con su cuadrado y su cubo." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# calcula el cuadrado y el cubo de un número\n", + "(25.0, ' - ', 125.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(36.0, ' - ', 216.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(81.0, ' - ', 729.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(1.0, ' - ', 1.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(4.0, ' - ', 8.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(4.0, ' - ', 8.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(81.0, ' - ', 729.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(49.0, ' - ', 343.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(1.0, ' - ', 1.0)\n", + "# calcula el cuadrado y el cubo de un número\n", + "(16.0, ' - ', 64.0)\n" + ] + } + ], + "source": [ + "import random as aleatorio\n", + "import math\n", + "\n", + "lista_aleatorios = [aleatorio.randint(0, 10) for _ in range(10)]\n", + "\n", + "for num in lista_aleatorios:\n", + " print(\n", + " f\"# calcula el cuadrado y el cubo de un número\\n\"\n", + " f'{math.pow(num,2), \" - \" , math.pow(num,3)}'\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Ejercicio 2\n", + "\n", + "Crea una lista e inicializala con 5 cadenas de caracteres leídas por teclado. Copia los elementos de la lista en otra lista pero en orden inverso, y muestra sus elementos por la pantalla." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['2', '2', '2', '2', '2']\n" + ] + } + ], + "source": [ + "lista = [None] * 5\n", + "for i in range(0, len(lista)):\n", + " lista[i] = str(input(\"Intro un nuevo caracter\"))\n", + "\n", + "lista.reverse()\n", + "\n", + "print(lista)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aMam1QSaJDCu" + }, + "source": [ + "## Ejercicio 3\n", + "\n", + "Se quiere realizar un programa que lea por teclado las 5 notas obtenidas por un alumno (comprendidas entre 0 y 10). A continuación debe mostrar todas las notas, la nota media, la nota más alta que ha sacado y la menor." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Lista de notas: [2.0, 2.0, 2.0, 2.0, 2.0]\n", + "Notas media : 2.0\n", + "Nota más alta : 2.0\n" + ] + } + ], + "source": [ + "nota_media = 0\n", + "nota_alta = 0\n", + "notas = [None] * 5\n", + "\n", + "for i in range(len(notas)):\n", + " notas[i] = float(input(\"Introduce la nota numero {} : \".format(i)))\n", + "\n", + "print(\"Lista de notas: \",notas)\n", + "\n", + "nota_alta = notas[0]\n", + "\n", + "for i in range(0, len(notas)):\n", + " nota_media += notas[i]\n", + "\n", + "for i in range(0, len(notas)):\n", + " if nota_alta < notas[i]:\n", + " nota_alta = notas[i]\n", + "\n", + "# Nota media\n", + "print(\"Notas media : \", nota_media / len(notas))\n", + "print(\"Nota más alta : \", nota_alta)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IQHHht7GJJVs" + }, + "source": [ + "## Ejercicio 4\n", + "\n", + "Programa que declare una lista y la vaya llenando de números hasta que introduzcamos un número negativo. Entonces se debe imprimir el vector (sólo los elementos introducidos)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Negativo si no deseo continuar\n", + "Negativo si no deseo continuar\n", + "Negativo si no deseo continuar\n", + "Negativo si no deseo continuar\n", + "Negativo si no deseo continuar\n", + "Negativo si no deseo continuar\n" + ] + }, + { + "ename": "ValueError", + "evalue": "invalid literal for int() with base 10: ''", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mk:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA\\PIA\\UT01\\2_Ejercicios\\18_Ejercicios_de_Listas_en_Python.ipynb Celda 8\u001b[0m line \u001b[0;36m6\n\u001b[0;32m 3\u001b[0m incr \u001b[39m=\u001b[39m \u001b[39m0\u001b[39m\n\u001b[0;32m 5\u001b[0m \u001b[39mwhile\u001b[39;00m(\u001b[39mTrue\u001b[39;00m):\n\u001b[1;32m----> 6\u001b[0m numero \u001b[39m=\u001b[39m \u001b[39mint\u001b[39;49m(\u001b[39minput\u001b[39;49m(\u001b[39m\"\u001b[39;49m\u001b[39mIntroduce un numero\u001b[39;49m\u001b[39m\"\u001b[39;49m))\n\u001b[0;32m 7\u001b[0m \u001b[39mif\u001b[39;00m (numero \u001b[39m>\u001b[39m \u001b[39m0\u001b[39m):\n\u001b[0;32m 8\u001b[0m lista\u001b[39m.\u001b[39mappend(numero) \n", + "\u001b[1;31mValueError\u001b[0m: invalid literal for int() with base 10: ''" + ] + } + ], + "source": [ + "# Añadir una lista vacia\n", + "lista = []\n", + "incr = 0\n", + "\n", + "while(True):\n", + " numero = int(input(\"Introduce un numero\"))\n", + " if (numero > 0):\n", + " lista.append(numero) \n", + " print('Negativo si no deseo continuar')\n", + " if (numero < 0):\n", + " break\n", + " \n", + "print(lista) " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2-Gt2ufCJPqy" + }, + "source": [ + "## Ejercicio 5\n", + "\n", + "Hacer un programa que inicialice una lista de números con valores aleatorios (10 valores), y posterior ordene los elementos de menor a mayor." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "\n", + "lista = [random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10),random.randint(1,10)]\n", + "print(\"Longitud: \",len(lista))\n", + "print(\"Sin ordenación:\" ,lista)\n", + "lista.sort()\n", + "print(\"Con ordenación:\" , lista)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6lUuFkx9JUVZ" + }, + "source": [ + "## Ejercicio 6\n", + "\n", + "Crea un programa que pida un número al usuario un número de mes (por ejemplo, el 4) y diga cuántos días tiene (por ejemplo, 30) y el nombre del mes. Debes usar listas. Para simplificarlo vamos a suponer que febrero tiene 28 días." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mes = int(input(\"Numero de mes\"))\n", + "\n", + "while (mes < 1) or (mes > 12):\n", + " if(mes < 1 or mes > 12):\n", + " mes = int(input(\"Introduce un nuevo numero de mes\"))\n", + " else:\n", + " print(\"Mes correcto\")\n", + "\n", + "mes -= 1\n", + " \n", + "print(\"Numero escogido: \", mes+1)\n", + "lista_meses = [31,28,31,30,31,30,31,31,30,31,30,31]\n", + "nombre_meses = [\"Enero\" ,\"Febrero\" , \"Marzo\" , \"Abril\" , \"Mayo\" , \"Junio\" , \"Julio\" , \"Agosto\" , \"Septiembre\", \"Octubre\" , \"Noviembre\" , \"Diciembre\"]\n", + "print(\"El mes: \", nombre_meses[mes] ,\" tiene \" , lista_meses[mes] , \" dias\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Tri9usePJalD" + }, + "source": [ + "## Ejercicio 7\n", + "\n", + "Programa que declare tres listas ‘lista1’, ‘lista2’ y ‘lista3’ de cinco enteros cada uno, pida valores para ‘lista1’ y ‘lista2’ y calcule lista3=lista1+lista2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "lista_1 = [0] * 5\n", + "lista_2 = [0] * 5\n", + "lista_3 = [0] * 5\n", + "\n", + "for i in range(0,len(lista_3)):\n", + " lista_1[i] = int(input(\"Introduce un número lista 1\"))\n", + " lista_2[i] = int(input(\"Introduce un número lista 2\"))\n", + " lista_3[i] = lista_1[i] + lista_2[i]\n", + " print(lista_3[i])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Pedir valores para lista1 y lista2\n", + "print(\"Introduce los valores para lista1:\")\n", + "lista1 = [int(input(\"Introduce un número: \")) for _ in range(5)]\n", + "\n", + "print(\"Introduce los valores para lista2:\")\n", + "lista2 = [int(input(\"Introduce un número: \")) for _ in range(5)]\n", + "\n", + "# Calcular lista3 = lista1 + lista2 utilizando comprensión de listas\n", + "lista3 = [lista1[i] + lista2[i] for i in range(5)]\n", + "\n", + "print(\"La suma de lista1 y lista2 es:\", lista3)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kxjDuluCJgQz" + }, + "source": [ + "## Ejercicio 8\n", + "\n", + "Queremos guardar los nombres y la edades de los alumnos de un curso. Realiza un programa que introduzca el nombre y la edad de cada alumno. El proceso de lectura de datos terminará cuando se introduzca como nombre un asterisco (*) Al finalizar se mostrará los siguientes datos:\n", + "\n", + "* Todos lo alumnos mayores de edad.\n", + "* Los alumnos mayores (los que tienen más edad)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "edad_mas_alta = 0\n", + "mayor_edad = 18\n", + "alumno_mayor = 0\n", + "posicion = 0\n", + "nombre_adulto = ''\n", + "\n", + "nombres = []\n", + "nombres_adultos = []\n", + "edades = []\n", + "edades_adultos = []\n", + "\n", + "while(True):\n", + " nombre = input(\"Nombre del alumno:\")\n", + " if nombre == '*':\n", + " break\n", + " else:\n", + " edad = int(input(\"Edad del alumno:\"))\n", + " nombres.append(nombre)\n", + " edades.append(edad)\n", + "\n", + "# Alumnos mayores\n", + "for i in range(0,len(nombres)):\n", + " if edades[i] > mayor_edad:\n", + " edades_adultos.append(edades[i]) \n", + " nombres_adultos.append(nombres[i]) \n", + "\n", + "print(\"Nombres: \",nombres_adultos) \n", + "print(\"Edades: \",edades_adultos)\n", + " \n", + "# Mostrar adultos\n", + "for i in range(0, len(edades_adultos)):\n", + " alumno_mayor = edades_adultos[i]\n", + " nombre_adulto = nombres_adultos[i]\n", + " for j in range(0, len(edades_adultos)):\n", + " if 18 < edades_adultos[j] and alumno_mayor < edades_adultos[j]:\n", + " posicion = j\n", + " alumno_mayor = edades_adultos[j]\n", + " nombre_adulto = nombres_adultos[j]\n", + " \n", + "\n", + "print(\"Nombres: \",nombres)\n", + "print(\"Edades: \",edades)\n", + "print(\"Mayores de edad: \", edades_adultos)\n", + "print(\"Nombre:\" , nombre_adulto ,\" El alumno con más edad:\", alumno_mayor , \" Posicion: \" , posicion + 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Optimización\n", + "mayor_edad = 18\n", + "alumno_mayor = None\n", + "edad_alumno_mayor = 0\n", + "\n", + "personas = []\n", + "\n", + "while True:\n", + " nombre = input(\"Nombre del alumno:\")\n", + " if nombre == '*':\n", + " break\n", + " else:\n", + " edad = int(input(\"Edad del alumno:\"))\n", + " personas.append((nombre, edad))\n", + "\n", + "adultos = [(nombre, edad) for nombre, edad in personas if edad > mayor_edad]\n", + "\n", + "for nombre, edad in adultos:\n", + " if edad > edad_alumno_mayor:\n", + " alumno_mayor = nombre\n", + " edad_alumno_mayor = edad\n", + "\n", + "print(\"Adultos: \", adultos)\n", + "print(\"El alumno con más edad es\", alumno_mayor, \"con\", edad_alumno_mayor, \"años.\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tSjIHZ2WJtUj" + }, + "source": [ + "## Ejercicio 9\n", + "\n", + "Queremos guardar la temperatura mínima y máxima de 5 días. Realiza un programa que de la siguiente información:\n", + "\n", + "* La temperatura media de cada día\n", + "* Los días con menos temperatura\n", + "* Se lee una temperatura por teclado y se muestran los días cuya temperatura máxima coincide con ella. si no existe ningún día se muestra un mensaje de información." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dias menos temperaturas : ['Lunes', '', 'Miercoles', 'Jueves', '']\n", + "Temperatura media: 22.906\n", + "Temperatura menor: 2.56\n", + "Temperatura maxima: 41.39\n" + ] + } + ], + "source": [ + "import random as r\n", + "\n", + "temp_minima = 0\n", + "temp_maxima = 0\n", + "temp_media = 0\n", + "# Temperatura media de España en Verano\n", + "temp_media_pais = 25\n", + "\n", + "\n", + "# Lista de temperaturas\n", + "# lista_temp = [r.random() * 40 for _ in range(0 , 5)]\n", + "# lista_temp_redondeo = [round(temp,2) for temp in lista_temp]\n", + "# print(\"Temperaturas: \", lista_temp_redondeo)\n", + "\n", + "# Temperaturas mínimas y máximas\n", + "temperaturas_minimas = []\n", + "temperaturas_maximas = []\n", + "\n", + "dias_semana = [\"Lunes\" , \"Martes\" , \"Miercoles\" , \"Jueves\" , \"Viernes\"]\n", + "dias_menos_temperaturas = [\"\"] * len(dias_semana)\n", + "dias_max_temperaturas = [\"\"] * len(dias_semana)\n", + "\n", + "lista_temp = [12.19, 34.72, 23.67, 2.56, 41.39]\n", + "\n", + "# Temperatura media del total\n", + "for i in range(0,len(lista_temp)):\n", + " temp_media += lista_temp[i] / len(lista_temp) \n", + "\n", + "# Temperatura minima\n", + "for i in range(0,len(lista_temp)):\n", + " temp_minima = lista_temp[i]\n", + " for j in range(0,len(lista_temp)):\n", + " if temp_minima > lista_temp[j]:\n", + " temp_minima = lista_temp[j]\n", + " # print(temp_minima)\n", + "\n", + "# Temperatura maxima\n", + "for i in range(0,len(lista_temp)):\n", + " temp_maxima = lista_temp[i]\n", + " for j in range(0,len(lista_temp)):\n", + " if temp_maxima < lista_temp[j]:\n", + " temp_maxima = lista_temp[j]\n", + " # print(temp_maxima)\n", + " \n", + "# Dias con temperaturas minimas\n", + "for i in range(0,len(lista_temp)):\n", + " if temp_media_pais > lista_temp[i]:\n", + " dias_menos_temperaturas[i] = dias_semana[i]\n", + " # print(temp_minima)\n", + "\n", + "# Dias con temperaturas minimas\n", + "for i in range(0,len(lista_temp)):\n", + " if temp_media_pais < lista_temp[i]:\n", + " dias_max_temperaturas[i] = dias_semana[i]\n", + " # print(temp_minima)\n", + "\n", + "# Se lee una temperatura por teclado y se muestran los días \n", + "# cuya temperatura máxima coincide con ella.\n", + "# si no existe ningún día se muestra un mensaje de información.\n", + "\n", + "dias_temp_max = float(input(\"Introduce temp maxima\"))\n", + "\n", + "salida = False\n", + "for i in range(0,len(lista_temp)):\n", + " if dias_temp_max == lista_temp[i]:\n", + " print(\"Dias que coinciden con la temperatura maxima: \",dias_semana[i])\n", + " salida = True\n", + " elif(i == (len(lista_temp)-1) and salida == False):\n", + " print(\"No existen días con esa temperatura máxima\")\n", + "\n", + "print(\"Temperaturas : \", lista_temp)\n", + "print(\"Dias menos temperaturas : \", dias_menos_temperaturas)\n", + "print(\"Dias maximas temperaturas : \", dias_max_temperaturas)\n", + "print(\"Temperatura media: \",temp_media)\n", + "print(\"Temperatura menor: \",temp_minima)\n", + "print(\"Temperatura maxima: \",temp_maxima)\n", + "# print(temp_minima)\n", + "# print(temperaturas_minimas)\n", + "# print(lista_temp)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random as r\n", + "\n", + "# Lista de temperaturas\n", + "lista_temp = [12.19, 34.72, 23.67, 2.56, 41.39]\n", + "\n", + "# Temperatura media de España en Verano\n", + "temp_media_pais = 25\n", + "\n", + "dias_semana = [\"Lunes\" , \"Martes\" , \"Miercoles\" , \"Jueves\" , \"Viernes\"]\n", + "\n", + "# Calculamos la temperatura media\n", + "temp_media = sum(lista_temp) / len(lista_temp)\n", + "\n", + "# Encontramos la temperatura mínima y máxima\n", + "temp_minima = min(lista_temp)\n", + "temp_maxima = max(lista_temp)\n", + "\n", + "# Días con temperaturas por debajo y por encima de la media\n", + "dias_menos_temperaturas = [dia for dia, temp in zip(dias_semana, lista_temp) if temp < temp_media_pais]\n", + "dias_max_temperaturas = [dia for dia, temp in zip(dias_semana, lista_temp) if temp > temp_media_pais]\n", + "\n", + "# Se lee una temperatura por teclado y se muestran los días \n", + "# cuya temperatura máxima coincide con ella.\n", + "# si no existe ningún día se muestra un mensaje de información.\n", + "\n", + "dias_temp_max = float(input(\"Introduce temp maxima\"))\n", + "\n", + "dias_con_temp_max = [dia for dia, temp in zip(dias_semana, lista_temp) if temp == dias_temp_max]\n", + "\n", + "if dias_con_temp_max:\n", + " print(\"Días que coinciden con la temperatura máxima: \", dias_con_temp_max)\n", + "else:\n", + " print(\"No existen días con esa temperatura máxima\")\n", + "\n", + "print(\"Temperaturas : \", lista_temp)\n", + "print(\"Días con temperaturas menores a la media : \", dias_menos_temperaturas)\n", + "print(\"Días con temperaturas mayores a la media : \", dias_max_temperaturas)\n", + "print(\"Temperatura media: \", temp_media)\n", + "print(\"Temperatura menor: \", temp_minima)\n", + "print(\"Temperatura máxima: \", temp_maxima)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nL8BLwAOJ4Wi" + }, + "source": [ + "## Ejercicio 10\n", + "\n", + "Diseñar el algoritmo correspondiente a un programa, que:\n", + "\n", + "* Crea una tabla (lista con dos dimensiones) de 5x5 enteros.\n", + "* Carga la tabla con valores numéricos enteros.\n", + "* Suma todos los elementos de cada fila y todos los elementos de cada columna visualizando los resultados en pantalla.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random as rad\n", + "\n", + "filas = 0\n", + "columnas = 0\n", + "\n", + "mi_lista = [rad.randint(1,9) for _ in range(0,5)]\n", + "\n", + "for i in range(0,len(mi_lista)):\n", + " filas += mi_lista[i]\n", + " for j in range(0,len(mi_lista)):\n", + " columnas += mi_lista[j]\n", + " print(mi_lista[i] , end=\" \")\n", + " print(\"\\n\") \n", + "\n", + "print(filas)\n", + "print(columnas)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random as rad\n", + "\n", + "# 1. Crear la tabla\n", + "tabla = [[0 for i in range(5)] for j in range(1)]\n", + "\n", + "# 2. Cargar la tabla\n", + "for i in range(len(tabla)):\n", + " for j in range(len(tabla[0])):\n", + " tabla[i][j] = [rad.randint(1, 9) for _ in range(0, 5)]\n", + " # tabla[i][j] = int(input(\"Introduce el valor en la posición ({},{}): \".format(i, j)))\n", + "\n", + "for i in range(0, len(tabla)):\n", + " for j in range(0, len(tabla[i])):\n", + " print(tabla[i][j])\n", + "\n", + "# 3. Sumar los elementos de cada fila\n", + "sumas_filas = []\n", + "for i in range(len(tabla)):\n", + " suma_fila = 0\n", + " for j in range(len(tabla[0])):\n", + " suma_fila += sum(tabla[i][j]) # Aquí está la corrección\n", + " sumas_filas.append(suma_fila)\n", + "\n", + "# 4. Sumar los elementos de cada columna\n", + "sumas_columnas = []\n", + "for j in range(len(tabla[0])):\n", + " suma_columna = 0\n", + " for i in range(len(tabla)):\n", + " suma_columna += sum(tabla[i][j]) # Aquí está la corrección\n", + " sumas_columnas.append(suma_columna)\n", + "\n", + "# 5. Visualizar los resultados\n", + "print(\"Sumas de filas:\")\n", + "for suma in sumas_filas:\n", + " print(\"Suma filas : \",suma)\n", + "print(\"Sumas de columnas:\")\n", + "for suma in sumas_columnas:\n", + " print(suma)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DpDEKp4gKDFO" + }, + "source": [ + "## Ejercicio 11\n", + "\n", + "Diseñar el algoritmo correspondiente a un programa, que:\n", + "\n", + "* Crea una tabla bidimensional de longitud 5x5 y nombre ‘diagonal’.\n", + "* Carga la tabla de forma que los componentes pertenecientes a la diagonal de la matriz tomen el valor 1 y el resto el valor 0.\n", + "* Muestra el contenido de la tabla en pantalla." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 0 0 0 0 \n", + "0 1 0 0 0 \n", + "0 0 1 0 0 \n", + "0 0 0 1 0 \n", + "0 0 0 0 1 \n" + ] + } + ], + "source": [ + "# Declaro la matriz de 5x5\n", + "matriz = [[0 for i in range(5)] for j in range(5)]\n", + "\n", + "print(\"• Diagonal • \")\n", + "print(\"-------------\")\n", + "\n", + "for i in range(0,len(matriz)):\n", + " for j in range(0,len(matriz)):\n", + " if (i == j):\n", + " matriz[i][j] = 1\n", + " \n", + "for i in range(0,len(matriz)):\n", + " for j in range(0,len(matriz)):\n", + " print(matriz[i][j] , end=\" \")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AKnNXsN4KRym" + }, + "source": [ + "## Ejercicio 12\n", + "\n", + "Diseñar el algoritmo correspondiente a un programa, que:\n", + "\n", + "* Crea una tabla bidimensional de longitud 5x15 y nombre ‘marco’.\n", + "* Carga la tabla con dos únicos valores 0 y 1, donde el valor uno ocupará las posiciones o elementos que delimitan la tabla, es decir, las más externas, mientras que el resto de los elementos contendrán el valor 0.\n", + "\n", + "\n", + "```\n", + "111111111111111\n", + "100000000000001\n", + "100000000000001\n", + "100000000000001\n", + "111111111111111\n", + "```\n", + "\n", + "* Visualiza el contenido de la matriz en pantalla" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00000\n", + "00000\n", + "00000\n", + "00000\n", + "00000\n" + ] + } + ], + "source": [ + "matriz = [[0 for i in range(5)] for j in range(5)]\n", + "\n", + "limite = len(matriz)\n", + "\n", + "for i in range(0,len(matriz)):\n", + " for j in range(0,len(matriz)):\n", + " if (i == limite) or (j == limite):\n", + " matriz[i][j] = 1\n", + " else: \n", + " matriz[i][j] = 0\n", + " print(matriz[i][j], end=\"\")\n", + " print(\"\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "matriz = [[0 for i in range(5)] for j in range(5)]\n", + "\n", + "limite = len(matriz)-1\n", + "\n", + "for i in range(0,len(matriz)):\n", + " for j in range(0,len(matriz)):\n", + " matriz[i][j] += 1\n", + " \n", + "incr = 0\n", + "for i in range(0,len(matriz)):\n", + " for j in range(0,len(matriz)):\n", + " if (i == incr or i == limite) or (j == incr or j == limite):\n", + " matriz[i][j] = 1\n", + " else: \n", + " matriz[i][j] = 0\n", + " print(matriz[i][j], end=\"\")\n", + " print(\"\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Valores \n", + "\n", + "matriz = [[0 for i in range(5)] for j in range(5)]\n", + "\n", + "limite = len(matriz)-1\n", + "\n", + "for i in range(0,len(matriz)):\n", + " for j in range(0,len(matriz)):\n", + " matriz[i][j] += 1\n", + " \n", + "\n", + "incr = 0\n", + "for i in range(0,len(matriz)):\n", + " for j in range(0,len(matriz)):\n", + " if (i == incr or i == limite): \n", + " if(j == incr or j == limite):\n", + " matriz[i][j] = 1\n", + " else: \n", + " matriz[i][j] = 0\n", + " print(matriz[i][j], end=\"\")\n", + " print(\"\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H7VlNaP5Kk2T" + }, + "source": [ + "## Ejercicio 13\n", + "\n", + "De una empresa de transporte se quiere guardar el nombre de los conductores que tiene, y los kilómetros que conducen cada día de la semana.\n", + "\n", + "Para guardar esta información se van a utilizar dos arrays:\n", + "\n", + "* Nombre: Lista para guardar los nombres de los conductores.\n", + "* kms: Tabla para guardar los kilómetros que realizan cada día de la semana.\n", + "\n", + "Se quiere generar una nueva lista (“total_kms”) con los kilómetros totales que realza cada conductor.\n", + "\n", + "Al finalizar se muestra la lista con los nombres de conductores y los kilómetros que ha realizado." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Nombre | Kilómetros\n", + "Juan | 1500\n", + "Pedro | 2000\n", + "María | 2500\n" + ] + } + ], + "source": [ + "# ☻ Definimos los arrays\n", + "Nombre = [\"Juan\", \"Pedro\", \"María\"]\n", + "kms = [[100, 200, 300, 400, 500], [200, 300, 400, 500, 600], [300, 400, 500, 600, 700]]\n", + "\n", + "# Calculamos los kilómetros totales\n", + "total_kms = []\n", + "for i in range(len(Nombre)):\n", + " total = 0\n", + " for j in range(len(kms[i])):\n", + " total += kms[i][j]\n", + " total_kms.append(total)\n", + "\n", + "# Imprimimos los resultados\n", + "print(\"Nombre | Kilómetros\")\n", + "for i in range(len(Nombre)):\n", + " print(f\"{Nombre[i]} | {total_kms[i]}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QEDeTz8FKzfu" + }, + "source": [ + "## Ejercicio 14\n", + "\n", + "Crear un programa que lea los precios de 5 artículos y las cantidades vendidas por una empresa en sus 4 sucursales. Informar:\n", + "\n", + "* Las cantidades totales de cada articulo.\n", + "* La cantidad de artículos en la sucursal 2.\n", + "* La cantidad del articulo 3 en la sucursal 1.\n", + "* La recaudación total de cada sucursal.\n", + "* La recaudación total de la empresa.\n", + "* La sucursal de mayor recaudación." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- Resultados ----------\n", + "Cantidades totales:\n", + "Articulo 1: 400\n", + "Articulo 2: 400\n", + "Articulo 3: 400\n", + "Articulo 4: 400\n", + "Articulo 5: 400\n", + "\n", + "Cantidad de artículos en la sucursal 2: 500\n", + "\n", + "Cantidad del artículo 3 en la sucursal 1: 100\n", + "\n", + "Recaudación total por sucursal:\n", + "Sucursal 1: 15000\n", + "Sucursal 2: 15000\n", + "Sucursal 3: 15000\n", + "Sucursal 4: 15000\n", + "\n", + "Recaudación total de la empresa: 60000\n", + "\n", + "Sucursal de mayor recaudación: 1\n" + ] + } + ], + "source": [ + "# ☻ Definimos las variables\n", + "precios = [10, 20, 30, 40, 50]\n", + "cantidades = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]\n", + "\n", + "# Leemos los datos\n", + "for i in range(len(precios)):\n", + " for j in range(4):\n", + " cantidades[j][i] = int(input(f\"Ingrese la cantidad del artículo {i + 1} en la sucursal {j + 1}: \"))\n", + "\n", + "# Calculamos las cantidades totales\n", + "cantidades_totales = []\n", + "for i in range(len(precios)):\n", + " cantidades_totales.append(sum(cantidades[j][i] for j in range(4)))\n", + "\n", + "# Calculamos la cantidad de artículos en la sucursal 2\n", + "cantidad_sucursal2 = sum(cantidades[1])\n", + "\n", + "# Calculamos la cantidad del artículo 3 en la sucursal 1\n", + "cantidad_articulo3_sucursal1 = cantidades[0][2]\n", + "\n", + "# Calculamos la recaudación total de cada sucursal\n", + "recaudacion_sucursales = []\n", + "\n", + "for i in range(4):\n", + " recaudacion_sucursales.append(sum(precios[j] * cantidades[i][j] for j in range(len(precios))))\n", + "\n", + "# Calculamos la recaudación total de la empresa\n", + "recaudacion_total = sum(recaudacion_sucursales)\n", + "\n", + "# Calculamos la sucursal de mayor recaudación\n", + "sucursal_mayor_recaudacion = recaudacion_sucursales.index(max(recaudacion_sucursales)) + 1\n", + "\n", + "# Imprimimos los resultados\n", + "print(\"---------- Resultados ----------\")\n", + "print(\"Cantidades totales:\")\n", + "for i in range(len(cantidades_totales)):\n", + " print(f\"Articulo {i + 1}: {cantidades_totales[i]}\")\n", + "print()\n", + "print(f\"Cantidad de artículos en la sucursal 2: {cantidad_sucursal2}\")\n", + "print()\n", + "print(f\"Cantidad del artículo 3 en la sucursal 1: {cantidad_articulo3_sucursal1}\")\n", + "print()\n", + "print(\"Recaudación total por sucursal:\")\n", + "for i in range(4):\n", + " print(f\"Sucursal {i + 1}: {recaudacion_sucursales[i]}\")\n", + "print()\n", + "print(f\"Recaudación total de la empresa: {recaudacion_total}\")\n", + "print()\n", + "print(f\"Sucursal de mayor recaudación: {sucursal_mayor_recaudacion}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6SMOp_uVK-b8" + }, + "source": [ + "## Ejercicio 15\n", + "\n", + "Crear un programa de ordenador para gestionar los resultados de la quiniela de fútbol. Para ello vamos a utilizar dos tablas:\n", + "\n", + "* Equipos: Que es una tabla de cadenas donde guardamos en cada columna el nombre de los equipos de cada partido. En la quiniela se indican 15 partidos.\n", + "* Resultados: Es una tabla de enteros donde se indica el resultado. También tiene dos columnas, en la primera se guarda el número de goles del equipo que está guardado en la primera columna\n", + "de la tabla anterior, y en la segunda los goles del otro equipo.\n", + "\n", + "El programa ira pidiendo los nombres de los equipos de cada partido y el resultado del partido, a continuación se imprimirá la quiniela de esa jornada.\n", + "\n", + "¿Qué modificación habría que hacer en las tablas para guardar todos los resultados de todas las jornadas de la temporada?" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mk:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA\\PIA\\UT01\\2_Ejercicios\\18_Ejercicios_de_Listas_en_Python.ipynb Celda 36\u001b[0m line \u001b[0;36m9\n\u001b[0;32m 7\u001b[0m \u001b[39m# Guardamos los resultados de la jornada 1\u001b[39;00m\n\u001b[0;32m 8\u001b[0m \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(\u001b[39m15\u001b[39m):\n\u001b[1;32m----> 9\u001b[0m Resultados[i][\u001b[39m0\u001b[39m] \u001b[39m=\u001b[39m \u001b[39mint\u001b[39m(\u001b[39minput\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mIngrese el número de goles del equipo 1 del partido \u001b[39m\u001b[39m{\u001b[39;00mi\u001b[39m \u001b[39m\u001b[39m+\u001b[39m\u001b[39m \u001b[39m\u001b[39m1\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m: \u001b[39m\u001b[39m\"\u001b[39m))\n\u001b[0;32m 10\u001b[0m Resultados[i][\u001b[39m1\u001b[39m] \u001b[39m=\u001b[39m \u001b[39mint\u001b[39m(\u001b[39minput\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mIngrese el número de goles del equipo 2 del partido \u001b[39m\u001b[39m{\u001b[39;00mi\u001b[39m \u001b[39m\u001b[39m+\u001b[39m\u001b[39m \u001b[39m\u001b[39m1\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m: \u001b[39m\u001b[39m\"\u001b[39m))\n", + "\u001b[1;31mIndexError\u001b[0m: list index out of range" + ] + } + ], + "source": [ + "# ☻ Tabla Equipos - Sin terminar\n", + "Equipos = [[\"Equipo 1\", \"Equipo 2\"], [\"Equipo 3\", \"Equipo 4\"]]\n", + "\n", + "# Tabla Resultados\n", + "Resultados = [[0, 0], [0, 0] , [0,0] , [0, 0] , [0, 0],[0,0],[0, 0], [0, 0],[0,0]]\n", + "\n", + "# Guardamos los resultados de la jornada 1\n", + "for i in range(15):\n", + " Resultados[i][0] = int(input(f\"Ingrese el número de goles del equipo 1 del partido {i + 1}: \"))\n", + " Resultados[i][1] = int(input(f\"Ingrese el número de goles del equipo 2 del partido {i + 1}: \"))\n", + " \n", + "# Imprimimos los resultados de todas las jornadas\n", + "for jornada in range(38):\n", + " print(f\"Jornada {jornada + 1}\")\n", + " for i in range(15):\n", + " print(f\"{Equipos[i][0]} - {Equipos[i][1]}: {Resultados[jornada][i]} - {Resultados[jornada][i + 1]}\") " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8lOcKOs5LLvS" + }, + "source": [ + "## Ejercicio 16\n", + "\n", + "Vamos a crear un programa que tenga el siguiente menú:\n", + "\n", + "\n", + "\n", + "1. Añadir número a la lista: Me pide un número de la lista y lo añade al final de la lista.\n", + "2. Añadir número de la lista en una posición: Me pide un número y una posición, y si la posición existe en la lista lo añade a ella (la posición se pide a partir de 1).\n", + "3. Longitud de la lista: te muestra el número de elementos de la lista.\n", + "4. Eliminar el último número: Muestra el último número de la lista y lo borra.\n", + "5. Eliminar un número: Pide una posición, y si la posición existe en la lista lo borra de ella (la posición se pide a partir de 1).\n", + "6. Contar números: Te pide un número y te dice cuantas apariciones hay en la lista.\n", + "7. Posiciones de un número: Te pide un número y te dice en que posiciones está (contando desde 1).\n", + "8. Mostrar números: Muestra los números de la lista.\n", + "9. Salir" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1: Añadir número a la lista\n", + "2: Añadir número de la lista en una posición\n", + "3: Longitud de la lista\n", + "4: Eliminar el último número\n", + "5: Eliminar un número\n", + "6: Contar números\n", + "7: Posiciones de un número\n", + "8: Mostrar números\n", + "9: Salir\n" + ] + } + ], + "source": [ + "# ☻ Definimos la lista\n", + "lista = []\n", + "\n", + "# Creamos el menú\n", + "opciones = {\n", + " 1: \"Añadir número a la lista\",\n", + " 2: \"Añadir número de la lista en una posición\",\n", + " 3: \"Longitud de la lista\",\n", + " 4: \"Eliminar el último número\",\n", + " 5: \"Eliminar un número\",\n", + " 6: \"Contar números\",\n", + " 7: \"Posiciones de un número\",\n", + " 8: \"Mostrar números\",\n", + " 9: \"Salir\",\n", + "}\n", + "\n", + "# Bucle principal\n", + "while True:\n", + " # Mostramos el menú\n", + " for opcion, descripcion in opciones.items():\n", + " print(f\"{opcion}: {descripcion}\")\n", + "\n", + " # Leemos la opción\n", + " opcion = int(input(\"Introduce una opción: \"))\n", + "\n", + " # Ejecutamos la acción correspondiente\n", + " if opcion == 1:\n", + " # Añadimos un número al final de la lista\n", + " numero = int(input(\"Introduce un número: \"))\n", + " lista.append(numero)\n", + " elif opcion == 2:\n", + " # Añadimos un número a una posición determinada\n", + " numero = int(input(\"Introduce un número: \"))\n", + " posicion = int(input(\"Introduce la posición: \"))\n", + " lista.insert(posicion - 1, numero)\n", + " elif opcion == 3:\n", + " # Mostramos la longitud de la lista\n", + " print(f\"La longitud de la lista es {len(lista)}\")\n", + " elif opcion == 4:\n", + " # Eliminamos el último número de la lista\n", + " numero = lista.pop()\n", + " print(f\"Se ha eliminado el número {numero}\")\n", + " elif opcion == 5:\n", + " # Eliminamos un número de la lista\n", + " posicion = int(input(\"Introduce la posición: \"))\n", + " lista.pop(posicion - 1)\n", + " elif opcion == 6:\n", + " # Contamos las apariciones de un número\n", + " numero = int(input(\"Introduce un número: \"))\n", + " contador = lista.count(numero)\n", + " print(f\"El número {numero} aparece {contador} veces\")\n", + " elif opcion == 7:\n", + " # Mostramos las posiciones de un número\n", + " numero = int(input(\"Introduce un número: \"))\n", + " posiciones = [i for i, n in enumerate(lista) if n == numero]\n", + " print(f\"El número {numero} aparece en las posiciones: {posiciones}\")\n", + " elif opcion == 8:\n", + " # Mostramos los números de la lista\n", + " print(lista)\n", + " elif opcion == 9:\n", + " # Salimos del programa\n", + " break\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JJvxL8wVL3Zm" + }, + "source": [ + "## Ejercicio 17\n", + "\n", + "Crear un programa que añada números a una lista hasta que introducimos un número negativo. A continuación debe crear una nueva lista igual que la anterior pero eliminando los números duplicados. Muestra esta segunda lista para comprobar que hemos eliminados los duplicados." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ☻ Definimos la lista\n", + "lista = []\n", + "\n", + "# Bucle principal\n", + "while True:\n", + " # Leemos un número\n", + " numero = int(input(\"Introduce un número: \"))\n", + "\n", + " # Si el número es negativo, salimos del bucle\n", + " if numero < 0:\n", + " break\n", + "\n", + " # Añadimos el número a la lista\n", + " lista.append(numero)\n", + "\n", + "# Creamos una nueva lista sin duplicados\n", + "lista_sin_duplicados = list(set(lista))\n", + "\n", + "# Mostramos la nueva lista\n", + "print(lista_sin_duplicados)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BZtFKJ8uL-vS" + }, + "source": [ + "## Ejercicio 18\n", + "\n", + "Escriba un programa que permita crear una lista de palabras y que, a continuación de tres opciones:\n", + "\n", + "* Contar: Me pide una cadena, y me dice cuantas veces aparece en la lista\n", + "* Modificar: Me pide una cadena, y otra cadena a modificar, y modifica todas las apariciones de la primera por la segunda en la lista.\n", + "* Eliminar: Me pide una cadena, y la elimina de la lista.\n", + "* Mostrar: Muestra la lista de cadenas\n", + "* Terminar" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1: Contar\n", + "2: Modificar\n", + "3: Eliminar\n", + "4: Mostrar\n", + "5: Terminar\n" + ] + } + ], + "source": [ + "# ☻ Definimos la lista\n", + "lista = []\n", + "\n", + "# Bucle principal\n", + "while True:\n", + " # Mostramos el menú\n", + " opciones = {\n", + " 1: \"Contar\",\n", + " 2: \"Modificar\",\n", + " 3: \"Eliminar\",\n", + " 4: \"Mostrar\",\n", + " 5: \"Terminar\",\n", + " }\n", + " for opcion, descripcion in opciones.items():\n", + " print(f\"{opcion}: {descripcion}\")\n", + "\n", + " # Leemos la opción\n", + " opcion = int(input(\"Introduce una opción: \"))\n", + "\n", + " # Ejecutamos la acción correspondiente\n", + " if opcion == 1:\n", + " # Contamos las apariciones de una cadena\n", + " cadena = input(\"Introduce una cadena: \")\n", + " contador = lista.count(cadena)\n", + " print(f\"La cadena {cadena} aparece {contador} veces\")\n", + " elif opcion == 2:\n", + " # Modificamos una cadena\n", + " cadena_a_buscar = input(\"Introduce una cadena a buscar: \")\n", + " cadena_a_modificar = input(\"Introduce una cadena a modificar: \")\n", + " for i, cadena in enumerate(lista):\n", + " if cadena == cadena_a_buscar:\n", + " lista[i] = cadena_a_modificar\n", + " elif opcion == 3:\n", + " # Eliminamos una cadena\n", + " cadena = input(\"Introduce una cadena a eliminar: \")\n", + " lista.remove(cadena)\n", + " elif opcion == 4:\n", + " # Mostramos la lista\n", + " print(lista)\n", + " elif opcion == 5:\n", + " # Salimos del programa\n", + " break\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/UT01/1_Teoria/13_Cadenas_de_caracteres_en_Python.ipynb b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/13_Cadenas_de_caracteres_en_Python.ipynb similarity index 100% rename from PIA/UT01/1_Teoria/13_Cadenas_de_caracteres_en_Python.ipynb rename to PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/13_Cadenas_de_caracteres_en_Python.ipynb diff --git a/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb new file mode 100644 index 0000000..a09783f --- /dev/null +++ b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/14_Ejercicios_de_Cadenas_de_caracteres_en_Python.ipynb @@ -0,0 +1,130 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# **Ejercicios de Cadenas de Caracteres**\n", + "\n", + "## Ejercicio 1\n", + "\n", + "Escribir por pantalla cada carácter de una cadena introducida por teclado." + ], + "metadata": { + "id": "W9Gdw-6MCll2" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 2\n", + "\n", + "Realizar un programa que comprueba si una cadena leída por teclado comienza por una subcadena introducida por teclado." + ], + "metadata": { + "id": "zmyG292wDOiG" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 3\n", + "\n", + "Pide una cadena y un carácter por teclado (valida que sea un carácter) y muestra cuantas veces aparece el carácter en la cadena." + ], + "metadata": { + "id": "FVzv8hz3DUef" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 4\n", + "\n", + "Suponiendo que hemos introducido una cadena por teclado que representa una frase (palabras separadas por espacios), realiza un programa que cuente cuantas palabras tiene." + ], + "metadata": { + "id": "XtEjQoQpDaGW" + } + }, + { + "cell_type": "markdown", + "source": [ + "# Ejercicio 5\n", + "\n", + "Si tenemos una cadena con un nombre y apellidos, realizar un programa que muestre las iniciales en mayúsculas." + ], + "metadata": { + "id": "J__5_DHTDjci" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 6\n", + "\n", + "Realizar un programa que dada una cadena de caracteres, genere otra cadena resultado de invertir la primera." + ], + "metadata": { + "id": "joAkqTC4Doum" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 7\n", + "\n", + "Pide una cadena y dos caracteres por teclado (valida que sea un carácter), sustituye la aparición del primer carácter en la cadena por el segundo carácter." + ], + "metadata": { + "id": "CSZfCwUeD0IH" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 8\n", + "\n", + "Realizar un programa que lea una cadena por teclado y convierta las mayúsculas a minúsculas y viceversa." + ], + "metadata": { + "id": "5ibc80xoD5fa" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 9\n", + "\n", + "Realizar un programa que compruebe si una cadena contiene una **subcadena**. Las dos cadenas se introducen por teclado." + ], + "metadata": { + "id": "BUJSIWtzD_QY" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 10\n", + "\n", + "Introducir una cadena de caracteres e indicar si es un palíndromo. Una palabra palíndroma es aquella que se lee igual adelante que atrás." + ], + "metadata": { + "id": "yX7KMeUQEG1C" + } + } + ] +} \ No newline at end of file diff --git "a/PIA/UT01/1_Teoria/15_Introducci\303\263n_a_las_Listas_en_Python.ipynb" "b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/15_Introducci\303\263n_a_las_Listas_en_Python.ipynb" similarity index 100% rename from "PIA/UT01/1_Teoria/15_Introducci\303\263n_a_las_Listas_en_Python.ipynb" rename to "PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/15_Introducci\303\263n_a_las_Listas_en_Python.ipynb" diff --git "a/PIA/UT01/1_Teoria/16_M\303\251todos_principales_de_Listas_en_Python.ipynb" "b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/16_M\303\251todos_principales_de_Listas_en_Python.ipynb" similarity index 100% rename from "PIA/UT01/1_Teoria/16_M\303\251todos_principales_de_Listas_en_Python.ipynb" rename to "PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/16_M\303\251todos_principales_de_Listas_en_Python.ipynb" diff --git a/PIA/UT01/1_Teoria/17_Tuplas_en_Python.ipynb b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/17_Tuplas_en_Python.ipynb similarity index 100% rename from PIA/UT01/1_Teoria/17_Tuplas_en_Python.ipynb rename to PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2 - Teoria/17_Tuplas_en_Python.ipynb diff --git a/PIA/UT01/3_Practica/15_Intro_Listas.py b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Intro_Listas.py similarity index 100% rename from PIA/UT01/3_Practica/15_Intro_Listas.py rename to PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Intro_Listas.py diff --git a/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Leer_archivo.py b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Leer_archivo.py new file mode 100644 index 0000000..2e89348 --- /dev/null +++ b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Leer_archivo.py @@ -0,0 +1,25 @@ +# Lista basica + +lista = [1, 2, 3, 4, 5] + +for num in lista: + print(num, end=" ") + +print("") + +# Lista Multidimensiones + +lista = [[1, 2, 3, 4, 5], [61, 72, 83, 94, 101]] + +print("-------------") +print("1- Dimension") +for num in lista: + print(num) + +print("-------------") +print("2- Dimension") + +# for fila in lista: +# for columna in fila: +# print(columna,end="") +# print() diff --git a/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Listas_basicos.py b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Listas_basicos.py new file mode 100644 index 0000000..9df4603 --- /dev/null +++ b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Listas_basicos.py @@ -0,0 +1,71 @@ +# Lista basica +lista = [1, 2, 3, 4, 5] + +# Dinamica : Distintos elementos +lista1 = [] +lista2 = ["a", 1, True] + +print("• Mostrar una lista basica : ") +print(lista) + +print("• Unión de 2 listas en una sola") +lista_mezclada = zip(lista, lista2) + +for i in lista_mezclada: + print(i, end=" ") + +numeros = [11, 22, 33, 44, 55] +letras = ['aa', 'bb', 'cc', 'dd'] + +for num, letra in zip(numeros, letras): + print(num, letra) + +print("\n###################") +cont = 0 +for num in lista: + cont += 1 + print(num, end=" ") + print("• Recorrer una lista basica : ", cont) + + +print("###################") +lista_caracteres = ["aa", "ba", "ca", "da", "fa", "ga", "ha", "ia"] + +for i in lista_caracteres: + print(i, end=" ") + +print("► Convertir listas en tuplas") + +# Crear Tupla vacia +tupla = tuple() + +print("► Convertir en tupla") +for num, letra in zip(numeros, letras): + tupla = num, letra + print(tupla) + +# Unir 2 listas y crear una tupla +tupla1 = tuple(lista) +tupla2 = tuple(lista2) + +tupla_combinada = tupla1 + tupla2 + +for elementos in tupla_combinada: + print(elementos, end=" ") + +# Unión de listas +unir_listas = zip(lista, lista_caracteres) +print("\n• De que tipo soy: ", type(unir_listas)) + +# Recorremos la lista +for i in unir_listas: + print(i, end=" ") + +print("\n▬ Uniendo elementos con 'zip()' para convertirlos en 'dict' #") + +# Creamos un dict +unir_listas = zip(lista, lista_caracteres) +diccionario = dict(unir_listas) + +# Mostramos el dict +print(diccionario) diff --git a/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Listas_completos.py b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Listas_completos.py new file mode 100644 index 0000000..9df4603 --- /dev/null +++ b/PIA/UT02. Aplicaciones de IA en la nube y servicios API/UT2- Practica - Listas/15_Listas_completos.py @@ -0,0 +1,71 @@ +# Lista basica +lista = [1, 2, 3, 4, 5] + +# Dinamica : Distintos elementos +lista1 = [] +lista2 = ["a", 1, True] + +print("• Mostrar una lista basica : ") +print(lista) + +print("• Unión de 2 listas en una sola") +lista_mezclada = zip(lista, lista2) + +for i in lista_mezclada: + print(i, end=" ") + +numeros = [11, 22, 33, 44, 55] +letras = ['aa', 'bb', 'cc', 'dd'] + +for num, letra in zip(numeros, letras): + print(num, letra) + +print("\n###################") +cont = 0 +for num in lista: + cont += 1 + print(num, end=" ") + print("• Recorrer una lista basica : ", cont) + + +print("###################") +lista_caracteres = ["aa", "ba", "ca", "da", "fa", "ga", "ha", "ia"] + +for i in lista_caracteres: + print(i, end=" ") + +print("► Convertir listas en tuplas") + +# Crear Tupla vacia +tupla = tuple() + +print("► Convertir en tupla") +for num, letra in zip(numeros, letras): + tupla = num, letra + print(tupla) + +# Unir 2 listas y crear una tupla +tupla1 = tuple(lista) +tupla2 = tuple(lista2) + +tupla_combinada = tupla1 + tupla2 + +for elementos in tupla_combinada: + print(elementos, end=" ") + +# Unión de listas +unir_listas = zip(lista, lista_caracteres) +print("\n• De que tipo soy: ", type(unir_listas)) + +# Recorremos la lista +for i in unir_listas: + print(i, end=" ") + +print("\n▬ Uniendo elementos con 'zip()' para convertirlos en 'dict' #") + +# Creamos un dict +unir_listas = zip(lista, lista_caracteres) +diccionario = dict(unir_listas) + +# Mostramos el dict +print(diccionario) diff --git "a/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Ejercicios/20_Ejercicios_de_Diccionarios_en_Python.ipynb" "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Ejercicios/20_Ejercicios_de_Diccionarios_en_Python.ipynb" new file mode 100644 index 0000000..f277271 --- /dev/null +++ "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Ejercicios/20_Ejercicios_de_Diccionarios_en_Python.ipynb" @@ -0,0 +1,284 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "j29sm1Ngi89V" + }, + "source": [ + "# Ejerccios de Diccionarios\n", + "\n", + "## Ejercicio 1\n", + "\n", + "Escribe un programa python que pida un número por teclado y que cree un diccionario cuyas claves sean desde el número 1 hasta el número indicado, y los valores sean los cuadrados de las claves." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{1: 1, 2: 4, 3: 9, 4: 16}\n" + ] + } + ], + "source": [ + "# ☻ Solución\n", + "n = int(input(\"Introduce un número: \"))\n", + "\n", + "diccionario = {}\n", + "\n", + "for i in range(1, n+1):\n", + "\n", + " diccionario[i] = i**2\n", + "\n", + "print(diccionario)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Hc1OttpvjI40" + }, + "source": [ + "## Ejercicio 2\n", + "\n", + "Escribe un programa que lea una cadena y devuelva un diccionario con la cantidad de apariciones de cada carácter en la cadena." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ☻ Solución\n", + "cadena = input(\"Introduce una cadena: \")\n", + "diccionario = {}\n", + "for caracter in cadena:\n", + " if caracter in diccionario:\n", + " diccionario[caracter] += 1\n", + " else:\n", + " diccionario[caracter] = 1\n", + " \n", + "print(diccionario)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Aepr-8fAjNmm" + }, + "source": [ + "## Ejercicio 3\n", + "\n", + "Vamos a crear un programa en python donde vamos a declarar un diccionario para guardar los precios de las distintas frutas. El programa pedirá el nombre de la fruta y la cantidad que se ha vendido y nos mostrará el precio final de la fruta a partir de los datos guardados en el diccionario. Si la fruta no existe nos dará un error. Tras cada consulta el programa nos preguntará si queremos hacer otra consulta." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ☻ Solución\n", + "def calcular_precio():\n", + " # Declaración del diccionario\n", + " precios = {\n", + " 'manzana': 0.5,\n", + " 'naranja': 0.3,\n", + " 'plátano': 0.2,\n", + " 'piña': 1.0\n", + " }\n", + "\n", + " while True:\n", + " # Solicitar el nombre de la fruta\n", + " fruta = input('Introduce el nombre de la fruta: ')\n", + "\n", + " # Comprobar si la fruta existe en el diccionario\n", + " if fruta not in precios:\n", + " print('Lo siento, esa fruta no está en el diccionario.')\n", + " continue\n", + "\n", + " # Solicitar la cantidad vendida\n", + " cantidad = float(input('Introduce la cantidad vendida: '))\n", + "\n", + " # Calcular y mostrar el precio final\n", + " precio_final = precios[fruta] * cantidad\n", + " print('El precio final es: ', precio_final)\n", + "\n", + " # Preguntar si se quiere hacer otra consulta\n", + " otra_consulta = input('¿Quieres hacer otra consulta? (s/n): ')\n", + " if otra_consulta.lower() != 's':\n", + " break\n", + "\n", + "# Llamar a la función\n", + "calcular_precio()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RGzZWQm5jVYG" + }, + "source": [ + "## Ejercicio 4\n", + "\n", + "Codifica un programa en python que nos permita guardar los nombres de los alumnos de una clase y las notas que han obtenido. Cada alumno puede tener distinta cantidad de notas. Guarda la información en un diccionario cuya claves serán los nombres de los alumnos y los valores serán listas con las notas de cada alumno.\n", + "\n", + "El programa pedirá el número de alumnos que vamos a introducir, pedirá su nombre e irá pidiendo sus notas hasta que introduzcamos un número negativo. Al final el programa nos mostrará la lista de alumnos y la nota media obtenida por cada uno de ellos. Nota: si se introduce el nombre de un alumno que ya existe el programa nos dará un error." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ☻ Solución\n", + "def registrar_notas():\n", + " # Declaración del diccionario\n", + " notas = {}\n", + "\n", + " # Solicitar el número de alumnos\n", + " num_alumnos = int(input('Introduce el número de alumnos: '))\n", + "\n", + " for _ in range(num_alumnos):\n", + " # Solicitar el nombre del alumno\n", + " nombre = input('Introduce el nombre del alumno: ')\n", + "\n", + " # Comprobar si el alumno ya existe en el diccionario\n", + " if nombre in notas:\n", + " print('Error: el alumno ya existe.')\n", + " continue\n", + "\n", + " # Solicitar las notas del alumno\n", + " notas_alumno = []\n", + " while True:\n", + " nota = float(input('Introduce una nota del alumno (número negativo para terminar): '))\n", + " if nota < 0:\n", + " break\n", + " notas_alumno.append(nota)\n", + "\n", + " # Guardar las notas del alumno en el diccionario\n", + " notas[nombre] = notas_alumno\n", + "\n", + " # Mostrar la lista de alumnos y la nota media de cada uno\n", + " for nombre, notas_alumno in notas.items():\n", + " nota_media = sum(notas_alumno) / len(notas_alumno)\n", + " print('El alumno {} tiene una nota media de {:.2f}.'.format(nombre, nota_media))\n", + "\n", + "# Llamar a la función\n", + "registrar_notas()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6VVzevmsjbr-" + }, + "source": [ + "## Ejercicio 5\n", + "\n", + "Escribir un programa que implemente una agenda. En la agenda se podrán guardar nombres y números de teléfono. El programa nos dará el siguiente menú:\n", + "\n", + "* Añadir/modificar: Nos pide un nombre. Si el nombre se encuentra en la agenda, debe mostrar el teléfono y, opcionalmente, permitir modificarlo si no es correcto. Si el nombre no se encuentra, debe permitir ingresar el teléfono correspondiente.\n", + "* Buscar: Nos pide una cadena de caracteres, y nos muestras todos los contactos cuyos nombres comiencen por dicha cadena.\n", + "* Borrar: Nos pide un nombre y si existe nos preguntará si queremos borrarlo de la agenda.\n", + "* Listar: Nos muestra todos los contactos de la agenda.\n", + "\n", + "Implementar el programa con un diccionario." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ☻ Solución\n", + "def agenda():\n", + " # Declaración del diccionario\n", + " contactos = {}\n", + "\n", + " while True:\n", + " # Mostrar el menú\n", + " print('1. Añadir/modificar')\n", + " print('2. Buscar')\n", + " print('3. Borrar')\n", + " print('4. Listar')\n", + " print('5. Salir')\n", + " opcion = int(input('Elige una opción: '))\n", + "\n", + " if opcion == 1:\n", + " # Añadir/modificar\n", + " nombre = input('Introduce el nombre del contacto: ')\n", + " if nombre in contactos:\n", + " print('El número de teléfono es: ', contactos[nombre])\n", + " modificar = input('¿Quieres modificar el número de teléfono? (s/n): ')\n", + " if modificar.lower() == 's':\n", + " telefono = input('Introduce el nuevo número de teléfono: ')\n", + " contactos[nombre] = telefono\n", + " else:\n", + " telefono = input('Introduce el número de teléfono: ')\n", + " contactos[nombre] = telefono\n", + "\n", + " elif opcion == 2:\n", + " # Buscar\n", + " cadena = input('Introduce la cadena de caracteres a buscar: ')\n", + " for nombre, telefono in contactos.items():\n", + " if nombre.startswith(cadena):\n", + " print('Nombre: ', nombre, ', Teléfono: ', telefono)\n", + "\n", + " elif opcion == 3:\n", + " # Borrar\n", + " nombre = input('Introduce el nombre del contacto a borrar: ')\n", + " if nombre in contactos:\n", + " del contactos[nombre]\n", + " print('Contacto borrado con éxito.')\n", + " else:\n", + " print('Ese contacto no existe.')\n", + "\n", + " elif opcion == 4:\n", + " # Listar\n", + " for nombre, telefono in contactos.items():\n", + " print('Nombre: ', nombre, ', Teléfono: ', telefono)\n", + "\n", + " elif opcion == 5:\n", + " # Salir\n", + " break\n", + "\n", + "# Llamar a la función\n", + "agenda()\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/UT01/2_Ejercicios/24_Ejercicios_de_Funciones_en_Python.ipynb "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Ejercicios/24_Ejercicios_de_Funciones_en_Python.ipynb" similarity index 73% rename from PIA/UT01/2_Ejercicios/24_Ejercicios_de_Funciones_en_Python.ipynb rename to "PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Ejercicios/24_Ejercicios_de_Funciones_en_Python.ipynb" index 272b5b8..572afab 100644 --- a/PIA/UT01/2_Ejercicios/24_Ejercicios_de_Funciones_en_Python.ipynb +++ "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Ejercicios/24_Ejercicios_de_Funciones_en_Python.ipynb" @@ -1,21 +1,10 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "markdown", + "metadata": { + "id": "HFjw3Q0WVZ_i" + }, "source": [ "\n", "# Ejercicios de Funciones\n", @@ -26,24 +15,93 @@ "\n", "Además subraya el mensaje utilizando el carácter =.\n", "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Soy una cadena de texto\n", + " =======================\n" + ] + } ], - "metadata": { - "id": "HFjw3Q0WVZ_i" - } + "source": [ + "def centerText(texto):\n", + " longitud = len(texto)\n", + " espacios = int((80 - longitud) / 2)\n", + " print(' ' * espacios + texto)\n", + " print(' ' * espacios + '=' * longitud)\n", + "\n", + "\n", + "centerText(\"Soy una cadena de texto\")" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "Zov0-hjGVvHI" + }, "source": [ - "\n", "## Ejercicio 2\n", + "\n", "Crea un programa que pida dos número enteros al usuario y diga si alguno de ellos es múltiplo del otro. Crea una función **EsMultiplo** que reciba los dos números, y devuelve si el primero es múltiplo del segundo.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "El número 2 es múltiplo de 1\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } ], - "metadata": { - "id": "Zov0-hjGVvHI" - } + "source": [ + "def EsMultiplo(num1 , num2):\n", + " if num1 % num2 == 0:\n", + " return True\n", + " else:\n", + " return False\n", + "\n", + "num1 = int(input(\"Introduce el primer número: \"))\n", + "num2 = int(input(\"Introduce el segundo número: \"))\n", + "\n", + "if EsMultiplo(num1, num2):\n", + " print(f\"El número {num1} es múltiplo de {num2}\")\n", + "elif EsMultiplo(num2, num1):\n", + " print(f\"El número {num2} es múltiplo de {num1}\")\n", + "else:\n", + " print(\"Ninguno de los números es múltiplo del otro.\")\n", + " \n", + "# Metodo\n", + "EsMultiplo(1,2)\n" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "sMFIz7Y6V4O4" + }, "source": [ "## Ejercicio 3\n", "Crear una función que calcule la temperatura media de un día a partir de la temperatura máxima y mínima.\n", @@ -51,49 +109,85 @@ "Crear un programa principal, que utilizando la función anterior, vaya pidiendo la temperatura máxima y mínima de cada día y vaya mostrando la media.\n", "\n", "El programa pedirá el número de días que se van a introducir." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "La temperatura media del día 1 es 20.0 grados.\n", + "La temperatura media del día 2 es 17.5 grados.\n", + "La temperatura media del día 3 es 22.5 grados.\n", + "La temperatura media del día 4 es 32.0 grados.\n", + "La temperatura media del día 5 es 17.0 grados.\n", + "La temperatura media del día 6 es 32.0 grados.\n", + "La temperatura media del día 7 es 22.0 grados.\n", + "La temperatura media del día 8 es 22.0 grados.\n", + "La temperatura media del día 9 es 27.5 grados.\n", + "La temperatura media del día 10 es 17.0 grados.\n" + ] + } ], - "metadata": { - "id": "sMFIz7Y6V4O4" - } + "source": [ + "def calcular_temperatura_media(maxima, minima):\n", + " return (maxima + minima) / 2\n", + "\n", + "dias = int(input(\"Introduce el número de días: \"))\n", + "\n", + "for i in range(dias):\n", + " maxima = float(input(f\"Introduce la temperatura máxima del día {i+1}: \"))\n", + " minima = float(input(f\"Introduce la temperatura mínima del día {i+1}: \"))\n", + " media = calcular_temperatura_media(maxima, minima)\n", + " print(f\"La temperatura media del día {i+1} es {media} grados.\")\n" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "hbfFfsW-WAZq" + }, "source": [ "## Ejercicio 4\n", "Crea un función **“ConvertirEspaciado”**, que reciba como parámetro un texto y devuelve una cadena con un espacio adicional tras cada letra.\n", "\n", "Por ejemplo, “Hola, tú” devolverá “H o l a , t ú “. Crea un programa principal donde se use dicha función." - ], - "metadata": { - "id": "hbfFfsW-WAZq" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "0RMKcLKAWJNk" + }, "source": [ "## Ejercicio 5\n", "Crea una función **“calcularMaxMin”** que recibe una lista con valores numéricos y devuelve el valor máximo y el mínimo.\n", "\n", "Crea un programa que pida números por teclado y muestre el máximo y el mínimo, utilizando la función anterior." - ], - "metadata": { - "id": "0RMKcLKAWJNk" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "ltEZLGQaWSQb" + }, "source": [ "## Ejercicio 6\n", + "\n", "Diseñar una función que calcule el área y el perímetro de una circunferencia.\n", "\n", "Utiliza dicha función en un programa principal que lea el radio de una circunferencia y muestre su área y perímetro." - ], - "metadata": { - "id": "ltEZLGQaWSQb" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "jTT6LIfjWZJd" + }, "source": [ "## Ejercicio 7\n", "Crear una subrutina llamada **“Login”**, que recibe un nombre de usuario y una contraseña y te devuelve Verdadero si el nombre de usuario es “usuario1” y la contraseña es “asdasd”.\n", @@ -101,25 +195,25 @@ "Además recibe el número de intentos que se ha intentado hacer login y si no se ha podido hacer login incremente este valor.\n", "\n", "Crear un programa principal donde se pida un nombre de usuario y una contraseña y se intente hacer login, solamente tenemos tres oportunidades para intentarlo." - ], - "metadata": { - "id": "jTT6LIfjWZJd" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "EQepXrvfWiBy" + }, "source": [ "## Ejercicio 8\n", "Crear una función recursiva que permita calcular el factorial de un número.\n", "\n", "Realiza un programa principal donde se lea un entero y se muestre el resultado del factorial." - ], - "metadata": { - "id": "EQepXrvfWiBy" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "ur7GAuRpWpk0" + }, "source": [ "## Ejercicio 9\n", "Crear una función que calcule el MCD de dos número por el método de Euclides.\n", @@ -132,13 +226,13 @@ "\n", "\n", "Crea un programa principal que lea dos números enteros y muestre el MCD." - ], - "metadata": { - "id": "ur7GAuRpWpk0" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "4GVQVdzcW2Jk" + }, "source": [ "## Ejercicio 10\n", "Escribir dos funciones que permitan calcular:\n", @@ -147,13 +241,13 @@ "+ La cantidad de horas, minutos y segundos de un tiempo dado en segundos.\n", "\n", "Escribe un programa principal con un menú donde se pueda elegir la opción de convertir a segundos, convertir a horas,minutos y segundos o salir del programa." - ], - "metadata": { - "id": "4GVQVdzcW2Jk" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "sDgH3UJkXAn5" + }, "source": [ "## Ejercicio 11\n", "El día juliano correspondiente a una fecha es un número entero que indica los días que han transcurrido desde el 1 de enero del año indicado.\n", @@ -164,23 +258,23 @@ "+ DiasDelMes: Recibe un mes y un año y nos dice los días de ese mes en ese año.\n", "+ EsBisiesto: Recibe un año y nos dice si es bisiesto.\n", "+ Calcular_Dia_Juliano: recibe una fecha y nos devuelve el día juliano." - ], - "metadata": { - "id": "sDgH3UJkXAn5" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "Johi6PUTXQlH" + }, "source": [ "## Ejercicio 12\n", "Vamos a mejorar el ejercicio anterior haciendo una función para validar la fecha. De tal forma que al leer una fecha se asegura que es válida." - ], - "metadata": { - "id": "Johi6PUTXQlH" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "7AD6g_xhXXFi" + }, "source": [ "## Ejercicio 13\n", "Queremos crear un programa que trabaje con fracciones a/b. Para representar una fracción vamos a utilizar dos enteros: numerador y denominador.\n", @@ -203,13 +297,13 @@ "3. Multiplicar dos fracciones: En esta opción se piden dos fracciones y se muestra la producto.\n", "4. Dividir dos fracciones: En esta opción se piden dos fracciones y se muestra la cociente.\n", "5. Salir" - ], - "metadata": { - "id": "7AD6g_xhXXFi" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "-R2uj4xIYV_U" + }, "source": [ "## Ejercicio 14\n", "Vamos a crear un programa para trabajar con una pila.\n", @@ -235,13 +329,13 @@ "3. Longitud de la pila\n", "4. Mostrar pila\n", "5. Salir" - ], - "metadata": { - "id": "-R2uj4xIYV_U" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "jx6kQJaTYyou" + }, "source": [ "## Ejercicio 15\n", "Vamos a realizar un programa similar al anterior para trabajar con una **cola**.\n", @@ -249,10 +343,30 @@ "Una cola es una estructura de datos que nos permite guardar un conjunto de variables. La característica fundamental es que el primer elemento que se añade al conjunto es el primero que se puede sacar.\n", "\n", "En realidad nos sirven todas las funciones del ejercicio anterior menos la función **SacarDeLaCola** que es la que tienes que modificar." - ], - "metadata": { - "id": "jx6kQJaTYyou" - } + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - MisEjemplos/UT03_Celsius_Fahrenheit.ipynb" "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - MisEjemplos/UT03_Celsius_Fahrenheit.ipynb" new file mode 100644 index 0000000..b4e84c9 --- /dev/null +++ "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - MisEjemplos/UT03_Celsius_Fahrenheit.ipynb" @@ -0,0 +1,52 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "212.0" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def conversion(C):\n", + " # Algorithm to convert Celsius to Fahrenheit\n", + " F = (C * 1.8) + 32\n", + " print(F)\n", + "\n", + "conversion(-40)\n", + "conversion(0)\n", + "conversion(100)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git "a/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Practica/Te_damos_la_bienvenida_a_Colaboratory.ipynb" "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Practica/Te_damos_la_bienvenida_a_Colaboratory.ipynb" new file mode 100644 index 0000000..83b4e37 --- /dev/null +++ "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Practica/Te_damos_la_bienvenida_a_Colaboratory.ipynb" @@ -0,0 +1,327 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Nma_JWh-W-IF" + }, + "source": [ + "
\n", + "

Te damos la bienvenida a Colab

\n", + "
\n", + "\n", + "Si ya conoces Colab, echa un vistazo a este vídeo para obtener información sobre las tablas interactivas, la vista del historial de código ejecutado y la paleta de comandos.\n", + "\n", + "
\n", + " \n", + " Miniatura de un vídeo que muestra tres funciones interesantes de Google Colab\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5fCEDCU_qrC0" + }, + "source": [ + "
\n", + "

¿Qué es Colaboratory?

\n", + "
\n", + "\n", + "Colab, también conocido como \"Colaboratory\", te permite programar y ejecutar Python en tu navegador con las siguientes ventajas:\n", + "- No requiere configuración\n", + "- Acceso a GPUs sin coste adicional\n", + "- Permite compartir contenido fácilmente\n", + "\n", + "Colab puede facilitar tu trabajo, ya seas estudiante, científico de datos o investigador de IA. No te pierdas el vídeo de Introducción a Colab para obtener más información. O simplemente empieza con los pasos descritos más abajo." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GJBs_flRovLc" + }, + "source": [ + "
\n", + "\n", + "## Primeros pasos\n", + "
\n", + "\n", + "El documento que estás leyendo no es una página web estática, sino un entorno interactivo denominado cuaderno de Colab que te permite escribir y ejecutar código.\n", + "\n", + "Por ejemplo, a continuación se muestra una celda de código con una breve secuencia de comandos de Python que calcula un valor, lo almacena en una variable e imprime el resultado:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "gJr_9dXGpJ05", + "outputId": "9f556d03-ec67-4950-a485-cfdba9ddd14d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "86400" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seconds_in_a_day = 24 * 60 * 60\n", + "seconds_in_a_day" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2fhs6GZ4qFMx" + }, + "source": [ + "Si quieres ejecutar el código de la celda anterior, haz clic para seleccionarlo y pulsa el botón de reproducir situado a la izquierda del código o usa la combinación de teclas \"Comando/Ctrl + Intro\". Para editar el código, solo tienes que hacer clic en la celda.\n", + "\n", + "Las variables que definas en una celda se pueden usar después en otras celdas:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "-gE-Ez1qtyIA", + "outputId": "94cb2224-0edf-457b-90b5-0ac3488d8a97" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "604800" + ] + }, + "execution_count": 0, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "seconds_in_a_week = 7 * seconds_in_a_day\n", + "seconds_in_a_week" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lSrWNr3MuFUS" + }, + "source": [ + "Los cuadernos de Colab te permiten combinar código ejecutable y texto enriquecido en un mismo documento, además de imágenes, HTML, LaTeX y mucho más. Los cuadernos que creas en Colab se almacenan en tu cuenta de Google Drive. Puedes compartir tus cuadernos de Colab fácilmente con compañeros de trabajo o amigos, lo que les permite comentarlos o incluso editarlos. Consulta más información en Información general sobre Colab. Para crear un cuaderno de Colab, puedes usar el menú Archivo que aparece arriba o bien acceder al enlace para crear un cuaderno de Colab.\n", + "\n", + "Los cuadernos de Colab son cuadernos de Jupyter alojados en Colab. Para obtener más información sobre el proyecto Jupyter, visita jupyter.org." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UdRyKR44dcNI" + }, + "source": [ + "
\n", + "\n", + "## Ciencia de datos\n", + "
\n", + "\n", + "Con Colab, puedes aprovechar toda la potencia de las bibliotecas más populares de Python para analizar y visualizar datos. La celda de código de abajo utiliza NumPy para generar datos aleatorios y Matplotlib para visualizarlos. Para editar el código, solo tienes que hacer clic en la celda." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 281 + }, + "id": "C4HZx7Gndbrh", + "outputId": "46abc637-6abd-41b2-9bba-80a7ae992e06" + }, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'numpy'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32md:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA\\PIA\\UT03. Entornos de programación de IA con Python\\UT03 - Tarea01 - Programacion en Colab con Python\\Te_damos_la_bienvenida_a_Colaboratory.ipynb Celda 9\u001b[0m line \u001b[0;36m1\n\u001b[1;32m----> 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mnumpy\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mnp\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mmatplotlib\u001b[39;00m \u001b[39mimport\u001b[39;00m pyplot \u001b[39mas\u001b[39;00m plt\n\u001b[0;32m 4\u001b[0m ys \u001b[39m=\u001b[39m \u001b[39m200\u001b[39m \u001b[39m+\u001b[39m np\u001b[39m.\u001b[39mrandom\u001b[39m.\u001b[39mrandn(\u001b[39m100\u001b[39m)\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'numpy'" + ] + } + ], + "source": [ + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "\n", + "ys = 200 + np.random.randn(100)\n", + "x = [x for x in range(len(ys))]\n", + "\n", + "plt.plot(x, ys, '-')\n", + "plt.fill_between(x, ys, 195, where=(ys > 195), facecolor='g', alpha=0.6)\n", + "\n", + "plt.title(\"Sample Visualization\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4_kCnsPUqS6o" + }, + "source": [ + "Puedes importar tus propios datos a los cuadernos de Colab desde tu cuenta de Google Drive, incluidas las hojas de cálculo, y también desde GitHub y muchas fuentes más. Para obtener más información sobre cómo importar datos y cómo se puede usar Colab en la ciencia de datos, consulta los enlaces que aparecen en la sección Trabajar con datos más abajo." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OwuxHmxllTwN" + }, + "source": [ + "
\n", + "\n", + "## Aprendizaje automático\n", + "
\n", + "\n", + "Con Colab, puedes importar un conjunto de datos de imágenes, entrenar un clasificador de imágenes con dicho conjunto de datos y evaluar el modelo con tan solo usar unas pocas líneas de código. Los cuadernos de Colab ejecutan código en los servidores en la nube de Google, lo que te permite aprovechar la potencia del hardware de Google, incluidas las GPU y TPU, independientemente de la potencia de tu equipo. Lo único que necesitas es un navegador." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ufxBm1yRnruN" + }, + "source": [ + "Colab es una herramienta muy utilizada en la comunidad de aprendizaje automático. Estos son algunos ejemplos de las aplicaciones que tiene Colab:\n", + "- Dar los primeros pasos con TensorFlow\n", + "- Desarrollar y entrenar redes neuronales\n", + "- Experimentar con TPUs\n", + "- Divulgar datos de investigación sobre IA\n", + "- Crear tutoriales\n", + "\n", + "Para ver cuadernos de Colab que demuestran las aplicaciones del aprendizaje automático, consulta los ejemplos de aprendizaje automático de abajo." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-Rh3-Vt9Nev9" + }, + "source": [ + "
\n", + "\n", + "## Más recursos\n", + "\n", + "### Trabajar con cuadernos en Colab\n", + "\n", + "
\n", + "\n", + "- [Información general sobre Colaboratory](/notebooks/basic_features_overview.ipynb)\n", + "- [Guía de Markdown](/notebooks/markdown_guide.ipynb)\n", + "- [Importar bibliotecas e instalar dependencias](/notebooks/snippets/importing_libraries.ipynb)\n", + "- [Guardar y cargar cuadernos en GitHub](https://colab.research.google.com/github/googlecolab/colabtools/blob/main/notebooks/colab-github-demo.ipynb)\n", + "- [Formularios interactivos](/notebooks/forms.ipynb)\n", + "- [Widgets interactivos](/notebooks/widgets.ipynb)\n", + "\n", + "
\n", + "\n", + "\n", + "### Trabajar con datos\n", + "
\n", + "\n", + "- [Cargar datos: Drive, Hojas de cálculo y Google Cloud Storage](/notebooks/io.ipynb)\n", + "- [Gráficos: visualización de datos](/notebooks/charts.ipynb)\n", + "- [Primeros pasos con BigQuery](/notebooks/bigquery.ipynb)\n", + "\n", + "
\n", + "\n", + "### Curso intensivo de aprendizaje automático\n", + "\n", + "
\n", + "\n", + "A continuación, se muestran algunos cuadernos del curso online de Google sobre aprendizaje automático. Para obtener más información, consulta el sitio web del curso completo.\n", + "- [Introducción a Pandas DataFrame](https://colab.research.google.com/github/google/eng-edu/blob/main/ml/cc/exercises/pandas_dataframe_ultraquick_tutorial.ipynb)\n", + "- [Regresión lineal con tf.keras usando datos sintéticos](https://colab.research.google.com/github/google/eng-edu/blob/main/ml/cc/exercises/linear_regression_with_synthetic_data.ipynb)\n", + "\n", + "
\n", + "\n", + "\n", + "### Uso de hardware acelerado\n", + "
\n", + "\n", + "- [TensorFlow con GPUs](/notebooks/gpu.ipynb)\n", + "- [TensorFlow con TPUs](/notebooks/tpu.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "P-H6Lw1vyNNd" + }, + "source": [ + "
\n", + "\n", + "\n", + "\n", + "### Ejemplos destacados\n", + "\n", + "
\n", + "\n", + "- Reemplaza voces con NeMo: usa NeMo, el kit de herramientas de IA conversacional de Nvidia, para sustituir una voz de un fragmento de audio por otra generada por ordenador.\n", + "\n", + "- Reentrenamiento de un clasificador de imágenes: crea un modelo de Keras sobre un clasificador de imágenes preparado previamente para que distinga flores.\n", + "- Clasificación de textos: clasifica las reseñas de películas de IMDb en positivas o negativas.\n", + "- Transferencia de estilo: utiliza el aprendizaje profundo para transferir el estilo de una imagen a otra.\n", + "- Codificador universal de frases multilingüe para preguntas y respuestas: utiliza un modelo de aprendizaje automático para contestar preguntas con el conjunto de datos SQuAD.\n", + "- Interpolación de vídeo: predice lo que ocurre entre el primer y el último fotograma de un vídeo.\n" + ] + } + ], + "metadata": { + "colab": { + "name": "Te damos la bienvenida a Colaboratory", + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Practica/UT03 - Tarea01 - Programacion en Colab con Python/UT03 - Teoria/22_Introduccion_Modulos_en_Python.ipynb" "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Practica/UT03 - Tarea01 - Programacion en Colab con Python/UT03 - Teoria/22_Introduccion_Modulos_en_Python.ipynb" new file mode 100644 index 0000000..3808697 --- /dev/null +++ "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Practica/UT03 - Tarea01 - Programacion en Colab con Python/UT03 - Teoria/22_Introduccion_Modulos_en_Python.ipynb" @@ -0,0 +1,191 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "3g3SDW-tM54S" + }, + "source": [ + "# Módulos (Librerías) en Python\n", + "\n", + "**Módulo**: Cada uno de los ficheros **.py** que nosotros creamos se llama módulo.\n", + "\n", + "Los elementos creados en un módulo (funciones, clases, …) se pueden importar para ser utilizados en otro módulo.\n", + "\n", + "El nombre que vamos a utilizar para importar un módulo es el nombre del fichero." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p6LggU36NYzE" + }, + "source": [ + "Python tiene sus propios módulos, los cuales forman parte de su librería de módulos estándar, que podemos usar en nuestros programas.\n", + "\n", + "Para poder usarlos debemos importarlos.\n", + "\n", + "## Importación de Módulos\n", + "\n", + "Podemos importar el módulo completo y posteriormente usar cualquier función definida, por ejemplo para realizar la raíz cuadrada importamos el módulo de funciones matemáticas **math**:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ESY77fSYM37x", + "outputId": "b4419da2-f26b-49b9-fe2d-6b6e4a99e319" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.0\n" + ] + } + ], + "source": [ + "import math\n", + "\n", + "print(math.sqrt(9))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1mFzgBZjNneF" + }, + "source": [ + "Pero si sólo quiero utilizar la función sqrt puedo importar sólo esa función (en este caso al utilizarla no hace falta utilizar el nombre del módulo):\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SRnY8vQONsEk", + "outputId": "05762f8e-0d03-4f79-e9e6-e3f7be4f37a8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.0\n" + ] + } + ], + "source": [ + "from math import sqrt\n", + "from math import sqrt as raiz \n", + "\n", + "\n", + "print(sqrt(9))\n", + "print(raiz(9))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7sYEwnw6N2H6" + }, + "source": [ + "Veamos algunos módulos que ya hemos utilizado en algunos ejercicios:\n", + "\n", + "## Módulos matemáticos\n", + "\n", + "* **Módulo Math**: El módulo math nos proporciones distintas funciones y operaciones matemáticas. Como la usada en el ejemplo anterior.\n", + "\n", + "* **Módulo fractions**: El módulo fractions nos permite trabajar con fracciones.\n", + "\n", + "* **Módulo random**: El módulo random nos permite generar datos pseudo-aleatorios." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ABBPZfKNOTU1", + "outputId": "a6c035d3-d9d8-4950-dd6e-aca39f89bb85" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + } + ], + "source": [ + "import random\n", + "\n", + "print(random.randint(1,10))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o-I1bTGNOfO3" + }, + "source": [ + "## Módulos de hora y fecha\n", + "\n", + "* **Módulo Time**: El módulo time nos permite trabajar con fechas y horas.\n", + "El tiempo es medido como un número real que representa los segundos transcurridos desde el 1 de enero de 1970.\n", + "\n", + "```\n", + "time.sleep(1)\n", + "```\n", + "\n", + "* **Módulo datetime**: El módulo datetime amplía las posibilidades del módulo time que provee funciones para manipular expresiones de tiempo." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VxrCEI71O4uy" + }, + "source": [ + "## Módulo del sistema\n", + "\n", + "* **Módulo os**\n", + "\n", + " * El módulo os nos permite acceder a funcionalidades dependientes del Sistema Operativo. Sobre todo, aquellas que nos refieren información sobre el entorno del mismo y nos permiten manipular la estructura de directorios.\n", + "\n", + "***\n", + "\n", + "* Permite generar carpetas , ficheros , multiples datos dentro del fichero , generar un fichero pdf a través de los datos de un fichero\n", + "\n", + "```python\n", + "os.system('clear')\n", + "```\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/UT01/1_Teoria/19_Tipos_de_Datos_Mapas_(Diccionarios)_en_Python.ipynb "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/19_Tipos_de_Datos_Mapas_(Diccionarios)_en_Python.ipynb" similarity index 99% rename from PIA/UT01/1_Teoria/19_Tipos_de_Datos_Mapas_(Diccionarios)_en_Python.ipynb rename to "PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/19_Tipos_de_Datos_Mapas_(Diccionarios)_en_Python.ipynb" index c108f82..8ae52d2 100644 --- a/PIA/UT01/1_Teoria/19_Tipos_de_Datos_Mapas_(Diccionarios)_en_Python.ipynb +++ "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/19_Tipos_de_Datos_Mapas_(Diccionarios)_en_Python.ipynb" @@ -216,7 +216,7 @@ } ], "source": [ - "# La clave esta dentro del diccionari o no esta \n", + "# La clave esta dentro del diccionario o no esta \n", "print('two' in a) # Si esta la clave\n", "\n", "print('one' in a) # No esta " diff --git a/PIA/UT01/1_Teoria/21_Tratamiento_de_Excepcciones_en_Python.ipynb "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/21_Tratamiento_de_Excepcciones_en_Python.ipynb" similarity index 94% rename from PIA/UT01/1_Teoria/21_Tratamiento_de_Excepcciones_en_Python.ipynb rename to "PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/21_Tratamiento_de_Excepcciones_en_Python.ipynb" index 083822e..4ea2330 100644 --- a/PIA/UT01/1_Teoria/21_Tratamiento_de_Excepcciones_en_Python.ipynb +++ "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/21_Tratamiento_de_Excepcciones_en_Python.ipynb" @@ -1,31 +1,17 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "markdown", + "metadata": { + "id": "S9P13YfAHdK4" + }, "source": [ - "# Tratamiento de Excepcciones en Python\n", + "# Tratamiento de Excepciones en Python\n", "\n", "## Errores sintácticos y errores de ejecución.\n", "\n", "Los errores sintácticos se producen cuando tenemos algo mal escrito en nuestro código fuente. Veamos un ejemplo de error sintáctico:" - ], - "metadata": { - "id": "S9P13YfAHdK4" - } + ] }, { "cell_type": "code", @@ -40,9 +26,9 @@ }, "outputs": [ { - "output_type": "error", "ename": "SyntaxError", "evalue": "ignored", + "output_type": "error", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m while True print('Hello World')\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] @@ -54,6 +40,9 @@ }, { "cell_type": "markdown", + "metadata": { + "id": "0SPW0sb-H3pG" + }, "source": [ "Una excepción o un error de ejecución **se produce durante la ejecución del programa**. Las excepciones **se pueden manejar para que no termine el programa**. Veamos algunos ejemplos de excepciones:\n", "\n", @@ -81,24 +70,26 @@ "```\n", "\n", "Hemos obtenido varias excepciones: **ˋZeroDivisionErrorˋ**, **ˋNameErrorˋ** y **ˋTypeErrorˋ**. Puedes ver la [lista de excepciones](https://docs.python.org/es/3/tutorial/errors.html#exceptions) y su significado." - ], - "metadata": { - "id": "0SPW0sb-H3pG" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "9Y3jFD6UJkuN" + }, "source": [ "## Manejando excepciones\n", "\n", "Veamos un ejemplo simple como podemos tratar una excepción:" - ], - "metadata": { - "id": "9Y3jFD6UJkuN" - } + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "b5yVqVbIJq1K" + }, + "outputs": [], "source": [ "while True:\n", " try:\n", @@ -106,15 +97,13 @@ " break\n", " except ValueError:\n", " print (\"Debes introducir un número\")" - ], - "metadata": { - "id": "b5yVqVbIJq1K" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", + "metadata": { + "id": "dLx_GnPgJztz" + }, "source": [ "### ¿Cómo funciona este tratamiento?\n", "\n", @@ -122,24 +111,26 @@ "2. Si no se produce la excepción, el bloque de **except** no se ejecuta y continúa la ejecución secuencia.\n", "3. Si se produce una excepción, el resto del bloque **try** no se ejecuta, si la excepción que se ha produce corresponde con la indicada en **except** se salta a ejecutar el bloque de instrucciones **except**.\n", "4. Si la excepción producida no se corresponde con las indicadas en **except** se pasa a otra instrucción **try**, si finalmente no hay un manejador nos dará un error y el programa terminará." - ], - "metadata": { - "id": "dLx_GnPgJztz" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "r4v1aF7LKWYY" + }, "source": [ "Un bloque **except** puede manejar varios tipos de excepciones, si quiero controlar varios tipos de excepciones **puedo poner varios bloques except**.\n", "\n", "Teniendo en cuenta que en el último, si quiero no indico el tipo de excepción:" - ], - "metadata": { - "id": "r4v1aF7LKWYY" - } + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cQOCqNr1KjEK" + }, + "outputs": [], "source": [ "try:\n", " print (10/int(cad))\n", @@ -149,24 +140,24 @@ " print(\"No se puede dividir por cero\")\n", "except:\n", " print(\"Otro error\")" - ], - "metadata": { - "id": "cQOCqNr1KjEK" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", - "source": [ - "Se puede utilizar también la cláusula **else**" - ], "metadata": { "id": "M-Am8SMtKv5P" - } + }, + "source": [ + "Se puede utilizar también la cláusula **else**" + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hLFNvRLtK5nL" + }, + "outputs": [], "source": [ "try:\n", " print (10/int(cad))\n", @@ -176,24 +167,24 @@ " print(\"No se puede dividir por cero\")\n", "else:\n", " print(\"Otro error\")" - ], - "metadata": { - "id": "hLFNvRLtK5nL" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", - "source": [ - "Por último indicar que podemos indicar una clausula **finally** para indicar un bloque de instrucciones que **siempre se debe ejecutar**, independientemente de si la excepción se ha producido o no." - ], "metadata": { "id": "NwbTp7t1K9L2" - } + }, + "source": [ + "Por último indicar que podemos indicar una clausula **finally** para indicar un bloque de instrucciones que **siempre se debe ejecutar**, independientemente de si la excepción se ha producido o no." + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "pUVPwLJuLNEw" + }, + "outputs": [], "source": [ "try:\n", " result = x / y\n", @@ -203,37 +194,46 @@ " print(\"El resultado es\", result)\n", "finally:\n", " print(\"Terminamos el programa\")" - ], - "metadata": { - "id": "pUVPwLJuLNEw" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", + "metadata": { + "id": "J22gYbYrLxI0" + }, "source": [ "### Nota:\n", "\n", "Podemos saber el tipo de excepción que se ha producido y nos permitirá mostrar una información más detallada:" - ], - "metadata": { - "id": "J22gYbYrLxI0" - } + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "uutaY8iQL-tN" + }, + "outputs": [], "source": [ "try:\n", " result = x / y\n", "except Exception as e:\n", " print(repr(e))" - ], - "metadata": { - "id": "uutaY8iQL-tN" - }, - "execution_count": null, - "outputs": [] + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PIA/UT01/1_Teoria/22_Introduccion_Modulos_en_Python.ipynb "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/22_Introduccion_Modulos_en_Python.ipynb" similarity index 100% rename from PIA/UT01/1_Teoria/22_Introduccion_Modulos_en_Python.ipynb rename to "PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/22_Introduccion_Modulos_en_Python.ipynb" diff --git a/PIA/UT01/1_Teoria/23_Funciones_en_Python.ipynb "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/23_Funciones_en_Python.ipynb" similarity index 100% rename from PIA/UT01/1_Teoria/23_Funciones_en_Python.ipynb rename to "PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/23_Funciones_en_Python.ipynb" diff --git "a/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/Tarea01 - Programaci\303\263n en Colab con Python.ipynb" "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/Tarea01 - Programaci\303\263n en Colab con Python.ipynb" new file mode 100644 index 0000000..4c4f351 --- /dev/null +++ "b/PIA/UT03. Entornos de programaci\303\263n de IA con Python/UT03 - Teoria/Tarea01 - Programaci\303\263n en Colab con Python.ipynb" @@ -0,0 +1,53 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "x2PulESGBUM0" + }, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'google'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mk:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA\\PIA\\UT03. Entornos de programación de IA con Python\\UT03 - Tarea01 - Programacion en Colab con Python\\Tarea01 - Programación en Colab con Python.ipynb Celda 1\u001b[0m line \u001b[0;36m1\n\u001b[1;32m----> 1\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgoogle\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mcolab\u001b[39;00m \u001b[39mimport\u001b[39;00m data_table\n\u001b[0;32m 2\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mvega_datasets\u001b[39;00m \u001b[39mimport\u001b[39;00m data\n\u001b[0;32m 4\u001b[0m cars \u001b[39m=\u001b[39m data\u001b[39m.\u001b[39mcars()\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'google'" + ] + } + ], + "source": [ + "from google.colab import data_table\n", + "from vega_datasets import data\n", + "\n", + "cars = data.cars()\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/4_Practica/27_Libreria_numpy_practica.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/4_Practica/27_Libreria_numpy_practica.py" new file mode 100644 index 0000000..e69de29 diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/27_Librer\303\255as_para_IA_Numpy_Teor\303\255a.ipynb" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/27_Librer\303\255as_para_IA_Numpy_Teor\303\255a.ipynb" new file mode 100644 index 0000000..d6b8c25 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/27_Librer\303\255as_para_IA_Numpy_Teor\303\255a.ipynb" @@ -0,0 +1,907 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "z6Z5YIWBDsxK" + }, + "source": [ + "# NumPy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "h_fD-nMEE1iI" + }, + "source": [ + "---\n", + "## Introducción" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lBYAFcgwE3Yi" + }, + "source": [ + "``NumPy``\n", + "\n", + "* Es un ``módulo`` de Python\n", + "\n", + "* El nombre viene de **PY**thon **NUM**érico \n", + "\n", + "* Es una librería de código abierto muy utilizada para la generación y manejo de matrices multidimensionales. \n", + "\n", + "* En su mayor parte está escrito en C para optimizar su velocidad de ejercución.\n", + "\n", + "Además, los objetos de Pandas (librería que veremos próximamente) dependen en gran medida de los objetos de NumPy ya que ``Pandas`` extiende a ``NumPy``.\n", + "\n", + "- Aquí os dejo la url de la [documentación oficial](https://numpy.org/doc/stable/) de NumPy." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YvxcwSHXnDW1" + }, + "source": [ + "* No viene instalado por defecto con Python en Visual Studio Code por lo que tendremos que ejecutar la siguiente línea en la consola:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "vz9f1JDwnNsg" + }, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'numpy'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32md:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA2\\Python_PIA\\PIA\\UT04. Librerías de programación de Aprendizaje Automático con Python\\Librerias\\Numpy\\27_Librerías_para_IA_Numpy_Teoría.ipynb Celda 5\u001b[0m line \u001b[0;36m2\n\u001b[0;32m 1\u001b[0m \u001b[39m# pip es el gestor de paquetes de Python\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mnumpy\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[39m# Invocar libreria desde la consola de Power Shell\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[39m# pip install numpy\u001b[39;00m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'numpy'" + ] + } + ], + "source": [ + "# pip es el gestor de paquetes de Python\n", + "import numpy\n", + "\n", + "# Invocar libreria desde la consola de Power Shell\n", + "# pip install numpy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GNbNW9biE8rS" + }, + "source": [ + "Además, para nuestros proyectos no vendrá importado por defecto por lo que tendremos que hacerlo nosotros:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yoKVTkB-DYIE" + }, + "outputs": [], + "source": [ + "import numpy as np # np es el diminutivo por defecto que se suele ver en internet" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p6XEXRjN1uDb" + }, + "source": [ + "## Otra opción es usar Anaconda y Jupyter (hagamos un inciso aquí para verlo)\n", + "\n", + "[Web Oficial Anaconda](https://www.anaconda.com/)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9pYvu5-MGDhF" + }, + "source": [ + "---\n", + "## Arrays" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3j-rfLx3GVQk" + }, + "source": [ + "Con NumPy podemos crear arrays de todo tipo de dimensiones: 1D, 2D, 3D...\n", + "Para ello, podremos utilizar los siguientes comandos:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Soo9eaE3GUcJ", + "outputId": "9427df38-ea78-4576-a770-681dc9598da0" + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'np' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32md:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA2\\Python_PIA\\PIA\\UT04. Librerías de programación de Aprendizaje Automático con Python\\Librerias\\Numpy\\27_Librerías_para_IA_Numpy_Teoría.ipynb Celda 11\u001b[0m line \u001b[0;36m3\n\u001b[0;32m 1\u001b[0m \u001b[39m# NumPy cuenta con la función \"array\" que crea su propia estructura de datos de array en función de los datos recibidos\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[39m# 1D\u001b[39;00m\n\u001b[1;32m----> 3\u001b[0m a \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39marray([\u001b[39m1\u001b[39m,\u001b[39m2\u001b[39m,\u001b[39m3\u001b[39m])\n\u001b[0;32m 4\u001b[0m \u001b[39mprint\u001b[39m(a)\n\u001b[0;32m 6\u001b[0m \u001b[39m# 2D con listas de listas\u001b[39;00m\n", + "\u001b[1;31mNameError\u001b[0m: name 'np' is not defined" + ] + } + ], + "source": [ + "# NumPy cuenta con la función \"array\" que crea su propia estructura de datos de array en función de los datos recibidos\n", + "# 1D\n", + "a = np.array([1,2,3])\n", + "print(a)\n", + "\n", + "# 2D con listas de listas\n", + "a = np.array([[1,2,3],[4,5,6],[7,8,9]])\n", + "print(a)\n", + "\n", + "# 2D con listas de tuplas\n", + "a = np.array([(1,2,3),(4,5,6),(7,8,9)])\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "anDoV3zHOItN" + }, + "source": [ + "---\n", + "## Tipos de datos" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yVP3pes5PTgP" + }, + "source": [ + "Con NumPy puedes decidir el tipo de datos de un array. Hecho muy importante ya que en función de esto dependerá la información que almacenemos y el espacio que ocupe en memoria:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "sV-88QTRPk1u", + "outputId": "087f9c4e-c18d-4765-eaa2-5f5aa778f39b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1. 2. 3. 4.]\n", + " [5. 6. 7. 8.]]\n", + "\n", + "[[1 2 3 4]\n", + " [5 6 7 8]]\n", + "\n", + "[[ 1 2 3 4]\n", + " [ 5 6 7 -1]]\n", + "\n" + ] + } + ], + "source": [ + "array_float = np.array([[1,2,3,4],[5,6,7,8]], dtype=np.float128) # hay distintos tipos de float: 16, 32, 64, 128\n", + "print(array_float)\n", + "print(type(array_float[0][0]))\n", + "\n", + "# Al igual que float, también hay distintos tipos de int (8, 16, 32, 64),\n", + "array_int = np.array([[1,2,3,4],[5,6,7,8]], dtype=np.int8)\n", + "print(array_int)\n", + "print(type(array_int[0][0]))\n", + "\n", + "# Habrá que tener cuidado ya que cada tipo de dato tiene su límite numérico\n", + "array_int = np.array([[1,2,3,4],[5,6,7,1000]], dtype=np.int8)\n", + "print(array_int)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Kv1iwpb1UwDB" + }, + "source": [ + "---\n", + "## Matrices predefinidas" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eUW0EaYFUyJC" + }, + "source": [ + "Otra de las ventajas es que NumPy permite crear matrices vacías o rellenas con valores aleatorios de distintas formas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RCK2JxdhVHLq", + "outputId": "ab225a25-cd16-43e2-c9fc-435ddd5f8112" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1. 1. 1. 1.]\n", + " [1. 1. 1. 1.]\n", + " [1. 1. 1. 1.]]\n", + "[[0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]]\n", + "[[0.63667376 0.38237538 0.62922992]\n", + " [0.85817229 0.22058705 0.48235666]\n", + " [0.36536953 0.29787294 0.62113401]]\n", + "[[5.e-324 5.e-324]\n", + " [5.e-324 0.e+000]]\n", + "[[5 5 5]\n", + " [5 5 5]]\n" + ] + } + ], + "source": [ + "# matriz rellena de unos\n", + "unos = np.ones((3,4))\n", + "print(unos)\n", + "\n", + "# matriz rellena de ceros\n", + "ceros = np.zeros((2,5))\n", + "print(ceros)\n", + "\n", + "# matriz rellena de números aleatorios (entre 0 y 1)\n", + "aleatorios = np.random.random((3,3))\n", + "print(aleatorios)\n", + "\n", + "# matriz vacía\n", + "vacia = np.empty((2,2))\n", + "print(vacia)\n", + "\n", + "# matriz con un mismo valor\n", + "valor = np.full((2,3), 5)\n", + "print(valor)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0asleqEIWlEa" + }, + "source": [ + "Si en lugar de crear valores de las formas anteriores preferimos crearlos en un intérvalo concreto podremos utilizar estas dos funciones:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tDDABj5WWtj-", + "outputId": "ab2677a2-5a56-42da-eb30-90109290658b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0 5 10 15 20 25 30 35 40 45]\n", + "[ 0. 2.5 5. 7.5 10. ]\n" + ] + } + ], + "source": [ + "# crea una matriz con valores especificados en función de un rango\n", + "m1 = np.arange(0, 50, 5)\n", + "print(m1)\n", + "\n", + "# crea matriz con valores entre dos datos y definiendo el número de elementos\n", + "m2 = np.linspace(0, 10, 5)\n", + "print(m2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pgOylyNNXPIJ" + }, + "source": [ + "Por último, una matriz muy típica es la matriz \"identidad\". Si queremos generar este tipo de matrices tenemos dos formas:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NpWq8kf8XUf5", + "outputId": "de97ba4f-20f7-4e06-d276-99a63f23e807" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1. 0. 0. 0.]\n", + " [0. 1. 0. 0.]\n", + " [0. 0. 1. 0.]\n", + " [0. 0. 0. 1.]]\n", + "[[1. 0. 0. 0.]\n", + " [0. 1. 0. 0.]\n", + " [0. 0. 1. 0.]\n", + " [0. 0. 0. 1.]]\n" + ] + } + ], + "source": [ + "# genera matrices de identidad de cualquier dimensión\n", + "id1 = np.eye(4,4)\n", + "print(id1)\n", + "\n", + "# genera matrices de identidad cuadradas\n", + "id2 = np.identity(4)\n", + "print(id2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0sl803TOXy33" + }, + "source": [ + "---\n", + "## Funciones sobre matrices" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vgAEyGeKX2Oz" + }, + "source": [ + "NumPy incluye una serie de funciones útiles a la hora de inspeccionar las matrices generadas:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hJKhoW1RX8ER", + "outputId": "3b00e735-3e8b-42e1-8e51-9dc0c61920bb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dimensiones A: 2\n", + "Dimensiones B: 3\n", + "Tipo A: int64\n", + "Tipo B: float64\n", + "Tamaño A: 6\n", + "Forma A: (2, 3)\n", + "Tamaño B: 12\n", + "Forma B: (2, 2, 3)\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "a = np.array([[1,2,3],[4,5,6]])\n", + "b = np.array([[[1.1,2.2,3.3],[4.4,5.5,6.6]],[[7.7,8.8,9.9],[10.1,11.2,12.3]]])\n", + "\n", + "# saber las dimensiones de un array\n", + "print(\"Dimensiones A: \", a.ndim)\n", + "print(\"Dimensiones B: \", b.ndim)\n", + "\n", + "# conocer el tipo de datos de un array\n", + "print(\"Tipo A: \", a.dtype)\n", + "print(\"Tipo B: \", b.dtype)\n", + "\n", + "# para conocer el tamaño y la forma de una matriz\n", + "print(\"Tamaño A: \", a.size)\n", + "print(\"Forma A: \", a.shape)\n", + "print(\"Tamaño B: \", b.size)\n", + "print(\"Forma B: \", b.shape)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JiTKDz0VZUX4" + }, + "source": [ + "También podemos cambiar el tamaño y la forma de las matrices:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "n4YtaTwaZXfz", + "outputId": "dd53e2e3-f935-4a07-904e-f2ad13ed2035" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a: [[1 2 3]\n", + " [4 5 6]]\n", + "c: [[1 2]\n", + " [3 4]\n", + " [5 6]]\n" + ] + } + ], + "source": [ + "# aprovechamos el elemento \"a\" creado en el bloque anterior\n", + "print(\"a: \", a)\n", + "\n", + "# modificamos su forma para que en lugar de 2 filas y 3 columnas sea 3 filas y 2 columnas:\n", + "c = a.reshape(3,2) # Esto no ha almacenado el cambio sobre \"a\" sino sobre \"c\"\n", + "print(\"c: \", c)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vHDlVM2xaZI6" + }, + "source": [ + "---\n", + "## Trabajo sobre posiciones de una matriz" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4p5nbx06acHp" + }, + "source": [ + "NumPy también ofrece unas maneras más sencillas para trabajar sobre posiciones concretas de una matriz:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UeNzRg_VaiBC", + "outputId": "e7cc0116-3f13-492a-a8bb-da4ea5d12788" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.31808129 0.98512647 0.42187885 0.53145153 0.33215916]\n", + " [0.53492506 0.80193155 0.08096006 0.03892644 0.05792654]]\n", + "0.42187885206324915\n", + "[0.33215916 0.05792654]\n", + "[[0.31808129 0.98512647]\n", + " [0.53492506 0.80193155]]\n", + "[[1 2 3 4]]\n", + "[[1 2 3 4]\n", + " [5 6 7 8]]\n", + "[[5 6 7 8]]\n", + "[[5 6 7 8]\n", + " [1 2 3 4]]\n" + ] + } + ], + "source": [ + "matriz = np.random.random((2,5))\n", + "print(matriz)\n", + "\n", + "# si quiero obtener el elemento de una posición concreta\n", + "print(matriz[0,2])\n", + "\n", + "# si quiero obtener todas las filas de una columna concreta\n", + "print(matriz[:,4])\n", + "\n", + "# si quiero obtener una submatriz de la matriz\n", + "print(matriz[:,0:2])\n", + "\n", + "# En general podemos utilizar todos los wildcard de listas en numpy\n", + "my_array1 = np.array([[1,2,3,4],[5,6,7,8]])\n", + "print(my_array1[0:1])\n", + "print(my_array1[0:2])\n", + "print(my_array1[1::])\n", + "print(my_array1[::-1])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dCjmQdKNhhCO" + }, + "source": [ + "---\n", + "## Modificación de arrays" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RUbQxac9hjPk" + }, + "source": [ + "Si quisieramos modificar matrices creadas anteriormente podríamos tanto insertar como eliminar partes de las mismas:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_tsnO_QkhoPy", + "outputId": "32c4496a-6672-401a-bc65-ca99bdbec3a6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1 2 8 0 7]]\n", + "[ 1 2 8 0 7 10 10 10]\n", + "[ 1 2 8 0 7 10 10]\n", + "[1 2 8 0 7]\n" + ] + } + ], + "source": [ + "matriz = np.random.randint(10, size=(1,5))\n", + "print(matriz)\n", + "\n", + "# Añadimos tres nuevos elementos\n", + "matriz = np.append(matriz, [10, 10, 10])\n", + "print(matriz)\n", + "\n", + "# Eliminamos el último elemento\n", + "matriz = np.delete(matriz, 7)\n", + "print(matriz)\n", + "\n", + "# Eliminamos los dos últimos elementos\n", + "matriz = np.delete(matriz, [5,6])\n", + "print(matriz)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2kG9NyiIbYpS" + }, + "source": [ + "---\n", + "## Operaciones matemáticas sobre matrices" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kyNBU2mebbj0" + }, + "source": [ + "Tal y como hemos comentado, NumPy ofrece una serie de funciones optimizadas que facilitan los cálculos matemáticos sobre matrices:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "N-Cwn9ZabnKM", + "outputId": "4920c081-5803-45ac-bfd1-f135c1b7b139" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Matriz 1:\n", + "[[1 3 1 3]\n", + " [3 2 3 3]\n", + " [1 4 3 0]]\n", + "\n", + "Matriz 2:\n", + "[[2 0 4 1]\n", + " [4 0 4 4]\n", + " [0 1 1 4]]\n", + "M1 min: 0\n", + "M1 max: 4\n", + "M1 suma: 27\n", + "M1 sqrt: [[1. 1.73205081 1. 1.73205081]\n", + " [1.73205081 1.41421356 1.73205081 1.73205081]\n", + " [1. 2. 1.73205081 0. ]]\n", + "\n", + "[[3 3 5 4]\n", + " [7 2 7 7]\n", + " [1 5 4 4]]\n", + "[[-1 3 -3 2]\n", + " [-1 2 -1 -1]\n", + " [ 1 3 2 -4]]\n", + "[[ 2 0 4 3]\n", + " [12 0 12 12]\n", + " [ 0 4 3 0]]\n", + "[[0.5 inf 0.25 3. ]\n", + " [0.75 inf 0.75 0.75]\n", + " [ inf 4. 3. 0. ]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:23: RuntimeWarning: divide by zero encountered in true_divide\n" + ] + } + ], + "source": [ + "# genero unas matrices con valores aleatorios del 0 al 4\n", + "matriz_1 = np.random.randint(5, size=(3,4))\n", + "matriz_2 = np.random.randint(5, size=(3,4))\n", + "print(\"Matriz 1:\")\n", + "print(matriz_1)\n", + "print()\n", + "print(\"Matriz 2:\")\n", + "print(matriz_2)\n", + "\n", + "# muestro el valor mínimo, máximo y la suma de los valores de una matriz\n", + "print(\"M1 min: \", matriz_1.min())\n", + "print(\"M1 max: \", matriz_1.max())\n", + "print(\"M1 suma: \", matriz_1.sum())\n", + "\n", + "# También podemos calcular la raíz cuadrada\n", + "print(\"M1 sqrt: \", np.sqrt(matriz_1))\n", + "print()\n", + "\n", + "# Por último, podremos hacer cálculos matemáticos básicos entre matrices. Estos cálculos serán posición a posición\n", + "print(matriz_1 + matriz_2)\n", + "print(matriz_1 - matriz_2)\n", + "print(matriz_1 * matriz_2)\n", + "print(matriz_1 / matriz_2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NVr7sa2_dQou" + }, + "source": [ + "Otras operaciones interesantes y bastantes útiles son:\n", + "* El cálculo de la [desviación estándar o típica](https://es.wikipedia.org/wiki/Desviaci%C3%B3n_t%C3%ADpica)\n", + "* El cálculo de la [media aritmética](https://es.wikipedia.org/wiki/Media_aritm%C3%A9tica)\n", + "* El cálculo de la [mediana](https://es.wikipedia.org/wiki/Mediana_(estad%C3%ADstica))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8bOjaNM7dfOr", + "outputId": "54022ff6-bcee-45fa-f71a-20ab0e33e21e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1 3 1 3]\n", + " [3 2 3 3]\n", + " [1 4 3 0]]\n", + "1.1636866703140785\n", + "2.25\n", + "3.0\n" + ] + } + ], + "source": [ + "print(matriz_1)\n", + "\n", + "# Desviación estándar\n", + "print(np.std(matriz_1))\n", + "\n", + "# Media aritmética\n", + "print(np.mean(matriz_1))\n", + "\n", + "# Mediana\n", + "print(np.median(matriz_1))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3CZb0TV5Oh_r" + }, + "source": [ + "---\n", + "## Optimización" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nK16CnrGIkGO" + }, + "source": [ + "Una comparación interesante de NumPy con respecto a Python es que podemos ver el tamaño de los arrays generados y compararlos. De esta forma veremos que NumPy, además de facilitarnos la generación y el uso de matrices, optimiza el espacio en memoria:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zAgW2ufIIyFq", + "outputId": "3a5b341c-9ba3-40a1-a877-bea14105c58b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tamaño lista de python: 28000\n", + "Tamaño array de NumPy: 8000\n" + ] + } + ], + "source": [ + "# Esta librería nos dará acceso a algunas variables utilizadas por el intérprete de python\n", + "import sys\n", + "\n", + "# generamos una lista de 1000 números con python\n", + "lista_python = range(1000)\n", + "\n", + "# calculo el tamaño de un número int normal y lo multiplico por la longitud de la lista\n", + "print(\"Tamaño lista de python: \", sys.getsizeof(5)*len(lista_python))\n", + "\n", + "# generamos un array con NumPy\n", + "array_numpy = np.arange(1000)\n", + "\n", + "# calculo el tamaño de un elemento de numpy y lo multiplico por el tamaño del array\n", + "print(\"Tamaño array de NumPy: \", array_numpy.size * array_numpy.itemsize)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o9vltPZXJ9Tb" + }, + "source": [ + "Otra comparación útil de NumPy frente a Python es la velocidad de cálculo. Hagamos un ejemplo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "N6fX2TucKVUA", + "outputId": "e42eab3e-9f50-4f56-b0b5-4a98ad1f6acf" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Suma Python: 436.0473155975342\n", + "Suma NumPy: 3.052234649658203\n" + ] + } + ], + "source": [ + "# importamos la librería time para poder medir tiempos de ejecución\n", + "import time\n", + "\n", + "# definimos un tamaño de lista/array inicial\n", + "size = 1000000\n", + "\n", + "# creamos dos listas y dos arrays del mismo tamaño\n", + "lista1_python = range(size)\n", + "lista2_python = range(size)\n", + "array1_numpy = np.arange(size)\n", + "array2_numpy = np.arange(size)\n", + "\n", + "# guardamos el momento de inicio\n", + "start = time.time()\n", + "\n", + "# calculamos la suma y la almacenamos en result_python\n", + "result_python = []\n", + "for i in range(len(lista1_python)):\n", + " result_python.append(lista1_python[i] + lista2_python[i])\n", + "\n", + "print(\"Suma Python: \", (time.time() - start) * 1000) # multiplico por 1000 para verlo en milisegundos (time devuelve segundos desde epoch)\n", + "\n", + "# reinicio el contador del tiempo\n", + "start = time.time()\n", + "\n", + "# calculamos la suma y la almacenamos en un nuevo objeto\n", + "result_numpy = array1_numpy + array2_numpy\n", + "\n", + "print(\"Suma NumPy: \", (time.time() - start) * 1000)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/NumpyPruebas.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/NumpyPruebas.py" new file mode 100644 index 0000000..7ff0ec7 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/NumpyPruebas.py" @@ -0,0 +1,25 @@ +import numpy as np + +print(np.__version__) + +array_2d = np.arange(1, 10).reshape(3, 3) +print(array_2d) + +# Crear un array tridimensional +mi_array = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + +# Mostrar el array +print(mi_array) + + +# Crear tres matrices +matriz1 = np.array([[1, 2], [3, 4]]) +matriz2 = np.array([[5, 6], [7, 8]]) +matriz3 = np.array([[[9, 10], [11, 12]], [[13, 14], [15, 16]]]) + +# Mostrar las dimensiones, el tamaño y la forma de las matrices +for i, matriz in enumerate([matriz1, matriz2, matriz3], start=1): + print(f"Matriz{i}:") + print(f"Dimensiones: {matriz.ndim}") + print(f"Tamaño: {matriz.size}") + print(f"Forma: {matriz.shape}\n") diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/28_Numpy_Ejercicios.ipynb" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/28_Numpy_Ejercicios.ipynb" new file mode 100644 index 0000000..54f528b --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/28_Numpy_Ejercicios.ipynb" @@ -0,0 +1,777 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "LXgzv1V5lPXi" + }, + "source": [ + "# Ejercicios NumPy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dA5cYe7AlShE" + }, + "source": [ + "Tras hacer tus propias pruebas con la teoría de NumPy, completa los siguientes ejercicios en orden" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ADfp2pApl4BF" + }, + "source": [ + "---\n", + "## Ejercicio 1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KXZZO1zol8Qo" + }, + "source": [ + "Antes de empezar a trabajar de verdad, tendrás que importar la librería de NumPy para poder trabajar con ella:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "KZOgslZVl9OD" + }, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'numpy'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32md:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA2\\Python_PIA\\PIA\\UT04. Librerías de programación de Aprendizaje Automático con Python\\Librerias\\Numpy\\Practiquemos un poco!!!\\28_Numpy_Ejercicios.ipynb Celda 5\u001b[0m line \u001b[0;36m1\n\u001b[1;32m----> 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mnumpy\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mnp\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \u001b[39mprint\u001b[39m(np\u001b[39m.\u001b[39m__version__)\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'numpy'" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "print(np.__version__)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4VkL00bgl9ge" + }, + "source": [ + "---\n", + "## Ejercicio 2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BoZhx3JLl-Si" + }, + "source": [ + "Crea un array de **una dimensión** con los 10 valores que tu quieras y muéstralo por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Dy7Unk9Wl-qx" + }, + "outputs": [], + "source": [ + "array_1d = np.arange(1,11)\n", + "print(array_1d)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6677oBi5l--F" + }, + "source": [ + "---\n", + "## Ejercicio 3" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "41JYosl8l_wm" + }, + "source": [ + "Crea un array de distinto nombre al anterior de **dos dimensiones** con los 3x3 valores que tu quieras y muéstrala por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5mlfPZf6mABE" + }, + "outputs": [], + "source": [ + "array_2d = np.arange(1, 10).reshape(3, 3)\n", + "print(array_2d)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eVg9kk42mAX_" + }, + "source": [ + "---\n", + "## Ejercicio 4" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pedf75MGmA-I" + }, + "source": [ + "Crea un array de distinto nombre a los anteriores de **tres dimensiones** con los 2x2x2 valores que tu quieras y muéstrala por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "N6u9E6i3mBLv" + }, + "outputs": [], + "source": [ + "# Crear un array tridimensional\n", + "mi_array = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])\n", + "\n", + "# Mostrar el array\n", + "print(mi_array)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NK3e4TpmmBfN" + }, + "source": [ + "---\n", + "## Ejercicio 5" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YNcdlYDjmCBY" + }, + "source": [ + "Muestra las dimensiones, el tamaño y la forma que tienen las tres matrices creadas anteriormente:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kB77aVDhmCN2" + }, + "outputs": [], + "source": [ + "# Crear tres matrices\n", + "matriz1 = np.array([[1, 2], [3, 4]])\n", + "matriz2 = np.array([[5, 6], [7, 8]])\n", + "matriz3 = np.array([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])\n", + "\n", + "# Mostrar las dimensiones, el tamaño y la forma de las matrices\n", + "for i, matriz in enumerate([matriz1, matriz2, matriz3], start=1):\n", + " print(f\"Matriz{i}:\")\n", + " print(f\"Dimensiones: {matriz.ndim}\")\n", + " print(f\"Tamaño: {matriz.size}\")\n", + " print(f\"Forma: {matriz.shape}\\n\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dWM-6b0lnBbZ" + }, + "source": [ + "---\n", + "## Ejercicio 6" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oowvRvyrnCMy" + }, + "source": [ + "Crea un array de una dimensión de tipo int8. \n", + "\n", + "En una de las posiciones pon el valor 1000. \n", + "\n", + "¿Qué ocurre y por qué?\n", + "\n", + "*Si creas un array de una dimensión de tipo int8 en Python y tratas de almacenar el valor 1000 en una de las posiciones, obtendrás un comportamiento llamado “desbordamiento de enteros” o “integer overflow”*\n", + "\n", + "*Esto se debe a que el tipo int8 puede almacenar valores enteros que van desde -128 hasta 127.*\n", + "\n", + "*Cuando intentas almacenar un valor que está fuera de este rango, como 1000, el valor se “desborda” y se almacena como otro valor dentro del rango permitido*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "8l_eEmAvnCcL" + }, + "outputs": [], + "source": [ + "# Crear un array de una dimensión de tipo int8\n", + "mi_array = np.array([0], dtype=np.int8)\n", + "\n", + "# Intentar almacenar el valor 1000 en una de las posiciones\n", + "mi_array[0] = 1000\n", + "\n", + "# Mostrar el array\n", + "print(mi_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qV3M-sd0nC26" + }, + "source": [ + "---\n", + "## Ejercicio 7" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yYZC-dFOnDmZ" + }, + "source": [ + "Crea un array de dos dimensiones de tipo float128 y luego muestra su tipo por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LkAGxyuFnDwh" + }, + "outputs": [], + "source": [ + "# Crear un array de dos dimensiones de tipo float128\n", + "mi_array = np.array([[1.0, 2.0], [3.0, 4.0]], dtype=np.float128)\n", + "\n", + "# Mostrar el tipo del array\n", + "print(mi_array.dtype)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OZ3XX41HnEO1" + }, + "source": [ + "---\n", + "## Ejercicio 8" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3qBso9AbnE-9" + }, + "source": [ + "Crea un array con todos los múltiplos de 5 en una sola instrucción y muéstralo por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "NpShB_oUnFKN" + }, + "outputs": [], + "source": [ + "# Crear un array con todos los múltiplos de 5\n", + "mi_array = np.arange(0, 101, 5)\n", + "\n", + "# Mostrar el array\n", + "print(mi_array)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Z2Ymsre1nFp-" + }, + "source": [ + "---\n", + "## Ejercicio 9" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "R2LvvpIUnGXJ" + }, + "source": [ + "Crea un array con 20 valores entre los números 1 y 2. Estos valores deben estar distribuídos de manera equitativa:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ft9_dnY1nGhd" + }, + "outputs": [], + "source": [ + "# Crear un array con 20 valores equitativamente distribuidos entre 1 y 2\n", + "mi_array = np.linspace(1, 2, 20)\n", + "\n", + "# Mostrar el array\n", + "print(mi_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V_2YvVrUnGzO" + }, + "source": [ + "---\n", + "## Ejercicio 10" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "veIUhoHdnHkC" + }, + "source": [ + "Crea una matriz de forma 2x3 y muéstrala por pantalla. A continuación cambia su forma a una matriz 3x2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4xmNj-genHwf" + }, + "outputs": [], + "source": [ + "# Crear una matriz de forma 2x3\n", + "mi_matriz = np.array([[1, 2, 3], [4, 5, 6]])\n", + "print(\"Matriz original de forma 2x3:\")\n", + "print(mi_matriz)\n", + "\n", + "# Cambiar la forma de la matriz a 3x2\n", + "mi_matriz = mi_matriz.reshape(3, 2)\n", + "print(\"\\nMatriz después de cambiar su forma a 3x2:\")\n", + "print(mi_matriz)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0OKve7lDoPMT" + }, + "source": [ + "---\n", + "## Ejercicio 11" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O-WK7p6soR8-" + }, + "source": [ + "Crea una matriz de 3x6 con valores aleatorios. Después muestra por pantalla las siguientes convinaciones:\n", + "* La primera fila entera\n", + "* La primera columna entera\n", + "* Todos los valores entre las columnas 2 y 4\n", + "* Todos los valores de las filas 1 y 2\n", + "* Todos los valores entre las filas 2 y 3 y las columnas 5 y 6" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "A21uA-KdohAT" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Crear una matriz de 3x6 con valores aleatorios\n", + "mi_matriz = np.random.rand(3, 6)\n", + "print(\"Matriz original de 3x6 con valores aleatorios:\")\n", + "print(mi_matriz)\n", + "\n", + "# Mostrar la primera fila entera\n", + "print(\"\\nPrimera fila entera:\")\n", + "print(mi_matriz[0])\n", + "\n", + "# Mostrar la primera columna entera\n", + "print(\"\\nPrimera columna entera:\")\n", + "print(mi_matriz[:, 0])\n", + "\n", + "# Mostrar todos los valores entre las columnas 2 y 4\n", + "print(\"\\nValores entre las columnas 2 y 4:\")\n", + "print(mi_matriz[:, 1:4])\n", + "\n", + "# Mostrar todos los valores de las filas 1 y 2\n", + "print(\"\\nValores de las filas 1 y 2:\")\n", + "print(mi_matriz[0:2])\n", + "\n", + "# Mostrar todos los valores entre las filas 2 y 3 y las columnas 5 y 6\n", + "print(\"\\nValores entre las filas 2 y 3 y las columnas 5 y 6:\")\n", + "print(mi_matriz[1:3, 4:6])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NcMs8O0xohx0" + }, + "source": [ + "---\n", + "## Ejercicio 12" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O2Aabc_Uoiqe" + }, + "source": [ + "Crea un array de tamaño 1x5. Después añádele 5 elementos nuevos. Por último, elimina los dos primeros valores y muéstralo por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "8tSosR39oi2O" + }, + "outputs": [], + "source": [ + "# Crear un array de tamaño 1x5\n", + "mi_array = np.array([1, 2, 3, 4, 5])\n", + "print(\"Array original de tamaño 1x5:\")\n", + "print(mi_array)\n", + "\n", + "# Añadir 5 elementos nuevos\n", + "mi_array = np.append(mi_array, [6, 7, 8, 9, 10])\n", + "print(\"\\nArray después de añadir 5 elementos nuevos:\")\n", + "print(mi_array)\n", + "\n", + "# Eliminar los dos primeros valores\n", + "mi_array = np.delete(mi_array, [0, 1])\n", + "print(\"\\nArray después de eliminar los dos primeros valores:\")\n", + "print(mi_array)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "M9WW962tojUz" + }, + "source": [ + "---\n", + "## Ejercicio 13" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kPfnKIW6okVX" + }, + "source": [ + "Crea dos matrices 3x3, una con valores aleatorios y otra de identidad. Realiza las cuatro operaciones básicas entre ellas (suma, resta, multiplicación y división). Por último, calcula la raíz cuadrada de matriz de identidad." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "h5PJEntqoks0" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-pvYqcfFolmh" + }, + "source": [ + "---\n", + "## Ejercicio 14" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sM9V2Ulnomoo" + }, + "source": [ + "Sin utilizar las funciones std, mean y median de NumPy, programa dichas funcionalidades:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eeN5RTZQom_m" + }, + "outputs": [], + "source": [ + "# Crear una matriz 3x3 con valores aleatorios\n", + "matriz_aleatoria = np.random.rand(3, 3)\n", + "print(\"Matriz aleatoria 3x3:\")\n", + "print(matriz_aleatoria)\n", + "\n", + "# Crear una matriz de identidad 3x3\n", + "matriz_identidad = np.eye(3)\n", + "print(\"\\nMatriz de identidad 3x3:\")\n", + "print(matriz_identidad)\n", + "\n", + "# Realizar las cuatro operaciones básicas entre las matrices\n", + "suma = np.add(matriz_aleatoria, matriz_identidad)\n", + "print(\"\\nSuma de las matrices:\")\n", + "print(suma)\n", + "\n", + "resta = np.subtract(matriz_aleatoria, matriz_identidad)\n", + "print(\"\\nResta de las matrices:\")\n", + "print(resta)\n", + "\n", + "multiplicacion = np.multiply(matriz_aleatoria, matriz_identidad)\n", + "print(\"\\nMultiplicación de las matrices:\")\n", + "print(multiplicacion)\n", + "\n", + "division = np.divide(matriz_aleatoria, matriz_identidad)\n", + "print(\"\\nDivisión de las matrices:\")\n", + "print(division)\n", + "\n", + "# Calcular la raíz cuadrada de la matriz de identidad\n", + "raiz_cuadrada = np.sqrt(matriz_identidad)\n", + "print(\"\\nRaíz cuadrada de la matriz de identidad:\")\n", + "print(raiz_cuadrada)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + " Calcula la desviación estándar de un array.\n", + "\n", + " Argumentos\n", + " array: El array del que se quiere calcular la desviación estándar.\n", + "\n", + " Returns:\n", + " La desviación estándar del array.\n", + "\"\"\"\n", + "def std(array):\n", + " # Calculamos la media del array.\n", + " mean = np.mean(array)\n", + "\n", + " # Calculamos la suma de los cuadrados de las diferencias entre los valores del array y la media.\n", + " squared_diffs = np.square(array - mean)\n", + "\n", + " # Calculamos la varianza del array.\n", + " variance = np.mean(squared_diffs)\n", + "\n", + " # Devolvemos la desviación estándar, que es la raíz cuadrada de la varianza.\n", + " return np.sqrt(variance)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + " Calcula la media de un array.\n", + "\n", + " Argumentos\n", + " array: El array del que se quiere calcular la media.\n", + "\n", + " Returns:\n", + " La media del array.\n", + "\"\"\"\n", + "def mean(array):\n", + "\n", + " # Calculamos la suma de los valores del array.\n", + " sum = np.sum(array)\n", + "\n", + " # Calculamos la cantidad de valores del array.\n", + " n = len(array)\n", + "\n", + " # Devolvemos la media, que es la suma de los valores dividida por la cantidad de valores.\n", + " return sum / n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + " Calcula la mediana de un array.\n", + "\n", + " Argumentos\n", + " array: El array del que se quiere calcular la mediana.\n", + "\n", + " Returns:\n", + " La mediana del array.\n", + "\"\"\"\n", + "def median(array):\n", + " # Ordenamos el array.\n", + " array = np.sort(array)\n", + "\n", + " # Si el array tiene un número par de elementos, la mediana es la media de los dos valores centrales.\n", + " if len(array) % 2 == 0:\n", + " median = (array[len(array) // 2] + array[len(array) // 2 - 1]) / 2\n", + "\n", + " # Si el array tiene un número impar de elementos, la mediana es el valor central.\n", + " else:\n", + " median = array[len(array) // 2]\n", + "\n", + " return median" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-QL_QTj-oncQ" + }, + "source": [ + "---\n", + "## Ejercicio 15" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jxdjFioFooZS" + }, + "source": [ + "Compara los tiempos de ejecución entre las funciones que has creado anteriormente y las de NumPy para matrices de tamaño 1.000.000 x 1.000.000 con valores aleatorios:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3Z7iVaiooosD" + }, + "outputs": [], + "source": [ + "import timeit\n", + "\n", + "# Generamos una matriz de tamaño 1.000.000 x 1.000.000 con valores aleatorios.\n", + "array = np.random.rand(1000000, 1000000)\n", + "\n", + "# Calculamos la desviación estándar de la matriz utilizando la función `std()` de NumPy.\n", + "std_numpy = np.std(array)\n", + "\n", + "# Calculamos la desviación estándar de la matriz utilizando la función `std()` creada anteriormente.\n", + "std_custom = std(array)\n", + "\n", + "# Imprimimos los tiempos de ejecución de ambas funciones.\n", + "print(\"Tiempo de ejecución de NumPy:\", timeit.timeit(lambda: np.std(array), number=10))\n", + "print(\"Tiempo de ejecución de custom:\", timeit.timeit(lambda: std(array), number=10))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import timeit\n", + "\n", + "# Generamos una matriz de tamaño 1.000.000 x 1.000.000 con valores aleatorios.\n", + "array = np.random.rand(1000000, 1000000)\n", + "\n", + "# Calculamos la media de la matriz utilizando la función `mean()` de NumPy.\n", + "mean_numpy = np.mean(array)\n", + "\n", + "# Calculamos la media de la matriz utilizando la función `mean()` creada anteriormente.\n", + "mean_custom = mean(array)\n", + "\n", + "# Imprimimos los tiempos de ejecución de ambas funciones.\n", + "print(\"Tiempo de ejecución de NumPy:\", timeit.timeit(lambda: np.mean(array), number=10))\n", + "print(\"Tiempo de ejecución de custom:\", timeit.timeit(lambda: mean(array), number=10))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import timeit\n", + "\n", + "# Generamos una matriz de tamaño 1.000.000 x 1.000.000 con valores aleatorios.\n", + "array = np.random.rand(1000000, 1000000)\n", + "\n", + "# Calculamos la mediana de la matriz utilizando la función `median()` de NumPy.\n", + "median_numpy = np.median(array)\n", + "\n", + "# Calculamos la mediana de la matriz utilizando la función `median()` creada anteriormente.\n", + "median_custom = median(array)\n", + "\n", + "# Imprimimos los tiempos de ejecución de ambas funciones.\n", + "print(\"Tiempo de ejecución de NumPy:\", timeit.timeit(lambda: np.median(array), number=10))\n", + "print(\"Tiempo de ejecución de custom:\", timeit.timeit(lambda: median(array), number=10))\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/28_Numpy_Practica.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/28_Numpy_Practica.py" new file mode 100644 index 0000000..e476bc9 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/28_Numpy_Practica.py" @@ -0,0 +1,6 @@ + +import numpy as np + +a = np.array([1,2,3]) +print(a) + diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/29_Introduccion_a_pandas.ipynb" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/29_Introduccion_a_pandas.ipynb" new file mode 100644 index 0000000..c88ad66 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/29_Introduccion_a_pandas.ipynb" @@ -0,0 +1,3648 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "OQMcKrN_AZ_h" + }, + "source": [ + "# Primeros pasos con Pandas\n", + "\n", + "## Instalación e Importación\n", + "\n", + "Como siempre podemos realizar la instalación en nuestro entorno virtual (anaconda o venv) con los siguientes comandos:\n", + "\n", + "\n", + "\n", + "```\n", + "conda install pandas\n", + "```\n", + "\n", + "```\n", + "pip install pandas\n", + "```\n", + "\n", + "De manera alternativa, si estamos usando cuadernos jupyter en nuestro entorno de desarrollo podemos ejecutar este código en una de sus celdas:\n", + "\n", + "```\n", + "!pip install pandas\n", + "```\n", + "\n", + "```\n", + "%pip install pandas\n", + "```\n", + "\n", + "El carácter **'!'** al inicio de la ejecución de una celda hace como si estuviera en una terminal.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6txOJjKpW5dC" + }, + "source": [ + "# Núcleo de los componentes de Pandas: Series y DataFrames\n", + "\n", + "Los dos componentes principales del módulo de Pandas son las **Series** y los **Dataframes**\n", + "\n", + "Podemos decir que una **Serie** es esencialmente una columna, y que un **Dataframe** es una tabla multidimensional creada a partir de una colección de **Series**\n", + "\n", + "![series-and-dataframe.width-1200.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAF/CAIAAABVPXRhAADU5ElEQVR42uydd3wURRvHZ3b3Wu4uvffQEwgBAiH0KlWlCSIIKuiLYkFFUbBQBEQFURSQjjQFpPfeCQESSCAkgfTe+9Vt7x8bjuPuklzokOf78Q/c7O7tzs4885tnnnkG8zyPAAAAAAAAAAB4tiGgCAAAAAAAAAAAhDsAAAAAAAAAACDcAQAAAAAAAACEOwAAAAAAAAAAINwBAAAAAAAAAADhDgAAAAAAAAAg3AEAAAAAAAAAAOEOAAAAAAAAAAAI9wYDz/MVFRUajQaKAgAAAAAAAIQ78IwSERExbNgwHx+fwMDAb775pqysDMoEAB430dHRixYt+uuvv9LT06E0AAAAgEcL5nkeSuHF49SpU8OGDSsvLzccGThw4M6dO6VSKRQOADwOOI77+uuvf//9d71ejxBydHT87bffxo0bByUDAAAAgHAHaqNbt27nz583Obhq1ap3330XCgcAHgc///zzV199ZXxEIpGcOHGiS5cuUDgAAADAI4FqCC+p0Wji4+MTEhJyc3P37duHMUYIsSxrb28/YMAAW1vbFi1aNGvWzNbW9sV43+Tk5Fu3bpkfP3XqFAh34EnCsqxWq42PjxccBDzPi8Xipk2bSiQSinqhjI9Go9m6davJQZ1Ot3nzZhDuAAAAAAh3q4iLi9uwYcOhQ4fi4+MZhjE/Yd++fQghjHGLFi38/f3Hjh3bu3dvDw+P5/qtq6qqqqqqzI8XFxdDjQeeAKWlpWfOnNm9e/ft27erqqpu3rxpmNmjKCowMNDGxsbb27tfv36hoaHBwcFisfh5f+X8/PzU1FTz47GxsVAfgGeEoqKikpISgqjH2jaO4+zt7V1dXaH0Hh61Wp2Tk/NIbsXzvFwu9/T0hFIF4f7ikJmZOXfu3M2bN6tUKmvaQHx8fHx8/KFDh5ycnF577bX333+/TZs2z+m7u7q6urm5ZWZmmhxv2rQp1HjgsZKRkbF06dItW7ZkZWVZPIFhmBs3biCEIiMjd+zYgRAKCwvr37//W2+91bhx4+fYklKUSCQyPy6RSKBWAM8ICxYsWLRoUX2v8vDwaNWqlVwub9269aBBg9q0aQO1+sG4cOFCv379HtXd+vbte+zYMSjVBsiLmVXm/PnzYWFhK1eutEa1m1BcXLxixYqwsLCxY8fevHnzeXx9Dw+P3r17mx9/5ZVXoMYDj4+lS5e2b9/+559/rkm1W+Ty5cs//PBDcHDw22+/HRUV9Zy+u5eXV/Pmzc2Pd+jQASoG8FyTm5t77Nix3bt3z5kzJzw8PDQ09Ouvv87IyHjWnpPnea1Wq7kfrVYLXxAA4f6sc/r06SFDhuTl5T3MTWia3rJly/jx49Vq9fNYCAsWLOjWrZvhfzHG8+bNe4RjfQAw4auvvvroo48KCwsf7HKNRvP333936tRp8uTJz2OjwxhPmTLFxOnu6+s7ceJEqBvAi0RcXNxPP/3UqlWr6dOnP3B7f0wDjA4dOnh5efnfxd3dvU+fPjqd7oX8EMJqPQCE+3NPWlrauHHjSkpKHsndRo8ebWNj8zyWg7u7+/79+1etWjVs2LD33nvv7NmzM2bMgOoOPCa+/fbbn3/++eHvQ9N0dHT0c7pudcSIERs2bAgMDEQIURTVo0ePnTt3Qnwa8EJSWVm5YMGCzp07Hzx48Bl5JJZlCwsLS0tLC+5SUVFRXFwMqfOAF4wXLcZ94cKFNU3Ti0SiRo0aubm5kSSJEFKpVEVFRVlZWULSZYva97nOwWxra/vuu+9CGhngcXPmzJkFCxY8qrt98cUXz+9a1dGjRw8ePDghIUEikQQFBb1gmXMAwISkpKTBgwf/+OOPX3/99bPwPOZOaIzxi+qZhgEJCPcXgbS0tH/++cfinzp27Dhv3rzw8HC5XC4cYRimsrLyxo0bERER27ZtS0hIMJmgHzt27POeXgYAnsxomWVZi51o27ZtX3/99aCgILFYjDEuLS1NTU09fvz4jRs38vPzzS8JDQ0dPHjwc10aSqUS4tqBBsX06dMrKirmz58PRfEksbgaHgDh/pxx5MgRi0EyvXv3PnDggMmmoRRFOTg4dO/evXv37tOmTbt06dKaNWv+++8/YbdRpVIJvmoAqJPo6OiTJ09a7FQWLFjw2Wefmbu7vvrqq8LCwhMnTmzduvXAgQM0TRv+9M4778hkMihVAHhidO3aderUqRYzCGOM9Xp9SkrKlStXIiIiKisra/Ly/vjjj1Kp9Pvvv4fyrC/29vaLFy8Wi8Ucx1l/FcMwEIYHwv0F0RAWj3/99dcmqt3cPHXq1KlTp07Tpk1btGjRypUrhw4d2qJFi3r9OsMwSUlJeXl5Z86cKSsrIwiCYZhGjRqFhYW5u7v7+voKITrWsGzZsoSEBOPxNM/zX3zxhUnS1uzs7NTUVCEh1Ndff22seHbu3Hnq1CnjkAONRjNx4sTQ0FDr30ir1SYlJWVnZ58+fVqr1RIEwbJscHBwq1atfHx8PDw8HmwKkqbp27dvZ2VlnThxgmEYjDFN0+Hh4U2bNvXx8XFzc4M1N88RZ86csbiW9NNPP/38889rusrFxWX06NGjR4+Oi4tbunTppk2bKisr/fz8Ro8e/WCPUVVVpdfrMcY8z0skEsPEmvWoVCqdTmdc93iet7W1tRjuUlVVRdO0nZ2dcUpsrVarVqtN7iCXyx8gdx7P85WVlcI8Bs/zMpnskYxneJ4vLy83bIalUChegAz6wEPSqFGjoUOH1nlaTk7Ov//+u3DhwtzcXIsnzJo1q3379oMGDYIirRcymeyNN96ADJtAAxXuZWVl5gcJgrB+84hmzZqtWLFizJgxSqXS+t9NTU3dtGnT3r17r1+/zvO8cdgAxpggCIqiwsPDR4wYMXr0aBcXlzpvuGnTpoiICJOD48ePNwj3M2fOrFq1at++fYILxMvLa8qUKcZd+8GDB9esWWNyh86dO1sp3G/cuLFhw4aDBw8mJiYihIzfiCAIjLFUKu3Vq9fIkSOHDx+uUCisLKi8vLx169Zt27bt5s2bHMcZOxj+/PNPkiRlMlm3bt169OgxbNgwcCc8F1jcdQghZGX/3bJly2XLln300UfTpk1r27atk5NTvaT2mTNnjh8/XlBQcOHChcLCQpIkGYbx9vYODw93dnbu06dPjx49rBTx77777vbt241P1mg0p06dMt739M6dO9u3b09MTDx16hTHcZcvXzYeS//yyy9z5swxXs5eUVGxfPny999/38o3Ki4uPnHixLlz5/Lz88+ePatSqYTxf/Pmzdu0aePh4TFgwICOHTvWV22r1eoTJ04cP348Ly/v5MmTwiCcpum2bdsGBgZ6enr27NkzLCzM+oYMNEA8PT0///zzt99+e8aMGStWrLA4LJw6dWpoaKibm5uV92RZNjMzs7y8/NKlS8LOUMKoMjw83NfX19fXt16rREiSNPeOkST5kEtN1Gp1ZmZmYWFhREQEy7IYY47jlEpl165dXV1dn50tkIqLi//++2+dTmfwJtA07enpOWHCBPMxWEpKyqlTp9q1a1d7aGJVVVV2dnZOTs7ly5d5nscYsyzr6OjYuXNnNzc36z80Qujo0aOXL182dkfqdLrXXnstKCjI+DSNRpOZmRkVFZWcnCwSiQRfYcuWLQMCAqzx6JWVlWVlZUVGRubn5wvlEB4e3rx5czc3t3rtO1bT2DU/P//ixYsVFRWCZfb392/btq2bm1u9eq5HAP8CMXLkSIvvuH///sf0i8XFxVOnTrWzs7OytH18fFatWlXnbXv06GF+7bVr13ier6ioeP/9903Mk7e3d0lJifEdJk+ebH6HjRs31vnTQlqe2icoTITX3r1767wtx3HLly93dna28rZSqfT111+/cuUKDzzbvPfeexa/4PHjx+t1H5qm1Wq1lScXFBTMmzfP39+/9lpEEETjxo1//vlnwc1cOxZ3OTh9+rTw1/T09LfffttY1js4OGRmZhrfwWLipt9//92aN0pOTp46dWqdLgaKokJCQtasWaPT6ay5bVVV1R9//NGkSZM6FY+3t/fHH38cHR0NVfoFZurUqeZff/z48fW9z9KlS2vqI7744os6L1er1cePH//ss8+aN2+uVCrNU7dJJBKFQhESEvLdd9/duXOnlluVlpauX79+zZo1GzZsWLhwoXlf7OHhsXLlyvXr1681YvXq1Rs3biwtLa3lzvn5+Rs3bnzjjTfc3d2VSqW5R9zGxsbOzq5fv34rV66sqKiwptyOHj1qXmIeHh5arfbhP+6NGzfMh/TBwcHGNnbPnj1DhgyxtbUVXmfcuHEWb5Wdnb1mzZoRI0a4uLgolUqT22KM5XK5g4PDyy+/vGHDBivttsXEuMaaJDY29tNPP23SpImNjY3xWIskSblcHhYW9ueff9ZSzpcuXXr33XednJzkcrmxxBfqUp8+ffbt28dx3AMUbEFBwbJly/r27Wtra2tSV4Vnc3JyGj58+L///is4Up8AL5Rwf/PNNy2akldfffVx/NzVq1dDQkIeYLD03nvv1d5QLQr3mzdvarXaTp06mf/pUQn3AwcO+Pj41HvWhqJmz55d+50tPo81d96wYQN0t88ykyZNqmne/DH94n///efl5VWvihQYGBgZGVn7bV999dWahPvhw4fN16mbC/dvvvnmAYQ7x3FLliyxtbWt1xv16NEjKSmp9jvfuXOna9eu9bqtWCwePXr0rVu3oGKDcK+dxYsXW6xCTk5OqampNV1VUlLy+++/N2nSxHovuEKhmD17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Saxs7/VtdCa+yZCQkD179owfP15QSLWTmpr65ZdfbtiwYd26daGhoVBjASspLy+Pj483P25xB7SVK1fOnDkzLy/vWX6dr776av369Y+jkdaEjY3N6NGjKYqy0tCxLGtvb1/T3u0mODs7WwxoMaegoODzzz/funXrk1xyZu6irkkQm0tqGxsbixv3WrzcmtMszh3p9Xpzz5H1VFRU1DfoH4R7HWCMe/TocezYsY8++mjlypXmJ+Tm5sbHxxs67wfboa1OrJzGehzy5XG8EcbY4tTnp59++tprr23evHnz5s1CIr/a7/PHH39IJJJffvkFescXBqVS+fLLL7/88st79uz58MMPzac+EULXrl2LiYl5HK5uE6X7gpWt+Ru1a9fu1KlTixYt2rx5c+2ud4EbN24MGjRo7969D7/xO9BAuHLlSkpKivlxk51xEEJz58797rvvnuV3UalUI0eOPHbs2CPpBK0/2c7ObtmyZY/JMScSiaxZbFBcXPzKK69cvnz5CZd5fWN4TAr5YS5/Ypgv8APh/mhq9u+//x4XF3fhwgWLw1Dj0aF5pJSbm1uLFi0eTAcImX0sZqt9MlgcsPr7+/v7+1s5E2cCwzBOTk41TQx5e3t/9dVXn3zySVRU1OHDhw8cOCDs/FrT3X777bdXXnnlAZIMAs84Q4YM8fDwGDBggEUnR3JyskG4K5VKiqIeuRPIym7ycYyWrXSV1bcPszgId3FxWbBgwbRp0/bv379x48br168XFRXVcp+CgoIxY8acO3fO4vY3AGDCP//8Y37Q2dm5ffv2xkf279//qFT74xtyf/31149EtSNL8dNPCyst2JQpUx6Van+SPpFHa58ffjm1ReqV/6chCveTJ09ev379s88+q298hVQqHTx4cJ3C3cPDQyQSmcybuLm5HT582Dik+znCYvccHBy8d+/ex/ejMpmsa9euXbt2/f777+Pj4/fu3btt27Zbt26ZN3iGYbZu3QrC/VlGpVJVVFTUnpDLImFhYe+++67FGZWSkhLDvx0cHMRisYlwb9Gixc8//0xR1IN1EizLtmzZ8mmVmMWtl3v27DljxowHm5PleZ6iqFpmjR0dHcePHz9+/PjMzMxz587t37//6NGjJSUlFru9lJSUVatWzZw5E+o2UDuRkZEWk2SHhYUZJ0BjGMZidXJxcRk9enT79u1dXFzMG7JI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)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-UiU1r14YKDm" + }, + "source": [ + "Tanto Series como DataFrames se comportan de manera similar en cuanto a las operaciones que podemos realizar con dichas estructuras. Todas las operaciones que podemos hacer en una las podemos implementar en la otra como por ejemplo crear estructuras rellenando las celdas con valores nulos o calculando la media.\n", + "\n", + "Veamos como trabajar con estos elementos:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jfhwNz5P6SgB" + }, + "source": [ + "# Ejemplos utilizando librería Pandas\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s7HURMM3D-tj" + }, + "source": [ + "Empezamos importando la librería Pandas y numpy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "SZG8vmlwjxcc" + }, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pandas'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32md:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA\\PIA\\UT04_NumPy_Panda\\29_Introduccion_a_pandas.ipynb Celda 6\u001b[0m line \u001b[0;36m1\n\u001b[1;32m----> 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpandas\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mpd\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mnumpy\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mnp\u001b[39;00m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'pandas'" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pB4RK63zagR1" + }, + "source": [ + "## Creación de Series\n", + "\n", + "Para crear este tipo de estructura usaremos el método **Series()** de nuestro módulo de Pandas que entre otros tipos de datos serializables admite como parámetro un array para su creación.\n", + "\n", + "Por ejemplo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Z6hO5rnjauUe", + "outputId": "53b5086a-5ca5-4c0a-f5a8-376298a1c1b2" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0 3\n", + "1 2\n", + "2 0\n", + "3 1\n", + "dtype: int64" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "apples = pd.Series([3,2,0,1])\n", + "\n", + "apples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5nEzNan2bBYo" + }, + "source": [ + "Podemos hacer lo mismo con la otra seríe del ejemplo inicial:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ryiDPyT_bE90", + "outputId": "b5c508eb-8555-43dd-d493-a6306eb6b6f3" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0 0\n", + "1 3\n", + "2 7\n", + "3 2\n", + "dtype: int64" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "oranges = pd.Series([0,3,7,2])\n", + "\n", + "oranges" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gipE4PwsbxDN" + }, + "source": [ + "### Creación de una Serie a partir de un Diccionario\n", + "\n", + "Supongamos que tenemos un puesto de frutas que vende manzanas y naranjas y queremos estructurar la información de manera que, tengamos una columna para cada fruta y una fila para cada compra de cliente.\n", + "\n", + "Para organizar esto como un diccionario en pandas podríamos hacer algo así:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jMY7DKLocgrt" + }, + "outputs": [], + "source": [ + "data = {'apples': [3,2,0,1]}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RJ4SCSS2cueh" + }, + "source": [ + "Solo nos quedaría pasarle este diccionario como parámetro al método" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ILiAVNkvdEa3", + "outputId": "aa217191-3d36-4250-c7eb-5dcb2980a350" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "apples [3, 2, 0, 1]\n", + "dtype: object" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "apples = pd.Series(data)\n", + "\n", + "apples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2_b0Nmz-dXCM" + }, + "source": [ + "## Propiedades de un Serie\n", + "\n", + "+ size: Devuelve el número de elementos de la serie\n", + "+ index: Devuelve una lista con los nombres de las filas de la estructura\n", + "+ dtype: Devuelve el tipo de datos de los elementos de la serie" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "F0BaR8tMdmiV", + "outputId": "d1ede8ef-e4ec-49fb-f6ee-7d8de293e749" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "RangeIndex(start=0, stop=10, step=1)" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers = pd.Series([1,2,3,4,5,6,7,8,9,10])\n", + "\n", + "numbers.index\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "L7RRWfBXnWQx", + "outputId": "e3f52b0d-b88d-4163-c26d-cecb24bad4f7" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "RangeIndex(start=0, stop=6, step=1)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers2 = pd.Series([2,4,6,8,10,12])\n", + "\n", + "numbers2.index\n", + "\n", + "#print(type(numbers2.index))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "v2lx9usmefE6", + "outputId": "e3c6b699-b96e-4767-db75-809f1c52a5d3" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers.size" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VUOb0CupeiFk", + "outputId": "6eaa8ada-8eeb-4a6b-b990-11773b523ab3" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype('int64')" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers.dtype" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ARxJf7Hhe3Wi" + }, + "source": [ + "## Acceso a los elementos de una Serie\n", + "\n", + "Podemos emplear los mismos wildcard que hemos venido usando en las listas de Python.\n", + "\n", + "Por ejemplo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ixeonp6yfDBm", + "outputId": "a44891ba-8f1c-4d3d-974c-044d144eba29" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2\n", + "2 3\n", + "3 4\n", + "dtype: int64\n", + "1 2\n", + "3 4\n", + "5 6\n", + "7 8\n", + "9 10\n", + "dtype: int64\n", + "9 10\n", + "8 9\n", + "7 8\n", + "6 7\n", + "5 6\n", + "4 5\n", + "3 4\n", + "2 3\n", + "1 2\n", + "0 1\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "print(numbers[1:4])\n", + "\n", + "print(numbers[1::2])\n", + "\n", + "print(numbers[::-1])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b08RBFNDfWQB" + }, + "source": [ + "Si la serie está creada a partir de un diccionario, debemos recordar que en este caso nos referiremos al valor de su key para localizar los elementos:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AjvQmfynfjp4", + "outputId": "fbe1807f-83c7-459e-853b-feec0eaf425c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "green\n" + ] + } + ], + "source": [ + "colors = pd.Series({\n", + " 'color1': 'orange',\n", + " 'color2': 'green',\n", + " 'color3': 'blue'\n", + "})\n", + "\n", + "print(colors['color2'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yFjH1KuygEWY" + }, + "source": [ + "## Operaciones con Series\n", + "\n", + "Veamos algunas operaciones que podemos realizar con este tipo de estructuras:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "L_qDTleIgEBq", + "outputId": "32e3496b-5870-477a-9f8a-64166e01a4aa" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0 2\n", + "1 4\n", + "2 6\n", + "3 8\n", + "4 10\n", + "5 12\n", + "6 14\n", + "7 16\n", + "8 18\n", + "9 20\n", + "dtype: int64" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers * 2 #Devuelve todos los elementos de la serie multiplicados por 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "R5IofNFegnFt", + "outputId": "552c6ba6-ba75-40d3-ec1b-e280cf141929" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "55" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FF6FngMpguqK", + "outputId": "8b5192f8-f6e9-4987-c212-aeda50965b6a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "1\n" + ] + } + ], + "source": [ + "print(numbers.max())\n", + "print(numbers.min())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Vtz3xJMfg6Va", + "outputId": "c7d309ba-76f4-476e-a742-3a68202bc84b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.0276503540974917\n" + ] + } + ], + "source": [ + "# Uso de métodos estadísticos\n", + "# Desviación estándar\n", + "print(numbers.std())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NNkJ-onthGfy", + "outputId": "b5759934-8790-4034-a853-3efee45bfb41" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "count 10.00000\n", + "mean 5.50000\n", + "std 3.02765\n", + "min 1.00000\n", + "25% 3.25000\n", + "50% 5.50000\n", + "75% 7.75000\n", + "max 10.00000\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "#Resumen del contenido de nuestra serie\n", + "print(numbers.describe())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vD0KCrWhhV8v" + }, + "source": [ + "Hagamos algún ejemplo más, esta vez usando como estructura un nuevo diccionario:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Zd1GxnzTha95" + }, + "outputs": [], + "source": [ + "subjects = pd.Series({\n", + " 'PIA': 10,\n", + " 'MAA': 7,\n", + " 'SIA': 9,\n", + " 'SBD': 9,\n", + " 'BDA': 6\n", + "\n", + "})" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JqAlihq6iGJv" + }, + "source": [ + "Podemos filtrar lo que queremos sacar por pantalla a partir de un valor específico:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "15EnwchyiLuK", + "outputId": "94dc427f-92cc-48d9-bb2e-bb744f799bb5" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PIA 10\n", + "SIA 9\n", + "SBD 9\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "print(subjects[subjects > 7])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XDjOavVhijHY" + }, + "source": [ + "También podemos ordenar los elementos de la serie:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "n1NKTg-EilyE", + "outputId": "c42d0402-9121-44c2-87a8-0bbc562f5273" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BDA 6\n", + "MAA 7\n", + "SIA 9\n", + "SBD 9\n", + "PIA 10\n", + "dtype: int64\n", + "\n" + ] + } + ], + "source": [ + "print(subjects.sort_values())\n", + "\n", + "print(type(subjects.sort_values()))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XZl1obZnivP_", + "outputId": "e0095029-627c-47c7-b4fe-9725ad435c8d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BDA 6\n", + "MAA 7\n", + "PIA 10\n", + "SBD 9\n", + "SIA 9\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "print(subjects.sort_index(ascending=True)) #Ordenación Alfabética por nombre de materia" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qdYwv48kjKSm" + }, + "source": [ + "Podemos automatizar más la creación de series, por ejemplo empleando un **valor escalar**:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zVohSjhnjRDa", + "outputId": "2de60121-a075-4108-d23c-1819b3d78233" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "bero 0\n", + "quintuple 5\n", + "dtype: int64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Creamos una serie de tamaño 10 cuyos valores sean 3 por ejemplo.\n", + "serie = pd.Series(3, index=range(1,11))\n", + "\n", + "serie\n", + "\n", + "serie2 = pd.Series(np.arange(0, 50, 5), index=range(1,11))\n", + "\n", + "serie2\n", + "\n", + "serie3 = pd.Series(np.arange(0, 10, 5), index={'bero', 'quintuple'})\n", + "\n", + "serie3" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EMjFA8v_kEwV" + }, + "source": [ + "De igual modo podemos generar la serie a partir de un índice pre-definido:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9Jwmw8gIkSWH", + "outputId": "a1b59e13-0c34-4b91-a14c-2076a2eed8c5" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Real Madrid 14\n", + "AC Milan 7\n", + "Liverpool 6\n", + "Bayern Munich 6\n", + "Barcelona 5\n", + "Ajax 4\n", + "Inter de Milán 3\n", + "ManUTD 3\n", + "Chelsea 2\n", + "Juventus 2\n", + "ManCity 1\n", + "dtype: int64" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = [14,7,6,6,5,4,3,3,2,2,1]\n", + "index = ['Real Madrid', 'AC Milan', 'Liverpool', 'Bayern Munich', 'Barcelona',\n", + " 'Ajax', 'Inter de Milán', 'ManUTD', 'Chelsea', 'Juventus', 'ManCity']\n", + "\n", + "winners = pd.Series(data, index=index)\n", + "\n", + "winners" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f3Cc3Sk1lsNC" + }, + "source": [ + "Con esto ya estamos preparados para generar nuestros primeros DataFrames\n", + "\n", + "# Dataframes en Pandas" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "78-Vr-6pEKWF" + }, + "source": [ + "Para entender cómo generamos un DataFrame con Pandas, lo comparamos con una lista convencional" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9sOuaqcPDv0Q", + "outputId": "0b4a55fa-c864-4b48-dc14-a5077f638c56" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mylist:\n", + "[1 2 3 4 5]\n" + ] + } + ], + "source": [ + "mylist = np.array([1,2,3,4,5])\n", + "print(\"mylist:\")\n", + "print(mylist)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 224 + }, + "id": "DZf8vVgkcNh4", + "outputId": "1b5a7778-2bc5-46ca-f541-27c6f0b3db04" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mydf1:\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
01
12
23
34
45
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " 0\n", + "0 1\n", + "1 2\n", + "2 3\n", + "3 4\n", + "4 5" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mydf1 = pd.DataFrame(mylist)\n", + "print(\"mydf1:\")\n", + "mydf1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "avJ9zhPcEe1B" + }, + "source": [ + "El nuevo dataframe creado, tiene índices de filas y de columnas.\n", + "Probamos a generar uno desde un array de dos dimensiones (una matriz)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "kxCLSIm3D0u0", + "outputId": "8e74268a-b183-4781-8c10-1eb6b7768598" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "myarray:\n", + "[[ 10 30 20]\n", + " [ 50 40 60]\n", + " [1000 2000 3000]]\n", + "\n" + ] + } + ], + "source": [ + "myarray = np.array([[10,30,20], [50,40,60],[1000,2000,3000]])\n", + "print(\"myarray:\")\n", + "print(myarray)\n", + "print()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 161 + }, + "id": "9AtpURjYcdru", + "outputId": "ed7c4a27-d39b-407b-a378-fdd2589a8360" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mydf2:\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
0103020
1504060
2100020003000
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " 0 1 2\n", + "0 10 30 20\n", + "1 50 40 60\n", + "2 1000 2000 3000" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mydf2 = pd.DataFrame(myarray)\n", + "print(\"mydf2:\")\n", + "mydf2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "LNh7UeI6pU6y", + "outputId": "285b6276-f3b8-4a60-9a09-4a26a42df67c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " a b c\n", + "0 0.661707 0.718344 0.559617\n", + "1 0.594431 0.840218 0.728236\n", + "2 0.507968 0.888984 0.703670\n", + "3 0.269993 0.272817 0.208284\n" + ] + } + ], + "source": [ + "#Otra variante usando Numpy\n", + "mydf3 = pd.DataFrame(np.random.rand(4,3), columns=['a', 'b', 'c'])\n", + "\n", + "print(mydf3)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5zs5XTMXk-TL" + }, + "source": [ + "En los elementos anteriores, se aprecia que los dataframes de pandas ponen claves de filas y columnas por defecto, que serán números si no damos otro tipo de claves. Vamos a crear un df ahora en forma de diccionario:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VU8M_eWKmqat", + "outputId": "c3ea83d8-e566-4f21-a549-e7c1eda23fbd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " name age email\n", + "0 Raúl 28 raul@gmail.com\n", + "1 Miguel Ángel 30 ma@gmail.com\n", + "2 Manu 43 manu@gmail.com\n", + "3 Jorge 24 jorge@gmail.com\n", + "4 Pablo 23 pablo@gmail.com\n" + ] + } + ], + "source": [ + "data = {\n", + " 'name': ['Raúl', 'Miguel Ángel', 'Manu', 'Jorge', 'Pablo'],\n", + " 'age': [28, 30, 43, 24, 23],\n", + " 'email': ['raul@gmail.com', 'ma@gmail.com', 'manu@gmail.com', 'jorge@gmail.com', 'pablo@gmail.com']\n", + "}\n", + "\n", + "\n", + "students = pd.DataFrame(data=data)\n", + "\n", + "print(students)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TKtTn9Fwn9jp" + }, + "source": [ + "También podemos crear las series en forma de Diccionario y luego pasárselas al Dataframe como en el ejemplo siguiente:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "G_BYzZlkkROx", + "outputId": "8b21b727-e883-47c7-a8a9-2da812637801" + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CitiesSize
0SF852469
1San Jose1015785
2Sacramento485199
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " Cities Size\n", + "0 SF 852469\n", + "1 San Jose 1015785\n", + "2 Sacramento 485199" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "names = pd.Series(['SF', 'San Jose', 'Sacramento'])\n", + "sizes = pd.Series([852469, 1015785, 485199])\n", + "df = pd.DataFrame({ 'Cities': names, 'Size': sizes })\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oSgIb8zaE_7x" + }, + "source": [ + "Los índices de las columnas se han tomado a partir de las claves del diccionario. Pero también podemos crear un dataframe desde un array y asignar después los valores de índices de las filas y de las columnas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 161 + }, + "id": "QrYIUyUxk8sR", + "outputId": "869cabb1-7513-4860-d9fd-2f867b8f0554" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Compras:\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
enerofebreromarzo
lentejas103020
espinacas504060
cerveza100020003000
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " enero febrero marzo\n", + "lentejas 10 30 20\n", + "espinacas 50 40 60\n", + "cerveza 1000 2000 3000" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "myarray = np.array([[10,30,20], [50,40,60],[1000,2000,3000]])\n", + "rownames = ['lentejas', 'espinacas', 'cerveza']\n", + "colnames = ['enero', 'febrero', 'marzo']\n", + "mydf = pd.DataFrame(myarray, index=rownames, columns=colnames)\n", + "print(\"Compras:\")\n", + "mydf\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MzRB9PVUGe_Q" + }, + "source": [ + "Si solo queremos ver los datos de enero" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "YY3WjgyMFiXZ", + "outputId": "6e02595a-01d4-411e-a916-ac2c702df3d5" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Compras de enero:\n" + ] + }, + { + "data": { + "text/plain": [ + "lentejas 10\n", + "espinacas 50\n", + "cerveza 1000\n", + "Name: enero, dtype: int64" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Compras de enero:\")\n", + "mydf['enero']" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RJP5W3a4qLY6" + }, + "source": [ + "Si solo nos interesa los datos de cerveza, jejeje. Podemos usar este otro método para filtrar por columna:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XhPSBS2_qQLr", + "outputId": "56c72c5f-6ed3-44fe-b682-8bc29e2bd498" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Lo que me interesa\n" + ] + }, + { + "data": { + "text/plain": [ + "enero 1000\n", + "febrero 2000\n", + "marzo 3000\n", + "Name: cerveza, dtype: int64" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print('Lo que me interesa')\n", + "mydf.loc['cerveza']" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1Ff7x3mwHOth" + }, + "source": [ + "Si queremos saber la cantidad de elementos en cada dimensión:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K8DTU8oKFjfP", + "outputId": "a5848df7-e3b3-4434-c029-124c84811b34" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Número de filas:\n", + "3\n", + "\n", + "Número de columnas:\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Número de filas:\")\n", + "print(mydf.shape[0])\n", + "print()\n", + "print(\"Número de columnas:\")\n", + "mydf.shape[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E9g5QiGoHY_V" + }, + "source": [ + "O ver las dimensiones en conjunto:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FssLqFzDF-U8", + "outputId": "eb49c666-f628-49f5-efb4-4adf7f70e3a0" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Número de filas y columnas:\n", + "(3, 3)\n" + ] + } + ], + "source": [ + "print(\"Número de filas y columnas:\")\n", + "print(mydf.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QFwBcDFVHspK" + }, + "source": [ + "También podemos consultar los nombres o etiquetas de filas o columnas, que son los valores que habíamos asignado a los índices, así como el tipo de valor que son." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "kjqu7Y7qFpA4", + "outputId": "df55700c-e11e-4d6c-b20a-dce514d7458e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Columnas:\n", + "Index(['enero', 'febrero', 'marzo'], dtype='object')\n", + "\n", + "Column types:\n" + ] + }, + { + "data": { + "text/plain": [ + "enero int64\n", + "febrero int64\n", + "marzo int64\n", + "dtype: object" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Columnas:\")\n", + "print(mydf.columns)\n", + "print()\n", + "print(\"Column types:\")\n", + "mydf.dtypes" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iUJ5Jj0wIG8e" + }, + "source": [ + "La función \"describe\" es muy útil, pues nos devuelve los datos estadísticos principales de la distribución de datos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 317 + }, + "id": "foVHw_VOGKN3", + "outputId": "449d4e79-0dbe-4552-ab00-f9c868341ef7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Valores estadísticos de los datos:\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
enerofebreromarzo
count3.0000003.0000003.000000
mean353.333333690.0000001026.666667
std560.3867711134.5042971709.073823
min10.00000030.00000020.000000
25%30.00000035.00000040.000000
50%50.00000040.00000060.000000
75%525.0000001020.0000001530.000000
max1000.0000002000.0000003000.000000
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " enero febrero marzo\n", + "count 3.000000 3.000000 3.000000\n", + "mean 353.333333 690.000000 1026.666667\n", + "std 560.386771 1134.504297 1709.073823\n", + "min 10.000000 30.000000 20.000000\n", + "25% 30.000000 35.000000 40.000000\n", + "50% 50.000000 40.000000 60.000000\n", + "75% 525.000000 1020.000000 1530.000000\n", + "max 1000.000000 2000.000000 3000.000000" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Valores estadísticos de los datos:\")\n", + "mydf.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PVtQiKK_IdCi" + }, + "source": [ + "También podemos hacer una representación gráfica básica de los datos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "gwFhU-CdljpB", + "outputId": "026d6f23-adee-4ff9-ea84-8379f6bb3df4" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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u6rU/X/HjEajatiwoapWrZr6448/VFRUlFqxYoX6/ffflVJKnT59Wk2fPl39+++/KioqSn322WfKYDCobdu2KaWUOnv2rLKxsVEff/yxio6OVnv37lUzZ85UV69eLagfuRC5MnToUFWiRAk1d+5cdezYMfX333+rb775Jkf7sF69eikXFxfVo0cPtX//fssLUMeOHbOs4/p3R48eVUoptXDhQuXn56eWLVumjh8/rpYtW6Y8PT3V3LlzlVLm/er1/em5c+fUhx9+qJycnNS+ffuUUkotXbpULVu2TB09elT9+++/qn379qpGjRrKaDTmeLutMtScPHlSGQwGdebMmWzTH3/8cTV8+HCllPk/lLf+Bc2cOVP5+PhYPvfq1Ut16NAh2zIWLFigqlSpokwmk+W79PR05ejoqNauXauUuj3U3MpoNCpXV1e1YsUKpZRSH330kapcubLKyMh4oO0WoiClpaUpJycntWXLlmzf9+nTR3Xp0kW1b99e9e7d+47zXg8177//vuW7zMxMFRAQoD744AOl1J1Dzf1+V2916+/Y2rVrlV6vV4cPH87xdrZr1069++67Simldu7cqQB14sSJHM8vhFYSExOVvb29+uabb26blpN9WK9evZSPj48l5FxXq1YtNWHCBMvn4cOHq9DQUMvnChUqqMWLF2ebZ+LEiSosLOy2OiIjI5WDg4P68ccf77od58+fV4Al9OSEVZ5+2rdvH0ajkcqVK1uub3FxcWHjxo3ZDmU5OTlRoUIFy2c/Pz/i4+Pvuew9e/Zw7NgxXF1dLcv19PQkLS3trofJ4uLieOWVV6hUqRLu7u64ubmRlJRETEwMAM8//zypqamUL1+eV155heXLl5OVlZUHPwkh8t6xY8dISUnhiSeeyPb7NX/+fKKioujfvz8//PADtWvXZujQoWzZsuW2ZYSFhVne29jYUL9+fQ4dOnTXdd7vd/V+v2O7d+8mICCAypUr33H5RqORiRMnUqNGDTw9PXFxcWHt2rWW+WvVqsXjjz9OjRo1eP755/nmm2+4fPly7n5wQhSQQ4cOkZ6ezuOPP37btJzuw2rUqHHbdTTdunVj8eLFgPmyie+//55u3boBkJycTFRUFH369Mn234VJkybdtm+MiYmhY8eODB48mBdeeMHy/dGjR+nSpQvly5fHzc2NcuXKWcbnlFVeKJyUlITB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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mydf.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-h1XLPjBrAUU" + }, + "source": [ + "A veces, vamos a necesitar trasponer un dataframe, esto es, cambiar las filas por las columnas, y lo hacemos con la función T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iEtwxpolqODm", + "outputId": "ebb491de-c341-4a16-d725-63f956741c1c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " a b\n", + "0 1 0\n", + "1 0 1\n", + "2 1 1\n", + "df1.T:\n", + " 0 1 2\n", + "a 1 0 1\n", + "b 0 1 1\n" + ] + } + ], + "source": [ + "df1 = pd.DataFrame({'a': [1, 0, 1], 'b': [0, 1, 1] },\n", + "dtype=int)\n", + "print(df1)\n", + "print(\"df1.T:\")\n", + "print(df1.T)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QlxwUISlI28W" + }, + "source": [ + "Si lo aplicamos a nuestro dataframe de las compras:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "-il3HKnarDwr", + "outputId": "90a14267-cfa5-46c9-8c83-71227dcfc526" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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OxQtIiIi11mVeRfStGnTmDx5svV2RkYGgYGB5b6fCRET6B7YnV5BvXAylesFLBERESmlcg0YPz8/ANLS0vD397fen5aWRvv27a1jjh07ZrNefn4+p06dsq7v5+dHWlqazZjC24VjLuXm5oabm1u5HMeVBHkGEeQZVOH7ERERkZKV6yWE4OBg/Pz8WL16tfW+jIwMNm3aRGRkJACRkZGcOXOGLVu2WMesWbMGs9lMly5drGPWrVtHXl6edczKlStp3bp1sU8fiYiISPVS5oDJyspi69atbN26FbC8cHfr1q2kpKRgMpl47LHHeOmll/jmm2/Ytm0bI0aMICAgwPpOpZCQEHr37s3YsWP55ZdfWL9+PY888gj3338/AQEBADzwwAO4uroyevRoduzYwccff8w777xj8xSRiIiIVGNGGf3www8GcNlXdHS0YRiGYTabjWeffdbw9fU13NzcjB49ehjJyck22zh58qQxdOhQo3bt2oanp6fx0EMPGZmZmTZjEhMTjVtuucVwc3MzGjVqZLz66qtlmmd6eroBGOnp6WU9RBEREbGT0p6//9LnwFRmFfk5MCIiIlIx7PI5MCIiIiLXgwJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERByOAkZEREQcjgJGREREHI4CRkRERBxOuQfM9OnTMZlMNl9t2rSxLj9//jwTJ06kfv361K5dmyFDhpCWlmazjZSUFPr164eHhwc+Pj488cQT5Ofnl/dURURExEHVqIiNtm3bllWrVl3cSY2Lu3n88cdZunQpn376KV5eXjzyyCMMHjyY9evXA1BQUEC/fv3w8/Njw4YNHD16lBEjRuDi4sIrr7xSEdMVERERB1MhAVOjRg38/Pwuuz89PZ158+axePFi/va3vwGwYMECQkJC+Pnnn7nppptYsWIFO3fuZNWqVfj6+tK+fXtefPFFpk6dyvTp03F1da2IKYuIiIgDqZDXwOzdu5eAgACaNWvGsGHDSElJAWDLli3k5eXRs2dP69g2bdrQpEkTNm7cCMDGjRsJCwvD19fXOiYqKoqMjAx27NhR4j5zcnLIyMiw+RIREZGqqdwDpkuXLsTHx7Ns2TJiY2M5cOAA3bp1IzMzk9TUVFxdXfH29rZZx9fXl9TUVABSU1Nt4qVweeGyksyYMQMvLy/rV2BgYPkemIiIiFQa5f4UUp8+fazfh4eH06VLF4KCgvjkk09wd3cv791ZTZs2jcmTJ1tvZ2RkKGJERESqqAp/G7W3tzetWrVi3759+Pn5kZuby5kzZ2zGpKWlWV8z4+fnd9m7kgpvF/e6mkJubm54enrafImIiEjVVOEBk5WVxf79+/H396dTp064uLiwevVq6/Lk5GRSUlKIjIwEIDIykm3btnHs2DHrmJUrV+Lp6UloaGhFT1dEREQcQLk/hTRlyhQGDBhAUFAQR44c4Z///CfOzs4MHToULy8vRo8ezeTJk6lXrx6enp5MmjSJyMhIbrrpJgB69epFaGgow4cP57XXXiM1NZVnnnmGiRMn4ubmVt7TFREREQdU7gHzxx9/MHToUE6ePEnDhg255ZZb+Pnnn2nYsCEAM2fOxMnJiSFDhpCTk0NUVBSzZs2yru/s7MySJUuIiYkhMjKSWrVqER0dzQsvvFDeUxUREREHZTIMw7D3JCpCRkYGXl5epKen6/UwIiIiDqK052/9LiQRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTgKGBEREXE4ChgRERFxOAoYERERcTg17D0BERERuY7MZjDMYBRY/msuuHj7SssM48LtIsu8A8G9rl0OQwFTVrlnwZwPmMBkuvBfpxK+L3pbRKQaMowLJ8BLT4aFt41Lbl9pWWlOsuYLy690Ar50+ZWWXWnu5kuWl2buV1h26RxKNfeS5mcuYTvm8v3zvXs+tBtSvtssJQVMWX0zCbZ/fo0rlyJ2bMKopEi6ZKz1++L2UdLYMu7DZjllGHvpPq42n6LrUYaxhcspxdgrzK1Mf0aXPg6lfdyv8vgVO3fKMLYU61XUY3LF9a4w9/KM/MITZrEnglKcjMrtJHulE9WVTrKXnHzscZItSwRc7bEt7xOmXB8mJzA5W/7r5Fzktsn2trOb3aaogLmuCv+ysPc8RCqjMoYuxVzONszoB8xB2ZwsC793KvlEWuIyp2LGXmGZdT/FnawvmcOVTuSXzuFKyy47zqvN3XQN8yvp8SvlY+sATIZhVNqf9nfffZfXX3+d1NRUIiIi+Pe//82NN95YqnUzMjLw8vIiPT0dT0/P8ptUQX6Rf1UYln+NUHiJ9NLvufivwauONYqMLc16lywvev9Vx1663VKud9mxlXbsVR6Tqx5nafdRlsekpPUow9gyPn4XvjcMy1fhWMMwMDAu/Iv3wvcXQtco3J5hYHDxewzzhamaueJjVNzjdeHPwITtclPhmMLbF/ZnuTZiYLLGgWWsiQvbcEBmTJhxwsAJs8kJo/C2yQkzTtbvjUvHmJwtR21ywowzhsmEUeS/5qK3TU5Fvne2bMtU5ItLv7ecqIqOxVT0v842403W25aTW9FxhScog0u+d7LMz3Th5GV2qoGpyMnRMDljMjlhODkBTpicnDGcnDGZTBgmy1jjwjqGyRknpyInPJOzzfcmJxMmUw3LtkxOODkVLquBU+E+TM6YnCzbMRVedDWZbL53MoEJk/UinVPhctOF7ym8gHdh7IX7CsdBkbFFtlX0+6LbMWGyXrwsbltOxc1PLxMoV6U9f1faKzAff/wxkydPJi4uji5duvD2228TFRVFcnIyPj4+9puYc6V9yEpkNhsUGAZmw8BsBrNhuW2YKXJ/4RjLeLNhUGC+cNsocrvo+oZBwYXb5gtjbbZXzPqGwYX7C++7uNyyXS5s9+K61vHF7MN8YXvGhTkVmC9f/9J9X5x7McdnUOJjYZSw76LHUjgPc3HzvzC+6imMGTBdOOUXjRsnzNZlhcu5MN52GZiKGWvCuHDCMNvsw3zhHrPhRAEXw8OMiYILaxZcuG2m6JgLV3HkGhhAnr0nUWkVDSjTpd9fEljW5Rdi6GIkFUaVbWBhXadocNnG1OXhVrjPi/unyP4vC7eiY51KCMdL5jru1mbcGFzvej3ENirtFZguXbpwww038J///AcAs9lMYGAgkyZN4qmnnrrq+hV1BeazLX+w/c/0y0545ktOXJedJM0XT9BlOyleOqb4k+KlJ/ii+xbHU/iXi/OFvyicnUw4XfjLyMnJcr+Tk+W2ZYzpwhgu3H/JGKcLYy5st+j9lu0WWb/IbdNlYy5Zv5h9O18YW3SMU5H5F52L9fsr7Luk4wMuXL268N/Ci05YfkaMC1fTDAPMBhjW740L61ruM5u5uI2i2yqyHePCCmbj4rjC7wu3Zbauf3Ffhdsqun/bfdgux7Ddp+18jZK3U3gsRjH7v2R+2Bz3xf1D8cd9+VyLPiZFj7twfly4YlhkbDHbKvpY2m6n6J/fVY7bZh9FHv9L91/MXAvHyl/zr6EduDMioFy36dBXYHJzc9myZQvTpk2z3ufk5ETPnj3ZuHGjHWcGa/cc59vEI3adQ0UwFZ5oTJbyvuwkZD3pFDlRFT2pWk86RU5ypTwpWk+k1hPv5SfZwn1b1y/xpGjZf0knxRJPssUcn1Mxx1LSvovbx6UBYrN+CRFRdC4iUvEuRmZxAXpJuFEkkIrElG2A2saW2XxJMNvE1uWxWpr9UzRWL9n/1QO0+Ni7dH5weYCajcJ9XNx/RGOv6/sHVkSlDJgTJ05QUFCAr6+vzf2+vr7s3r272HVycnLIycmx3s7IyKiQufUK9aVJPfcy/qv3yifFq/+rt+STYokn2SsGwuX/qtcJU0Sqo8KnYZz0tKLDqZQBcy1mzJjB888/X+H7GRARwIByvlwmIiIiZVMp3yvVoEEDnJ2dSUtLs7k/LS0NPz+/YteZNm0a6enp1q/Dhw9fj6mKiIiIHVTKgHF1daVTp06sXr3aep/ZbGb16tVERkYWu46bmxuenp42XyIiIlI1VdqnkCZPnkx0dDSdO3fmxhtv5O233+bs2bM89NBD9p6aiIiI2FmlDZj77ruP48eP89xzz5Gamkr79u1ZtmzZZS/sFRERkeqn0n4OzF9VYZ/EKyIiIhWmtOfvSvkaGBEREZErUcCIiIiIw1HAiIiIiMNRwIiIiIjDUcCIiIiIw1HAiIiIiMNRwIiIiIjDUcCIiIiIw6m0n8T7VxV+Pl9GRoadZyIiIiKlVXjevtrn7FbZgMnMzAQgMDDQzjMRERGRssrMzMTLy6vE5VX2VwmYzWaOHDlCnTp1MJlM5bbdjIwMAgMDOXz4cJX9FQVV/Rh1fI6vqh9jVT8+qPrHqOO7doZhkJmZSUBAAE5OJb/SpcpegXFycqJx48YVtn1PT88q+T9lUVX9GHV8jq+qH2NVPz6o+seo47s2V7ryUkgv4hURERGHo4ARERERh6OAKSM3Nzf++c9/4ubmZu+pVJiqfow6PsdX1Y+xqh8fVP1j1PFVvCr7Il4RERGpunQFRkRERByOAkZEREQcjgJGREREHI4CRkQqhGEYjBs3jnr16mEymdi6desVxyckJGAymThz5sx1mZ+IOLYq+0F2ImJfy5YtIz4+noSEBJo1a0aDBg3sPSURqUIUMBUsLy8PFxcXe09D5Lrbv38//v7+dO3atcL2UVBQgMlkuuLHjZfneiJyZbm5ubi6ul6XfVWrn16z2cyMGTMIDg7G3d2diIgIPvvsM+Di5evVq1fTuXNnPDw86Nq1K8nJyTbb+Prrr+nYsSM1a9akWbNmPP/88+Tn51uXm0wmYmNjufPOO6lVqxYvv/wyALGxsTRv3hxXV1dat27NwoULr9+Bi1xnI0eOZNKkSaSkpGAymWjatOkVf/6KWr9+PeHh4dSsWZObbrqJ7du3W5fFx8fj7e3NN998Q2hoKG5ubqSkpJCTk8OUKVNo1KgRtWrVokuXLiQkJFx1vdOnTzNixAjq1q2Lh4cHffr0Ye/evdfjIRK57m677TYmTZrEY489Rt26dfH19WXu3LmcPXuWhx56iDp16tCiRQu+//57wBL6o0ePtv7Mtm7dmnfeecdmmyNHjmTQoEG8/PLLBAQE0Lp1a+v59NKvkSNHWtcrl3OiUY289NJLRps2bYxly5YZ+/fvNxYsWGC4ubkZCQkJxg8//GAARpcuXYyEhARjx44dRrdu3YyuXbta11+3bp3h6elpxMfHG/v37zdWrFhhNG3a1Jg+fbp1DGD4+PgY8+fPN/bv328cOnTI+OKLLwwXFxfj3XffNZKTk40333zTcHZ2NtasWWOPh0Gkwp05c8Z44YUXjMaNGxtHjx41jh07dsWfP8MwrD+DISEhxooVK4ykpCSjf//+RtOmTY3c3FzDMAxjwYIFhouLi9G1a1dj/fr1xu7du42zZ88aY8aMMbp27WqsW7fO2Ldvn/H6668bbm5uxp49e6643p133mmEhIQY69atM7Zu3WpERUUZLVq0sO5PpCrp3r27UadOHePFF1809uzZY7z44ouGs7Oz0adPH2POnDnGnj17jJiYGKN+/frG2bNnjdzcXOO5554zNm/ebPz+++/GBx98YHh4eBgff/yxdZvR0dFG7dq1jeHDhxvbt283tm/fbuTk5BhHjx61fq1Zs8aoWbOmMW/ePMMwjHI7J1abgDl//rzh4eFhbNiwweb+0aNHG0OHDrX+5blq1SrrsqVLlxqAce7cOcMwDKNHjx7GK6+8YrP+woULDX9/f+ttwHjsscdsxnTt2tUYO3aszX333HOP0bdv33I5NpHKaObMmUZQUJBhGFf/+TOMiwHz0UcfWZefPHnScHd3t/6FuWDBAgMwtm7dah1z6NAhw9nZ2fjzzz9ttt2jRw9j2rRpJa63Z88eAzDWr19vve/EiROGu7u78cknn5TDIyBSuXTv3t245ZZbrLfz8/ONWrVqGcOHD7fed/ToUQMwNm7cWOw2Jk6caAwZMsR6Ozo62vD19TVycnKKHX/ixAmjWbNmxsMPP2y9r7zOidXmNTD79u0jOzubO+64w+b+3NxcOnToYL0dHh5u/d7f3x+AY8eO0aRJExITE1m/fr31aSGwXGI7f/482dnZeHh4ANC5c2ebfezatYtx48bZ3HfzzTdfdilOpKoq7c8fQGRkpPX7evXq0bp1a3bt2mW9z9XV1ebndNu2bRQUFNCqVSub7eTk5FC/fv0S19u1axc1atSgS5cu1vvq169/2f5EqpKiPwPOzs7Ur1+fsLAw632+vr6A5bwH8O677zJ//nxSUlI4d+4cubm5tG/f3mabYWFhxb7uJS8vjyFDhhAUFGRzviuvc2K1CZisrCwAli5dSqNGjWyWubm5sX//fgCbF9yaTCbA8tqZwm08//zzDB48+LLt16xZ0/p9rVq1ynfyIg7uaj9/ZeHu7m792SzctrOzM1u2bMHZ2dlmbO3atUtcT6Q6uvRNJSaTqcTz3kcffcSUKVN48803iYyMpE6dOrz++uts2rTJZhslnfNiYmI4fPgwv/zyCzVqlH9uVJuAKfrCve7du1+2vDBgrqRjx44kJyfTokWLMu07JCSE9evXEx0dbb1v/fr1hIaGlmk7Io7qaj9/Rf388880adIEgNOnT7Nnzx5CQkJKHN+hQwcKCgo4duwY3bp1K/WcQkJCyM/PZ9OmTdZ3Sp08eZLk5GT9bIpgOU917dqVhx9+2Hpfac6VAG+99RaffPIJGzZssLkSCuV3Tqw2AVOnTh2mTJnC448/jtls5pZbbiE9PZ3169fj6elJUFDQVbfx3HPP0b9/f5o0acLdd9+Nk5MTiYmJbN++nZdeeqnE9Z544gnuvfdeOnToQM+ePfn222/54osvWLVqVXkeokildbWfv6J/kb3wwgvUr18fX19f/vGPf9CgQQMGDRpU4rZbtWrFsGHDGDFiBG+++SYdOnTg+PHjrF69mvDwcPr161fsei1btmTgwIGMHTuW2bNnU6dOHZ566ikaNWrEwIEDy/shEHE4LVu25L///S/Lly8nODiYhQsXsnnzZoKDg6+43qpVq3jyySd59913adCgAampqYDlKqiXl1f5nRPL9IoZB2c2m423337baN26teHi4mI0bNjQiIqKMtauXWt9AeHp06et43/77TcDMA4cOGC9b9myZUbXrl0Nd3d3w9PT07jxxhuNOXPmWJcDxpdffnnZvmfNmmU0a9bMcHFxMVq1amX897//rcAjFbG/oi/iNYwr//wZxsUX8X777bdG27ZtDVdXV+PGG280EhMTrdtYsGCB4eXlddm+Ct8t0bRpU8PFxcXw9/c37rrrLiMpKemK6506dcoYPny44eXlZbi7uxtRUVHWdy6JVDXdu3c3/u///s/mvqCgIGPmzJk29xWex86fP2+MHDnS8PLyMry9vY2YmBjjqaeeMiIiIqxjo6OjjYEDB9qs/89//tMALvuKjo62jimPc6LpwmRFREREHEa1+iA7ERERqRoUMCIiIuJwFDAiIiLicBQwIiIi4nAUMCIiIuJwFDAiIiLicBQwIiIi4nAUMCIiIuJwFDAiIiLicBQwIiIi4nAUMCIiIuJwFDAiIiLicP4/AEQ6w3Fxb88AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = mydf.T\n", + "df.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fexvuFaHI-5u" + }, + "source": [ + "Viendo el gráfico, podemos concluir que vamos a tener que incentivar de alguna manera el consumo de lentejas y espinacas frente al de cerveza 😅" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V_oB7KE6rrAN" + }, + "source": [ + "Probemos ahora a sumar dataframes valor a valor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SgFL_P8SrYM4", + "outputId": "368537c0-169a-45ce-e82e-ed07cfe8ab2f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "df1 + df2:\n", + " a b\n", + "0 4 5\n", + "1 3 6\n", + "2 4 6\n" + ] + } + ], + "source": [ + "df1 = pd.DataFrame({'a' : [1, 0, 1], 'b' : [0, 1, 1] },\n", + "dtype=int)\n", + "df2 = pd.DataFrame({'a' : [3, 3, 3], 'b' : [5, 5, 5] },\n", + "dtype=int)\n", + "print(\"df1 + df2:\")\n", + "print(df1 + df2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-oKk-EsEx8_B" + }, + "source": [ + "Algo que vamos a necesitar más de una vez, será convertir datos de tipo categórico a numérico. Esta opción es la más básica, y es adecuada para casos de valores binarios. Puedes descargar el archivo 'spam_no_spam.tsv' necesario para este ejemplo, [aquí](https://drive.google.com/file/d/1o3zlsYxTlU7JyJTzdJF9ClF-AF2-QAGZ/view?usp=sharing)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OlayQ48Hsl7G", + "outputId": "49d28811-353f-4e8a-fc4c-a7dd695f2be7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Primeras cinco líneas:\n", + " type text\n", + "0 no_spam Ya esta disponible su pedido\n", + "1 no_spam Revise sus mensajes\n", + "2 spam Un iPhone gratis!!\n", + "3 no_spam Un 20% de descuento\n", + "4 no_spam Tienes un nuevo comentario\n", + "-------------------------\n", + "Primeras cinco líneas despues del cambio:\n", + " type text\n", + "0 0 Ya esta disponible su pedido\n", + "1 0 Revise sus mensajes\n", + "2 1 Un iPhone gratis!!\n", + "3 0 Un 20% de descuento\n", + "4 0 Tienes un nuevo comentario\n", + "-------------------------\n" + ] + } + ], + "source": [ + "df = pd.read_csv('/content/sample_data/spam_no_spam.tsv', delimiter='\\t')\n", + "print(\"Primeras cinco líneas:\")\n", + "print(df.head(5))\n", + "print(\"-------------------------\")\n", + "# mapeamos no_spam/spam a valores 0/1 respectivamente:\n", + "df['type'] = df['type'].map( {'no_spam':0 , 'spam':1} )\n", + "print(\"Primeras cinco líneas despues del cambio:\")\n", + "print(df.head(5))\n", + "print(\"-------------------------\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U_l2a2eA2A5l" + }, + "source": [ + "En este otro ejemplo, utilizamos replace para sustituir las categorías de talla de camisetas por el valor numérico. El archivo para este ejemplo, puedes descargarlo [aquí](https://drive.google.com/file/d/1Q2696bRiBilF3DOpmPyFSOBcz2EiJunx/view?usp=sharing). El parámetro regex corresponde a \"regular expresions\", y aunque suele ser de tipo booleano, en casos como éste, toma como valor una cadena. Si quieres saber más, puedes consultar la [documentación de Pandas sobre la función replace](https://pandas.pydata.org/docs/reference/api/pandas.Series.replace.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "39s5rj09udby", + "outputId": "700a7820-e00b-4765-8c8b-60fd02665439" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "shirts before:\n", + " type size\n", + "0 shirt xxlarge\n", + "1 shirt xxlarge\n", + "2 shirt xlarge\n", + "3 shirt xlarge\n", + "4 shirt xlarge\n", + "5 shirt large\n", + "6 shirt medium\n", + "7 shirt small\n", + "8 shirt small\n", + "9 shirt xsmall\n", + "10 shirt xsmall\n", + "\n", + "shirts after:\n", + " type size\n", + "0 shirt 4\n", + "1 shirt 4\n", + "2 shirt 4\n", + "3 shirt 4\n", + "4 shirt 4\n", + "5 shirt 3\n", + "6 shirt 2\n", + "7 shirt 1\n", + "8 shirt 1\n", + "9 shirt 1\n", + "10 shirt 1\n" + ] + } + ], + "source": [ + "shirts = pd.read_csv(\"shirts.csv\")\n", + "print(\"shirts before:\")\n", + "print(shirts)\n", + "print()\n", + "shirts['size'] = shirts['size'].replace(regex='xlarge',\n", + "value=4)\n", + "shirts['size'] = shirts['size'].replace(regex='large',\n", + "value=3)\n", + "shirts['size'] = shirts['size'].replace(regex='medium',\n", + "value=2)\n", + "shirts['size'] = shirts['size'].replace(regex='small',\n", + "value=1)\n", + "print(\"shirts after:\")\n", + "print(shirts)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E_KVYcnk2rTT" + }, + "source": [ + "Otras funciones muy útiles son startswith, split, iloc...\n", + "\n", + "Probamos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GK5cm3Iy0yOb", + "outputId": "5c49c00b-660e-427a-e791-3a98e1898f02" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "shirts:\n", + " type size\n", + "0 shirt xxlarge\n", + "1 shirt xxlarge\n", + "2 shirt xlarge\n", + "3 shirt xlarge\n", + "4 shirt xlarge\n", + "5 shirt large\n", + "6 shirt medium\n", + "7 shirt small\n", + "8 shirt small\n", + "9 shirt xsmall\n", + "10 shirt xsmall\n", + "\n", + "shirts starting with xl:\n", + " type size\n", + "2 shirt xlarge\n", + "3 shirt xlarge\n", + "4 shirt xlarge\n", + "\n", + "Exclude 'xlarge' shirts:\n", + " type size\n", + "0 shirt xxlarge\n", + "1 shirt xxlarge\n", + "5 shirt large\n", + "6 shirt medium\n", + "7 shirt small\n", + "8 shirt small\n", + "9 shirt xsmall\n", + "10 shirt xsmall\n", + "\n", + "first three letters:\n", + " type size sub1\n", + "0 shirt xxlarge xxl\n", + "1 shirt xxlarge xxl\n", + "2 shirt xlarge xla\n", + "3 shirt xlarge xla\n", + "4 shirt xlarge xla\n", + "5 shirt large lar\n", + "6 shirt medium med\n", + "7 shirt small sma\n", + "8 shirt small sma\n", + "9 shirt xsmall xsm\n", + "10 shirt xsmall xsm\n", + "\n", + "split ssize on letter 'a':\n", + " type size sub1 sub2\n", + "0 shirt xxlarge xxl [xxl, rge]\n", + "1 shirt xxlarge xxl [xxl, rge]\n", + "2 shirt xlarge xla [xl, rge]\n", + "3 shirt xlarge xla [xl, rge]\n", + "4 shirt xlarge xla [xl, rge]\n", + "5 shirt large lar [l, rge]\n", + "6 shirt medium med [medium]\n", + "7 shirt small sma [sm, ll]\n", + "8 shirt small sma [sm, ll]\n", + "9 shirt xsmall xsm [xsm, ll]\n", + "10 shirt xsmall xsm [xsm, ll]\n", + "\n", + "Rows 3 through 5 and column 2:\n", + "2 xla\n", + "3 xla\n", + "4 xla\n", + "Name: sub1, dtype: object\n", + "\n" + ] + } + ], + "source": [ + "shirts = pd.read_csv(\"shirts.csv\")\n", + "print(\"shirts:\")\n", + "print(shirts)\n", + "print()\n", + "print(\"shirts starting with xl:\")\n", + "print(shirts[shirts['size'].str.startswith('xl')])\n", + "print()\n", + "print(\"Exclude 'xlarge' shirts:\")\n", + "print(shirts[shirts['size'] != 'xlarge'])\n", + "print()\n", + "print(\"first three letters:\")\n", + "shirts['sub1'] = shirts['size'].str[:3]\n", + "print(shirts)\n", + "print()\n", + "print(\"split ssize on letter 'a':\")\n", + "shirts['sub2'] = shirts['size'].str.split('a')\n", + "print(shirts)\n", + "print()\n", + "print(\"Rows 3 through 5 and column 2:\")\n", + "print(shirts.iloc[2:5, 2])\n", + "print()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "a_j9ezHg6XKg" + }, + "source": [ + "Se pueden combinar dataframes con concat" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Qg0jGXno4DRm", + "outputId": "8f933934-7cb1-4de9-dcf8-4d701fc8f789" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " city temperature humidity\n", + "0 Vancouver 72 40\n", + "1 Toronto 65 20\n", + "2 Montreal 50 25\n", + "0 SF 60 30\n", + "1 Chicago 40 15\n", + "2 LA 85 55\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "can_weather = pd.DataFrame({\n", + "\"city\": [\"Vancouver\",\"Toronto\",\"Montreal\"],\n", + "\"temperature\": [72,65,50],\n", + "\"humidity\": [40, 20, 25]\n", + "})\n", + "us_weather = pd.DataFrame({\n", + "\"city\": [\"SF\",\"Chicago\",\"LA\"],\n", + "\"temperature\": [60,40,85],\n", + "\"humidity\": [30, 15, 55]\n", + "})\n", + "df = pd.concat([can_weather, us_weather])\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "p9BAbp1Yxb1g", + "outputId": "f9db2cd8-9a62-41b2-c8b5-beba828f625e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "city SF\n", + "temperature 60\n", + "humidity 30\n", + "Name: 0, dtype: object" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.iloc[3]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "j9TnWY-D-ths" + }, + "source": [ + "En el siguiente ejemplo, creamos una nueva columna 'Total' que tendrá los valores resultado de sumar los de las otras dos columnas anteriores" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AmyDL9JH-s4F", + "outputId": "4c9f35db-ab53-42ed-af89-a367f6110e19" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "First Dataset:\n", + " Quarter Cost Revenue\n", + "0 Q1 -23500 40000\n", + "1 Q2 -34000 40000\n", + "2 Q3 -57000 40000\n", + "3 Q4 -32000 40000\n", + "Second Dataset:\n", + " Quarter Cost Revenue Total\n", + "0 Q1 -23500 40000 16500\n", + "1 Q2 -34000 40000 6000\n", + "2 Q3 -57000 40000 -17000\n", + "3 Q4 -32000 40000 8000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":8: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError. Select only valid columns before calling the reduction.\n", + " df['Total'] = df.sum(axis=1)\n" + ] + } + ], + "source": [ + "summary = {\n", + "'Quarter': ['Q1', 'Q2', 'Q3', 'Q4'],\n", + "'Cost': [-23500, -34000, -57000, -32000],\n", + "'Revenue': [40000, 40000, 40000, 40000]\n", + "}\n", + "df = pd.DataFrame(summary)\n", + "print(\"First Dataset:\\n\",df)\n", + "df['Total'] = df.sum(axis=1)\n", + "print(\"Second Dataset:\\n\",df)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "u1C8YrD8A-do" + }, + "source": [ + "En las siguientes celdas, vemos cómo operar, añadir y borrar columnas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "L0a7SJPAOnOJ", + "outputId": "a1d2fe66-6640-4c84-a0aa-6ab4c7750b82" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " one two three\n", + "A 1 2 3\n", + "B 4 5 6\n" + ] + } + ], + "source": [ + "df = pd.DataFrame.from_dict({'A':[1,2,3],'B':[4,5,6]},\n", + "orient='index', columns=['one', 'two', 'three'])\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "oaVJ5sgMPERU", + "outputId": "3dec84c1-8581-4824-f875-02078ad70d31" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " one two three four\n", + "A 1 2 3 2\n", + "B 4 5 6 20\n" + ] + } + ], + "source": [ + "df['four'] = df['one'] * df['two']\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "paLU6f-jPMzV", + "outputId": "c2ee7322-05c8-4bec-980c-138e2f4a5306" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " one two three four\n", + "A 1 2 4 2\n", + "B 4 5 25 20\n" + ] + } + ], + "source": [ + "df['three'] = df['two'] * df['two']\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-DlBFfiMPVU5", + "outputId": "e6f1faa8-a925-4d10-c42a-7c8e3f77699e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " one random two three four\n", + "A 1 0.415789 2 4 2\n", + "B 4 -0.386212 5 25 20\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "rand = np.random.randn(2)\n", + "df.insert(1, 'random', rand)\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hWqslYTKPaS2", + "outputId": "6073b597-7450-4978-d38c-9accea4e74e6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " one random two three four flag\n", + "A 1 0.415789 2 4 2 False\n", + "B 4 -0.386212 5 25 20 True\n" + ] + } + ], + "source": [ + "df['flag'] = df['one'] > 2\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hjTKm4JKzW-X", + "outputId": "9dbf8dd2-f37d-42f1-8b32-e5c6429fe40b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0 Status\n", + "PIA 10 Aprobado\n", + "MAA 7 Aprobado\n", + "SIA 3 Suspenso\n", + "SBD 4 Suspenso\n", + "BDA 6 Aprobado\n" + ] + } + ], + "source": [ + "serie = pd.Series({\n", + " 'PIA': 10,\n", + " 'MAA': 7,\n", + " 'SIA': 3,\n", + " 'SBD': 4,\n", + " 'BDA': 6\n", + "\n", + "})\n", + "\n", + "\n", + "df = pd.DataFrame(serie)\n", + "\n", + "def aprobado(x: int):\n", + " if x >= 5:\n", + " return 'Aprobado'\n", + " else:\n", + " return 'Suspenso'\n", + "\n", + "df['Status'] = df[0].apply(aprobado)\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "H84QXV0SPlxm", + "outputId": "966db298-4119-43b9-ef4a-2e891ae471ea" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " one random three four flag\n", + "A 1 0.415789 4 2 False\n", + "B 4 -0.386212 25 20 True\n" + ] + } + ], + "source": [ + "del df['two']\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IfrXOKJRRWZO", + "outputId": "a921237d-b786-43dc-d9f2-80a7bf848f3e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " one random four flag\n", + "A 1 0.415789 2 False\n", + "B 4 -0.386212 20 True\n" + ] + } + ], + "source": [ + "three = df.pop('three')\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "d4VdcyGXRblS", + "outputId": "215c5330-2ef9-4b3d-9503-a75544928d71" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " one random four flag foo\n", + "A 1 0.415789 2 False bar\n", + "B 4 -0.386212 20 True bar\n" + ] + } + ], + "source": [ + "df['foo'] = 'bar'\n", + "print(df)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/30_Pandas_conceptos_nivel_intermedio.ipynb" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/30_Pandas_conceptos_nivel_intermedio.ipynb" new file mode 100644 index 0000000..26f7a87 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Numpy/Practiquemos un poco!!!/30_Pandas_conceptos_nivel_intermedio.ipynb" @@ -0,0 +1,8252 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "B8G_QKNbzN1p" + }, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Cómo leer datos\n", + "\n", + "Es bastante sencillo cargar datos desde varios formatos de archivo en un DataFrame. En los siguientes ejemplos seguiremos utilizando nuestros datos de manzanas y naranjas, pero esta vez provienen de diversos archivos.\n", + "\n", + "## Leyendo datos desde CSV\n", + "\n", + "Aunque lo vimos en el cuaderno anterior no viene de más recordarlo:\n", + "\n", + "```\n", + "df = pd.read_csv('filename.csv')\n", + "```\n", + "\n", + "Para el ejemplo podemos usar este csv de prueba [ventas.csv](https://docs.google.com/spreadsheets/d/1HkxNg8tGWe5Oy5FBcTtIxhcrBteb6ziy1wg7ME8wWAg/edit?usp=sharing)" + ], + "metadata": { + "id": "YNCraNYGzYeT" + } + }, + { + "cell_type": "code", + "source": [ + "purchases = pd.read_csv('sample_data/ventas.csv')\n", + "\n", + "purchases" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 175 + }, + "id": "0OO-8uvX05zK", + "outputId": "6bdaedc0-413a-4d79-e52e-52208f2bca74" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " Unnamed: 0 apples oranges\n", + "0 Julio 3 0\n", + "1 Roberto 2 3\n", + "2 Lily 0 7\n", + "3 David 1 2" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0applesoranges
0Julio30
1Roberto23
2Lily07
3David12
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 2 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Podemos hacer que la columna de nombres sea la que haga de índice en lugar de hacerlo numérico:" + ], + "metadata": { + "id": "dhgbAqer3i28" + } + }, + { + "cell_type": "code", + "source": [ + "purchases = pd.read_csv('sample_data/ventas.csv', index_col=0)\n", + "\n", + "purchases" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 175 + }, + "id": "SHYjHRhs3nwW", + "outputId": "4c57ab83-8c20-4746-db90-6a0b1b5457ad" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " apples oranges\n", + "Julio 3 0\n", + "Roberto 2 3\n", + "Lily 0 7\n", + "David 1 2" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
applesoranges
Julio30
Roberto23
Lily07
David12
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Leyendo datos de JSON\n", + "\n", + "Cuando disponemos de fichero json, esencialmente son datos almacenados de manera similar a los diccionarios Python, luego Pandas puede leerlos de manera sencilla:\n", + "\n", + "```\n", + "purchases = pd.read_json('purchases.json')\n", + "```" + ], + "metadata": { + "id": "I3stnmar37sh" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Leyendo datos de un Base de Datos SQL\n", + "\n", + "Si trabajas con datos de una base de datos SQL, primero necesitas establecer una conexión utilizando una biblioteca de Python apropiada, y luego pasar una consulta a pandas. Aquí utilizaremos SQLite para demostrarlo.\n", + "\n", + "Primero, necesitamos tener instalado pysqlite3, así que ejecuta este comando en tu terminal:\n", + "\n", + "```\n", + "pip install pysqlite3\n", + "```" + ], + "metadata": { + "id": "04MgWgW14jGI" + } + }, + { + "cell_type": "markdown", + "source": [ + "sqlite3 se utiliza para crear una conexión con una base de datos que podemos utilizar luego para generar un DataFrame a través de una consulta SELECT.\n", + "\n", + "Así que primero estableceremos una conexión con un archivo de base de datos SQLite:" + ], + "metadata": { + "id": "ysNM4u2M5GRj" + } + }, + { + "cell_type": "code", + "source": [ + "import sqlite3\n", + "\n", + "connection = sqlite3.connect('database.db')" + ], + "metadata": { + "id": "w1QYn9bA5J7K" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### IMPORTANTE:\n", + "\n", + "Si tienes datos en PostgreSQL, MySQL u otro servidor SQL, necesitarás obtener la biblioteca de Python adecuada para realizar una conexión. Por ejemplo, **psycopg2** ([link](http://initd.org/psycopg/download/)) es una biblioteca comúnmente utilizada para establecer conexiones con PostgreSQL. Además, realizarías una conexión a un URI de base de datos en lugar de a un archivo como hicimos aquí con SQLite." + ], + "metadata": { + "id": "mhjQEqVm5vBH" + } + }, + { + "cell_type": "markdown", + "source": [ + "Volviendo al ejemplo anterior podríamos consultar la base de datos para mostrar la información:\n", + "\n" + ], + "metadata": { + "id": "RwQx853M6DsP" + } + }, + { + "cell_type": "code", + "source": [ + "purchases = pd.read_sql_query('SELECT * FROM purchases', connection)" + ], + "metadata": { + "id": "h3AFZOya6Mjq" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Convertir resultados a CSV, JSON o SQL\n", + "\n", + "Después de un trabajo exhaustivo de limpieza y tratamiento de tus datos, ahora estás listo para guardarlos en un archivo de tu elección. De manera similar a cómo leemos los datos, pandas proporciona comandos intuitivos para guardarlos:" + ], + "metadata": { + "id": "2-53ljC67PDt" + } + }, + { + "cell_type": "code", + "source": [ + "purchases.to_csv('results.csv')\n", + "purchases.to_json('results.csv')\n", + "purchases.to_sql('results.csv', connection) #Este requiere del parámetro de conexión a la base de datos" + ], + "metadata": { + "id": "OgaqXUsC7jbf" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Operaciiones más importantes con DataFrames\n", + "\n", + "Los DataFrames poseen cientos de métodos y otras operaciones que son cruciales para cualquier análisis. Como principiante, debes conocer las operaciones que realizan transformaciones simples de tus datos y aquellas que proporcionan un análisis estadístico fundamental.\n", + "\n", + "Carguemos el conjunto de datos de películas de IMDB para comenzar:" + ], + "metadata": { + "id": "Ez9AgN4m8Ctp" + } + }, + { + "cell_type": "code", + "source": [ + "movies = pd.read_csv('sample_data/imdb_movies.csv')" + ], + "metadata": { + "id": "F-yhNoYM8UZs" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Una de las primeras acciones a realizar es visualizar un pequeño extracto de la información para obtener una referencia visual, para ello usaremos el método **head()**" + ], + "metadata": { + "id": "ju30DNx58gDA" + } + }, + { + "cell_type": "code", + "source": [ + "movies.head()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 625 + }, + "id": "BYC2zw5E8rU9", + "outputId": "37b84fbf-f10e-4fa0-c0a8-5ec967c79504" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " names date_x score \\\n", + "0 Creed III 03/02/2023 73.0 \n", + "1 Avatar: The Way of Water 12/15/2022 78.0 \n", + "2 The Super Mario Bros. Movie 04/05/2023 76.0 \n", + "3 Mummies 01/05/2023 70.0 \n", + "4 Supercell 03/17/2023 61.0 \n", + "\n", + " genre \\\n", + "0 Drama, Action \n", + "1 Science Fiction, Adventure, Action \n", + "2 Animation, Adventure, Family, Fantasy, Comedy \n", + "3 Animation, Comedy, Family, Adventure, Fantasy \n", + "4 Action \n", + "\n", + " overview \\\n", + "0 After dominating the boxing world, Adonis Cree... \n", + "1 Set more than a decade after the events of the... \n", + "2 While working underground to fix a water main,... \n", + "3 Through a series of unfortunate events, three ... \n", + "4 Good-hearted teenager William always lived in ... \n", + "\n", + " crew \\\n", + "0 Michael B. Jordan, Adonis Creed, Tessa Thompso... \n", + "1 Sam Worthington, Jake Sully, Zoe Saldaña, Neyt... \n", + "2 Chris Pratt, Mario (voice), Anya Taylor-Joy, P... \n", + "3 Óscar Barberán, Thut (voice), Ana Esther Albor... \n", + "4 Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin... \n", + "\n", + " orig_title status orig_lang budget_x \\\n", + "0 Creed III Released English 75000000.0 \n", + "1 Avatar: The Way of Water Released English 460000000.0 \n", + "2 The Super Mario Bros. Movie Released English 100000000.0 \n", + "3 Momias Released Spanish, Castilian 12300000.0 \n", + "4 Supercell Released English 77000000.0 \n", + "\n", + " revenue country \n", + "0 2.716167e+08 AU \n", + "1 2.316795e+09 AU \n", + "2 7.244590e+08 AU \n", + "3 3.420000e+07 AU \n", + "4 3.409420e+08 US " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namesdate_xscoregenreoverviewcreworig_titlestatusorig_langbudget_xrevenuecountry
0Creed III03/02/202373.0Drama, ActionAfter dominating the boxing world, Adonis Cree...Michael B. Jordan, Adonis Creed, Tessa Thompso...Creed IIIReleasedEnglish75000000.02.716167e+08AU
1Avatar: The Way of Water12/15/202278.0Science Fiction, Adventure, ActionSet more than a decade after the events of the...Sam Worthington, Jake Sully, Zoe Saldaña, Neyt...Avatar: The Way of WaterReleasedEnglish460000000.02.316795e+09AU
2The Super Mario Bros. Movie04/05/202376.0Animation, Adventure, Family, Fantasy, ComedyWhile working underground to fix a water main,...Chris Pratt, Mario (voice), Anya Taylor-Joy, P...The Super Mario Bros. MovieReleasedEnglish100000000.07.244590e+08AU
3Mummies01/05/202370.0Animation, Comedy, Family, Adventure, FantasyThrough a series of unfortunate events, three ...Óscar Barberán, Thut (voice), Ana Esther Albor...MomiasReleasedSpanish, Castilian12300000.03.420000e+07AU
4Supercell03/17/202361.0ActionGood-hearted teenager William always lived in ...Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin...SupercellReleasedEnglish77000000.03.409420e+08US
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 18 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Podemos usar la columna names como índice de nuestra muestra:" + ], + "metadata": { + "id": "DWI__y5O81-c" + } + }, + { + "cell_type": "code", + "source": [ + "movies = pd.read_csv('sample_data/imdb_movies.csv', index_col='names')\n", + "\n", + "movies.head()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 656 + }, + "id": "pVZhf5IY87fF", + "outputId": "0867baa6-5bd0-47d1-9c1d-b251bbc675cf" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " date_x score \\\n", + "names \n", + "Creed III 03/02/2023 73.0 \n", + "Avatar: The Way of Water 12/15/2022 78.0 \n", + "The Super Mario Bros. Movie 04/05/2023 76.0 \n", + "Mummies 01/05/2023 70.0 \n", + "Supercell 03/17/2023 61.0 \n", + "\n", + " genre \\\n", + "names \n", + "Creed III Drama, Action \n", + "Avatar: The Way of Water Science Fiction, Adventure, Action \n", + "The Super Mario Bros. Movie Animation, Adventure, Family, Fantasy, Comedy \n", + "Mummies Animation, Comedy, Family, Adventure, Fantasy \n", + "Supercell Action \n", + "\n", + " overview \\\n", + "names \n", + "Creed III After dominating the boxing world, Adonis Cree... \n", + "Avatar: The Way of Water Set more than a decade after the events of the... \n", + "The Super Mario Bros. Movie While working underground to fix a water main,... \n", + "Mummies Through a series of unfortunate events, three ... \n", + "Supercell Good-hearted teenager William always lived in ... \n", + "\n", + " crew \\\n", + "names \n", + "Creed III Michael B. Jordan, Adonis Creed, Tessa Thompso... \n", + "Avatar: The Way of Water Sam Worthington, Jake Sully, Zoe Saldaña, Neyt... \n", + "The Super Mario Bros. Movie Chris Pratt, Mario (voice), Anya Taylor-Joy, P... \n", + "Mummies Óscar Barberán, Thut (voice), Ana Esther Albor... \n", + "Supercell Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin... \n", + "\n", + " orig_title status \\\n", + "names \n", + "Creed III Creed III Released \n", + "Avatar: The Way of Water Avatar: The Way of Water Released \n", + "The Super Mario Bros. Movie The Super Mario Bros. Movie Released \n", + "Mummies Momias Released \n", + "Supercell Supercell Released \n", + "\n", + " orig_lang budget_x revenue \\\n", + "names \n", + "Creed III English 75000000.0 2.716167e+08 \n", + "Avatar: The Way of Water English 460000000.0 2.316795e+09 \n", + "The Super Mario Bros. Movie English 100000000.0 7.244590e+08 \n", + "Mummies Spanish, Castilian 12300000.0 3.420000e+07 \n", + "Supercell English 77000000.0 3.409420e+08 \n", + "\n", + " country \n", + "names \n", + "Creed III AU \n", + "Avatar: The Way of Water AU \n", + "The Super Mario Bros. Movie AU \n", + "Mummies AU \n", + "Supercell US " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
date_xscoregenreoverviewcreworig_titlestatusorig_langbudget_xrevenuecountry
names
Creed III03/02/202373.0Drama, ActionAfter dominating the boxing world, Adonis Cree...Michael B. Jordan, Adonis Creed, Tessa Thompso...Creed IIIReleasedEnglish75000000.02.716167e+08AU
Avatar: The Way of Water12/15/202278.0Science Fiction, Adventure, ActionSet more than a decade after the events of the...Sam Worthington, Jake Sully, Zoe Saldaña, Neyt...Avatar: The Way of WaterReleasedEnglish460000000.02.316795e+09AU
The Super Mario Bros. Movie04/05/202376.0Animation, Adventure, Family, Fantasy, ComedyWhile working underground to fix a water main,...Chris Pratt, Mario (voice), Anya Taylor-Joy, P...The Super Mario Bros. MovieReleasedEnglish100000000.07.244590e+08AU
Mummies01/05/202370.0Animation, Comedy, Family, Adventure, FantasyThrough a series of unfortunate events, three ...Óscar Barberán, Thut (voice), Ana Esther Albor...MomiasReleasedSpanish, Castilian12300000.03.420000e+07AU
Supercell03/17/202361.0ActionGood-hearted teenager William always lived in ...Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin...SupercellReleasedEnglish77000000.03.409420e+08US
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 62 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Como habrás podido comprobar este método devuelve las primeras 5 filas, aunque acepta como parámetro un valor numérico:" + ], + "metadata": { + "id": "9pBqdOsG9Sej" + } + }, + { + "cell_type": "code", + "source": [ + "movies.head(10)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "N3xyuSf29elD", + "outputId": "ab633499-aee0-43c0-d358-0fddaa9a351f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " date_x score \\\n", + "names \n", + "Creed III 03/02/2023 73.0 \n", + "Avatar: The Way of Water 12/15/2022 78.0 \n", + "The Super Mario Bros. Movie 04/05/2023 76.0 \n", + "Mummies 01/05/2023 70.0 \n", + "Supercell 03/17/2023 61.0 \n", + "Cocaine Bear 02/23/2023 66.0 \n", + "John Wick: Chapter 4 03/23/2023 80.0 \n", + "Puss in Boots: The Last Wish 12/26/2022 83.0 \n", + "Attack on Titan 09/30/2022 59.0 \n", + "The Park 03/02/2023 58.0 \n", + "\n", + " genre \\\n", + "names \n", + "Creed III Drama, Action \n", + "Avatar: The Way of Water Science Fiction, Adventure, Action \n", + "The Super Mario Bros. Movie Animation, Adventure, Family, Fantasy, Comedy \n", + "Mummies Animation, Comedy, Family, Adventure, Fantasy \n", + "Supercell Action \n", + "Cocaine Bear Thriller, Comedy, Crime \n", + "John Wick: Chapter 4 Action, Thriller, Crime \n", + "Puss in Boots: The Last Wish Animation, Family, Fantasy, Adventure, Comedy \n", + "Attack on Titan Action, Science Fiction \n", + "The Park Action, Drama, Horror, Science Fiction, Thriller \n", + "\n", + " overview \\\n", + "names \n", + "Creed III After dominating the boxing world, Adonis Cree... \n", + "Avatar: The Way of Water Set more than a decade after the events of the... \n", + "The Super Mario Bros. Movie While working underground to fix a water main,... \n", + "Mummies Through a series of unfortunate events, three ... \n", + "Supercell Good-hearted teenager William always lived in ... \n", + "Cocaine Bear Inspired by a true story, an oddball group of ... \n", + "John Wick: Chapter 4 With the price on his head ever increasing, Jo... \n", + "Puss in Boots: The Last Wish Puss in Boots discovers that his passion for a... \n", + "Attack on Titan As viable water is depleted on Earth, a missio... \n", + "The Park A dystopian coming-of-age movie focused on thr... \n", + "\n", + " crew \\\n", + "names \n", + "Creed III Michael B. Jordan, Adonis Creed, Tessa Thompso... \n", + "Avatar: The Way of Water Sam Worthington, Jake Sully, Zoe Saldaña, Neyt... \n", + "The Super Mario Bros. Movie Chris Pratt, Mario (voice), Anya Taylor-Joy, P... \n", + "Mummies Óscar Barberán, Thut (voice), Ana Esther Albor... \n", + "Supercell Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin... \n", + "Cocaine Bear Keri Russell, Sari, Alden Ehrenreich, Eddie, O... \n", + "John Wick: Chapter 4 Keanu Reeves, John Wick, Donnie Yen, Caine, Bi... \n", + "Puss in Boots: The Last Wish Antonio Banderas, Puss in Boots (voice), Salma... \n", + "Attack on Titan Paul Bianchi, Computer (voice), Erin Coker, Al... \n", + "The Park Chloe Guidry, Ines, Nhedrick Jabier, Bui, Carm... \n", + "\n", + " orig_title status \\\n", + "names \n", + "Creed III Creed III Released \n", + "Avatar: The Way of Water Avatar: The Way of Water Released \n", + "The Super Mario Bros. Movie The Super Mario Bros. Movie Released \n", + "Mummies Momias Released \n", + "Supercell Supercell Released \n", + "Cocaine Bear Cocaine Bear Released \n", + "John Wick: Chapter 4 John Wick: Chapter 4 Released \n", + "Puss in Boots: The Last Wish Puss in Boots: The Last Wish Released \n", + "Attack on Titan Attack on Titan Released \n", + "The Park The Park Released \n", + "\n", + " orig_lang budget_x revenue \\\n", + "names \n", + "Creed III English 75000000.0 2.716167e+08 \n", + "Avatar: The Way of Water English 460000000.0 2.316795e+09 \n", + "The Super Mario Bros. Movie English 100000000.0 7.244590e+08 \n", + "Mummies Spanish, Castilian 12300000.0 3.420000e+07 \n", + "Supercell English 77000000.0 3.409420e+08 \n", + "Cocaine Bear English 35000000.0 8.000000e+07 \n", + "John Wick: Chapter 4 English 100000000.0 3.513494e+08 \n", + "Puss in Boots: The Last Wish English 90000000.0 4.834806e+08 \n", + "Attack on Titan English 71000000.0 2.549465e+08 \n", + "The Park English 119200000.0 4.889625e+08 \n", + "\n", + " country \n", + "names \n", + "Creed III AU \n", + "Avatar: The Way of Water AU \n", + "The Super Mario Bros. Movie AU \n", + "Mummies AU \n", + "Supercell US \n", + "Cocaine Bear AU \n", + "John Wick: Chapter 4 AU \n", + "Puss in Boots: The Last Wish AU \n", + "Attack on Titan US \n", + "The Park US " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
date_xscoregenreoverviewcreworig_titlestatusorig_langbudget_xrevenuecountry
names
Creed III03/02/202373.0Drama, ActionAfter dominating the boxing world, Adonis Cree...Michael B. Jordan, Adonis Creed, Tessa Thompso...Creed IIIReleasedEnglish75000000.02.716167e+08AU
Avatar: The Way of Water12/15/202278.0Science Fiction, Adventure, ActionSet more than a decade after the events of the...Sam Worthington, Jake Sully, Zoe Saldaña, Neyt...Avatar: The Way of WaterReleasedEnglish460000000.02.316795e+09AU
The Super Mario Bros. Movie04/05/202376.0Animation, Adventure, Family, Fantasy, ComedyWhile working underground to fix a water main,...Chris Pratt, Mario (voice), Anya Taylor-Joy, P...The Super Mario Bros. MovieReleasedEnglish100000000.07.244590e+08AU
Mummies01/05/202370.0Animation, Comedy, Family, Adventure, FantasyThrough a series of unfortunate events, three ...Óscar Barberán, Thut (voice), Ana Esther Albor...MomiasReleasedSpanish, Castilian12300000.03.420000e+07AU
Supercell03/17/202361.0ActionGood-hearted teenager William always lived in ...Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin...SupercellReleasedEnglish77000000.03.409420e+08US
Cocaine Bear02/23/202366.0Thriller, Comedy, CrimeInspired by a true story, an oddball group of ...Keri Russell, Sari, Alden Ehrenreich, Eddie, O...Cocaine BearReleasedEnglish35000000.08.000000e+07AU
John Wick: Chapter 403/23/202380.0Action, Thriller, CrimeWith the price on his head ever increasing, Jo...Keanu Reeves, John Wick, Donnie Yen, Caine, Bi...John Wick: Chapter 4ReleasedEnglish100000000.03.513494e+08AU
Puss in Boots: The Last Wish12/26/202283.0Animation, Family, Fantasy, Adventure, ComedyPuss in Boots discovers that his passion for a...Antonio Banderas, Puss in Boots (voice), Salma...Puss in Boots: The Last WishReleasedEnglish90000000.04.834806e+08AU
Attack on Titan09/30/202259.0Action, Science FictionAs viable water is depleted on Earth, a missio...Paul Bianchi, Computer (voice), Erin Coker, Al...Attack on TitanReleasedEnglish71000000.02.549465e+08US
The Park03/02/202358.0Action, Drama, Horror, Science Fiction, ThrillerA dystopian coming-of-age movie focused on thr...Chloe Guidry, Ines, Nhedrick Jabier, Bui, Carm...The ParkReleasedEnglish119200000.04.889625e+08US
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ] + }, + { + "cell_type": "code", + "source": [ + "#También podemos ver las 2 últimas filas con tail()\n", + "movies.tail(2)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 389 + }, + "id": "53lgPGlO9jKQ", + "outputId": "ec48c987-5adb-46a9-dc78-5e7eab6af5a1" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " date_x score \\\n", + "names \n", + "Darkman II: The Return of Durant 07/11/1995 55.0 \n", + "The Swan Princess: A Royal Wedding 07/20/2020 70.0 \n", + "\n", + " genre \\\n", + "names \n", + "Darkman II: The Return of Durant Action, Adventure, Science Fiction, Thriller, ... \n", + "The Swan Princess: A Royal Wedding Animation, Family, Fantasy \n", + "\n", + " overview \\\n", + "names \n", + "Darkman II: The Return of Durant Darkman and Durant return and they hate each o... \n", + "The Swan Princess: A Royal Wedding Princess Odette and Prince Derek are going to ... \n", + "\n", + " crew \\\n", + "names \n", + "Darkman II: The Return of Durant Larry Drake, Robert G. Durant, Arnold Vosloo, ... \n", + "The Swan Princess: A Royal Wedding Nina Herzog, Princess Odette (voice), Yuri Low... \n", + "\n", + " orig_title \\\n", + "names \n", + "Darkman II: The Return of Durant Darkman II: The Return of Durant \n", + "The Swan Princess: A Royal Wedding The Swan Princess: A Royal Wedding \n", + "\n", + " status orig_lang budget_x \\\n", + "names \n", + "Darkman II: The Return of Durant Released English 116000000.0 \n", + "The Swan Princess: A Royal Wedding Released English 92400000.0 \n", + "\n", + " revenue country \n", + "names \n", + "Darkman II: The Return of Durant 475661306.0 US \n", + "The Swan Princess: A Royal Wedding 539401838.6 GB " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
date_xscoregenreoverviewcreworig_titlestatusorig_langbudget_xrevenuecountry
names
Darkman II: The Return of Durant07/11/199555.0Action, Adventure, Science Fiction, Thriller, ...Darkman and Durant return and they hate each o...Larry Drake, Robert G. Durant, Arnold Vosloo, ...Darkman II: The Return of DurantReleasedEnglish116000000.0475661306.0US
The Swan Princess: A Royal Wedding07/20/202070.0Animation, Family, FantasyPrincess Odette and Prince Derek are going to ...Nina Herzog, Princess Odette (voice), Yuri Low...The Swan Princess: A Royal WeddingReleasedEnglish92400000.0539401838.6GB
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 21 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Obteniendo información\n", + "\n", + "Aplicar el método info() es una de las primeras cosas que debemos realizar después de cargar los datos:" + ], + "metadata": { + "id": "5ZNoIl7Z92-X" + } + }, + { + "cell_type": "code", + "source": [ + "movies.info()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EsjaE8el-A7l", + "outputId": "ab16b0de-6a1e-4130-f7a6-1f96c3223d34" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Index: 10178 entries, Creed III to The Swan Princess: A Royal Wedding\n", + "Data columns (total 11 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 date_x 10178 non-null object \n", + " 1 score 10178 non-null float64\n", + " 2 genre 10093 non-null object \n", + " 3 overview 10178 non-null object \n", + " 4 crew 10122 non-null object \n", + " 5 orig_title 10178 non-null object \n", + " 6 status 10178 non-null object \n", + " 7 orig_lang 10178 non-null object \n", + " 8 budget_x 10178 non-null float64\n", + " 9 revenue 10178 non-null float64\n", + " 10 country 10178 non-null object \n", + "dtypes: float64(3), object(8)\n", + "memory usage: 954.2+ KB\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "**.info()** proporciona los detalles esenciales sobre tu conjunto de datos, como el número de filas y columnas, la cantidad de valores no nulos, qué tipo de datos hay en cada columna y cuánta memoria está utilizando tu DataFrame.\n", + "\n", + "Ver rápidamente el tipo de dato es realmente bastante útil.\n", + "\n", + "Imagina que acabas de importar algunos JSON y los enteros fueron registrados como cadenas. Vas a hacer alguna aritmética y encuentras una excepción de \"operando no soportado\" porque no puedes hacer matemáticas con cadenas. Llamar a **.info()** rápidamente señalará que tu columna que pensabas que era de enteros en realidad contiene objetos de tipo cadena.\n", + "\n", + "Otro atributo rápido y útil es **.shape**, que simplemente devuelve una tupla de (filas, columnas):" + ], + "metadata": { + "id": "ER8W8LPi-cqG" + } + }, + { + "cell_type": "code", + "source": [ + "movies.shape" + ], + "metadata": { + "id": "B4vMQMNk-tNv", + "outputId": "56456f3f-0f67-460d-d430-ba9c8a731312", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(10178, 11)" + ] + }, + "metadata": {}, + "execution_count": 23 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Esta información nos indica que nuestro DataFrame tiene un total de 10178 filas y 11 columnas.\n" + ], + "metadata": { + "id": "9zybXgezxr2V" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Manejo de Duplicados\n", + "\n", + "Actualmente nuestro Dataset importado no tiene datos duplicados, aunque siempre es importante comprobar que no hay agregadas filas duplicadas.\n", + "\n", + "Vamos a realizar una pequeña demostración creando una variable temporal que contenga dos veces la información de nuestro dataset:" + ], + "metadata": { + "id": "5_-dtm3Axzbf" + } + }, + { + "cell_type": "code", + "source": [ + "temp_movies = movies.append(movies)\n", + "\n", + "temp_movies.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "I5E53BK7yJfw", + "outputId": "402cc840-3059-46d0-95bc-0b8585711ddd" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " temp_movies = movies.append(movies)\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(20356, 11)" + ] + }, + "metadata": {}, + "execution_count": 24 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Como podemos comprobar ahora tenemos el doble de filas que en la comprobación anterior.\n", + "\n", + "Bien, podemos eliminar esos duplicados haciendo uso del método **.drop_duplicates()**" + ], + "metadata": { + "id": "11QGySJcy5VG" + } + }, + { + "cell_type": "code", + "source": [ + "temp_movies = temp_movies.drop_duplicates()\n", + "\n", + "print(temp_movies.shape)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XM0Wj4y3zGKu", + "outputId": "59694251-2ae6-4b9e-ef0a-79a6619eef56" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(10178, 11)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Pero puede resultar un poco engorroso tener que ir creando nuevos dataframes para hacer la limpieza, por esta razón Pandas tiene en muchos de sus métodos la posibilidad de incluir el parámetro **inplace = True** que hará que se apliquen los cambios deseados en el objeto DataFrame" + ], + "metadata": { + "id": "zj82x_nLzdXn" + } + }, + { + "cell_type": "code", + "source": [ + "temp_movies.drop_duplicates(inplace=True)" + ], + "metadata": { + "id": "7Sf4z28az6BD" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "De este modo los datos se transfomarán de manera auotmática, sin realizar nuevas asignaciones.\n", + "\n", + "Otros parámetros importantes a emplear dentro del método drop_duplicates() es **keep** que nos ofrece tres alternativas:\n", + "\n", + "+ first:(Por defecto) Elimina los duplicados excepto la primera ocurrencia.\n", + "\n", + "* last: Igual pero dejando la última ocurrencia\n", + "\n", + "* False: Elimina todos los duplicados\n", + "\n", + "Observemos que ocurre si usamos esta última opción con el ejemplo anterior:\n" + ], + "metadata": { + "id": "zXVRWE-Z0FdN" + } + }, + { + "cell_type": "code", + "source": [ + "temp_movies = movies.append(movies)\n", + "\n", + "temp_movies.drop_duplicates(inplace=True, keep=False)\n", + "\n", + "print(temp_movies.shape)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QPWGwiKp032u", + "outputId": "546f90a6-c311-4cfd-f713-8355502c1fa7" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(0, 11)\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " temp_movies = movies.append(movies)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Como todas las filas estaban duplicadas no deja ninguna. Pero, ¿qué tipo de utilidad es esta? La razón principal es que esto te permite localizar todos los duplicados en tu dataset. Cuando veamos las selecciones condicionales, verás cómo hacerlo." + ], + "metadata": { + "id": "Lb2shWZ90Oyt" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Limpieza de Columnas\n", + "\n", + "En muchas ocasiones, los datasets contienen una cantidad de columnas cuyos nombres están formados por símbolos, caracteres en mayúsculas y minúsculas, espacios y otros tipos. Para hacer que podamos seleccionar los datos por columna de manera sencilla, es una buena práctica invertir un poco de tiempo limpiando estos nombres de columnas.\n", + "\n", + "Comencemos imprimiendo los nombres de columnas de nuestro dataset:" + ], + "metadata": { + "id": "3p_ezkhf2KZ0" + } + }, + { + "cell_type": "code", + "source": [ + "print(movies.columns)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SXVWn7Tq2uK6", + "outputId": "b1ec198f-78fe-4464-8fc1-3f4bc278f64d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Index(['date_x', 'score', 'genre', 'overview', 'crew', 'orig_title', 'status',\n", + " 'orig_lang', 'budget_x', 'revenue', 'country'],\n", + " dtype='object')\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Esto a parte de ser muy útil para renombrar las columnas lo podemos usar para entender por qué a veces recibimos un mensaje tipo Key Error cuando tratamos de seleccionar una columna.\n", + "\n", + "Con el método **.rename()** podemos renombrar una o varias columnas que le pasamos en forma de diccionario, por ejemplo vamos a renombrar las columnas date_x y overview por estreno y sinopsis respectivamente:" + ], + "metadata": { + "id": "BSg37EWS3EgJ" + } + }, + { + "cell_type": "code", + "source": [ + "movies.rename(columns={\n", + " 'date_x': 'estreno',\n", + " 'overview': 'sinopsis'\n", + "}, inplace=True)\n", + "\n", + "print(movies.columns)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "43Gxu0dV32i4", + "outputId": "37ec85d4-3939-46b1-9bd4-554418f9b35f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Index(['estreno', 'score', 'genre', 'sinopsis', 'crew', 'orig_title', 'status',\n", + " 'orig_lang', 'budget_x', 'revenue', 'country'],\n", + " dtype='object')\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Excelente!!! Otra manera en caso de tener que andar usando el método rename() es establecer una lista de nombres de columnas directamente como mostramos a continuación:" + ], + "metadata": { + "id": "nkDt5ZEx4aty" + } + }, + { + "cell_type": "code", + "source": [ + "movies.columns = ['estreno', 'puntuacion', 'genero', 'sinopsis',\n", + " 'elenco', 'titulo_original', 'estado',\n", + " 'idioma_original', 'presupuesto', 'recaudacion', 'pais']\n", + "\n", + "print(movies.columns)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SAhvyUkB4me_", + "outputId": "319299cc-63a2-4c7a-b1e8-993b3fa2003a" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Index(['estreno', 'puntuacion', 'genero', 'sinopsis', 'elenco',\n", + " 'titulo_original', 'estado', 'idioma_original', 'presupuesto',\n", + " 'recaudacion', 'pais'],\n", + " dtype='object')\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "¿¿¿Y si ahora quisiéramos todas las columnas en mayúsculas??? Demasiado trabajo, lo podemos hacer automáticamente así:" + ], + "metadata": { + "id": "xwsb4T3y5JmZ" + } + }, + { + "cell_type": "code", + "source": [ + "movies.columns = [column.upper() for column in movies]\n", + "\n", + "print(movies.columns)\n", + "\n", + "print(type(movies))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KSKUHWXJ5V-d", + "outputId": "3ec6f6b8-2128-480d-a781-d080c40ee4c2" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Index(['ESTRENO', 'PUNTUACION', 'GENERO', 'SINOPSIS', 'ELENCO',\n", + " 'TITULO_ORIGINAL', 'ESTADO', 'IDIOMA_ORIGINAL', 'PRESUPUESTO',\n", + " 'RECAUDACION', 'PAIS'],\n", + " dtype='object')\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Cómo trabajar con valores nulos\n", + "\n", + "Cuando exploramos datos, es bastante habitual no encontrar algunos valores o que estos sean nulos debido a que sean celdas en las que esencialmente no hay disponible un valor. Lo más común es que Python nos los muestre como **none** o **np.nan**, cada uno de los cuales se maneja de manera diferente en algunos casos.\n", + "\n", + "Hay 2 opciones en el manejo de estos datos:\n", + "\n", + "+ Deshacernos de las filas o columnas que tienen valores nulos\n", + "\n", + "+ Reemplazar los valores nulos por otros no nulos, a esta técnica se le conoce como **imputación**" + ], + "metadata": { + "id": "N7eVDE9p6DrJ" + } + }, + { + "cell_type": "markdown", + "source": [ + "Vamos a calcular el número total de valores nulos en cada columna de nuestro dataset. El primer paso será comprobar qué celdas en nuestro DataFrame son nulas:" + ], + "metadata": { + "id": "ki95_lko7WFA" + } + }, + { + "cell_type": "code", + "source": [ + "movies.isnull()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 735 + }, + "id": "Uw7v29NO7VE2", + "outputId": "f3a7695a-c49e-45d4-b12a-18f1c4c3a010" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ESTRENO PUNTUACION GENERO \\\n", + "names \n", + "Creed III False False False \n", + "Avatar: The Way of Water False False False \n", + "The Super Mario Bros. Movie False False False \n", + "Mummies False False False \n", + "Supercell False False False \n", + "... ... ... ... \n", + "20th Century Women False False False \n", + "Delta Force 2: The Colombian Connection False False False \n", + "The Russia House False False False \n", + "Darkman II: The Return of Durant False False False \n", + "The Swan Princess: A Royal Wedding False False False \n", + "\n", + " SINOPSIS ELENCO TITULO_ORIGINAL \\\n", + "names \n", + "Creed III False False False \n", + "Avatar: The Way of Water False False False \n", + "The Super Mario Bros. Movie False False False \n", + "Mummies False False False \n", + "Supercell False False False \n", + "... ... ... ... \n", + "20th Century Women False False False \n", + "Delta Force 2: The Colombian Connection False False False \n", + "The Russia House False False False \n", + "Darkman II: The Return of Durant False False False \n", + "The Swan Princess: A Royal Wedding False False False \n", + "\n", + " ESTADO IDIOMA_ORIGINAL PRESUPUESTO \\\n", + "names \n", + "Creed III False False False \n", + "Avatar: The Way of Water False False False \n", + "The Super Mario Bros. Movie False False False \n", + "Mummies False False False \n", + "Supercell False False False \n", + "... ... ... ... \n", + "20th Century Women False False False \n", + "Delta Force 2: The Colombian Connection False False False \n", + "The Russia House False False False \n", + "Darkman II: The Return of Durant False False False \n", + "The Swan Princess: A Royal Wedding False False False \n", + "\n", + " RECAUDACION PAIS \n", + "names \n", + "Creed III False False \n", + "Avatar: The Way of Water False False \n", + "The Super Mario Bros. Movie False False \n", + "Mummies False False \n", + "Supercell False False \n", + "... ... ... \n", + "20th Century Women False False \n", + "Delta Force 2: The Colombian Connection False False \n", + "The Russia House False False \n", + "Darkman II: The Return of Durant False False \n", + "The Swan Princess: A Royal Wedding False False \n", + "\n", + "[10178 rows x 11 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ESTRENOPUNTUACIONGENEROSINOPSISELENCOTITULO_ORIGINALESTADOIDIOMA_ORIGINALPRESUPUESTORECAUDACIONPAIS
names
Creed IIIFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
Avatar: The Way of WaterFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
The Super Mario Bros. MovieFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
MummiesFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
SupercellFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
....................................
20th Century WomenFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
Delta Force 2: The Colombian ConnectionFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
The Russia HouseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
Darkman II: The Return of DurantFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
The Swan Princess: A Royal WeddingFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", + "

10178 rows × 11 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 76 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Este método devuelve un Dataframe donde cada celda es respresentada por True o False dependiendo de si contiene un valor nulo o no.\n", + "\n", + "Para contar el número de nulos en cada columna, añadimos la función sum():" + ], + "metadata": { + "id": "9D8-nqVr727Z" + } + }, + { + "cell_type": "code", + "source": [ + "movies.isnull().sum()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5BjaorYW7vsN", + "outputId": "5eeb45d6-ca0e-44f7-b85e-e04bfb6671d1" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "ESTRENO 0\n", + "PUNTUACION 0\n", + "GENERO 85\n", + "SINOPSIS 0\n", + "ELENCO 56\n", + "TITULO_ORIGINAL 0\n", + "ESTADO 0\n", + "IDIOMA_ORIGINAL 0\n", + "PRESUPUESTO 0\n", + "RECAUDACION 0\n", + "PAIS 0\n", + "dtype: int64" + ] + }, + "metadata": {}, + "execution_count": 77 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "De este modo podemos comprobar que nuestra columna GENERO tiene 85 valores nulos y lo mismo ocurre con la columna ELENCO en un total de 56 ocasiones.\n", + "\n", + "Los científicos de datos y analistas se enfrentan regularmente al dilema de eliminar o imputar valores nulos, y es una decisión que requiere un conocimiento profundo de tus datos y su contexto. En general, se sugiere eliminar datos nulos solo si tienes una pequeña cantidad de datos faltantes.\n", + "\n", + "Eliminar nulos es bastante simple:" + ], + "metadata": { + "id": "Z9RnG_nF8Tao" + } + }, + { + "cell_type": "code", + "source": [ + "#movies.dropna()" + ], + "metadata": { + "id": "T-wREZls8oPD" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Esta operación eliminará cualquier fila con al menos un valor nulo, pero devolverá un nuevo DataFrame sin alterar el original. También podrías especificar inplace=True en este método.\n", + "\n", + "Entonces, en el caso de nuestro dataset, esta operación eliminaría 85 filas donde género es nulo y 56 filas donde elenco es nulo. Esto obviamente parece un desperdicio ya que hay datos perfectamente válidos en las otras columnas de esas filas eliminadas. Es por eso que veremos la imputación a continuación.\n", + "\n", + "Aparte de simplemente eliminar filas, también puedes eliminar columnas con valores nulos estableciendo axis=1:" + ], + "metadata": { + "id": "NhTSOhL-9EcN" + } + }, + { + "cell_type": "code", + "source": [ + "#movies.dropna(axis=1)" + ], + "metadata": { + "id": "yh7bxAvc9S8J" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Esto hará que se eleminen las columnas de elenco y género de nuestro dataset." + ], + "metadata": { + "id": "ydh7ojRj9aKd" + } + }, + { + "cell_type": "markdown", + "source": [ + "### Imputación\n", + "\n", + "La imputación es una técnica convencional de ingeniería utilizada para conservar datos valiosos que tienen valores nulos.\n", + "\n", + "Puede haber casos en los que eliminar cada fila con un valor nulo elimine una parte demasiado grande de tu conjunto de datos, por lo que en su lugar podemos imputar ese nulo con otro valor, generalmente la media o la mediana de esa columna.\n", + "\n", + "Veamos cómo imputar los valores faltantes en la columna elenco. Primero extraeremos esa columna en su propia variable:" + ], + "metadata": { + "id": "ydmhuYo-9nVt" + } + }, + { + "cell_type": "code", + "source": [ + "elenco = movies['ELENCO'] #Manera habitual de seleccionar columnas en un DataFrame, del mismo modo que si\n", + "# accedemos a los datos de un diccionario - Recuerda como crear datasets desde cero usando diccionarios." + ], + "metadata": { + "id": "rOhhrcLE9-BI" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Ahora la variable elenco contiene una serie" + ], + "metadata": { + "id": "6bZ_G_Oe-geu" + } + }, + { + "cell_type": "code", + "source": [ + "elenco.head()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1MZ7Zydx-kcJ", + "outputId": "9dbabdb8-70e9-42b9-89fc-c9d4d25af454" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "names\n", + "Creed III Michael B. Jordan, Adonis Creed, Tessa Thompso...\n", + "Avatar: The Way of Water Sam Worthington, Jake Sully, Zoe Saldaña, Neyt...\n", + "The Super Mario Bros. Movie Chris Pratt, Mario (voice), Anya Taylor-Joy, P...\n", + "Mummies Óscar Barberán, Thut (voice), Ana Esther Albor...\n", + "Supercell Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin...\n", + "Name: ELENCO, dtype: object" + ] + }, + "metadata": {}, + "execution_count": 79 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Como se trata de una columna de texto, no tiene sentido hacer ninguna media, cosa que si sería útil por ejemplo en columnas como presupuesto o recaudación. En este caso lo que vamos a realizar es crear el texto 'Sin Determinar' para rellenar esas celdas:" + ], + "metadata": { + "id": "J3f8eFKj-ybE" + } + }, + { + "cell_type": "code", + "source": [ + "elenco.fillna('sin determinar', inplace=True) #Recuerda, inplace modifica directamente el dataset" + ], + "metadata": { + "id": "8xAeCeVH_GwB" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Si volvemos a comprobar los valores nulos de nuestro Dataset:" + ], + "metadata": { + "id": "xmop40WR_cbJ" + } + }, + { + "cell_type": "code", + "source": [ + "movies.isnull().sum()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1QTWjPzd_gMe", + "outputId": "757f6d6b-ae7c-494e-b9a2-7daf10148392" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "ESTRENO 0\n", + "PUNTUACION 0\n", + "GENERO 85\n", + "SINOPSIS 0\n", + "ELENCO 0\n", + "TITULO_ORIGINAL 0\n", + "ESTADO 0\n", + "IDIOMA_ORIGINAL 0\n", + "PRESUPUESTO 0\n", + "RECAUDACION 0\n", + "PAIS 0\n", + "dtype: int64" + ] + }, + "metadata": {}, + "execution_count": 81 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Vemos como ELENCO ahora aparece con 0 celdas con valores nulos." + ], + "metadata": { + "id": "yh5LTF2aANAB" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Comprendiendo las variables\n", + "Con el método **describe()** usado en un Dataframe, obtenemos un resumen de la distribución de las variables continuas:" + ], + "metadata": { + "id": "IAHm2LfTAUK1" + } + }, + { + "cell_type": "code", + "source": [ + "movies.describe()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 300 + }, + "id": "yFzcFpumATH2", + "outputId": "2d83a99f-17b0-4092-b76d-5506acb15e30" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " PUNTUACION PRESUPUESTO RECAUDACION\n", + "count 10178.000000 1.017800e+04 1.017800e+04\n", + "mean 63.497052 6.488238e+07 2.531401e+08\n", + "std 13.537012 5.707565e+07 2.777880e+08\n", + "min 0.000000 1.000000e+00 0.000000e+00\n", + "25% 59.000000 1.500000e+07 2.858898e+07\n", + "50% 65.000000 5.000000e+07 1.529349e+08\n", + "75% 71.000000 1.050000e+08 4.178021e+08\n", + "max 100.000000 4.600000e+08 2.923706e+09" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PUNTUACIONPRESUPUESTORECAUDACION
count10178.0000001.017800e+041.017800e+04
mean63.4970526.488238e+072.531401e+08
std13.5370125.707565e+072.777880e+08
min0.0000001.000000e+000.000000e+00
25%59.0000001.500000e+072.858898e+07
50%65.0000005.000000e+071.529349e+08
75%71.0000001.050000e+084.178021e+08
max100.0000004.600000e+082.923706e+09
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 82 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Comprender estos números es muy útil a la hora de pensar el tipo de gráfico a usar para su representación visual.\n", + "\n", + "describe() también se puede usar en una variable categórica para obtener el recuento de filas, el recuento único de categorías, las categoría superior y la frecuencia de la categoría superior:" + ], + "metadata": { + "id": "wprP98-1A7Xy" + } + }, + { + "cell_type": "code", + "source": [ + "movies['PAIS'].describe()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ccv8TW3VBXek", + "outputId": "f7063234-e1c5-4c5a-b81f-170d1752c847" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "count 10178\n", + "unique 60\n", + "top AU\n", + "freq 4885\n", + "Name: PAIS, dtype: object" + ] + }, + "metadata": {}, + "execution_count": 83 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Este resultado nos informa que la columna país tiene 60 valores únicos, que el que más se repite es AU con una frecuencia de 4885 veces.\n", + "\n", + "Con el método .value_counts() podemos ver la frecuencia de todos los valores en una columna:\n" + ], + "metadata": { + "id": "YgK0XGjaBp-_" + } + }, + { + "cell_type": "code", + "source": [ + "movies['PAIS'].value_counts().head(10) #Incluimos head para mostrar solo los 10 primeros" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EHKLfOxPCGEY", + "outputId": "ec46026d-8912-45ba-a9ee-41e6e218ca91" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "AU 4885\n", + "US 2750\n", + "JP 538\n", + "KR 361\n", + "FR 222\n", + "GB 174\n", + "ES 153\n", + "HK 125\n", + "IT 123\n", + "MX 105\n", + "Name: PAIS, dtype: int64" + ] + }, + "metadata": {}, + "execution_count": 84 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Relaciones entre variables contínuas\n", + "\n", + "Utilizando el método de correlación **.corr()** podemos generar la relación entre cada variable continua:" + ], + "metadata": { + "id": "MgJMDuB3CdEM" + } + }, + { + "cell_type": "code", + "source": [ + "movies.corr()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 198 + }, + "id": "Pci0ymdZEYcp", + "outputId": "ffb778e5-1db0-4beb-f2ff-a0961b3b50a1" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":1: FutureWarning: The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.\n", + " movies.corr()\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " PUNTUACION PRESUPUESTO RECAUDACION\n", + "PUNTUACION 1.000000 -0.23547 0.096533\n", + "PRESUPUESTO -0.235470 1.00000 0.673830\n", + "RECAUDACION 0.096533 0.67383 1.000000" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PUNTUACIONPRESUPUESTORECAUDACION
PUNTUACION1.000000-0.235470.096533
PRESUPUESTO-0.2354701.000000.673830
RECAUDACION0.0965330.673831.000000
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 85 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Las tablas de correlación son una representación numérica de las relaciones bivariadas en el conjunto de datos.\n", + "\n", + "Los números positivos indican una correlación positiva — uno sube y el otro también — y los números negativos representan una correlación inversa — uno sube y el otro baja. 1.0 indica una correlación perfecta.\n", + "\n", + "Así que mirando en la primera fila, primera columna vemos que la puntuación tiene una correlación perfecta consigo mismo, lo cual es obvio. Por otro lado, la **correlación entre presupuesto y recaudación es de 0.6**. Un poco más interesante.\n", + "\n", + "Examinar las relaciones bivariadas es útil cuando tienes en mente una variable de resultado o dependiente y te gustaría ver las características más correlacionadas con el aumento o disminución del resultado. Puedes representar visualmente las relaciones bivariadas con diagramas de dispersión (como veremos más adelante).\n", + "\n", + "Para una mirada más profunda a las sumarizaciones de datos, consulta [Esencial Statistics for Data Science](https://www.learndatasci.com/tutorials/data-science-statistics-using-python/).\n", + "\n", + "Ahora veamos más sobre la manipulación de DataFrames." + ], + "metadata": { + "id": "yUobSUMUEjhO" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Cortar, seleccionar y extraer Dataframes\n", + "\n", + "Hasta ahora nos hemos centrado en algunos resúmenes básicos de nuestros datos. Hemos aprendido sobre la extracción simple de columnas utilizando corchetes individuales y hemos imputado valores nulos en una columna utilizando fillna(). A continuación, están los otros métodos de cortar, seleccionar y extraer que necesitarás usar constantemente.\n", + "\n", + "Es importante indicar que, aunque muchos métodos son los mismos, los DataFrames y las Series tienen diferentes atributos, por lo que necesitarás estar seguro de saber con qué tipo estás trabajando o de lo contrario recibirás errores de atributo.\n", + "\n", + "Veamos primero el trabajo con columnas.\n", + "\n", + "### Trabajo con Columnas\n", + "\n", + "ya lo vimos más arriba, haciendo uso de [ ]:" + ], + "metadata": { + "id": "RA2r-sOtF2uN" + } + }, + { + "cell_type": "code", + "source": [ + "generos = movies['GENERO']\n", + "\n", + "type(generos)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PtIABNVOGlYw", + "outputId": "02f43e11-f595-4762-e171-0e1bd1fe2022" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "pandas.core.series.Series" + ] + }, + "metadata": {}, + "execution_count": 86 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "El comando anterior nos devuelve una Serie. Para extraer una columna como un tipo Dataframe, necesitamos pasar la lista de los nombres de columnas, en nuestro ejemplo una sola:" + ], + "metadata": { + "id": "8gzdASAkGwKM" + } + }, + { + "cell_type": "code", + "source": [ + "generos = movies[['GENERO']]\n", + "type(generos)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1yzVjElmG-Li", + "outputId": "a5030d41-d4e5-475c-d809-8beb88af385a" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "pandas.core.frame.DataFrame" + ] + }, + "metadata": {}, + "execution_count": 87 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Como estamos tratando con listas, si necesitamos añadir otra/s columna/s es tan sencillo como hacer esto:" + ], + "metadata": { + "id": "JY2lO7qTHM5D" + } + }, + { + "cell_type": "code", + "source": [ + "subconjunto = movies[['GENERO', 'PUNTUACION', 'PRESUPUESTO']]\n", + "\n", + "subconjunto.head()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 237 + }, + "id": "5uVqS26BHT05", + "outputId": "39885c08-13b3-43ab-ebcc-1ccac31ed8b8" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " GENERO \\\n", + "names \n", + "Creed III Drama, Action \n", + "Avatar: The Way of Water Science Fiction, Adventure, Action \n", + "The Super Mario Bros. Movie Animation, Adventure, Family, Fantasy, Comedy \n", + "Mummies Animation, Comedy, Family, Adventure, Fantasy \n", + "Supercell Action \n", + "\n", + " PUNTUACION PRESUPUESTO \n", + "names \n", + "Creed III 73.0 75000000.0 \n", + "Avatar: The Way of Water 78.0 460000000.0 \n", + "The Super Mario Bros. Movie 76.0 100000000.0 \n", + "Mummies 70.0 12300000.0 \n", + "Supercell 61.0 77000000.0 " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GENEROPUNTUACIONPRESUPUESTO
names
Creed IIIDrama, Action73.075000000.0
Avatar: The Way of WaterScience Fiction, Adventure, Action78.0460000000.0
The Super Mario Bros. MovieAnimation, Adventure, Family, Fantasy, Comedy76.0100000000.0
MummiesAnimation, Comedy, Family, Adventure, Fantasy70.012300000.0
SupercellAction61.077000000.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 88 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Trabajo con Filas\n", + "\n", + "Cuando trabajos con filas tenemos dos opciones:\n", + "\n", + "+ .loc - Localiza por nombre\n", + "+ .iloc - Localiza por índice numérico\n", + "\n", + "Recuerda, en nuestro caso que el índice de nuestro dataset es el nombre de la película, por lo que deberemos usar el método .loc y proporcionar el título a encontrar:" + ], + "metadata": { + "id": "q0vrv5JRHwd9" + } + }, + { + "cell_type": "code", + "source": [ + "prom = movies.loc['Prometheus']\n", + "\n", + "print(prom)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Mm5TomCGIdGa", + "outputId": "0fda3bdf-b44e-4a8d-ae52-e8eafede8a19" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "ESTRENO 06/07/2012 \n", + "PUNTUACION 65.0\n", + "GENERO Science Fiction, Adventure, Mystery\n", + "SINOPSIS A team of explorers discover a clue to the ori...\n", + "ELENCO Noomi Rapace, Dr. Elizabeth Shaw, Michael Fass...\n", + "TITULO_ORIGINAL Prometheus\n", + "ESTADO Released\n", + "IDIOMA_ORIGINAL English\n", + "PRESUPUESTO 125000000.0\n", + "RECAUDACION 402448265.0\n", + "PAIS AU\n", + "Name: Prometheus, dtype: object\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "loc e iloc se pueden considerar similares al extraer de listas en Python. Para demostrar esto aún más, seleccionemos múltiples filas.\n", + "\n", + "¿Cómo lo harías con una lista? En Python, simplemente cortarías con corchetes como en example_list[1:4]. Funciona de la misma manera en pandas:" + ], + "metadata": { + "id": "2pIfBiR7I273" + } + }, + { + "cell_type": "code", + "source": [ + "subset = movies.loc['Prometheus':'Sing']\n", + "\n", + "subset = movies.iloc[1:6]\n", + "\n", + "subset" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 622 + }, + "id": "aF5NH3bBJCeH", + "outputId": "84343dcd-ba8b-477c-b135-3918011d9287" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ESTRENO PUNTUACION \\\n", + "names \n", + "Avatar: The Way of Water 12/15/2022 78.0 \n", + "The Super Mario Bros. Movie 04/05/2023 76.0 \n", + "Mummies 01/05/2023 70.0 \n", + "Supercell 03/17/2023 61.0 \n", + "Cocaine Bear 02/23/2023 66.0 \n", + "\n", + " GENERO \\\n", + "names \n", + "Avatar: The Way of Water Science Fiction, Adventure, Action \n", + "The Super Mario Bros. Movie Animation, Adventure, Family, Fantasy, Comedy \n", + "Mummies Animation, Comedy, Family, Adventure, Fantasy \n", + "Supercell Action \n", + "Cocaine Bear Thriller, Comedy, Crime \n", + "\n", + " SINOPSIS \\\n", + "names \n", + "Avatar: The Way of Water Set more than a decade after the events of the... \n", + "The Super Mario Bros. Movie While working underground to fix a water main,... \n", + "Mummies Through a series of unfortunate events, three ... \n", + "Supercell Good-hearted teenager William always lived in ... \n", + "Cocaine Bear Inspired by a true story, an oddball group of ... \n", + "\n", + " ELENCO \\\n", + "names \n", + "Avatar: The Way of Water Sam Worthington, Jake Sully, Zoe Saldaña, Neyt... \n", + "The Super Mario Bros. Movie Chris Pratt, Mario (voice), Anya Taylor-Joy, P... \n", + "Mummies Óscar Barberán, Thut (voice), Ana Esther Albor... \n", + "Supercell Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin... \n", + "Cocaine Bear Keri Russell, Sari, Alden Ehrenreich, Eddie, O... \n", + "\n", + " TITULO_ORIGINAL ESTADO \\\n", + "names \n", + "Avatar: The Way of Water Avatar: The Way of Water Released \n", + "The Super Mario Bros. Movie The Super Mario Bros. Movie Released \n", + "Mummies Momias Released \n", + "Supercell Supercell Released \n", + "Cocaine Bear Cocaine Bear Released \n", + "\n", + " IDIOMA_ORIGINAL PRESUPUESTO RECAUDACION \\\n", + "names \n", + "Avatar: The Way of Water English 460000000.0 2.316795e+09 \n", + "The Super Mario Bros. Movie English 100000000.0 7.244590e+08 \n", + "Mummies Spanish, Castilian 12300000.0 3.420000e+07 \n", + "Supercell English 77000000.0 3.409420e+08 \n", + "Cocaine Bear English 35000000.0 8.000000e+07 \n", + "\n", + " PAIS \n", + "names \n", + "Avatar: The Way of Water AU \n", + "The Super Mario Bros. Movie AU \n", + "Mummies AU \n", + "Supercell US \n", + "Cocaine Bear AU " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ESTRENOPUNTUACIONGENEROSINOPSISELENCOTITULO_ORIGINALESTADOIDIOMA_ORIGINALPRESUPUESTORECAUDACIONPAIS
names
Avatar: The Way of Water12/15/202278.0Science Fiction, Adventure, ActionSet more than a decade after the events of the...Sam Worthington, Jake Sully, Zoe Saldaña, Neyt...Avatar: The Way of WaterReleasedEnglish460000000.02.316795e+09AU
The Super Mario Bros. Movie04/05/202376.0Animation, Adventure, Family, Fantasy, ComedyWhile working underground to fix a water main,...Chris Pratt, Mario (voice), Anya Taylor-Joy, P...The Super Mario Bros. MovieReleasedEnglish100000000.07.244590e+08AU
Mummies01/05/202370.0Animation, Comedy, Family, Adventure, FantasyThrough a series of unfortunate events, three ...Óscar Barberán, Thut (voice), Ana Esther Albor...MomiasReleasedSpanish, Castilian12300000.03.420000e+07AU
Supercell03/17/202361.0ActionGood-hearted teenager William always lived in ...Skeet Ulrich, Roy Cameron, Anne Heche, Dr Quin...SupercellReleasedEnglish77000000.03.409420e+08US
Cocaine Bear02/23/202366.0Thriller, Comedy, CrimeInspired by a true story, an oddball group of ...Keri Russell, Sari, Alden Ehrenreich, Eddie, O...Cocaine BearReleasedEnglish35000000.08.000000e+07AU
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 90 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Una distinción importante entre el uso de .loc y .iloc para seleccionar múltiples filas es que .loc incluye la película Sing en el resultado, pero al usar .iloc estamos obteniendo las filas 1:6 pero la película en el índice 6 no está incluida.\n", + "\n", + "El corte con .iloc sigue las mismas reglas que el corte con listas, el objeto en el índice del final no está incluido." + ], + "metadata": { + "id": "cSydMmGoJjKH" + } + }, + { + "cell_type": "markdown", + "source": [ + "### Selecciones Condicionales\n", + "\n", + "Hemos revisado cómo seleccionar columnas y filas, pero ¿qué pasa si queremos hacer una selección condicional?\n", + "\n", + "Por ejemplo, ¿qué pasa si queremos filtrar nuestro DataFrame de películas para mostrar solo las películas de estados unidos o películas con una calificación mayor o igual a 80?\n", + "\n", + "Para hacer eso, tomamos una columna del DataFrame y aplicamos una condición booleana a ella. Aquí hay un ejemplo de una condición booleana:" + ], + "metadata": { + "id": "UTM7sGYFJxbf" + } + }, + { + "cell_type": "code", + "source": [ + "filter_conditional = (movies['PUNTUACION'] >= 80.0)\n", + "\n", + "filter_conditional.head(20)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ybhPXejlKAZr", + "outputId": "a72e8f3c-69a7-4a03-8aa2-fb2de763e2fb" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "names\n", + "Creed III False\n", + "Avatar: The Way of Water False\n", + "The Super Mario Bros. Movie False\n", + "Mummies False\n", + "Supercell False\n", + "Cocaine Bear False\n", + "John Wick: Chapter 4 True\n", + "Puss in Boots: The Last Wish True\n", + "Attack on Titan False\n", + "The Park False\n", + "Winnie the Pooh: Blood and Honey False\n", + "The Exorcist False\n", + "Murder Mystery 2 False\n", + "Black Panther: Wakanda Forever False\n", + "The Pope's Exorcist False\n", + "Prizefighter: The Life of Jem Belcher False\n", + "Knock at the Cabin False\n", + "The Devil Conspiracy False\n", + "Cazadora False\n", + "Gold Run False\n", + "Name: PUNTUACION, dtype: bool" + ] + }, + "metadata": {}, + "execution_count": 91 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Similar a isnull(), esto devuelve una Serie de valores Verdaderos y Falsos: Verdadero para las películas cuya puntuación sea superior a 80 y Falso para las que no lo son.\n", + "\n", + "Si queremos filtrar todas las películas con la puntuación deseada, en otras palabras, si no queremos las películas Falsas. Para devolver las filas donde esa condición es Verdadera, tenemos que pasar esta operación al DataFrame:" + ], + "metadata": { + "id": "fOpLg5AmtjmL" + } + }, + { + "cell_type": "code", + "source": [ + "print(type(movies))\n", + "\n", + "movies[movies['PUNTUACION'] >= 80.0]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "J-AWpB-vt8xI", + "outputId": "33838b5c-1981-400a-cdb3-4ef32b05c3da" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ESTRENO PUNTUACION \\\n", + "names \n", + "John Wick: Chapter 4 03/23/2023 80.0 \n", + "Puss in Boots: The Last Wish 12/26/2022 83.0 \n", + "The Whale 02/02/2023 81.0 \n", + "Demon Slayer -Kimetsu no Yaiba- The Movie: Muge... 02/25/2021 83.0 \n", + "Top Gun: Maverick 05/26/2022 83.0 \n", + "... ... ... \n", + "Folklore: The Long Pond Studio Sessions 11/25/2020 86.0 \n", + "A Brighter Summer Day 07/27/1991 83.0 \n", + "Simulant 06/02/2023 100.0 \n", + "Hamilton 07/03/2020 82.0 \n", + "The Treasure of the Sierra Madre 01/15/1948 80.0 \n", + "\n", + " GENERO \\\n", + "names \n", + "John Wick: Chapter 4 Action, Thriller, Crime \n", + "Puss in Boots: The Last Wish Animation, Family, Fantasy, Adventure, Comedy \n", + "The Whale Drama \n", + "Demon Slayer -Kimetsu no Yaiba- The Movie: Muge... Animation, Action, Adventure, Fantasy, Thriller \n", + "Top Gun: Maverick Action, Drama \n", + "... ... \n", + "Folklore: The Long Pond Studio Sessions Music, Documentary \n", + "A Brighter Summer Day Crime, Drama, Romance \n", + "Simulant Science Fiction, Thriller \n", + "Hamilton History, Drama \n", + "The Treasure of the Sierra Madre Adventure, Drama, Western \n", + "\n", + " SINOPSIS \\\n", + "names \n", + "John Wick: Chapter 4 With the price on his head ever increasing, Jo... \n", + "Puss in Boots: The Last Wish Puss in Boots discovers that his passion for a... \n", + "The Whale A reclusive English teacher suffering from sev... \n", + "Demon Slayer -Kimetsu no Yaiba- The Movie: Muge... Tanjiro Kamado, joined with Inosuke Hashibira,... \n", + "Top Gun: Maverick After more than thirty years of service as one... \n", + "... ... \n", + "Folklore: The Long Pond Studio Sessions An intimate concert film, in which Taylor Swif... \n", + "A Brighter Summer Day A boy experiences first love, friendships and ... \n", + "Simulant Faye attempts to replace her newly deceased hu... \n", + "Hamilton Presenting the tale of American founding fathe... \n", + "The Treasure of the Sierra Madre Fred C. Dobbs and Bob Curtin, both down on the... \n", + "\n", + " ELENCO \\\n", + "names \n", + "John Wick: Chapter 4 Keanu Reeves, John Wick, Donnie Yen, Caine, Bi... \n", + "Puss in Boots: The Last Wish Antonio Banderas, Puss in Boots (voice), Salma... \n", + "The Whale Brendan Fraser, Charlie, Sadie Sink, Ellie, Ho... \n", + "Demon Slayer -Kimetsu no Yaiba- The Movie: Muge... Natsuki Hanae, Tanjiro Kamado (voice), Akari K... \n", + "Top Gun: Maverick Tom Cruise, Capt. Pete 'Maverick' Mitchell, Mi... \n", + "... ... \n", + "Folklore: The Long Pond Studio Sessions Taylor Swift, Self, Jack Antonoff, Self, Aaron... \n", + "A Brighter Summer Day Chang Chen, Xiao Si'r, Lisa Yang, Ming, Chang ... \n", + "Simulant Robbie Amell, Evan, Jordana Brewster, Faye, Si... \n", + "Hamilton Lin-Manuel Miranda, Alexander Hamilton, Leslie... \n", + "The Treasure of the Sierra Madre Humphrey Bogart, Fred C. Dobbs, Walter Huston,... \n", + "\n", + " TITULO_ORIGINAL \\\n", + "names \n", + "John Wick: Chapter 4 John Wick: Chapter 4 \n", + "Puss in Boots: The Last Wish Puss in Boots: The Last Wish \n", + "The Whale The Whale \n", + "Demon Slayer -Kimetsu no Yaiba- The Movie: Muge... 劇場版「鬼滅の刃」無限列車編 \n", + "Top Gun: Maverick Top Gun: Maverick \n", + "... ... \n", + "Folklore: The Long Pond Studio Sessions Folklore: The Long Pond Studio Sessions \n", + "A Brighter Summer Day 牯嶺街少年殺人事件 \n", + "Simulant Hello Stranger \n", + "Hamilton Hamilton \n", + "The Treasure of the Sierra Madre The Treasure of the Sierra Madre \n", + "\n", + " ESTADO IDIOMA_ORIGINAL \\\n", + "names \n", + "John Wick: Chapter 4 Released English \n", + "Puss in Boots: The Last Wish Released English \n", + "The Whale Released English \n", + "Demon Slayer -Kimetsu no Yaiba- The Movie: Muge... Released Japanese \n", + "Top Gun: Maverick Released English \n", + "... ... ... \n", + "Folklore: The Long Pond Studio Sessions Released English \n", + "A Brighter Summer Day Released Chinese \n", + "Simulant Released English \n", + "Hamilton Released English \n", + "The Treasure of the Sierra Madre Released English \n", + "\n", + " PRESUPUESTO RECAUDACION \\\n", + "names \n", + "John Wick: Chapter 4 100000000.0 3.513494e+08 \n", + "Puss in Boots: The Last Wish 90000000.0 4.834806e+08 \n", + "The Whale 3000000.0 3.675201e+07 \n", + "Demon Slayer -Kimetsu no Yaiba- The Movie: Muge... 15800000.0 5.030637e+08 \n", + "Top Gun: Maverick 170000000.0 1.481369e+09 \n", + "... ... ... \n", + "Folklore: The Long Pond Studio Sessions 221000000.0 1.104642e+09 \n", + "A Brighter Summer Day 186000000.0 5.862587e+08 \n", + "Simulant 201000000.0 1.569324e+09 \n", + "Hamilton 200000000.0 8.846484e+08 \n", + "The Treasure of the Sierra Madre 3800000.0 4.307000e+06 \n", + "\n", + " PAIS \n", + "names \n", + "John Wick: Chapter 4 AU \n", + "Puss in Boots: The Last Wish AU \n", + "The Whale AU \n", + "Demon Slayer -Kimetsu no Yaiba- The Movie: Muge... AU \n", + "Top Gun: Maverick AU \n", + "... ... \n", + "Folklore: The Long Pond Studio Sessions US \n", + "A Brighter Summer Day TW \n", + "Simulant US \n", + "Hamilton AU \n", + "The Treasure of the Sierra Madre US \n", + "\n", + "[431 rows x 11 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ESTRENOPUNTUACIONGENEROSINOPSISELENCOTITULO_ORIGINALESTADOIDIOMA_ORIGINALPRESUPUESTORECAUDACIONPAIS
names
John Wick: Chapter 403/23/202380.0Action, Thriller, CrimeWith the price on his head ever increasing, Jo...Keanu Reeves, John Wick, Donnie Yen, Caine, Bi...John Wick: Chapter 4ReleasedEnglish100000000.03.513494e+08AU
Puss in Boots: The Last Wish12/26/202283.0Animation, Family, Fantasy, Adventure, ComedyPuss in Boots discovers that his passion for a...Antonio Banderas, Puss in Boots (voice), Salma...Puss in Boots: The Last WishReleasedEnglish90000000.04.834806e+08AU
The Whale02/02/202381.0DramaA reclusive English teacher suffering from sev...Brendan Fraser, Charlie, Sadie Sink, Ellie, Ho...The WhaleReleasedEnglish3000000.03.675201e+07AU
Demon Slayer -Kimetsu no Yaiba- The Movie: Mugen Train02/25/202183.0Animation, Action, Adventure, Fantasy, ThrillerTanjiro Kamado, joined with Inosuke Hashibira,...Natsuki Hanae, Tanjiro Kamado (voice), Akari K...劇場版「鬼滅の刃」無限列車編ReleasedJapanese15800000.05.030637e+08AU
Top Gun: Maverick05/26/202283.0Action, DramaAfter more than thirty years of service as one...Tom Cruise, Capt. Pete 'Maverick' Mitchell, Mi...Top Gun: MaverickReleasedEnglish170000000.01.481369e+09AU
....................................
Folklore: The Long Pond Studio Sessions11/25/202086.0Music, DocumentaryAn intimate concert film, in which Taylor Swif...Taylor Swift, Self, Jack Antonoff, Self, Aaron...Folklore: The Long Pond Studio SessionsReleasedEnglish221000000.01.104642e+09US
A Brighter Summer Day07/27/199183.0Crime, Drama, RomanceA boy experiences first love, friendships and ...Chang Chen, Xiao Si'r, Lisa Yang, Ming, Chang ...牯嶺街少年殺人事件ReleasedChinese186000000.05.862587e+08TW
Simulant06/02/2023100.0Science Fiction, ThrillerFaye attempts to replace her newly deceased hu...Robbie Amell, Evan, Jordana Brewster, Faye, Si...Hello StrangerReleasedEnglish201000000.01.569324e+09US
Hamilton07/03/202082.0History, DramaPresenting the tale of American founding fathe...Lin-Manuel Miranda, Alexander Hamilton, Leslie...HamiltonReleasedEnglish200000000.08.846484e+08AU
The Treasure of the Sierra Madre01/15/194880.0Adventure, Drama, WesternFred C. Dobbs and Bob Curtin, both down on the...Humphrey Bogart, Fred C. Dobbs, Walter Huston,...The Treasure of the Sierra MadreReleasedEnglish3800000.04.307000e+06US
\n", + "

431 rows × 11 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 102 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Podemos hacer selecciones más completas haciendo uso de los operadores lógicos => | para or y & para and\n", + "\n", + "Hagamos ahora un filtrado para aquellas películas cuya puntuación sea mayor o igual a 80 y el presupuesto sea menor o igual a 1000000" + ], + "metadata": { + "id": "lLZgL2WYnX-s" + } + }, + { + "cell_type": "code", + "source": [ + "movies[(movies['PUNTUACION'] >= 80.0) & (movies['PRESUPUESTO'] <= 1000000)].head()" + ], + "metadata": { + "id": "0YAo7QNDnXDc", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 709 + }, + "outputId": "1f404399-d87e-42bd-ca0b-7ab42a9a172e" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ESTRENO PUNTUACION \\\n", + "names \n", + "20th Century Girl 10/06/2022 83.0 \n", + "Evangelion: 3.0+1.0 Thrice Upon a Time 10/13/2022 83.0 \n", + "12 Angry Men 10/10/1957 85.0 \n", + "Miracle in Cell No. 7 10/11/2019 83.0 \n", + "Perfect Blue 06/02/2001 83.0 \n", + "\n", + " GENERO \\\n", + "names \n", + "20th Century Girl Romance, Drama \n", + "Evangelion: 3.0+1.0 Thrice Upon a Time Animation, Action, Science Fiction, Drama \n", + "12 Angry Men Drama \n", + "Miracle in Cell No. 7 Drama \n", + "Perfect Blue Animation, Thriller \n", + "\n", + " SINOPSIS \\\n", + "names \n", + "20th Century Girl Yeon-du asks her best friend Bora to collect a... \n", + "Evangelion: 3.0+1.0 Thrice Upon a Time In the aftermath of the Fourth Impact, strande... \n", + "12 Angry Men The defense and the prosecution have rested an... \n", + "Miracle in Cell No. 7 Separated from his daughter, a father with an ... \n", + "Perfect Blue A retired pop singer turned actress' sense of ... \n", + "\n", + " ELENCO \\\n", + "names \n", + "20th Century Girl Kim You-jung, Na Bo-ra, Byeon Woo-seok, Poong ... \n", + "Evangelion: 3.0+1.0 Thrice Upon a Time Megumi Ogata, Shinji Ikari (voice), Yuko Miyam... \n", + "12 Angry Men Martin Balsam, Juror 1, John Fiedler, Juror 2,... \n", + "Miracle in Cell No. 7 Aras Bulut İynemli, Memo, Nisa Sofiya Aksongur... \n", + "Perfect Blue Junko Iwao, Mima Kirigoe (voice), Rica Matsumo... \n", + "\n", + " TITULO_ORIGINAL ESTADO \\\n", + "names \n", + "20th Century Girl 20세기 소녀 Released \n", + "Evangelion: 3.0+1.0 Thrice Upon a Time シン・エヴァンゲリオン劇場版:|| Released \n", + "12 Angry Men 12 Angry Men Released \n", + "Miracle in Cell No. 7 7. Koğuştaki Mucize Released \n", + "Perfect Blue PERFECT BLUE Released \n", + "\n", + " IDIOMA_ORIGINAL PRESUPUESTO \\\n", + "names \n", + "20th Century Girl Korean 119.0 \n", + "Evangelion: 3.0+1.0 Thrice Upon a Time Japanese 961023.8 \n", + "12 Angry Men English 340000.0 \n", + "Miracle in Cell No. 7 Turkish 961023.8 \n", + "Perfect Blue Japanese 830000.0 \n", + "\n", + " RECAUDACION PAIS \n", + "names \n", + "20th Century Girl 77132590.4 KR \n", + "Evangelion: 3.0+1.0 Thrice Upon a Time 92300000.0 AU \n", + "12 Angry Men 379.0 AU \n", + "Miracle in Cell No. 7 19289062.0 TR \n", + "Perfect Blue 112536.0 AU " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ESTRENOPUNTUACIONGENEROSINOPSISELENCOTITULO_ORIGINALESTADOIDIOMA_ORIGINALPRESUPUESTORECAUDACIONPAIS
names
20th Century Girl10/06/202283.0Romance, DramaYeon-du asks her best friend Bora to collect a...Kim You-jung, Na Bo-ra, Byeon Woo-seok, Poong ...20세기 소녀ReleasedKorean119.077132590.4KR
Evangelion: 3.0+1.0 Thrice Upon a Time10/13/202283.0Animation, Action, Science Fiction, DramaIn the aftermath of the Fourth Impact, strande...Megumi Ogata, Shinji Ikari (voice), Yuko Miyam...シン・エヴァンゲリオン劇場版:||ReleasedJapanese961023.892300000.0AU
12 Angry Men10/10/195785.0DramaThe defense and the prosecution have rested an...Martin Balsam, Juror 1, John Fiedler, Juror 2,...12 Angry MenReleasedEnglish340000.0379.0AU
Miracle in Cell No. 710/11/201983.0DramaSeparated from his daughter, a father with an ...Aras Bulut İynemli, Memo, Nisa Sofiya Aksongur...7. Koğuştaki MucizeReleasedTurkish961023.819289062.0TR
Perfect Blue06/02/200183.0Animation, ThrillerA retired pop singer turned actress' sense of ...Junko Iwao, Mima Kirigoe (voice), Rica Matsumo...PERFECT BLUEReleasedJapanese830000.0112536.0AU
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 104 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Hagamos una más, esta vez algo más completa. Filtraremos todas las películas cuya puntuación esté entre 75 y 90, de género drama y cuyo presupuesto esté entre 100.000 y 700.000" + ], + "metadata": { + "id": "jSF5u36Qz51l" + } + }, + { + "cell_type": "code", + "source": [ + "movies[((movies['PUNTUACION'] >= 75) & (movies['PUNTUACION'] <= 90))\n", + " & (movies['GENERO'] == 'Drama')\n", + " & ((movies['PRESUPUESTO'] >= 100000) & (movies['PRESUPUESTO']<=700000))]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 556 + }, + "id": "0va4d0Kz04yD", + "outputId": "3dd20c6e-fb2b-4d5f-e57c-8ae889fa71a3" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ESTRENO PUNTUACION GENERO \\\n", + "names \n", + "Facing the Giants 09/29/2006 75.0 Drama \n", + "12 Angry Men 10/10/1957 85.0 Drama \n", + "3096 Days 02/27/2013 75.0 Drama \n", + "Bicycle Thieves 11/03/1950 82.0 Drama \n", + "\n", + " SINOPSIS \\\n", + "names \n", + "Facing the Giants A losing coach with an underdog football team ... \n", + "12 Angry Men The defense and the prosecution have rested an... \n", + "3096 Days A young Austrian girl is kidnapped and held in... \n", + "Bicycle Thieves Unemployed Antonio is elated when he finally f... \n", + "\n", + " ELENCO \\\n", + "names \n", + "Facing the Giants Alex Kendrick, Grant Taylor, Shannen Fields, B... \n", + "12 Angry Men Martin Balsam, Juror 1, John Fiedler, Juror 2,... \n", + "3096 Days Antonia Campbell-Hughes, Natascha Kampusch, Th... \n", + "Bicycle Thieves Lamberto Maggiorani, Antonio Ricci, Enzo Staio... \n", + "\n", + " TITULO_ORIGINAL ESTADO IDIOMA_ORIGINAL \\\n", + "names \n", + "Facing the Giants Facing the Giants Released English \n", + "12 Angry Men 12 Angry Men Released English \n", + "3096 Days 3096 Tage Released German \n", + "Bicycle Thieves Ladri di biciclette Released Italian \n", + "\n", + " PRESUPUESTO RECAUDACION PAIS \n", + "names \n", + "Facing the Giants 100000.0 10243159.0 US \n", + "12 Angry Men 340000.0 379.0 AU \n", + "3096 Days 515001.4 6677474.0 AU \n", + "Bicycle Thieves 133000.0 436655.0 AU " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ESTRENOPUNTUACIONGENEROSINOPSISELENCOTITULO_ORIGINALESTADOIDIOMA_ORIGINALPRESUPUESTORECAUDACIONPAIS
names
Facing the Giants09/29/200675.0DramaA losing coach with an underdog football team ...Alex Kendrick, Grant Taylor, Shannen Fields, B...Facing the GiantsReleasedEnglish100000.010243159.0US
12 Angry Men10/10/195785.0DramaThe defense and the prosecution have rested an...Martin Balsam, Juror 1, John Fiedler, Juror 2,...12 Angry MenReleasedEnglish340000.0379.0AU
3096 Days02/27/201375.0DramaA young Austrian girl is kidnapped and held in...Antonia Campbell-Hughes, Natascha Kampusch, Th...3096 TageReleasedGerman515001.46677474.0AU
Bicycle Thieves11/03/195082.0DramaUnemployed Antonio is elated when he finally f...Lamberto Maggiorani, Antonio Ricci, Enzo Staio...Ladri di bicicletteReleasedItalian133000.0436655.0AU
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 111 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Y la última antes de continuar con más cosas, podemos obtener de la consulta anterior aquellas películas cuya recaudación no haya supuesto más del 25% y para ello usaremos el método **quantile()**" + ], + "metadata": { + "id": "nr9J99aY3XB0" + } + }, + { + "cell_type": "code", + "source": [ + "movies[((movies['PUNTUACION'] >= 75) & (movies['PUNTUACION'] <= 90))\n", + " #& (movies['GENERO'] == 'Drama')\n", + " & ((movies['PRESUPUESTO'] >= 100000) & (movies['PRESUPUESTO']<=700000))\n", + " & (movies['RECAUDACION'] < movies['PRESUPUESTO'].quantile(0.25))].head()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 726 + }, + "id": "qpdi-iec3uwk", + "outputId": "19869fd6-a636-4b95-9ad8-2e3b82a97d29" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ESTRENO PUNTUACION GENERO \\\n", + "names \n", + "Facing the Giants 09/29/2006 75.0 Drama \n", + "12 Angry Men 10/10/1957 85.0 Drama \n", + "A Fistful of Dollars 04/29/2010 79.0 Western \n", + "In the Mood for Love 03/29/2001 81.0 Drama, Romance \n", + "3096 Days 02/27/2013 75.0 Drama \n", + "\n", + " SINOPSIS \\\n", + "names \n", + "Facing the Giants A losing coach with an underdog football team ... \n", + "12 Angry Men The defense and the prosecution have rested an... \n", + "A Fistful of Dollars The Man With No Name enters the Mexican villag... \n", + "In the Mood for Love Two neighbors become intimate after discoverin... \n", + "3096 Days A young Austrian girl is kidnapped and held in... \n", + "\n", + " ELENCO \\\n", + "names \n", + "Facing the Giants Alex Kendrick, Grant Taylor, Shannen Fields, B... \n", + "12 Angry Men Martin Balsam, Juror 1, John Fiedler, Juror 2,... \n", + "A Fistful of Dollars Clint Eastwood, Joe, Marianne Koch, Marisol, G... \n", + "In the Mood for Love Tony Leung Chiu-wai, Chow Mo-Wan, Maggie Cheun... \n", + "3096 Days Antonia Campbell-Hughes, Natascha Kampusch, Th... \n", + "\n", + " TITULO_ORIGINAL ESTADO IDIOMA_ORIGINAL \\\n", + "names \n", + "Facing the Giants Facing the Giants Released English \n", + "12 Angry Men 12 Angry Men Released English \n", + "A Fistful of Dollars Per un pugno di dollari Released Italian \n", + "In the Mood for Love 花樣年華 Released Cantonese \n", + "3096 Days 3096 Tage Released German \n", + "\n", + " PRESUPUESTO RECAUDACION PAIS \n", + "names \n", + "Facing the Giants 100000.0 10243159.0 US \n", + "12 Angry Men 340000.0 379.0 AU \n", + "A Fistful of Dollars 200000.0 14500000.0 AU \n", + "In the Mood for Love 150000.0 12854953.0 AU \n", + "3096 Days 515001.4 6677474.0 AU " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ESTRENOPUNTUACIONGENEROSINOPSISELENCOTITULO_ORIGINALESTADOIDIOMA_ORIGINALPRESUPUESTORECAUDACIONPAIS
names
Facing the Giants09/29/200675.0DramaA losing coach with an underdog football team ...Alex Kendrick, Grant Taylor, Shannen Fields, B...Facing the GiantsReleasedEnglish100000.010243159.0US
12 Angry Men10/10/195785.0DramaThe defense and the prosecution have rested an...Martin Balsam, Juror 1, John Fiedler, Juror 2,...12 Angry MenReleasedEnglish340000.0379.0AU
A Fistful of Dollars04/29/201079.0WesternThe Man With No Name enters the Mexican villag...Clint Eastwood, Joe, Marianne Koch, Marisol, G...Per un pugno di dollariReleasedItalian200000.014500000.0AU
In the Mood for Love03/29/200181.0Drama, RomanceTwo neighbors become intimate after discoverin...Tony Leung Chiu-wai, Chow Mo-Wan, Maggie Cheun...花樣年華ReleasedCantonese150000.012854953.0AU
3096 Days02/27/201375.0DramaA young Austrian girl is kidnapped and held in...Antonia Campbell-Hughes, Natascha Kampusch, Th...3096 TageReleasedGerman515001.46677474.0AU
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 116 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Usando Funciones\n", + "\n", + "Es posible iterar sobre un DataFrame o Serie como lo harías con una lista, pero hacerlo —especialmente en conjuntos de datos grandes— es muy lento.\n", + "\n", + "Una alternativa eficiente es aplicar() una función al conjunto de datos. Por ejemplo, podríamos usar una función para convertir películas con una calificación de 75 o superior a un valor de cadena \"buena\" y el resto a \"mala\" y usar estos valores transformados para crear una nueva columna.\n", + "\n", + "Primero crearíamos una función que, al recibir una calificación, determine si es buena o mala:" + ], + "metadata": { + "id": "GoPujYEk4yGg" + } + }, + { + "cell_type": "code", + "source": [ + "def rating_movie(x: float):\n", + " if x >= 75.0:\n", + " return 'Buena'\n", + " else:\n", + " return 'Mala'" + ], + "metadata": { + "id": "Mh8pKcPt5Hqh" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Ahora queremos enviar toda la columna de calificaciones a través de esta función, que es lo que hace apply():" + ], + "metadata": { + "id": "5UlKFO-h5XSD" + } + }, + { + "cell_type": "code", + "source": [ + "movies['CLASIFICADA'] = movies['PUNTUACION'].apply(rating_movie)\n", + "\n", + "movies.head(2)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 337 + }, + "id": "4iEuJHCy5fCy", + "outputId": "f5b30aab-31f6-46b7-f118-1a9a37872de0" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ESTRENO PUNTUACION \\\n", + "names \n", + "Creed III 03/02/2023 73.0 \n", + "Avatar: The Way of Water 12/15/2022 78.0 \n", + "\n", + " GENERO \\\n", + "names \n", + "Creed III Drama, Action \n", + "Avatar: The Way of Water Science Fiction, Adventure, Action \n", + "\n", + " SINOPSIS \\\n", + "names \n", + "Creed III After dominating the boxing world, Adonis Cree... \n", + "Avatar: The Way of Water Set more than a decade after the events of the... \n", + "\n", + " ELENCO \\\n", + "names \n", + "Creed III Michael B. Jordan, Adonis Creed, Tessa Thompso... \n", + "Avatar: The Way of Water Sam Worthington, Jake Sully, Zoe Saldaña, Neyt... \n", + "\n", + " TITULO_ORIGINAL ESTADO IDIOMA_ORIGINAL \\\n", + "names \n", + "Creed III Creed III Released English \n", + "Avatar: The Way of Water Avatar: The Way of Water Released English \n", + "\n", + " PRESUPUESTO RECAUDACION PAIS CLASIFICADA \n", + "names \n", + "Creed III 75000000.0 2.716167e+08 AU Mala \n", + "Avatar: The Way of Water 460000000.0 2.316795e+09 AU Buena " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ESTRENOPUNTUACIONGENEROSINOPSISELENCOTITULO_ORIGINALESTADOIDIOMA_ORIGINALPRESUPUESTORECAUDACIONPAISCLASIFICADA
names
Creed III03/02/202373.0Drama, ActionAfter dominating the boxing world, Adonis Cree...Michael B. Jordan, Adonis Creed, Tessa Thompso...Creed IIIReleasedEnglish75000000.02.716167e+08AUMala
Avatar: The Way of Water12/15/202278.0Science Fiction, Adventure, ActionSet more than a decade after the events of the...Sam Worthington, Jake Sully, Zoe Saldaña, Neyt...Avatar: The Way of WaterReleasedEnglish460000000.02.316795e+09AUBuena
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 118 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "El método **.apply()** pasa cada valor en la columna de calificaciones a través de la rating_movie y luego devuelve una nueva Serie. Esta Serie se asigna entonces a una nueva columna llamada CLASIFICADA.\n", + "\n", + "También puedes usar funciones anónimas. Esta función lambda logra el mismo resultado que rating_movie:\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "metadata": { + "id": "STaSJ80J6ZRD" + } + }, + { + "cell_type": "code", + "source": [ + "movies['CLAMBDA'] = movies['PUNTUACION'].apply(lambda x: 'Buena' if x >= 75 else 'Mala')\n", + "\n", + "movies.head(3)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 438 + }, + "id": "8LeHojTA6j-y", + "outputId": "61342cee-5221-46c4-8111-acfefe117d74" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ESTRENO PUNTUACION \\\n", + "names \n", + "Creed III 03/02/2023 73.0 \n", + "Avatar: The Way of Water 12/15/2022 78.0 \n", + "The Super Mario Bros. Movie 04/05/2023 76.0 \n", + "\n", + " GENERO \\\n", + "names \n", + "Creed III Drama, Action \n", + "Avatar: The Way of Water Science Fiction, Adventure, Action \n", + "The Super Mario Bros. Movie Animation, Adventure, Family, Fantasy, Comedy \n", + "\n", + " SINOPSIS \\\n", + "names \n", + "Creed III After dominating the boxing world, Adonis Cree... \n", + "Avatar: The Way of Water Set more than a decade after the events of the... \n", + "The Super Mario Bros. Movie While working underground to fix a water main,... \n", + "\n", + " ELENCO \\\n", + "names \n", + "Creed III Michael B. Jordan, Adonis Creed, Tessa Thompso... \n", + "Avatar: The Way of Water Sam Worthington, Jake Sully, Zoe Saldaña, Neyt... \n", + "The Super Mario Bros. Movie Chris Pratt, Mario (voice), Anya Taylor-Joy, P... \n", + "\n", + " TITULO_ORIGINAL ESTADO \\\n", + "names \n", + "Creed III Creed III Released \n", + "Avatar: The Way of Water Avatar: The Way of Water Released \n", + "The Super Mario Bros. Movie The Super Mario Bros. Movie Released \n", + "\n", + " IDIOMA_ORIGINAL PRESUPUESTO RECAUDACION PAIS \\\n", + "names \n", + "Creed III English 75000000.0 2.716167e+08 AU \n", + "Avatar: The Way of Water English 460000000.0 2.316795e+09 AU \n", + "The Super Mario Bros. Movie English 100000000.0 7.244590e+08 AU \n", + "\n", + " CLASIFICADA CLAMBDA \n", + "names \n", + "Creed III Mala Mala \n", + "Avatar: The Way of Water Buena Buena \n", + "The Super Mario Bros. Movie Buena Buena " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ESTRENOPUNTUACIONGENEROSINOPSISELENCOTITULO_ORIGINALESTADOIDIOMA_ORIGINALPRESUPUESTORECAUDACIONPAISCLASIFICADACLAMBDA
names
Creed III03/02/202373.0Drama, ActionAfter dominating the boxing world, Adonis Cree...Michael B. Jordan, Adonis Creed, Tessa Thompso...Creed IIIReleasedEnglish75000000.02.716167e+08AUMalaMala
Avatar: The Way of Water12/15/202278.0Science Fiction, Adventure, ActionSet more than a decade after the events of the...Sam Worthington, Jake Sully, Zoe Saldaña, Neyt...Avatar: The Way of WaterReleasedEnglish460000000.02.316795e+09AUBuenaBuena
The Super Mario Bros. Movie04/05/202376.0Animation, Adventure, Family, Fantasy, ComedyWhile working underground to fix a water main,...Chris Pratt, Mario (voice), Anya Taylor-Joy, P...The Super Mario Bros. MovieReleasedEnglish100000000.07.244590e+08AUBuenaBuena
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 119 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "En general, usar apply() será mucho más rápido que iterar manualmente sobre las filas porque pandas está utilizando vectorización.\n", + "\n", + "```\n", + "Vectorización: un estilo de programación en computadoras donde las operaciones se aplican a arreglos enteros en lugar de a elementos individuales —Wikipedia\n", + "```\n", + "\n", + "Un buen ejemplo de la utilidad de apply() es durante el trabajo de procesamiento de lenguaje natural (NLP). Necesitarás aplicar todo tipo de funciones de limpieza de texto a cadenas para prepararlas para el aprendizaje automático." + ], + "metadata": { + "id": "SGmrvcYR7hKM" + } + }, + { + "cell_type": "markdown", + "source": [ + "# Representación Gráfica\n", + "\n", + "Otra gran ventaja de pandas es que se integra con Matplotlib, por lo que tienes la capacidad de trazar gráficos directamente desde DataFrames y Series. Para comenzar necesitamos importar Matplotlib\n", + "\n", + "```\n", + "pip install matplotlib\n", + "```" + ], + "metadata": { + "id": "anz0lw6O8QjU" + } + }, + { + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Configurando tamaño de fuente y del gráfico\n", + "plt.rcParams.update({'font.size': 20, 'figure.figsize': (10,8)})" + ], + "metadata": { + "id": "lVDVH-TC813H" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Ahora podemos comenzar. No habrá mucha variedad sobre la creación de gráficos, pero debería ser suficiente para explorar nuestros datos fácilmente.\n", + "\n", + "Vamos a trazar la relación entre las calificaciones y los ingresos. Todo lo que necesitamos hacer es llamar a .plot() en movies con información sobre cómo construir el gráfico:" + ], + "metadata": { + "id": "AgqSAbHA9YxI" + } + }, + { + "cell_type": "code", + "source": [ + "movies.plot(kind='scatter', x='PUNTUACION', y='RECAUDACION', title='Recaudación frente a Puntuación')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 775 + }, + "id": "Y2T6m1R091oR", + "outputId": "59c85195-6636-48e9-807f-575651b43f4c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 121 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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xdi7dy8mTZqERo0awcPDA/7+/ujUqRNef/11nDhxQmv4iTGaNWuGEydO4L333kNYWBh8fX3h6emJ5s2bY+rUqThw4ADeffddk7Lz+fj4YPv27fj5558xYsQI1K9fHx4eHmjYsCEeeughfP/999i9e7c4dM4QLy8vbN++HT/88AMGDRoEf39/uLu7o0GDBggPD8cnn3yCEydOiPMRjVWzZk2sWLECp06dwrx589C9e3cEBQXBzc0NXl5eaNGiBcaMGYPly5fj+vXrZicZmj59Oi5evIglS5agb9++qFevHtzd3VG3bl106tQJr7zyCk6cOIHPPvtMHIpZ3TVp0gQ7d+7E/v378dJLL6Fr164ICgqCu7s7atasieDgYAwYMACvvfYa/vrrL1y7dg1Dhgyp0jauX78e69evxyOPPILg4GCt5BZyJk6ciNTUVKxZswZRUVFo2bIlfH194erqCh8fHzzwwAMYO3YsPv30U5w/fx6HDh0ye4hg69atkZSUhCVLlqBbt26oXbs2atSogSZNmuCRRx7Bjz/+iD179uidAmCPnnrqKZw4cQLTp09Hs2bN4OnpiTp16iA0NBTvvvsuTpw4gb59+9q0je7u7ti5cye+/vprDBo0SPw+NKRLly44d+4c3nzzTXTs2BHe3t7w8vJC69atMXv2bCQlJeG5554zuh29evXC6dOnMW/ePHTo0AFeXl7i99zEiROxdetW/PrrrybPJ+vUqROSkpLwyy+/YMqUKWjVqhV8fHzg6uoKPz8/dO3aFc8++yy2bduG6Ohok/Zdmbe3N3766Sfs378fzz77LB544AH4+vqKf18iIyPxxRdfIDk5WSvZGJG5VIJQhampSJG0tDQ0a9YMAMQbdEN69OiBhIQEuLq64scff8TEiRMl1z158iTS0tK0xqoD95M+eHt76/0DXV5ejueff17MoLhgwQKTJscTEREREZFybrZuAOnat2+fVq0wzWLcKSkpOoHck08+qbOPH3/8Ed27d0d2djYmTZqEdevWYdKkSWjVqhVcXV1x+/ZtJCUl4X//+x8OHjyIV155RSeQi42NxZw5czB58mT069cPjRs3xt27d3HixAmsWLFCTK388MMP6xQGJyIiIiIi62GPnB168sknsXbtWqPXl3oJL1y4gHHjxhksbAzcz1BWOYPSpk2btDLoVaZSqTBt2jQsX77cppm3iIiIiIiqG/bIObHWrVvj2LFj+O9//4uff/4Zhw8fRkZGBsrLy+Hv7482bdqgT58+GDNmDLp06aKzfd++ffHhhx/i77//xrlz53Dr1i24uLigYcOGGDBgAKZNm6ZV74uIiIiIiKoGe+SIiIiIiIgcDLNWEhERERERORgGckRERERERA6Gc+TsQEVFBdLT01G7dm2TamIREREREZFzEQQBBQUFaNiwIVxcpPvdGMjZgfT0dISEhNi6GUREREREZCeuXr2K4OBgyeUM5OxA7dq1Adx/sXx8fGzcGiIiIiIispX8/HyEhISIMYIUBnJ2QD2c0sfHh4EcEREREREZnHLFZCdEREREREQOxmEDufz8fGzYsAGvvPIK+vXrh5YtW8LX1xceHh4ICgpC//798cEHHyArK8tix9y+fTvGjBmD4OBg1KhRA8HBwRgzZgy2b99usWMQEREREREZ4rAFwXfu3InBgwcbXC8gIADr1q3DkCFDFB+roqICM2fOxKpVqyTXmTFjBr799lvZzDJS8vPz4evri7y8PA6tJCIiIiKqxoyNDRx6jlxISAgGDBiArl27IiQkBA0aNEBFRQWuXbuGTZs24ZdffkFmZiZGjhyJhIQEdOrUSdFx5s+fLwZxoaGh+Ne//oUWLVrg4sWL+OCDD5CUlITvvvsOgYGBWLJkiSVPkYiIiIiISIfD9siVl5fD1dVVdp3NmzdjzJgxAIAxY8bgl19+Mfk4Fy5cQPv27VFWVoZu3bohLi4ONWvWFJcXFxejX79+OHLkCNzc3HD27Fm0bNnSpGOwR46IiIiIiADjYwOHnSNnKIgDgNGjR6NNmzYAgL179yo6zmeffYaysjIAwLJly7SCOADw8vLCsmXLAABlZWX49NNPFR2HiIiIiIjIWA4byBlLXX/h7t27Jm8rCAK2bNkCAGjbti169uypd72ePXuKAeOWLVvgoJ2cRERERETkIJw6kDt//jyOHTsG4H4gZqpLly4hPT0dANCvXz/ZddXLr1+/jrS0NJOPRUREREREZCynC+SKi4uRnJyMTz75BP369ROHRb744osm7+vMmTPiY0OBoObys2fPmnwsIiIiIiIiYzl01kq1NWvWYNq0aZLL33jjDTz66KMm7/fatWvi4+DgYNl1Q0JCxMdXr16VXffevXu4d++e+P/8/HyT20ZERERERNWX0/XIaercuTMSEhLw3nvvQaVSmbx9QUGB+Njb21t23Vq1aomPCwsLZdd977334OvrK/7TDAKJiIiIiIgMcYpAbvTo0Th58iROnjyJhIQExMTEYMyYMTh27BiioqLw22+/KdqvZoIUDw8P2XVr1KghPr5z547suvPmzUNeXp74z1APHhERERERkSanGFpZp04d1KlTR/x/WFgYJk+ejB9++AFTp07FqFGjsGrVKjz55JMm7dfT01N8XFJSIruu5lDJyiUKKqtRo4ZW4EdERERERGQKp+iRk/LEE09gwoQJqKiowJw5c5CdnW3S9urSBYDh4ZJFRUXiY0PDMImIiIiIiMzh1IEcAIwaNQrA/UDrjz/+MGlbzQQnmolP9NEcHsk5b0REREREZE1OH8gFBgaKjy9fvmzStu3atRMfnzt3TnZdzeUPPPCAScchIiIiIiIyhdMHctevXxcfmzrksVmzZmjYsCEAYM+ePbLrxsXFAQAaNWqEpk2bmtZIIiIiIiIiEzh9ILdx40bxcceOHU3aVqVSiUMzz507h4MHD+pd7+DBg2KP3KhRoxSVOiAiIiIiIjKWwwZya9as0SoPoM+nn36Kbdu2Abjfu9a3b1+t5bt374ZKpYJKpZLMaPniiy/C1dUVADB37lyd0gJ37tzB3LlzAQBubm548cUXFZwNERERERGR8Ry2/MDChQvxyiuvYNy4cejTpw9atGgBb29vFBQU4OTJk1i/fj3i4+MB3K8Bt2LFCjEgM0Xr1q3x2muvYenSpThy5AjCw8Px+uuvo0WLFrh48SLef/99JCUlAQBee+01tGrVyqLnSUREREREVJnDBnIAkJ2djZUrV2LlypWS6wQHB+P777/HoEGDFB9n8eLFuH37Nr7//nskJSVh8uTJOutMnz4d7777ruJjEBERERERGcthA7k///wTv//+O+Lj45GSkoJbt24hKysLNWvWRFBQEDp37oxHHnkEEydOhJeXl1nHcnFxwapVqzBu3DisWLEChw8fRmZmJgICAhAWFoZZs2bh4YcfttCZERERETmP1IxCXM4uRlP/WmgWUMvWzSFyGipBEARbN6K6y8/Ph6+vL/Ly8uDj42Pr5hARERGZLbe4BM/HHENccob4XESrQCyLCoWvl7sNW0Zk34yNDRw22QkRERER2a/nY44hPiVT67n4lEzMjUmyUYuInAsDOSIiIiKyqNSMQsQlZ6C80sCvckFAXHIGLmUW2ahlRM6DgRwRERERWdTl7GLZ5WlZDOSIzMVAjoiIiIgsqkld+URzTf2Z9ITIXAzkiIiIiMiimgd6I6JVIFxVKq3nXVUqRLQKZPZKIgtgIEdEREREFrcsKhThLQO0ngtvGYBlUaE2ahGRc3HYOnJEREREZL98vdwRPb07LmUWIS2riHXkiCyMgRwRERERWU2zAAZwRNbAoZVEREREREQOhoEcERERERGRg2EgR0RERERE5GAYyBERERERETkYBnJEREREREQOhoEcERERERGRg2EgR0RERERE5GAYyBERERERETkYBnJEREREREQOhoEcERERERGRg2EgR0RERERE5GAYyBERERERETkYBnJEREREREQOhoEcERERERGRg3GzdQOIiIiIiOxdakYhLmcXo6l/LTQLqGXr5hAxkCMiIiIikpJbXILnY44hLjlDfC6iVSCWRYXC18vdhi2j6o5DK4mIiIiIJDwfcwzxKZlaz8WnZGJuTJKNWkR0HwM5IiIiIiI9UjMKEZecgXJB0Hq+XBAQl5yBS5lFNmoZEQM5IiIiIiK9LmcXyy5Py2IgR7bDQI6IiIiISI8mdb1klzf1Z9ITsh0GckREREREejQP9EZEq0C4qlRaz7uqVIhoFcjslWRTDOSIiIiIiCQsiwpFeMsArefCWwZgWVSojVpEdB/LDxARERERSfD1ckf09O64lFmEtKwi1pEju8FAjoiIiIjIgGYBDODIvnBoJRERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNhIEdERERERORgGMgRERERERE5GAZyREREREREDoaBHBERERERkYNx6EDuyJEjWLRoESIjIxEcHIwaNWrA29sbrVu3xrRp07Bv3z6LHGfhwoVQqVRG/du9e7dFjklERERERCTFzdYNUCoiIgJ79+7Veb6kpATJyclITk7GmjVrMGXKFKxcuRIeHh42aCUREREREZHlOWwgl56eDgBo2LAhJkyYgL59+6Jx48YoLy/HgQMH8PHHH+P69euIjo5GaWkpfvzxR4sc9+TJk7LLmzVrZpHjEBERERERSXHYQK5t27ZYsmQJxo0bB1dXV61lPXv2xBNPPIHw8HBcuHABMTExeOaZZxAREWH2cTt06GD2PoiIiIiIiMzhsHPkfvvtN0ycOFEniFMLCAjAxx9/LP5/06ZNVdU0IiIiIiIiq3LYQM4YAwYMEB9fvHjRhi0hIiIiIiKyHKcO5O7duyc+luq5IyIiIiIicjROHcjt2bNHfPzAAw9YZJ+RkZEICgqCh4cHgoKC0L9/fyxduhQ5OTkW2T8REREREZEhThvIVVRUYOnSpeL/J06caJH9/vXXX8jIyEBpaSkyMjKwZ88ezJs3D82bN8eWLVsscgwiIiIiIiI5Dpu10pBPP/0UCQkJAICxY8eia9euZu2vY8eOGD16NLp3746GDRuitLQU58+fx/r167Fjxw7k5uZi3Lhx+N///oeHH35Ydl/37t3TGvaZn59vVtuIiIiIiKh6UQmCINi6EZa2Z88eDBo0CGVlZQgKCsLJkycRFBSkeH+5ubmoU6eO5PJvv/0WzzzzDID7de0uXrwIT09PyfUXLlyId955R+f5vLw8+Pj4KG4nERERERE5tvz8fPj6+hqMDZxuaOXp06cxZswYlJWVwdPTExs3bjQriAMgG8QBwKxZszB9+nQA9wuV//zzz7Lrz5s3D3l5eeK/q1evmtU+IiIiIiKqXpwqkLt06RIiIyORk5MDV1dXbNiwwSJFwI0xa9Ys8bFmkhV9atSoAR8fH61/RERERERExnKaQC49PR2DBg1Ceno6VCoVvv/+e4waNarKjt+uXTvx8fXr16vsuEREREREVP04RSCXmZmJwYMHIzU1FQCwbNkyTJkypUrboFKpqvR4RERERERUfTl8IJeX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G8j1798fQ4cOBQDEx8dj586dJs9ZuHChYRRtxowZcHU1nnS6adMm6HQ66HQ6PPDAA8L9/POf/4Szc+1E9SeffNKktUBZWRmefPJJAICLiwv++c9/NuRlERERERERmeWwgRwAfPjhh/D09ERVVRVGjx6Nt956C7t27UJCQgIeeeQRPPfccwCAmJgYzJw5U9M+YmJi8OyzzwIAkpKSMHjwYKxcuRJJSUlYuXIlBg8ejKSkJADAs88+i+joaNu8OCIiIiIiIgmHrFqpFxsbi5UrV+K+++5DUVERXnjhBZPnxMTEYP369UatBKz15ptv4vz58/jyyy+RnJyMe+65x+Q5U6dOxRtvvKF5H0RERERERJZy6BE5ALj11ltx4MABPP3004iJiYGXlxcCAgLQr18/vP3220hOTkaXLl3Mb0iFk5MT4uPjsX79eowdOxZhYWFwc3NDWFgYxo4di19++QVffPEFnJwc/u0kIiIiIiIH4LBVK1sSVq0kIiIiIiKgFVStJCIiIiIiaq0YyBERERERETkYBnJEREREREQOhoEcERERERGRg2EgR0RERERE5GAYyBERERERETkYBnJEREREREQOhoEcERERERGRg2EgR0RERERE5GAYyBERERERETkYBnJEREREREQOhoEcERERERGRg2EgR0RERERE5GAYyBERERERETkYBnJEREREREQOxqWpD4AARVEAAEVFRU18JERERERE1JT0MYE+RpBhINcMXLx4EQAQERHRxEdCRERERETNwcWLF+Hv7y9drlPMhXpkdzU1NcjOzoavry90Ol2THktRUREiIiKQmZkJPz+/Jj0Wcgw8Z8haPGfIWjxnyFo8Z8gaze18URQFFy9eRFhYGJyc5DPhOCLXDDg5OaF9+/ZNfRhG/Pz8msWJTI6D5wxZi+cMWYvnDFmL5wxZozmdL2ojcXosdkJERERERORgGMgRERERERE5GAZyZMTd3R1z586Fu7t7Ux8KOQieM2QtnjNkLZ4zZC2eM2QNRz1fWOyEiIiIiIjIwXBEjoiIiIiIyMEwkCMiIiIiInIwDOSIiIiIiIgcDAM5IiIiIiIiB8NAjgAAJ0+exMyZM9GtWzd4e3ujTZs2iIuLw7vvvovS0tKmPjxqBElJSXjttdcwevRotG/fHu7u7vDx8UFMTAymTJmCbdu2WbW9X3/9Fbfddpth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7dtnsq41fH198eyzzxq2tXr1aqu3oYX+WDMzM5GTk2P2+WqvU1EULF++3LBsxYoVqv+++eYbQ3+5+gHgAw88YPh50aJFqKmp0fT6LKHT6TBp0iQAtSOTn3/+ucXrLlq0yPBz3WO21KBBg/CPf/wDAPDJJ59Y1L6AiMgRMZAjIqJGce211xp+/uabb1SfqyiK4Tmurq4YNmyYpn0+8cQThvl6c+fOtXjeWkNY8zrLysrw448/AqidC6bvn6a3adMmnDp1CgAwadIk3HPPPar/JkyYgBtuuAEAsGrVKly6dMmwrd69e2PMmDEAgP3792PevHkWv6Zt27bhxIkTFj8fAGbMmGGoWvrqq6/i2LFjZtf59ttvDaOFvXr1wi233GLVPvX0FSwvXbpk1eskInIkDOSIiKhRjB07FhEREQCAjz/+GJs3b5Y+94033jCM2o0fP15z7zNvb288//zzAICDBw/il19+0bQda0yZMsUw1+3VV1/F4cOHhc9TFAVPPfWUYR7XY489ZihIold3VO2OO+6waP933nkngNoy/D/99JPRsk8//dTQo+3ll1/GnDlzVNNcS0pK8Oqrr2LUqFFWpUcCQGRkJN59910AtVUor732WtWR2O+++w6TJ08GALi5uWHZsmVWF7nRi4uLw6233goA+Pzzz9lXjohaJJemPgAiImodXFxc8OWXX+KGG25ARUUFrr/+ekyaNAm33HILIiIiUFVVhdTUVCxfvhwbNmwAUNtMuqE9wR577DEsWLAAZ86cMWpUbS9t2rTBRx99hKlTpyI/Px/9+/fHtGnTcP3116Ndu3a4dOkSDh48iPj4eEMRk549e+KFF14w2k5paSl++OEHAEDfvn0RGRlp0f5vvfVWuLm5oaKiAkuXLsX48eMNy9q2bYt169bhlltuwblz5/D6669j2bJluPfeezF48GCEhoaioqICp0+fxh9//IEffvjBovRQmSeffBLHjx/Hhx9+iFOnTqFfv36YMGECxowZg44dO6KyshJHjx7FN998g40bNwIA3N3dsXz58ga3r3jttdewbt06VFRUWDQnk4jI0TCQIyKiRnPddddh9erVmDx5MgoKChAfH4/4+Hjhc3v06IE1a9ZoHo3T8/T0xAsvvIAnn3yyQduxxoMPPoiqqirMmDEDpaWl+OCDD/DBBx8InztkyBB8//33hmqXeqtXrzY01taPslnC398f1113HX755Rds2LAB586dM4zCAUC/fv2we/duTJ8+HevXr0dGRoZq+qG3tzeeffZZdO/e3eJjqOuDDz5At27d8OKLL+LChQtYtmyZsGk5AHTv3h2ffvqppiIn9fXp0we33367IRgmImppmFpJRESNasyYMThx4gTeffddXHfddWjbti3c3Nzg6emJDh064I477sDy5ctx4MABREdH22SfDz/8sCGts7FMmzYNJ06cwCuvvIIhQ4YgJCQErq6u8PHxQVRUFCZOnIi1a9diy5YtRoGWnpa0yvrPr6qqEs7T69ixI9atW4fExEQ8//zz6N+/P9q1awc3Nzf4+Pigc+fOuPPOO/HZZ58hOzsbc+fONcx30+LRRx/F8ePHsWjRIvzjH/9AREQEPDw8DO/FPffcgxUrVuDgwYM2CeL0Xn31VTg58VKHiFomndIYM7+JiIiIiIjIZnibioiIiIiIyMEwkCMiIiIiInIwDOSIiIiIiIgcDAM5IiIiIiIiB8NAjoiIiIiIyMEwkCMiIiIiInIwDOSIiIiIiIgcDAM5IiIiIiIiB8NAjoiIiIiIyMEwkCMiIiIiInIwDOSIiIiIiIgcDAM5IiIiIiIiB8NAjoiIiIiIyMEwkCMiIiIiInIw/w/xdX6EuDcTmwAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "También podemos dibujar un histograma basado en una sóla columna:" + ], + "metadata": { + "id": "3cL2i-Bn-fWC" + } + }, + { + "cell_type": "code", + "source": [ + "movies['PUNTUACION'].plot(kind='hist', title='Puntuación')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 742 + }, + "id": "DE-bdwhA-qq-", + "outputId": "3736d5f6-c5ee-469d-9c25-5396d8fe2a4b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 122 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA40AAALECAYAAACsdNUpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACDJElEQVR4nOzdeVjU5f7/8dcggQiCe4qSpoiobR7FJTW0zSOuaGpWx+WIer5t2rFMy4PapqVmmZaaGlmmqbmT2ea+IWXnWGK4hOFCigsoIIjM7w8vPr+Bmc+wOIrg83Fdc103c9+f99wDc069uu+5Pxar1WoVAAAAAAAOuJX0BAAAAAAANy9CIwAAAADAFKERAAAAAGCK0AgAAAAAMEVoBAAAAACYIjQCAAAAAEwRGgEAAAAAptxLegIAAAA3yrx583Ts2DFJUpcuXRQSElLCMwKAm5/FarVaS3oSAAAA19uiRYv01FNPSZIefvhhff3117rttttKeFYAcPNjeyoAALipbdq0SRaLRRaLRR06dChWjf3792v48OGSpHvvvVdfffUVgREAConQCAC4qXTo0MEICI4eFStWVL169dSjRw998MEHSklJKekp4yaXlpamxx57TGlpabrjjjv09ddfy9fXt6SnBQClBqERAFCqXLx4UUePHtWaNWv0/PPP64477tDChQtLelrFlpCQYATievXqlfR0yqRhw4YpLi5OlStX1vr16+Xv71/SUwKAUoWDcAAAN62QkBC1bNnS+Nlqter8+fPas2ePDh48KElKTU3VwIEDdenSJQ0bNqykpoqb1EcffaQvvvhCnp6eWrVqlZo0aVLSUwKAUofQCAC4aYWFhWnChAkO+1auXKnBgwcb21Off/55hYWFqU6dOjdwhrgROnTooOKc25edna2UlBSNHz9e999/vx544IHrMDsAKPsIjQCAUik8PFweHh7q2rWrJCkzM1Mffvih3nrrrRKeGW4W7u7uGjNmTElPAwBKPb7TCAAotbp06aJ7773X+Pn7778vwdkAAFA2ERoBAKXa/fffb7SPHDlitAcNGmQcMBMVFVVgnaioKGP8oEGDijRm5cqV6tatm+644w55enqqRo0aevTRR/X555+bbqvMrXXnnXcazx09etT01NiiztVWUQ7biYuL0/Tp09WrVy81atRIFStW1G233abq1aurRYsWeuGFF7R///4CXzO/K1euaOnSpRowYIAaNWqkypUr67bbblPVqlXVqlUrjRgxQj/88IPD31dxbrmxYcMG/fOf/1RQUJB8fX3l5eWlunXrKjw8XFFRUbp8+XKBNRx9htLT0/Xhhx+qXbt2uv322+Xp6amAgAD1799f27dvL8qvBABKDbanAgBKtcqVKxvt1NTUG/raKSkpGjBggNasWZPn+dOnT+u7777Td999p0WLFmnFihXy8vK6oXMrjr59+2rZsmUO+5KTk5WcnKyffvpJ77//vkaMGKGpU6eqXLlyBdbdunWrIiIiFB8fb9d39uxZxcTEKCYmRjNmzNDLL7+syZMnF/s9nDp1Sk888YR++OEHu74///xTf/75p1atWqW33npLX3zxhVq0aFHo2vv379djjz2muLi4PM8fO3ZMS5Ys0ZIlSxQZGamJEycWe/4AcDMiNAIASrVz584ZbT8/vxv2utnZ2erdu7d++OEHeXh46P7771eDBg106dIlbd26VX/++ack6ZtvvtG///1vffTRR3mub9y4sZ555hlduHDBuGVIxYoVNWDAgBv2HvLLnbO7u7uaNGmihg0bqlKlSipXrpxOnTqlPXv26Pjx47JarXrvvfeM75E6s2TJEg0YMCDPyl5QUJCaNWsmPz8/paam6rffftNvv/2mnJwcXbp0qdjz/+uvv9S2bVsdPnzYeK5BgwZq1aqVPD09tX//fu3evVuSdPDgQXXs2FHffPON2rZtW2DtEydO6OGHH9bJkydVqVIltW/fXjVr1lRycrJ+/PFH40Cm1157TU2aNFG/fv2K/T4A4GZDaAQAlGq2WwJtt3peb8uXL1dmZqY6d+6sjz/+WLVr1zb6srOzNXbsWE2dOlWSNGfOHL388st5toa2atVKrVq1UkJCghEaq1SpopkzZ96w95Bfx44dNWrUKHXq1Em+vr52/VarVevWrdOQIUN0+vRpffTRR3riiSfUrl07h/X27t2rwYMHG4GxWbNm+uijj9SqVSu7sUlJSfr888+Vk5NT7PkPHjzYCIze3t6aN2+eHn/88TxjYmNj1a9fPx05ckQXL15U//799b///U+VKlVyWvu1115TZmamXn75ZUVGRqpChQpG39mzZ9WnTx/9+OOPkqRXXnlFffv2tdtWDAClFd9pBACUWtHR0frf//5n/PzQQw/dsNfOzMxU+/bt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v/76S3v27NGvv/4qi8WiFi1aKCwszGnd8ePHO3y+a9euGjBggHr37u1wlTM5OVlt27ZVfHy8JGnz5s164IEH7MbFx8eradOmys7OVosWLbRlyxZ5eXkZ/enp6QoNDVVsbKzc3d0VFxenwMBAuzoLFizQkCFDJElPP/20Zs2alaf/0KFDat68uVJTUxUYGKi4uDi5u9sfXjtgwAB99tlnkqSlS5eqT58+efqXLl2qfv36SZIGDhyoqKgoh78fR1hpBADAOVYaUVSsNKK0Kko2cFlolKTXXntNEyZM0L333qu5c+cqJCTE4bg9e/Zo+PDh+u9//6vx48crMjLSVVPIY926derWrZsk6bnnntOMGTPsxjz99NP66KOPJEk7d+5U69at7cbs2rVLbdq0McbnD4SS1KRJE8XFxalKlSpKTExUhQoV7MZMnjxZY8eOleQ4ECYlJal27drKyclRp06d9M033zh8X3//+9+1YcMGubm56fjx46pZs6azX4OB0AgAgHOERhQVoRGlVYlsT/3hhx80YcIEBQUFadu2baaBUZJCQkK0detWBQYGauLEifr+++9dNY08OnbsaLQPHz5s12+1WrV69WpJUnBwsMPAKEmtW7dWo0aNJEmrV6+22zYbHx+vuLg4SVLfvn0dBkZJebbJrly50q5/zZo1ysnJkSQNHjzY7G0ZdXJycrRmzRrTcQAAAABwrVwWGmfMmCGLxaIxY8bI29u7wPHe3t4aM2aMrFarPvjgA1dNI4/MzEyj7WgL6x9//GF8NzI0NNRprdz+48ePKyEhIU+f7SmtzurUrFlTQUFBkqTt27fb9Re2jm2fozoAAAAA4CouC42532O85557Cn3NvffeK0mmp41eq82bNxvtxo0b2/Xv37/faAcHBzutZdufu6p4LXUSExOVlpbmsI6fn5/TLae1atUylpDzzwUAAAAAXMllofHs2bOSpJSUlEJfk5qaKkk6d+6cq6ZhyMnJ0eTJk42f+/btazfG9vTROnXqOK0XEBBgtBMTE6+5jtVqtTv9NPfngmrY1sk/FwAAAABwJZeFRn9/f0nSV199Vehrli9fLunqypmrTZ8+XTExMZKu3v6iefPmdmMuXLhgtH18fJzWs91ye/Hixetap6AatnXy17CVmZmp1NTUPA8AAAAAKAqXhca///3vslqtmjNnjpYuXVrg+OXLl2vOnDmyWCwF3najqDZv3qwxY8ZIkmrUqGGcjprfpUuXjLaHh4fTmp6enkY7IyPjutYpqIZtnfw1bE2aNEl+fn7Gw3a1FAAAAAAKw2Wh8ZVXXpGvr69ycnLUv39/9ezZU6tWrdLx48d1+fJlZWdn6/jx41q1apXCw8PVr18/XblyRRUrVjRuQ+EKv/32m8LDw5Wdna3y5ctr2bJlqlGjhsOx5cuXN9pZWVlO69oeqmN7H8frUaegGrZ18tewNXbsWKWkpBgPtrICAAAAKCr7u8sXU+3atbV27Vp169ZNqampWrt2rdauXWs63mq1qmLFilq9erVq167tkjn88ccfevTRR3Xu3DmVK1dOS5Ys0QMPPGA6vmLFikbb2TZPSXkOrcm/fTR/HdsQWdQ66enpBc7Fto6zrayenp55VjYBAAAAoKhcttIoSe3bt9e+ffvUu3dvubm5yWq1Ony4ubmpV69e+t///lfgrS4K68SJE3r44Yd14sQJWSwWLViwQD169HB6je2BM/kPpcnPdpUu/zbP4tSxWCx2B97k/lxQDds6bDkFAAAAcD25bKUxV0BAgJYtW6a//vpLGzdu1L59+4yTVStXrqy7775bHTt2dHpLiaJKTk7WI488oiNHjkiSPvjgAw0YMKDA65o0aWK0Dxw44HSsbX/+23fkr3PfffcVWCcgIMDufpZNmjTRTz/9pJSUFCUlJZn+jk6ePGkcauPoViIAAAAA4CouD425br/9dj3++ON6/PHHr9dLSLp6i49OnToZ9zicPHmynnnmmUJde+edd8rf318nTpzIc09HR7Zs2SLp6jbcevXq5elr166d0d68ebPpe05KSlJ8fLwkqW3btnb97dq102effWbU6devn8M6tnN1VAcAAAAAXMWl21NvtPT0dHXp0kU///yzJOnVV1/Vyy+/XOjrLRaLsYX1wIED2rVrl8Nxu3btMlYIe/ToIYvFkqc/KCjIWPFbunSp0tPTHdaJiooy2uHh4Xb93bt3l5vb1T/JJ598Yjrv3Dpubm7q3r276TgAAAAAuFbXLTRmZGRo27ZtWr58uRYuXOjyewRmZWUpPDxc27dvlySNGDFCb7zxRpHrjBw5UuXKlZMkPffcc3a3sMjIyNBzzz0nSXJ3d9fIkSMd1nnxxRclSWfPntXo0aPt+g8fPqxJkyZJkgIDAx2Gxpo1a+rJJ5+UJG3YsMG4j6WtZcuWacOGDZKkf/zjHy7d5gsAAAAA+VmsVqvVlQUTExP1yiuvaNmyZbp8+bLx/L59+/J892/+/PmaM2eO/Pz89O2339qt3hWkd+/eWrFihSTpwQcf1Hvvvee0hoeHh4KCghz2jR07VpMnT5YkNWvWTC+//LIaNGigw4cP6+2339bevXuNcW+99ZbDGleuXFFoaKgRYnv37q2hQ4eqcuXKiomJ0euvv65Tp07Jzc1N69atU+fOnR3WSUxMVPPmzXX69Gm5u7tr1KhR6tq1qyRp3bp1mjZtmrKzs1W9enX9/PPPdofpOJOamio/Pz+lpKTI19e30NcBAHCrqDcmuqSngFImYXKXkp4CUCxFyQYuDY27d+9Wly5ddO7cOdmWtVgsdqHx1KlTuuOOO3T58mV9/fXX6tSpU5Feq6ghs27dukpISHDYl5OTo6FDh2rBggWm1w8ZMkRz5841to86kpycrLCwMO3Zs8dhv6enp2bOnKmIiAinc929e7d69uyppKQkh/01a9bUqlWr1KpVK6d18iM0AgDgHKERRUVoRGlVlGzgsu2p58+fV48ePXT27FnVrFlTH374ofbt22c6vkaNGsZqW3R0yf4ftJubm+bPn6/o6Gj16NFD/v7+8vDwkL+/v3r06KGvv/5a8+bNcxoYJalatWrasWOHPvzwQ7Vr105Vq1ZV+fLlVb9+fQ0dOlQ//fRTgYFRklq1aqV9+/Zp3Lhxuuuuu+Tj4yMfHx/dfffdGjdunH799dciB0YAAAAAKA6XrTS+9tprmjBhgqpVq6bY2Fjdcccdkq4GMkcrjZI0a9YsPffcc2rZsqXpITRwHVYaAQBwjpVGFBUrjSitSmSlce3atbJYLPr3v/9tBMaCNG3aVNLVQ2IAAAAAADcfl4XGQ4cOSZIeeOCBQl9TuXJlSXL5yaoAAAAAANdwWWi8dOmSJOm2224r9DVpaWmSJC8vL1dNAwAAAADgQu6uKlSjRg0dO3ZMf/zxh0JCQgp1zS+//CJJ8vf3d9U0AABAIfDdPQBAYblspTH3NM/169cXarzVatXHH38si8Wi9u3bu2oaAAAAAAAXcllofPLJJ2W1WrVo0SJjBdGZUaNG6b///a8kaeDAga6aBgAAAADAhVwWGnv06KGOHTsqOztbDz30kD766COdOnXK6M/OztaJEye0bNkytW/fXu+//74sFot69eql+++/31XTAAAAAAC4kMvu0yhJ58+f10MPPaS9e/fKYrE4HWu1WtW6dWt999138vb2dtUU4AT3aQQA5OI7jYBrcJ9GlFYlcp9GSapUqZJ27typsWPHytfXV1ar1eHDy8tLo0eP1qZNmwiMAAAAAHATc9npqbk8PDz05ptv6pVXXtHmzZsVGxurU6dO6cqVK6pataqaNWumhx9+WH5+fq5+aQAAAACAi7ksNC5cuFCS1KhRI7Vq1Ure3t4KCwtTWFiYq14CAAAAAHCDuWx76qBBgzR48GAdPXrUVSUBAAAAACXMZaExd7tpw4YNXVUSAAAAAFDCXBYa77zzTknSuXPnXFUSAAAAAFDCXBYaw8PDZbVatXbtWleVBAAAAACUMJeFxhEjRqhu3br66KOP9MMPP7iqLAAAAACgBLksNPr6+uq7775TcHCw/v73v2vYsGHatGmTzp49K6vV6qqXAQAAAADcQC675Ua5cuWMttVq1fz58zV//vxCXWuxWJSdne2qqQAAAAAAXMRloTH/aiKriwAAAABQ+rksNI4fP95VpQAAAAAAN4lihcaFCxdKknr27ClfX19JhEYAAAAAKIuKFRoHDRoki8WiFi1aqEmTJnb9p0+f1kcffSSLxaL//Oc/1zxJAAAAAEDJcNn2VFunTp3ShAkTCI0AAAAAUMq57JYbAAAAAICyh9AIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU9d0y40PP/xQNWrUsHv+1KlTRvu1114rVK3IyMhrmQoAAAAA4DqwWK1Wa1EvcnNzk8VicelErly54tJ6sJeamio/Pz+lpKTI19e3pKcDAChB9cZEl/QUgDIhYXKXkp4CUCxFyQbFXmksRtY05eoACgAAAABwjWKFxo0bN7p6HgAAAACAm1CxQmNoaKir5wEAAAAAuAlxeioAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU4RGAAAAAIApQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKZKdWg8deqU1q1bp8jISHXu3FnVqlWTxWKRxWLRoEGDClUjKirKuKagR1RUVIH10tPT9c477ygkJERVqlSRt7e3goODNWrUKB09erTQ7+3o0aMaNWqUgoOD5e3trSpVqigkJERTpkxRenp6oesAAAAAwLVwL+kJXIvbb7+9pKeQx6FDhxQWFqaDBw/mef7333/X77//rnnz5mnRokXq2rWr0zpr167VU089pdTUVOO59PR0xcbGKjY2VvPmzVN0dLQCAwOvy/sAAAAAgFylOjTauuOOOxQcHKxvv/222DU2bNggf39/0/46deqY9l24cEFdunQxAuPQoUP1+OOPy8vLSxs3btSkSZOUmpqqfv36afv27brvvvsc1tm7d6/69eunjIwM+fj4aOzYserYsaMyMjK0ZMkSffzxx4qPj1eXLl0UGxurihUrFvv9AgAAAEBBSnVojIyMVEhIiEJCQnT77bcrISFBd955Z7HrBQUFqV69esW6dsqUKYqPj5ckvfPOO3rppZeMvjZt2qhDhw4KDQ1Venq6Ro4cqU2bNjmsM2LECGVkZMjd3V3ffvut2rRpY/Q9+OCDatiwoUaPHq34+HhNmzZNEyZMKNZ8AQAAAKAwSvV3GidOnKiuXbuW+DbVy5cva8aMGZKkxo0ba9SoUXZj7r//fg0ZMkSStHnzZu3Zs8duTExMjLZu3SpJGjJkSJ7AmGvUqFFq3LixJOn999/X5cuXXfY+AAAAACC/Uh0abxYbN25USkqKJGngwIFyc3P8a7U9nGflypV2/atWrTLagwcPdljDzc1NAwYMkCSdP39eGzduLOasAQAAAKBghEYX2LZtm9EODQ01HdeiRQtVqFBBkrR9+3bTOt7e3mrevLlpHdvXcFQHAAAAAFyF0Ghj8ODB8vf3l4eHh6pVq6bWrVtr3LhxOn78uNPr9u/fb7SDg4NNx7m7uxsnnsbFxdn15z4XGBgod3fzr5vavoajOgAAAADgKoRGG5s2bdLJkyd1+fJlnTlzRrt379abb76pwMBAzZkzx/S6Y8eOSbq6QlipUiWnrxEQECBJOn36tDIzM43nL126pOTkZEnOT2mVpMqVK8vb21uSlJiYWOD7AgAAAIDiKtWnp7pK/fr11atXL7Vp08YIdUeOHNFXX32l5cuX69KlS/rXv/4li8WiYcOG2V1/4cIFSZKPj0+Br5Ub9iTp4sWL8vT0zFOjKHXS0tJ08eJF0zGZmZl5gqntfR8BAAAAoDBu+dAYHh6ugQMHymKx5Hk+JCRE/fr107p169SrVy9dvnxZL7zwgrp3766aNWvmGXvp0iVJkoeHR4GvlxsSJSkjI8OuRlHr2NbIb9KkSZo4cWKBtQAAAADAzC2/PdXPz88uMNrq2rWrIiMjJUnp6emaP3++3Zjy5ctLkrKysgp8PduVPy8vL7saRa1jWyO/sWPHKiUlxXiwlRUAAABAUd3yobEwhg0bZgTLzZs32/VXrFhRkpxuFc2VlpZmtG23oebWKGodZ1tZPT095evrm+cBAAAAAEVBaCyEGjVqqGrVqpLk8CTV3INr0tLSdP78eae1clf7qlevnmeravny5Y3XyD1Yx8y5c+eM0Jj7HUwAAAAAuB4IjYXkbAtrkyZNjPaBAwdMx2VnZ+vw4cOSpMaNG5vWOXTokLKzs03r2L6GozoAAAAA4CqExkI4ffq0cTsMf39/u/527doZbUfbV3PFxsYaK4Rt27Y1rZOWlqaffvrJtI7taziqAwAAAACuQmgshLlz58pqtUqSQkND7fo7dOggPz8/SdKnn35qjM0vKirKaIeHh9v19+zZ02h/8sknDmvk5ORo4cKFkqRKlSqpY8eOhXoPAAAAAFAct3RoTEhI0N69e52OWbdunV577TVJV08qHTx4sN0YDw8PPf/885KkuLg4TZ061W7Mzp07jZNXQ0NDFRISYjemZcuWat++vSRp/vz52rlzp92YadOmKS4uTpI0YsQI3XbbbU7nDwAAAADXolTfp3Hbtm06dOiQ8XPuFlLp6vcCbVf2JGnQoEF5fk5ISFDHjh3Vpk0bdevWTffee69q1KghSTpy5IiWL1+u5cuXGyuHU6dOVe3atR3O5aWXXtKXX36p+Ph4jR49WocOHdLjjz8uLy8vbdy4UW+99Zays7Pl5eWl9957z/Q9vf/++2rbtq0yMjL06KOP6pVXXlHHjh2VkZGhJUuWaO7cuZKkoKAgjRo1qrC/KgAAAAAoFovVbC9lKTBo0CB9+umnhR6f/61u2rSpUNs7K1SooOnTp2vYsGFOxx06dEhhYWE6ePCgw35fX18tWrRIXbt2dVpn7dq1euqpp5SamuqwPygoSNHR0QoMDCxw7rZSU1Pl5+enlJQUbr8BALe4emOiS3oKQJmQMLlLSU8BKJaiZINSvdJ4rZo3b67PP/9cO3fuVGxsrE6ePKnk5GRlZ2ercuXKatq0qR566CFFREQYK5DOBAYGau/evZo1a5aWLVumQ4cOKSsrSwEBAQoLC9OIESNUt27dAut069ZN//vf//T+++8rOjpax44dk4eHhwIDA9WnTx89++yzqlChgit+BQAAAADgVKleaUTRsNIIAMjFSiPgGqw0orQqSja4pQ/CAQAAAAA4R2gEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYIrQCAAAAAAwRWgEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYIrQCAAAAAAwRWgEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYIrQCAAAAAAwRWgEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYIrQCAAAAAAwRWgEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYIrQCAAAAAAwRWgEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYKpUh8ZTp05p3bp1ioyMVOfOnVWtWjVZLBZZLBYNGjSoyPXWr1+v8PBw1alTR56enqpTp47Cw8O1fv36QtfIzs7W7Nmz1b59e1WvXl1eXl5q0KCBhg8frt9++63QdZKTkxUZGal77rlHvr6+8vX11T333KPIyEidOXOmyO8NAAAAAIrDYrVarSU9ieKyWCymfQMHDlRUVFSh6uTk5GjYsGGaP3++6ZiIiAjNmTNHbm7mOTs5OVlhYWHas2ePw35PT0/NnDlTERERTueze/du9ezZU0lJSQ77a9WqpVWrVqlly5ZO6+SXmpoqPz8/paSkyNfXt0jXAgDKlnpjokt6CkCZkDC5S0lPASiWomSDUr3SaOuOO+7Qo48+WqxrX331VSMwNmvWTIsXL1ZMTIwWL16sZs2aSZLmzZuncePGmda4cuWKwsPDjcDYq1cvrV+/Xrt379aMGTNUo0YNZWZmavjw4U5XLhMTE9WtWzclJSXJ3d1do0eP1pYtW7RlyxaNHj1a7u7uOnnypLp166Zjx44V6/0CAAAAQGGV6pXG8ePHKyQkRCEhIbr99tuVkJCgO++8U1LhVxrj4+PVtGlTZWdnq0WLFtqyZYu8vLyM/vT0dIWGhio2Nlbu7u6Ki4tTYGCgXZ0FCxZoyJAhkqSnn35as2bNytN/6NAhNW/eXKmpqQoMDFRcXJzc3d3t6gwYMECfffaZJGnp0qXq06dPnv6lS5eqX79+RXqPuVhpBADkYqURcA1WGlFa3TIrjRMnTlTXrl11++23F7vGe++9p+zsbEnSBx98kCcwSlKFChX0wQcfSLr6fcXp06c7rDN16lRJUpUqVTRlyhS7/sDAQI0dO1bS1QC5cuVKuzFJSUlatGiRJKlTp052gVGS+vbtq06dOkmSPvvsM9MtrAAAAADgCqU6NF4rq9Wq1atXS5KCg4PVunVrh+Nat26tRo0aSZJWr16t/Iuz8fHxiouLk3Q11FWoUMFhHdvDeRyFxjVr1ignJ0eSNHjwYNN559bJycnRmjVrTMcBAAAAwLW6pUPjH3/8oRMnTkiSQkNDnY7N7T9+/LgSEhLy9G3bts1unCM1a9ZUUFCQJGn79u12/YWtY9vnqA4AAAAAuMotHRr3799vtIODg52Ote3PXVW8ljqJiYlKS0tzWMfPz081a9Y0rVGrVi1j33H+uQAAAACAK93SodH29NE6deo4HRsQEGC0ExMTr7mO1Wq1O/009+eCatjWyT8XAAAAAHAl++M7byEXLlww2j4+Pk7Hent7G+2LFy9e1zoF1bCtk7+GrczMTGVmZho/p6amFlgXAAAAAGzd0iuNly5dMtoeHh5Ox3p6ehrtjIyM61qnoBq2dfLXsDVp0iT5+fkZD9vVUgAAAAAojFs6NJYvX95oZ2VlOR1ru2KX/7Ycrq5TUA3bOvlr2Bo7dqxSUlKMB1tZAQAAABTVLb09tWLFikbb2TZPSXkOrcm/fTR/HdsQWdQ66enpBc7Fto6zrayenp55VjYBAAAAoKhu6ZVG2wNn8h9Kk5/tKl3+bZ7FqWOxWOwOvMn9uaAatnXYcgoAAADgerqlQ2OTJk2M9oEDB5yOte1v3LjxNdcJCAjIcyiObZ2UlBQlJSWZ1jh58qRxqE3+uQAAAACAK93SofHOO++Uv7+/JGnz5s1Ox27ZskWSVLt2bdWrVy9PX7t27Yy2szpJSUmKj4+XJLVt29auv7B1bPsc1QEAAAAAV7mlQ6PFYlGPHj0kXV0B3LVrl8Nxu3btMlYIe/ToIYvFkqc/KCjIWPFbunSp0tPTHdaJiooy2uHh4Xb93bt3l5vb1T/JJ598Yjrv3Dpubm7q3r276TgAAAAAuFa3dGiUpJEjR6pcuXKSpOeee87uFhYZGRl67rnnJEnu7u4aOXKkwzovvviiJOns2bMaPXq0Xf/hw4c1adIkSVJgYKDD0FizZk09+eSTkqQNGzZo+fLldmOWLVumDRs2SJL+8Y9/qGbNmoV5mwAAAABQLKX69NRt27bp0KFDxs/JyclG+9ChQ3lW9iRp0KBBdjWCgoL00ksvafLkyYqNjVXbtm318ssvq0GDBjp8+LDefvtt7d27V5L00ksvqWHDhg7nMnDgQC1YsEDbt2/XrFmzlJSUpKFDh6py5cqKiYnR66+/rtTUVLm5uWnGjBlyd3f8q3/zzTf1zTff6PTp0+rfv79iY2PVtWtXSdK6des0bdo0SVL16tX1xhtvFPp3BQAAAADFYbFardaSnkRxDRo0SJ9++mmhx5u91ZycHA0dOlQLFiwwvXbIkCGaO3eusX3UkeTkZIWFhWnPnj0O+z09PTVz5kxFREQ4nefu3bvVs2dP08NwatasqVWrVqlVq1ZO6+SXmpoqPz8/paSkyNfXt0jXAgDKlnpjokt6CkCZkDC5S0lPASiWomSDW357qnT1u4Hz589XdHS0evToIX9/f3l4eMjf3189evTQ119/rXnz5jkNjJJUrVo17dixQx9++KHatWunqlWrqnz58qpfv76GDh2qn376qcDAKEmtWrXSvn37NG7cON11113y8fGRj4+P7r77bo0bN06//vprkQMjAAAAABRHqV5pRNGw0ggAyMVKI+AarDSitGKlEQAAAADgEoRGAAAAAIApQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU4RGAAAAAIApQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU4RGAAAAAIApQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU4RGAAAAAIApQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU4RGAAAAAIApQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU4RGAAAAAIApQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjZIsFkuhHh06dCiw1vr16xUeHq46derI09NTderUUXh4uNavX1/o+WRnZ2v27Nlq3769qlevLi8vLzVo0EDDhw/Xb7/9dg3vFAAAAACKxr2kJ1BW5OTkaNiwYZo/f36e548fP67jx49r1apVioiI0Jw5c+TmZp7Vk5OTFRYWpj179uR5/siRI5o7d64+/fRTzZw5UxEREdflfQAAAACALUKjjf/7v//T008/bdrv7e1t2vfqq68agbFZs2YaPXq0GjRooMOHD+udd97R3r17NW/ePFWvXl1vvfWWwxpXrlxReHi4ERh79eqloUOHqkqVKtq9e7feeOMNnTp1SsOHD1ft2rXVuXPna3i3AAAAAFAwi9VqtZb0JEqaxWKRJI0fP14TJkwo8vXx8fFq2rSpsrOz1aJFC23ZskVeXl5Gf3p6ukJDQxUbGyt3d3fFxcUpMDDQrs6CBQs0ZMgQSdLTTz+tWbNm5ek/dOiQmjdvrtTUVAUGBiouLk7u7oXP/ampqfLz81NKSop8fX2L/D4BAGVHvTHRJT0FoExImNylpKcAFEtRsgHfaXSB9957T9nZ2ZKkDz74IE9glKQKFSrogw8+kHT1+4rTp093WGfq1KmSpCpVqmjKlCl2/YGBgRo7dqykqwFy5cqVLnsPAAAAAOAIofEaWa1WrV69WpIUHBys1q1bOxzXunVrNWrUSJK0evVq5V/gjY+PV1xcnCSpb9++qlChgsM6gwYNMtqERgAAAADXG6HxGv3xxx86ceKEJCk0NNTp2Nz+48ePKyEhIU/ftm3b7MY5UrNmTQUFBUmStm/fXpwpAwAAAEChERptLFu2TE2aNFGFChVUsWJFNWzYUAMHDtTGjRtNr9m/f7/RDg4Odlrftj93VfFa6iQmJiotLc3pWAAAAAC4FoRGG/v371dcXJwyMjJ08eJFHTp0SAsXLtSDDz6o8PBwpaSk2F1z7Ngxo12nTh2n9QMCAox2YmLiNdexWq15rgMAAAAAV+OWG7p6UE337t310EMPKTg4WD4+Pjp9+rQ2b96s2bNn68yZM1q1apV69Oih7777Trfddptx7YULF4y2j4+P09exvWXHxYsX8/S5qo6tzMxMZWZmGj+npqY6rQsAAAAA+REadfU7hpUqVbJ7/pFHHtFzzz2nzp07a+/evdq8ebM++ugjPf/888aYS5cuGW0PDw+nr+Pp6Wm0MzIy8vS5qo6tSZMmaeLEiU5rAQAAAIAzbE+VHAbGXLfffruWL19urC7m3jojV/ny5Y12VlaW09exXfXLf1sOV9WxNXbsWKWkpBiP/FtiAQAAAKAghMZCqF+/vh555BFJV++PmHtaqiRVrFjRaDvbKiopz6E1+beguqqOLU9PT/n6+uZ5AAAAAEBREBoLqUmTJkb7+PHjRtv20JqCDqWxXemzPRSnuHUsFkuBh+YAAAAAwLUgNBaSxWJx+LxtmDxw4IDTGrb9jRs3vuY6AQEBeQ7FAQAAAABXIzQWku19FP39/Y32nXfeafy8efNmpzW2bNkiSapdu7bq1auXp69du3ZG21mdpKQkxcfHS5Latm1buMkDAAAAQDERGgvhjz/+0HfffSdJatCggWrXrm30WSwW9ejRQ9LVFcBdu3Y5rLFr1y5jhbBHjx52K5dBQUHG6uPSpUuVnp7usE5UVJTRDg8PL94bAgAAAIBCslitVmtJT6IkrV27Vp07d5a7u+O7j/z111/GLTckadq0afr3v/+dZ0x8fLyaNGmiK1euqEWLFtqyZUueU00zMjL0wAMPKDY2Vu7u7tq/f78aNmxo91oLFizQkCFDJEnPPPOMZs6cmaf/8OHD+tvf/qbU1FQFBgYqLi7OdN6OpKamys/PTykpKRyKA+CWUG9MdElPAUAZlzC5S0lPASiWomSDW/4+jc8995wuX76s3r17q02bNqpXr568vLyUnJysTZs2ac6cOUpOTpZ0dQvpM888Y1cjKChIL730kiZPnqzY2Fi1bdtWL7/8sho0aKDDhw/r7bffNkLnSy+95DAwStLAgQO1YMECbd++XbNmzVJSUpKGDh2qypUrKyYmRq+//rpSU1Pl5uamGTNmFCkwAgAAAEBx3PIrjfXq1dPRo0cLHNe7d2/NmzfP9J6OOTk5Gjp0qBYsWGBaY8iQIZo7d67c3Mx3BScnJyssLEx79uxx2O/p6amZM2cqIiKiwDnnx0ojgFsNK40ArjdWGlFasdJYBJ9++qk2b96snTt36siRI0pOTlZqaqp8fHwUEBCg+++/XwMHDlSbNm2c1nFzc9P8+fPVu3dvzZ07V3v27FFycrKqVaumkJAQDR8+XJ07dy5wPtWqVdOOHTv08ccf64svvlBcXJzS0tLk7++vhx56SCNGjFDTpk1d9fYBAAAAwKlbfqXxVsJKI4BbDSuNAK43VhpRWhUlG3B6KgAAAADA1C2/PRUAAAAoLnY0mGMVtuxgpREAAAAAYIrQCAAAAAAwRWgEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYIrQCAAAAAAwRWgEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYIrQCAAAAAAwRWgEAAAAAJgiNAIAAAAATBEaAQAAAACmCI0AAAAAAFOERgAAAACAKUIjAAAAAMAUoREAAAAAYIrQCAAAAAAwRWgEAAAAAJhyL+kJ4NZWb0x0SU/hppQwuUtJTwEAAACQxEojAAAAAMAJQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU4RGAAAAAIApQiMAAAAAwBShEQAAAABgitAIAAAAADBFaAQAAAAAmCI0AgAAAABMERoBAAAAAKYIjQAAAAAAU4RGAAAAAIApQiMAAAAAwJR7SU8A5o4ePaoZM2YoOjpaiYmJ8vT0VIMGDdS3b18988wzqlChQklPEcBNot6Y6JKeAgAAKKMIjTeptWvX6qmnnlJqaqrxXHp6umJjYxUbG6t58+YpOjpagYGBJThLAAAAAGUd21NvQnv37lW/fv2UmpoqHx8fvfnmm9qxY4d++OEHDR06VJIUHx+vLl266MKFCyU8WwAAAABlGSuNN6ERI0YoIyND7u7u+vbbb9WmTRuj78EHH1TDhg01evRoxcfHa9q0aZowYULJTRYAAABAmcZK400mJiZGW7dulSQNGTIkT2DMNWrUKDVu3FiS9P777+vy5cs3dI4AAAAAbh2sNN5kVq1aZbQHDx7scIybm5sGDBigsWPH6vz589q4caMeffTRGzRDoORw2AsAAMCNR2i8yWzbtk2S5O3trebNm5uOCw0NNdrbt28nNJYxhCMAAADcLAiNN5m4uDhJUmBgoNzdzf88wcHBdtcAAAAANwv+I7hjCZO7lPQUiozvNN5ELl26pOTkZElSnTp1nI6tXLmyvL29JUmJiYnXfW4AAAAAbk2sNN5EbG+f4ePjU+B4b29vpaWl6eLFiw77MzMzlZmZafyckpIiSXnu/VjScjLTS3oKAAAAwA1zs/y7eO48rFZrgWMJjTeRS5cuGW0PD48Cx3t6ekqSMjIyHPZPmjRJEydOtHs+ICCgmDMEAAAAcC383ivpGeR14cIF+fn5OR1DaLyJlC9f3mhnZWUVOD53FdHLy8th/9ixY/Xvf//b+DknJ0dnz55V1apVZbFYrnG21y41NVUBAQFKTEyUr69vSU8HNzk+LygqPjMoKj4zKCo+Myiqm+kzY7VadeHCBfn7+xc4ltB4E6lYsaLRNttyaistLU2S+VZWT09PYzUyV6VKlYo/wevE19e3xP9Hg9KDzwuKis8MiorPDIqKzwyK6mb5zBS0wpiLg3BuIuXLl1fVqlUlSceOHXM69ty5c0ZoZLspAAAAgOuF0HiTadKkiSTp0KFDys7ONh134MABo924cePrPi8AAAAAtyZC402mXbt2kq5uPf3pp59Mx23evNlot23b9rrP63rw9PTU+PHj7bbQAo7weUFR8ZlBUfGZQVHxmUFRldbPjMVamDNWccPExMSoVatWkqThw4dr9uzZdmNycnJ01113KS4uTpUqVdKpU6d022233eipAgAAALgFsNJ4k2nZsqXat28vSZo/f7527txpN2batGmKi4uTJI0YMYLACAAAAOC6YaXxJrR37161bdtWGRkZ8vHx0SuvvKKOHTsqIyNDS5Ys0dy5cyVJQUFBio2NzXPqKgAAAAC4EqHxJrV27Vo99dRTSk1NddgfFBSk6OhoBQYG3uCZAQAAALiVEBpvYkePHtX777+v6OhoHTt2TB4eHgoMDFSfPn307LPPqkKFCiU9RQAAAABlHN9pvInVrVtX7777rn7//XelpaXp3Llz2rNnj0aPHl2qA+PRo0c1atQoBQcHy9vbW1WqVFFISIimTJmi9PT0kp4eboDY2Fi99tprevTRR1WnTh15enrKx8dHQUFBGjx4sLZt21akeuvXr1d4eLhRq06dOgoPD9f69euv0zvAzeLll1+WxWIxHps2bSrwGj4vt54///xT48ePV4sWLVS9enWVL19eAQEBat++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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "También podemos representar el método describe con una gráfica de tipo box:" + ], + "metadata": { + "id": "Df_Qhy91_FQD" + } + }, + { + "cell_type": "code", + "source": [ + "movies['RECAUDACION'].describe()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6D4JwHzN_MJl", + "outputId": "cfd4c880-9ee7-4ada-e405-93e20d523e58" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "count 1.017800e+04\n", + "mean 2.531401e+08\n", + "std 2.777880e+08\n", + "min 0.000000e+00\n", + "25% 2.858898e+07\n", + "50% 1.529349e+08\n", + "75% 4.178021e+08\n", + "max 2.923706e+09\n", + "Name: RECAUDACION, dtype: float64" + ] + }, + "metadata": {}, + "execution_count": 123 + } + ] + }, + { + "cell_type": "code", + "source": [ + "movies['RECAUDACION'].plot(kind='box')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 733 + }, + "id": "QPraSDs-_SlR", + "outputId": "01c3ceb5-b7af-467a-efa8-a3761c89c82c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 124 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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a8aOHWtcU1hYeFb7wIEDa/x3Dw8P16WXXqpbb71Vs2fP1rZt2+r9HZ3Z7XZdfPHFxr3vvvvuBt2nsb8Hx/gDBw6s13gbN27Ugw8+qMsvv1wdO3aUn5+fIiIi1K9fP82YMUPbt2+v132c/127du2qioqKWvs7/57Xr19frzEAwG3sAAC3WLdunV1SvX4uvfRS+65du2q8V33v4/i5/PLLa63t73//uz0sLKxe94qNjbVv2rSpzu/7zjvvuFzXq1evev07vf3228Y1b7/9dr2uueuuu4xrqvt3S0hIqPe/lcVisV9//fX2r7/+ul5jO2zYsMHlPm3atLGXlpaaukdT/B4c7QkJCbWOtXv3bvuwYcPqHKdVq1b2Bx980F5WVlbr/X593WuvvVZrf+ff87p16+r6pwEAt/JpWPQCADSl++67T/fff7/x+eDBgyooKNDs2bO1Z88effvttxo5cqTy8vLk7e1d432uuuoqvf3223WOFxAQUO35qqoq3XfffZo/f74kycvLS8nJybrpppsUFRWlkJAQHTp0SPn5+Vq+fLk2btyorVu36sUXX1RmZmatY/7jH/+QJAUFBenEiRP64YcftGXLFl199dV11tuc8vPzjePKykodP35ce/fu1ebNm5Wenq79+/fr888/19VXX61XX3213jNKv/6+x48f1yeffKJbbrmlzmub8/dQne+//15JSUnas2ePJKlnz54aN26cYmNj1bZtWx04cEBr167V22+/raNHj+qVV17RN998o+XLlys4OLheY8ycOVPjx4+Xv7+/6foAoMVxd4oDAE/lPBP19NNPV9vHarXau3XrZvT76KOPqu2nes421GXatGnGvXr06GH/73//W2v/jRs32n/3u9/Zk5OTa+23e/duu5eXl12Sfc6cOfa2bdvaJdknTpxYZ03NPRNVm7KyMvsLL7xg9/HxsUuye3l52VesWFHn+KWlpfbQ0FC7JPvkyZPtffr0sUuyDxs2rF71N+Xvoa7/NqxWq7179+5Gv4cfftheXl5ebd8DBw7Yr7/+eqPvLbfcUmNNjj4dOnQwjl966aUa+zMTBeB8wjNRANCCBQcH66mnnjI+f/bZZ8021ldffaVnn31WkhQREaGNGzfqsssuq/Wa/v3768svv9Qdd9xRa7/33ntPVVVV8vHx0ZgxY3TzzTdLkpYuXarTp083zRdo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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "![box-plot-explained.webp](data:image/webp;base64,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)" + ], + "metadata": { + "id": "HLGoyN9Z_-0y" + } + }, + { + "cell_type": "markdown", + "source": [ + "Combinando datos categóricos y continuos, podemos crear un Boxplot de los ingresos que se agrupe por la Categoría de Calificación que creamos anteriormente:" + ], + "metadata": { + "id": "S19KO0jHAHxT" + } + }, + { + "cell_type": "code", + "source": [ + "movies.boxplot(column='RECAUDACION', by='CLASIFICADA')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 789 + }, + "id": "ioJMjaRJASJw", + "outputId": "75b58cb1-8577-447b-d799-058b227f7fff" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 125 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAALzCAYAAABgNfQ0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC0iElEQVR4nOzdeVyUVf//8fcwCCKKG+KuoKRW2uaCWYiYWpoLEpWWppYtfm271RZbTFtscWu7WyzL0rLuiLRIS01FNEkt79LKNdDcd3EBgeH6/cGP656RGZgZtjFfz8djHlzLuc71mY2Zz5xznWMxDMMQAAAAAMBn+FV2AAAAAAAARyRqAAAAAOBjSNQAAAAAwMeQqAEAAACAjyFRAwAAAAAfQ6IGAAAAAD6GRA0AAAAAfAyJGgAAAAD4GBI1AAAAAPAxJGoAvDJx4kRZLBZZLBZNnDixssMByszs2bPN1/bw4cNLXV+3bt3M+lasWFHq+gAAFwYSNVxQ7L8wObv5+fmpRo0aioiIUFxcnN577z2dPHmyssMGAJ928OBBzZ49W7fffrvatWunBg0aKCAgQDVr1lRERIRuvPFGTZo0SRs3biy2nuHDh5dpkuzM0qVLHf7vX3zxxaWqb/PmzXryyScVGxurRo0aKSgoSAEBAapTp47atm2rAQMG6Nlnn9WSJUuUnZ3tsp4VK1Y4xOWK/Y9kntyc/aDm7jmdsdlsWrx4sR555BF17txZ4eHhCg4OVlBQkBo2bKioqCjdf//9mj9/vnJzcz2qW5K2b9/uEFvt2rV19uxZj+qw/9Hl3JvValXt2rUVHh6uK664QrfddpumTZum1atXyzAMj+Mtj/gB/8oOAPAlhmHo1KlTOnXqlDIyMrRgwQI9/fTTmjlzpvr371/Z4UEFyXZKSookafny5erWrVvlBgRcwI4ePaqXXnpJb775prKysorsz83NVWZmpjIyMrRw4UJNnDhR7du31wsvvKDrr7++EiKWPvroI4f1zZs3a+3aterUqZNH9Rw/flwPPfSQPv74Y6f7jx07pmPHjun333/X119/LUkKCgrSli1b1LRpU++C9xHz5s3TxIkTtXXrVqf79+/fr/3792vt2rX697//rbp16+qhhx7S2LFjVa1aNbfOce7zdPz4cS1YsEC33HJLqeOXpPz8fB0/flzHjx/Xzp079euvv2revHmSpMjISN1zzz0aPXq02/Geq7zjx4WBRA0XrI4dOxb5YC78x/3rr7/qjz/+kCQdOHBA8fHxmj9/vvr27VsZoQKAz/ntt9/Ur18/7dq1y2F769at1aZNG9WrV09ZWVnav3+/fv75Zx0/flyS9PPPP+uGG27Q559/XuFfWk+ePKmkpKQi2z/66COPErVjx46pe/fu+u9//2tuCw4OVocOHRQREaHAwEAdP35c27Zt06ZNm5STkyNJysrKKtNWlUaNGmngwIFulfU0EXUmOztbI0aM0GeffeawvVatWurUqZPCwsJUtWpV7d+/X9u2bdOWLVskSUeOHNGECRO0Zs0aLVy4sMTzGIahOXPmFNn+0Ucfef2aqVGjhu644w6HbadPn9bx48e1e/du/frrr2bL3/bt2/Xoo49q1qxZmjt3rjp06ODRucojflyYSNRwwerTp0+x11atXr1agwYN0u7du2Wz2XTfffcpPT1dVapUqbggAcAHrVu3Tt27d9epU6ckSVWqVNE999yjcePGKTw8vEj5vLw8rVq1StOmTVNycrIk6cyZMxUZsiQpMTHRPG9QUJDZCvjZZ59pxowZCggIcKuesWPHmklaQECAJk+erFGjRjltfcnKytL333+vzz//XF9++WXZ3JH/76KLLtKbb75ZpnW6kpOTo169eik1NdXc1rlzZz333HOKjY2V1Wotcsxff/2ljz76SDNmzNDJkyfdfs5XrFihnTt3SnJ8nr7//nvt379fDRo08Dj+OnXqFPtYZWdna+nSpZoxY4aWLVsmSdqyZYuuvfZa/fDDD7rmmmvcPld5xI8LE9eoAS5cc801+uKLL8z1PXv2MBAAgAve0aNHdfPNN5tJWu3atbVixQq9+eabTpM0SfL391e3bt30zTffKDU1tdK6/tl3R3vsscdUv359SQX36ZtvvnGrjgMHDjjUM2vWrGK79AUFBSkuLk7z5s3Trl271LBhw1Lcg8ozbtw4hyTt8ccf15o1a9SjRw+nSZoktWjRQpMmTdJff/2lhIQEt89l//jedtttat++vaSC6+I++eQTL+9B8apWraq+ffvqhx9+0IcffqigoCBJ0tmzZzVw4MAiLcfFqYz48c9EogYUo3PnzoqIiDDXC7tDAsCF6tFHHzVbC6xWq7799lt16dLF7eOvvfZa/fzzz7riiivKKULnMjIytHLlSkmSxWLRsGHDNHjwYHP/udcUubJ06VLl5+dLkho2bKjbb7/d7RgaNGig4OBgD6L2DatWrdIbb7xhro8aNUovvvii28eHhobqiy++0JNPPlli2dOnTzu0PA4dOlRDhw411919nkpj+PDhDuc5dOiQ26Mb+0L8+OcgUQNKYP/r5+nTp9065vvvv9edd96pVq1aKSQkREFBQWrevLkGDhyo2bNnFzsCVt++fc1Roq644grz2gZX0tLSVKVKFfOYxMTEImXCw8PN/RkZGZIKLqB/+OGHdckllygkJEQhISG67LLL9NRTT2n//v1u3U9P5Obm6sMPP1RcXJyaN2+uoKAghYSEqHXr1rrrrru0ZMmSYo8vjL9wIBFJio2NdTqa1+zZs0sd77Fjx/T888+rQ4cOql27tqpXr67WrVtr5MiRWrduXZG4ihsxzVmZX3/9VQ899JDatm2rOnXqyGKxKC4uzunxaWlpuv/++3XppZeqdu3aqlq1qpo0aaIbbrhBb775pluvS/vR9Nx5fNwZot5ZmdzcXH300Ufq2bOnmjRposDAQDVp0kRxcXFasGBBiec9199//63nnntO0dHRatSokQIDA1WnTh1deeWVGjdunMvBDFz55ZdfdPfdd6tFixYKCgpSvXr11KlTJ73yyis6evSox/F56++//9ZTTz2lyy+/XHXq1FFwcLDatGmjf/3rX9q+fbvL47766ivzMW/Tpo3b5/vrr7/k5+cni8WiwMBAHT582Ku49+7d63DtzUMPPaSrr77a43rq1atX4Ynaxx9/bI7md+211yo8PNzhC/SiRYt08ODBEuvZs2ePudysWTOPR0s8H7300kvmctOmTTVlyhSv6unZs2eJZb788kuztbZ58+bq2rWrBg8eLH//gqt1Nm7cqA0bNnh1fk/cfPPNuu2228z1uXPnmj9QFMdX4sc/hAFcQGJiYgxJhiTjmWeeceuYFi1amMfMmjWr2LIHDhwwrrvuOrO8q9tFF11krFu3zmkdBw8eNBo0aGCWHTNmjMvzZWZmOsQ3YsQIp+WaN29ulklPTzdmzpxpBAYGuoyvdu3axoIFC4q9r88884zbj2VaWprRsmXLEh+Xnj17GocOHXJaR0nH2t8+/PDDYuMpybJly4z69eu7rN/Pz8+YOHFikbhcObfMM888Y1it1iL1DhgwwOG4U6dOGbfeemuJ97dhw4bGwoULi71Pw4YN8+jx+fDDD83yw4YNc6vM3r17jS5duhQba79+/YxTp06VeH6bzWY8/fTTRtWqVYutz9/f33jiiSeM/Pz8Eut88sknnT7uhbcmTZoYa9asceu+e8L+/87y5cuNBQsWGDVr1nQZR1BQkPHuu+86rSs3N9fh/8OqVavciuHJJ580j7n55pu9vi/PPvusw/tg586dXtfljP3rtCwee3v2/4Nmzpxpbr/00kvN7TNmzCixnilTppjlw8LCyiy+5cuXu/X/xP5/b0xMTLmfc+fOnYbFYjHLPP/886U6Z0m6d+9unuuJJ54wt/fp08fc/tBDD7lVl/17uXnz5h7H8vPPPzs8PtOnT6/Q+AEGEwGKsX79ev3111/menR0tMuyBw4c0DXXXKMdO3aY21q2bKmoqCgFBgbqjz/+0E8//SRJ2rZtm2JjY/Xdd98VuUC5Xr16mj17tnr37i3DMDRjxgzdcMMNTn+JHD16tBlfZGSkXn/99RLv04IFC/Twww9Lkho3bqxrr71W1atX19atW7V69Wrl5+fr2LFjSkhI0DfffFPqIbRXrlyp3r17mxeRWywWderUSZdccolycnKUlpZmPmZLlizRNddco1WrVqlevXpF7qtU0KKwd+9eSVJcXJwaN25c5JylmRcpLS1Nffv2dYi3Y8eOuvTSS5WTk6O1a9dq27ZtmjhxokJDQz2uf8qUKZo0aZKkgtdHp06dVK1aNWVkZDgMVHPmzBl1795da9euNbc1atRI0dHRql69urZv365Vq1bJZrNp37596t+/v+bNm+fRdSBlKTc3VwMHDtRPP/0kq9Wq6OhotWzZUidPnlRKSooOHDggSfrmm2/Ur18/LV682PyF+Vw2m0233nqrQ/ehxo0bq1OnTqpXr55OnTqln376STt27FBeXp4mT56sQ4cOaebMmS7je+KJJxy6alWrVk3du3dXw4YNtX//fi1btky7d+9Wnz59zPdHeVi/fr2efPJJ5eTkqG7duurWrZtq166tjIwMpaSkKDc3V1lZWbr33ntltVp11113ORzv7++vESNGmPdl1qxZJQ5yYLPZHFpRR44c6XX8hYMsSAWtUs2aNfO6roq0atUq8/9MYGCgbr75ZnPf0KFD9fjjj0sq6JZW0vPfsmVLc/ngwYP68MMPNWLEiLIP2kcsX77cYV4x+1amsrZr1y4tX77cXLdv8bzjjjvMESM//fRTTZkypdwH97rqqqvUokUL83M2NTVV//rXv1yW97X48Q9Q2ZkiUJE8aVFbu3atER4ebpYfOHBgseV79+5tlg0ODjbmzZtXpMy6descWsCaNm1qHDt2zGl9Dz/8sEOLybktTZ9++qlDq8LatWtdxmbfohYQEGD4+fkZ06ZNM2w2m0O533//3eHX5QYNGhhHjx51Wqc7LWpHjx41GjdubJa76KKLjPXr1xcpN3fuXCMoKMih1cWVc1snylJWVpZx0UUXmfVHREQ4fVw///xzo1q1akVaJV2xL+Pv72/UrFnT+Oqrr4qUy87ONpdHjRplHmO1Wo1XX321yPO1detWo3379ma5kJAQIz093WkM5d2iFhAQYEgyrrrqKmPr1q0O5fLy8oznnnvO4XGYPHmyy3M//fTTDq/BL7/80mmL2X/+8x+HlqnPP//caX0pKSkOLQIJCQlFXtfHjx83Bg0a5HBfirvvnrB/zRbWPW7cOIfn2zAM4++//zaio6PNstWqVTO2b99epL6//vrLvD/BwcFGZmZmsef/9ttvHVoVzn0duSsnJ8ehhfORRx7xqp7ilFeL2siRIx2ef3t///234efnZ+7/9ddfi63rxIkTRo0aNRze0w888ECJx5XEV1vU7rrrrnJpQXTm+eefN8/VoUMHh31nzpwxQkJCzP0l9fowjNK3qBmGYQwePNjhs7gi4wdI1HBBsf/C1LFjR2P06NEOt1GjRhm33Xab0bZtW4cPr4EDBxqnT592We+yZcscyicnJ7ssm56e7vDlctKkSU7LZWdnG5dddplZzr5b3Ll1vPDCC8Xeb/tETZLx0ksvuSy7b98+IzQ01Cz79NNPOy3nTqI2YcIEs0zt2rWNXbt2uTxvUlKSQ4wpKSlOy5Vnovb222+X+CXZVbzuJmp+fn4u71uh7du3O3xxfPPNN12WPXr0qMMPCq66v5Z3oibJaNy4sXH48GGXdT711FNm2eDgYOPEiRNFyqSnp5vdE+vUqVPsc2AYju+9iy++2GlCZ98d87rrrjPy8vKc1mWz2YxevXo53KeyTtQkGffdd5/LsidPnjTatGljlh06dKjTcj179jTLvPfee8WePz4+vsT/N+74+++/He7H7Nmzva7LlfJI1Nz5gmzfXa247uaFpk2bVuT9X/hFPi4uznj++eeNxYsXGydPnnQ7Tm8StUaNGhX5HHN2c/W/0p1z2nfn79atm9v3xxutWrUyz/Xaa68V2X/nnXea++Pj40usrywStYkTJzok5RUZP0CihgvKuV+YSro1bNjQacvHueyvI+rfv3+J5V9++WWHc7i6vub33393aGl6++23jby8POOaa64xt3Xt2rXEX8jtE7WIiAgjNze32PKvv/66wxcBZ/GVlKjl5+c7XEvjTt9++1bJQYMGOS1Tnolahw4dzLrtry1wJTY21uNE7ZZbbimx3scee8wsf8UVV5R4/dXnn39ulg8MDDSOHz9epExFJGolXcOZnZ1tNGzY0Cz/zjvvFClj35L86quvlhinYRjG9ddfbx7z888/O+z7448/HGL8/fffi61ry5YtDq1vZZ2o1ahRw+nzY+/rr782y1etWtVp+f/85z9mmc6dO7us6+DBg0aVKlUMqeBHgr///tvr+/Hrr786PJbz58/3ui5XyiNRs+99ULduXSMnJ6dIGfvXcv369Uv8H2kYBdfr2f+g4uxmtVqNbt26GR999JHLHwgKeZOouXtzde2dO+e88sorzf1xcXElPi7e+vHHHx0SogMHDhQbb0BAgHHkyJFi6yyLRG3GjBkOj5GzH5jKK36AUR+BYuzbt0833XSThg4dqmPHjrksZ98n/c477yyx3hEjRsjPz888x5YtW5yWu+SSSzRt2jRzfcyYMbr77ru1evVqSVKtWrU0Z84csy533HbbbS6vDSo0ZMgQc16cvXv3uoyvOH/++ac5eqTVatUdd9xR4jH2185U9Jx1J0+e1C+//GKuDxkypMRj3ClzrkGDBpVYxv46oMLRGoszcOBA1alTR1LBnD9r1qzxOK7SCgwM1C233FJiGfv7b/++KVR4DYfk/rUw3bt3N5dXrVrlsM/+HO3bt9cll1xSbF2tWrVS586d3TqvN/r376+aNWsWW6ZPnz7mNZrZ2dlOn8+4uDiFhYVJKriu0tXUIR9//LE5yuz111+vJk2aeB37yZMnHdarV6/udV0VyX449EGDBjm9LighIcGcB+3AgQP6/vvvS6z36aef1m+//aahQ4e6HHLfZrNpxYoVGjZsmNq1a6eNGzd6eS8qj/3zXp7Puf3zdP3115uvb3sxMTFq3ry5pIIJuOfNm1du8RQ69z6f+z4o5Kvx4/xGooYL1jPPPCOjoFXZ4Xbq1Clt2rRJU6ZMUb169ZSfn6+5c+cqOjraabK2Z88ehyGd3ZlPqF69emrVqpW5bp8gnGvUqFHq16+fJCkrK0sffvihue+dd97x+GJ+d4bSrl27tlq3bm2uezOUsP0xrVu3Vt26dUs8xn5QhP3795uDhlSE3377zZwbKSQkxK2hz6Oiojw+T+HEp64YhqH//ve/5ro7r6cqVaqoU6dO5npxr6fy0q5dO7e+xNm//s59XR05csQcbj8gIECTJk3S/fffX+Ltu+++M+v4+++/Heq0P4e7w8h7M9y8u9yp22q1qmPHjua6s/dflSpVHKZNmDVrltO67LeXZhARSapRo4bDeuEQ5L5s7969Wrp0qbluP7iDverVqztMj+HuXFeXXnqpPv74Yx08eFCLFy/W008/rd69e5sTadv7888/1aVLF/3222+e3YlixMTEOP0cO/dWmgFy7J/38nrOz549q88//9xcd/U8WSwWh3nrKmJOsnMTs5CQkCJlfDl+nN8Y9RE4R3BwsC699FJdeumlGjx4sKKiorRnzx79/vvvGjNmjEOiJBVMhFmocF4md4SHh2vz5s2SVOKcRh988IEuu+wy7du3z9w2bNgw3Xrrre7eLZO7iV2zZs3MX+nt76O77I8p/AWxJPXr11fVqlWVnZ0tqeBxadSokcfn9oZ9vE2aNHFrbiRvWidKen2cOHHCYZ49dx+78PBwc9nbObJKw5PXVaFzX1f2r++cnBz9+9//9jiOc39MsT+HNzGWtbJ4nArdfffdmjJligzD0Jw5c/TSSy85tBatWbNGf/75p6SC91bhDz7eKmy1LXT8+PFS1VcR5s6dK5vNJkm66KKLiv1xZejQofr0008lSV9//bWOHTum2rVru3WeatWqqWfPng6j8/7555/67LPP9MYbb5ivy1OnTmno0KH673//e97Mv2b/vJfXc75gwQKz7pCQEPXv399l2aFDh2ry5MmSpHXr1unPP/8s1Ui/JTlx4oS5XKVKlSI/WEi+HT/Ob7SoAcVo3LixnnnmGXN97ty5RSaDtv+F0VX3F2fsy7rqSlGoWrVqRT4cXE2OXJLC7j0l8SQ+ZyricSlL9vG6+xh50w0oKCjI7Tgk9x+7ynrcCpXF68r+C5G38vLyHNa9eV49eb16qizff5GRkYqNjZVUkMx9/fXXDvvtW9PuuOOOUg8FXvhDSiFX3S19iX2LRUldlXv27KkGDRpIKtpC4o2LL75YkyZN0u+//65LL73U3P7bb79VeNfu0rD/Eai8nnP75+mmm24q9v9kmzZt1KFDB6fHlofCH1QlOW0pPTcGX4sf5zcSNaAE9vOI5eXlKSUlxWG//Zf106dPu12vfVlnv9DZe/jhh80uYYX+7//+z6uWk8L5wcoyPmcq4nEpS/bxevMYlUccnpyjrB+3wm6g7iqL15V9chISEuJWl65zb/bzhUm+87yWJobins+7777bXLZPzE6dOuWQaJS226NU0Jpg3yJVOC+kr1q/fr1DYvHMM8/IYrG4vPn7+zv8EFdWX6AbNmyo9957z2FbampqmdRdEa699lpz+eDBg8rIyCjT+vfv3+9wTeCHH35Y7PNksVi0fv16s/zcuXM9/n/lCfvXubPrV309fpzfSNSAEjRs2NBhfefOnQ7r9l3ZsrKy3E6e7D/sips4ef78+eaHvNVqVWRkpKSCbmLefPnatWuXW+Xsr/XxZmJn+8fF3XMePHjQ7Pbo7Xm9ZX+uPXv2uHXM7t27yzyOmjVrOrR8uPvYlfR6sq/z3FYnZzxt3SqL15X9r9WZmZluJzXF8eZ1eO51bmWprN9/8fHx5v7vv//efE3+5z//MVsTo6OjHa6JLY1zB24pz8eqtEqbaKWlpRX5gcxbV199tcMgMvbdfH1dbGysQzfNwu6hZeWTTz4xu6d6Y8+ePQ7XIZal9evXO/xv7dq1a5Eyvhw/zn8kakAJzv2yeO4Ii40bN3YY3enHH38ssc7Dhw87fAG46qqrnJbbu3evQzL29NNP6+uvvza7VSxYsEDvvvtuyXfCTlpaWolljh8/7tDdw1V8xbnyyivN5c2bN+vo0aMlHlM4mqUkNWjQwOn1aeV1Xcdll11mPrcnTpxwuP+urF27tszjsFgsuuKKK8x1d15PeXl5Wrdunbnu7PmyvwD+yJEjJdbp6eh0mzZtcqslyn4Ew3PjbNiwoZo2bWquu3PfS2L/OnTntS+pXEfNdCcGm81W4vNZKCAgQMOGDZNU0Apa2KJo37p21113eRltUXfddZcCAgLMOF977bUyq7ssnTuiXuvWrRUVFeXWzf6arLLslhYYGOh02dc1b95cvXv3NtfffffdMvkRpZD9YxweHu7282T/I2p5dR+cPn26uRwQEKD4+PjzKn78A1TIJACAj7Cfz8jVJM3nOncy608//bRIGft51AYOHFhinVOmTClxnrL8/HyjR48eZrkuXbqY8/D8+9//NrdXq1bN+PPPP4s9n/08ai1btixxPp8333zTLO9qnjdP51FzNvnnuW688Uaz/ODBg52WueGGG8wyixcvLrFOT7Rv396s+6mnniqxvP1EsMX9O3WnjD37edSuuuqqEudR++KLL0qcd8t+bjxXc9QVysrKcpj03N151Eqan+3s2bNG48aNzfLO5lEbNWqUR++lkpw7j1pJ75Vt27aV6zxqISEhLudhKpScnFzi82lvy5YtZvkWLVoYv//+u7les2ZN4/Tp06W+D/bsJ+21Wq1GWlqax3UcPHjQ2LBhQ5HtZTWPmv2E9K7mtHJl6tSp5rFNmzYtcZ5Kd+zZs8fhdTVt2rQiZbyZRy0mJqZUcbl7zpUrVzqUu//++70637n/s3/55ReHes+dB7E4iYmJ5nFBQUFO31elmUfNfq5CScY999xTpEx5xw+QqOGC4k2i1q9fP/MYi8Vi7N+/v0iZc5O57777zmV9GRkZRq1atcyykyZNclrOPpkLCQkx/vrrL4f9ffv2dfgyf/bsWZfntE/UJBlTpkxxWXb//v1GWFhYiQlLSYmaYRjGhAkTzDJ169Y1du/e7fK8CxYscIgxJSXFabnbb7/d7cTAU/YJcPXq1Ys85sXFW5aJ2vbt2x0m0nWW0BQ6duyYERERYZYdMWKE03I//fSTw307dOiQyzofeeQRh5jdTdSaNm1qHD161GW99q+Z4OBgp19Mtm/fblitVq+e43379jnd3qVLF7O+Xr16ufzibbPZHCZdL49ETZIxevRol2VPnTplXHLJJWbZIUOGeHyOqKgoc/m+++4rdfznOnz4sNG0aVOH97YnyVpqaqrRtGlTp89tWSVqAwYMMOvp3bu3R8fu2bPH4f23dOlSh/1ff/218d577zmdONsV++RWcj7xui8naoZhGP/3f//nUNadH7MKHT582EhISCgS70MPPWTWd/HFF3sUe3Z2tlGzZk3z+Pfff79IGW8TtdmzZxtBQUHmsQ0aNHD6+VXe8QMkarigeJKoHTt2zLjnnnscPphuv/12l+Xtv+BVr17d+M9//lOkzPr1643IyEiHL7bHjh0rUm7Dhg1GQECAWe7jjz8uUubgwYNG/fr1zTKPPPKIy9jsE7WAgADDz8/PePXVV4t8Yf3jjz+Mdu3amWXr169vHDlyxGmd7iRqR48edWhBad26tdNf0efNm2dUq1bNLNevXz+X9+XFF180y914440ltjZ54syZMw7PT4sWLYz169cXKffFF18YwcHBRmBgYLkkaobh2LLk7+9vvPnmm0Wer23bthkdO3Z0SOjT09Od1pefn2+0bNnSLNujR48iSdXp06eNcePGGZIc7ps7iVrh67VDhw7G9u3bHcrl5eUZkydPdmhReP75513ed/vXlsViMcaOHesysczNzTW+//57Y8iQIUaDBg2cllm+fLnDuW+99dYi77sTJ04Yt912m8N9KY9ErbDuxx57rMiPK7t373YoGxQUZGzbts2tc8ydO9fhdVZ4c/b6LQtpaWlGcHCww/168MEHjYyMDKflc3NzjRUrVjj88FVeidqhQ4eMKlWqmPXMnTvX4zrsW8uHDh3qsO/tt982JBnNmjUznn766WJbaXfu3Gm+rgpv/fv3d1rW1xO17Oxshx89JBnXXHON8cMPP7jspbFjxw5jwoQJRo0aNYrEm5OTY9SrV8+t/wmu3HXXXebx0dHRRfZ7kqhlZWUZycnJDj1ZCt+HP/30U5HyFRE/QKKGC4r9l6COHTsao0ePLnIbMWKEERsb6/BrmiSjVatWxXaf2b9/v8MXYUnGRRddZAwZMsS48847jc6dOzt8WQwODjZWrVpVpJ4zZ84YF198sVmuuG5qCxcuNMv5+fkZy5Ytc1rOPlF79dVXzeUmTZoYgwYNMkaOHGl07drV4Vdkf39/49tvv3V5bncSNcMwjJSUFIckzGKxGJ07dzbuvPNOY8iQIQ6JUeFjdvDgQZf1bdmyxeFxbNu2rXHPPfcYY8eONW/r1q1zeXxJVq1a5fDcnxtvq1atzH32XUQtFovLOr1J1E6fPu2QhJ37fMXGxjq0PPn7+xtffPFFsXWe25WnZs2aRnx8vHHPPfcY/fv3N1t6GzVqZLzwwgseJWq33Xab0alTJzOW2NhYY+TIkcatt95qNGzY0OG8Xbt2NXJzc13GmZ+f7/CFvTAR6NKlizF06FDj3nvvNQYPHmxcffXVDslC3bp1XdZ5bithcHCw0a9fP+Puu+82+vfvb1SvXt2QZNSuXduYOHFiuSVqr7zyiplEhIaGGgkJCcbdd99t9OrVyyFBlGS8++67bp8jOzvbqFOnjsPxV1xxRaljL86GDRuMJk2aFEkO27RpY8TFxRkjR440hgwZYvTo0cOoXbt2kXKJiYlF6rR/3mvXrm1cfvnlbt/efvttwzAM47XXXnN4nk+dOuXxffvggw8c6jh58qS5rzBRs7/Vq1fPuP76642hQ4ca9913nzF48GDjiiuucPhfVfg5snfvXqfn9PVEzTAKPp9uvvnmIve/du3a5v0fOXKk0a9fP6N169ZFyvXt29esy75XgsViKbYHgyv2vVksFouxY8cOh/32/6Nq1Kjh9PN+4MCBRseOHR2S+8LbpZde6vTHxYqKHyBRwwXl3C5I7t769+/vsluVvf379xvdu3cvsb7IyEhj7dq1Tuu47777zHLNmjUr8fqUBx54wOGLvLOuZ/aJWnp6uvH2228X+VJof6tVq5aRlJRU7HndTdQMwzDWrFljtGjRosTHpUePHsUmaYXGjx9fbD2l7RK5ZMkSh19Kz735+fkZEydONHJycsxtNWvWdFmfJ1+E7J08edK45ZZbSnzcGjZsaCxcuNCtOidNmlRsXa1btzY2bdrk8AXHnURt2LBhxp49e4zOnTsXW/+NN97o8KW3OK+//rrTL/jObhaLxWVLRaHHH3/c4ceIc2+NGjUyfvzxR7fuuyfs/+8sX77cmD9/vhESEuIyjqpVqxpvvfWWx+d5+OGHHep58803Sx17SQ4dOmSMGTOmyA9bxd2uvfZal12bz03QPbkV/h+66qqrzG3F9YIozokTJ4yqVas6/Z+yevVqo0OHDh7Hd/vttxf7/+18SNQMo+CHlDlz5hT5ka2k/1FTpkwxsrOzzXri4+PN/ddcc41X8dtsNocfC879LDq3e7a7t1atWhnTpk0zsrKyXJ67IuIHSNRwQXEnUQsMDDTCwsKMLl26GGPGjPGq69CiRYuM4cOHG5GRkUb16tWNwMBAo2nTpkb//v2NDz74wOW1DV9//bUZh5+fn7Fy5coSz5WVlWW0bdvWPO6mm24qUubcRM0wDGPTpk3G/fffb7Rp08aoXr26Ub16daNt27bG+PHjXf7ia8+TRM0wCgaSmDVrltGvXz+jadOmRmBgoFG9enUjMjLSGD58uPH999+XWIe9b7/91khISDAiIiIcWuzO/VLlrSNHjhiTJk0yrrzySqNmzZpGtWrVjIsuusi46667zCR7//795jmL61bj6Rehc/3444/GqFGjjIsvvtioWbOmERAQYDRq1Mjo1auX8frrr3vcYvDjjz8agwcPNpo0aWIEBAQYoaGhRufOnY1XX33VTKK8SdQM43/Pc/fu3Y1GjRoZAQEBRsOGDY3+/fsbX331lcf3PTMz0/j3v/9txMXFGREREUb16tUNf39/o3bt2ka7du2MQYMGGe+8846xa9cut+pbv369ceeddxrh4eFGYGCgUbduXaN9+/bGCy+8YHavLO9EzTAKrlV9/PHHjXbt2hk1a9Y0goKCjFatWhkPPvigsXXrVq/OYz/gQ1BQkNNu1eXlwIEDxqxZs4xBgwYZl156qREWFmb4+/sbISEhRkREhNG3b1/jhRdeMLZs2VJsPaVN1DZu3Oiwzd0fMJyxbzlylhDt3r3bmDNnjnHfffcZ0dHRRuPGjY1q1aoZVqvVqFmzptGiRQvzfrvTUnK+JGqFcnNzje+++84YM2aM0alTJ6Np06ZGUFCQERgYaDRo0MC4+uqrjQcffNBYuHBhka6RR44ccfix0JsfJgrZt5ZHREQ4dIcvLlHz8/MzatasaTRt2tS47LLLjEGDBhlTp041fvzxxxLPWVHxAxbDMAwB+EcLDw83539LT09XeHh45Qb0D7FkyRL16tVLknTDDTdo0aJFlRxRxZo9e7ZGjBghSRo2bFiRyaZRsSZNmqSJEydKkoYMGaI5c+ZUbkAAgFJhHjUA8NLnn39uLnfs2LESI8GFzjAMh0T57rvvrrxgAABlgkQNALzw008/6eOPPzbXb7vttkqMBhe6BQsWKCMjQ5J0ySWXqGvXrpUbEACg1EjUAMDOrl27dPPNN2vVqlVy1jPcZrNp7ty5uv7665WbmytJ6t+/v9q0aVPRoQKSpKNHj+rRRx811x9++OHKCwYAUGb8KzsAAPAl+fn5SkxMVGJiosLCwtS+fXs1bNhQVqtVBw4c0Jo1a3To0CGzfMOGDfXOO+9UYsS4ED377LM6evSoDh8+rEWLFuno0aOSpNatW2v48OGVGxwAoEzQogYALhw8eFCLFi3SBx98oPfee09ff/21Q5LWoUMHrVmzRg0bNnR6fLdu3WSxWFzeatSooWbNmumGG27Q5MmTtWfPHrfimjhxYrH1FnfzdCCZVatW6emnn1bXrl3VsmVLhYSEKDAwUPXr19czzzxjlsvLy/OoXknKzMxUcHCwGZu/v7/27t3rUR3Dhw83j/c0QVmxYoXDY+NKeHi4y8ezWrVqatiwoVq3bq3Y2FiNGzdO8+bN08GDBz2KxZUhQ4Y4nO/ll1+WJH3wwQd67bXX9Mknn5hJWrVq1TRnzhxVqVKl2DptNpsWL16sRx55RJ07d1Z4eLiCg4MVFBSkhg0bKioqSvfff7/mz59vtho74+7j58yJEyf0ySef6LbbbtOll16qevXqKTAwUI0aNdKVV16p0aNHa+HChR69rs6Nx2Kx6K233nL7ePvjNm/e7NH9AYByUbmDTgKoCM6G54drP/30k/HUU08ZPXr0MNq0aWOEhoYa/v7+Rq1atYzWrVsbw4cPN77++usS6/F03r4qVaoYEydOLHF4ZvvhuT29FTeNgL3vvvvOaN++vdv1+vv7G//617+MI0eOuFW/YRjG+++/X6Sel19+2e3jDcNxOHdPh9J3d2hy+/ePu7eAgADj1ltvNdLS0jyKyV5mZmaRqScuvvhih5gsFotRr14945ZbbjE2bdpUYp2ffvqpw6TtJd3q1q1rPPvss8bp06e9fvzs5eTkGDNmzCgyOberW+vWrd16rzmLRyqYG6+4ubDs2R/3559/unUMAJQnuj4CF4DCQQbgnk6dOqlTp05lWmfHjh2L1HnixAn9+uuv2rhxoyQpNzdXEydO1PHjxzVjxgy36m3UqJEGDhzodhx169Ytdn9+fr4eeeQRTZ8+3WF7tWrVFBUVpQYNGqh69eo6ePCg0tPTtXHjRhmGoby8PM2YMUPfffed/vjjD7di+eijj5xus7/eytdcd911Dtcj2mw2HT9+XMeOHdNvv/2mffv2SZJycnL0+eef64svvtAjjzyiZ599VgEBAR6d64svvtCZM2cctv35559at26dx+/p7OxsjRgxQp999pnD9lq1aqlTp04KCwtT1apVtX//fm3btk1btmyRJB05ckQTJkzQmjVrtHDhQo/Oea7MzEzFxcVp+fLlDtvbtWun1q1bq3bt2jpw4IA2bNigv//+W5K0ZcsW9e/fX+PGjdMrr7ziccvd3r179e9//1tjx44tVewAUCkqO1MEgH8q+xa14iYFX716tdGsWTOHX/TXrVvnsnxZTnh7rkGDBjnEcckllxhffvmlkZ2d7bT8nj17jGnTphlhYWEetdjt2LHDsFgs5sSz9pPHFnffz1XRLWolTab+119/GU8++aRRt25dh7r79etn2Gw2j+Lr2rWreXxQUJC5PHr0aI/qOXv2rBEdHe0QT+fOnY0lS5YUmYi40I4dO4wJEyYYNWrUcPk686RF7fTp08aVV17pUH7gwIFOJ8DOz883VqxYYVx++eUO5e+9995iz+GsRU2SERoaak7kXhz7Y2hRA+ALuEYNACpZly5dtGDBAofWgpkzZ1Z4HNOnT3docRk6dKh+/fVXxcfHKzAw0OkxjRo10pgxY7Rjxw6NHj3a7RaPjz/+2BxVMzY2Vv369TP3OWtpO19ERETo+eef1++//65u3bqZ27/55huNHz/e7XrS09OVmpoqqeDaqalTp5r75s2bp5ycHLfrGjdunFmXJD3++ONas2aNevToIavV6vSYFi1aaNKkSfrrr7+UkJDg9rlcefDBB7VhwwZzfcqUKUpKSlKrVq2KlLVYLIqJidH69esdWovfffddffLJJ26dr27duoqMjJQkHT58WK+++mrp7gAAVAISNQDwAVdccYXDF/uVK1dW6PnT09P1+OOPm+s33nijPvroI/n7u9dDvnr16nrzzTf17rvvlljWMAyHOeiGDh2qoUOHmuueJiK+qH79+vruu+901VVXmdumTZumv/76y63j7RPZmJgY3XPPPapXr56kguH4k5OT3apn1apVeuONN8z1UaNG6cUXX3T3big0NFRffPGFnnzySbePOdeyZcs0a9Ysc/2BBx7QuHHjSjzO399fn332mdq3b29u+7//+z8dP37crWMnTpxork+dOlXHjh3zKG4AqGwkagDgI6644gpz2dPRD0tr2rRp5gh/wcHBeu+99zy+HkiSevXqVWKZ1NRUpaenSyq49u2mm25Snz59zOvnjhw5om+//dbjc/uawMBAffrpp/LzK/iotdls5qiNxXGWyPr7+2vQoEHmNndbHV966SVzuWnTppoyZYq74Tvo2bOnV8dJcjhn48aNPUoUAwICNHPmTPO1mJmZ6XZr8+DBg3XppZdKKrge1Nv7DgCVhUQNAHxEUFCQuZydnV1h583OztaHH35org8ePNjllANlwT7JiIuLU/Xq1VWlShXdeuutTsucz1q3bq0bb7zRXP/iiy+Un59f7DGrVq0yW96qVq1qdj20b3VctGiRw1QRzuzatcthAJB7771XwcHBHt+H0sjIyNB3331XqhiuuuoqxcTEmOtvv/22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3vT0dKNKlSpm+R9++MEhxj///NPtGAGgvNCiVoYK5z/z1Lm/cAYGBuqbb77Re++9pyuuuMLh19ewsDA9+eSTSk1Ndbg4vTQTiQLwDbVr19YDDzxgrr/77rs6dOhQhZy7RYsWDt0tv/nmG40YMcLtEWVPnz6tBx54QPfee6/D9k8//dSso1atWrrxxhvdjql9+/Zq06aNuf7xxx8XKVOjRg0NGTLEXH/66afdur7vscceM1t2ateurUGDBrkdlzsOHjyoG264Qb/88ou57fHHH1ezZs0cyh06dMihxc3+vrjDvvycOXMcPhckKTo6Wv/3f/9nrr/55pseXZd15MgR3XzzzXrhhRc8istejx49HFps33jjDU2bNq3E4/Ly8jRo0CD9/PPP5ra33nqrTK4nDA8P1913322u06oGwCdVdqboyzxtUWvdurUhybj88suNjRs3un3Lyckptt7MzExj27Ztxp49ewybzWZuv+6668z4Dh06VNq7C6CMedqiZhiGcfjwYaN69ermcY899liRMuXRomYYhpGfn28kJCQ4tCy0bdvW+Oqrr4yzZ886PWbPnj3GtGnTjLCwMEOS0bx5c4f9V1xxhVnXyJEjPY7pueeeM49v3ry5kZ+fX6RMenq6UatWLbPcpZdeaqxatcppfQcPHjTuuusuh/v42muvFRuDJy1q6enpxtNPP23UrVvX4RwJCQlOY3/11VfNMjVq1DDOnDlTbP3n2rlzp2GxWBxahs6VnZ1tdOnSxSGea665xvjhhx+MvLw8p/Xu2LHDmDBhgtnC6+x15m6LmmEYxqlTp4zLLrvMoXx8fLyxZcuWImXz8/ONlJQUh9eOJOOee+4p9hyetKgZRsFrNygoyGmvFVrUAPiC8huP+AJUt25dSQUjibVt27bM6q1Ro4bDpKFSwZwy//3vfyUV/BLuauASAOeXunXravTo0Xr55ZclSf/+97/16KOPupw3atu2bbr//vs9Osf48ePVuHHjItstFos+++wzjRkzRq+//rokadOmTRo4cKCCg4MVFRWlhg0bKjg4WAcPHlR6erp+++03h1Yc+/9Vv/32m/l/SlKJQ847c/vtt5stQDt37tSKFSsUGxvrUCY8PFxz5sxRQkKCzp49q99//13XXnutWrRoofbt26tOnTo6c+aM/vrrL61du9ZhWpQhQ4bowQcfdDueuXPn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1lx21fIGAAAAAHCuXBK1lJQUc/niiy8ukzp79eqlsLAwBQQEKCwsTN26ddNLL72kY8eOlUn9AAAAAOAryjxRy8/P10svvWSu33LLLWVS75IlS3To0CHl5ubq0KFDSklJ0fjx49WiRQstWLCgTM4BAAAAAL7A41EfSzJjxgytXbtWkhQfH6/27duXqr527dopLi5OnTp1UqNGjZSbm6stW7bok08+0eLFi3X8+HHddNNN+uabb9S7d+9i6zp79qxDt8zMzExJUm5urnJzc0sVJ/BPU/ie4L0BAPAEnx+Aa568LyyGYRhldeKUlBT16NFDeXl5CgsL08aNGxUWFuZ1fcePH1etWrVc7n/33Xd13333SSqY123Hjh2qWrWqy/ITJ07UpEmTimz/9NNPVa1aNa/jBAAAAICSnDlzRrfddptOnDihkJCQYsuWWaL2+++/Kzo6WseOHVPVqlX1/fffl8n8aSUZOXKkZs2aJUmaO3eubr/9dpdlnbWoNW3aVIcPHy7xgQIuNLm5uVqyZIl69uypKlWqVHY4AIDzBJ8fgGuZmZkKDQ11K1Erk66P6enp6tWrl44dOyar1arPPvusQpI0Sbr33nvNRC0lJaXYRC0wMFCBgYFFtlepUoV/JIALvD8AAN7g8wMoypP3RKkHE9m7d6969OihvXv3ymKx6IMPPtCAAQNKW63bLrnkEnN5z549FXZeAAAAACgvpUrUDh8+rJ49e+qvv/6SJL3xxhu64447yiQwd1kslgo9HwAAAACUN68TtRMnTuj666/XH3/8IUl66aWXNHr06DILzF2F55cKBhQBAAAAgPOdV4namTNndOONN+qXX36RJD355JN67LHHyjQwd7377rvmckxMTKXEAAAAAABlyeNELScnRwMHDtTq1aslSQ899JCef/55j088e/ZsWSwWWSwWTZw4scj+jRs3avv27cXWMXPmTL3//vuSpAYNGmjgwIEexwEAAAAAvsbjUR8HDx6sxYsXS5K6d++uu+66S5s2bXJZPiAgQK1atfI4sJ9//lkjR45UbGysevfurXbt2qlu3brKy8vT5s2bzQmvJclqtWrmzJkKDg72+DwAAAAA4Gs8TtSSkpLM5WXLlumyyy4rtnzz5s2VkZHhcWCSZLPZtHTpUi1dutRlmbp162rWrFnq16+fV+cAAAAAAF9TJvOolYc+ffpo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ffbr5yZxAIrHPGoAAAAoE1WqVFGXLl2Un58vPz8//fjjj8rJyanssIDzEokaAAAAvGbfUpaTk+Ny0BBa1ADP0PURAAAAXjt8+HCZlgNQgEQNAAAAXqtWrVqZlgNQgEQNAAAAAHwMiRoAAAAA+BgSNQAAAHjt9OnTZVoOQAESNQAAAJQJi8VS7DoA9zE8PwAAALyWnZ1tLtetW1eNGjXSkSNHVLduXe3du9cc7dG+HICSkagBAADAa0FBQeby4cOHzcRsz549LssBKBldHwEAAOC1jh07lmk5AAVI1AAAAOC1mJiYMi0HoACJGgAAALy2cePGMi0HoACJGgAAALy2evXqMi0HoACJGgAAALzGPGpA+SBRAwAAgNeuuuqqMi0HoACJGgAAALwWGhpapuUAFCBRAwAAgNcOHTpUpuUAFCBRAwAAgNd++OGHMi0HoIBXidrBgweVnJysCRMmqHfv3goNDZXFYpHFYtHw4cPLOMQC8+bNU69evdSgQQNVrVpVzZs315AhQ7RmzZpyOR8AAABKtn///jItB6CAvzcH1a9fv6zjcCkrK0sJCQlauHChw/Zdu3bpk08+0bx58zRhwgQ988wzFRYTAAAACthstjItB6BAqbs+NmvWTL169SqLWJy68847zSQtNjZW8+fP19q1azVr1iy1bNlS+fn5mjhxombOnFluMQAAAMC58PDwMi0HoIBXidqECRP0zTffaP/+/dq5c6fefffdso5LkrRs2TJ99tlnkqR+/fppyZIlGjBggDp27Kg777xTaWlpatasmSTpscce07Fjx8olDgAAADh36aWXlmk5AAW8StQmTZqkvn37lnsXyKlTp0qS/P399dZbb8lqtTrsDw0N1csvvyxJOn78uN5///1yjQcAAACONmzYUKblABTw2VEfT548aY4O1KNHDzVp0sRpufj4eIWEhEiSvvrqqwqLDwAAANLevXvLtByAAj6bqK1bt045OTmSpJiYGJflAgIC1LlzZ/OY3NzcCokPAAAADCYClBefTdT++OMPc7lNmzbFli3cn5eXp23btpVrXAAAAPifxo0bO6xXrVpVdevWVdWqVYstB6B4Ppuo7d6921x21e2xUNOmTc3lv//+u9xiAgAAgCN/f8fZnrKzs3XkyBFlZ2cXWw5A8Xz2HXPy5ElzuXr16sWWDQ4ONpdPnTrlstzZs2d1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ymazyWazKSAgoMj9d+/erWeeeUbt27eXj4+PnJ2d5eXlJT8/P91999167bXXFBYWprS0tBx9jx8/bsZ+9NFHcz2+/TUX5tGjR488+xf2PTt58qTee+899e3bV02aNJGnp6c8PDzUoEED9evXT2+//baio6ML/f5s3bo1W44//fRTofqFh4fn+hqdnZ1Vo0YNNW3aVHfeeadeeOEFrV69WleuXCl0Tll98cUX5rGrVKmi06dPO3QcAKjUDABApbZ69WqjSZMmhqQCH82bNzdCQkKy9W/cuLEhyWjcuHGJ5HP8+HHDZrOZMZ2cnIyYmJhC9U1LSzOefvrpQr0WSUZgYGCOY0RHR5v7R40alWsc+2suzMPf3z/P/gW9Z8nJycbzzz9vuLm5FRjHZrMZDz30kHHy5MkC36fRo0dn6/vUU08V2McwDCMsLKzQr1uSUbt2beOtt94y0tLSCnV8u549e2Y7zowZM4rUHwCuBc4lU+4BAKzorbfe0rRp08yf+/btq4EDB6p169by8fHRhQsXdPToUa1bt06bNm1SVFSUXnnlFd17772lltOSJUtkGIbc3NyUkZGh9PR0LV26VC+99FKBfZ999ll98sknkqT69evrqaeeUpcuXVS7dm0lJyfr+PHj2rFjh9auXauTJ08WO1dfX19t2LAh3zaenp4OHfv8+fMaMGCAdu7cKUmqVq2ahg4dql69eqlhw4ZycXHR2bNnFRERoTVr1uj333/XihUrdMcdd+j555/P87jJyclatWqVJMnLy0uXL1/WihUrtGDBArm5uRU6v7Fjx2rcuHHmz5cvX1Z8fLz27dunzZs364cfftC5c+f02muvad26dQoJCVHt2rULPO6pU6cUHh6eLb8lS5bo5ZdfLnRuAHBNKO9KEQBQOhYtWmSOWNSpU8cIDw/Pt/3+/fuNPn36GDfffHO250t6RK158+aGJOOBBx4w7rnnHkOS0bZt2wL77d+/3xyJa9++vREfH59v+40bNxrbt2/P8XxRRtQcfc0F9c/IyMg2qtS/f3/jv//9b57Hy8jIMIKCgow6deoY8+bNyzf2l19+aR436/8DK1euLDDvrCNq06dPz7ftwYMHjQ4dOpjtu3btaqSmphYY45133jEkGS4uLsbHH39s9v/ll18K7AsA1xKuUQOASigmJkbPPvuspKsjPlu3bpW/v3++fdq2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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "De manera general, esta es la forma de trazar gráficos con pandas. Hay más gráficos para mencionar, se recomienda echar un vistazo a la [documentación de plot()](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html) para más información sobre lo que puedes hacer." + ], + "metadata": { + "id": "uVcKIWbEAu4V" + } + } + ] +} \ No newline at end of file diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Pandas/Practiquemos un poco!!!/31_Ejercicios_Pandas_vol_1.ipynb" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Pandas/Practiquemos un poco!!!/31_Ejercicios_Pandas_vol_1.ipynb" new file mode 100644 index 0000000..6f55b9f --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/Librerias/Pandas/Practiquemos un poco!!!/31_Ejercicios_Pandas_vol_1.ipynb" @@ -0,0 +1,352 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "1_tVFSfBNciO" + }, + "source": [ + "# Ejercicios Pandas Vol 1." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VxuUG_p4e57d" + }, + "source": [ + "Tras hacer tus propias pruebas con la teoría de Pandas, completa los siguientes ejercicios en orden:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "no2XCQiLfFdd" + }, + "source": [ + "---\n", + "## Ejercicio 1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "68dqg3OefH2O" + }, + "source": [ + "Al igual que con NumPy, tendrás que importar las librerías necesarias para poder trabajar:\n", + "\n", + "1. Elemento de lista\n", + "2. Elemento de lista\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "XaNbjqZmfIGW" + }, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'numpy'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32md:\\Otros ordenadores\\Mi PC\\CURSO BD & IA\\Python_PIA2\\Python_PIA\\PIA\\UT04. Librerías de programación de Aprendizaje Automático con Python\\Librerias\\Pandas\\Ejecicios\\31_Ejercicios_Pandas_vol_1.ipynb Celda 5\u001b[0m line \u001b[0;36m1\n\u001b[1;32m----> 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mnumpy\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mnp\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpandas\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mpd\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[39m# Crear la primera serie\u001b[39;00m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'numpy'" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "import pandas as pd\n", + "\n", + "# Crear la primera serie\n", + "serie1 = pd.Series([1, 2, 3, 4, 5])\n", + "print(\"Primera serie:\")\n", + "print(serie1)\n", + "\n", + "# Crear la segunda serie\n", + "serie2 = pd.Series(['a', 'b', 'c', 'd', 'e'])\n", + "print(\"\\nSegunda serie:\")\n", + "print(serie2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1DbbyDP8fIwt" + }, + "source": [ + "---\n", + "## Ejercicio 2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dwnu3mgHfKZR" + }, + "source": [ + "Crea una serie a partir de un diccionario con al menos 3 elementos. Muestra por pantalla la serie:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ut0CenZ2fKlL" + }, + "outputs": [], + "source": [ + "# Crear un diccionario\n", + "mi_diccionario = {'a': 1, 'b': 2, 'c': 3}\n", + "\n", + "# Crear una serie a partir del diccionario\n", + "mi_serie = pd.Series(mi_diccionario)\n", + "\n", + "# Mostrar la serie\n", + "print(mi_serie)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "N1U6BRkIfKyd" + }, + "source": [ + "---\n", + "## Ejercicio 3" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CHfJkoEIhHKp" + }, + "source": [ + "Crea una matriz de NumPy con al menos 3 filas y 3 columnas. A partir de esta, crea un dataframe, teniendo en cuenta que la primera fila serán los nombres de las columnas y la primera columna los índices de las filas. Muestra el DataFrame por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "p7Y0PVsFfLbu" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# Crear una matriz de numpy con al menos 3 filas y 3 columnas\n", + "matriz = np.array([['', 'col1', 'col2', 'col3'],\n", + " ['fila1', 1, 2, 3],\n", + " ['fila2', 4, 5, 6],\n", + " ['fila3', 7, 8, 9]])\n", + "\n", + "# Crear un dataframe a partir de la matriz\n", + "df = pd.DataFrame(data=matriz[1:,1:],\n", + " index=matriz[1:,0],\n", + " columns=matriz[0,1:])\n", + "\n", + "# Mostrar el dataframe\n", + "print(df)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HRyyXIHZfLnk" + }, + "source": [ + "---\n", + "## Ejercicio 4" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "id8NOuK4fMY7" + }, + "source": [ + "Crea una matriz 10x5 de números enteros comprendidos entre el 0 y el 9 con Numpy. Después, crea un DataFrame a partir de esta sin indicar columnas ni índice para las filas y muestralo por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "FFPby3q4fMjv" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hA03mDyhfMv9" + }, + "source": [ + "---\n", + "## Ejercicio 5" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sqWITlIKfO3K" + }, + "source": [ + "Del DataFrame creado en el ejercicio anterior, muestra su forma, índice, número de filas, media por columnas, valores máximos y mínimos por columnas, mediana por columnas y la desviación típica por columnas:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BaSO6O43fPQG" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dHaTuCZIfPeP" + }, + "source": [ + "---\n", + "## Ejercicio 6" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YWsa2kQkfQiz" + }, + "source": [ + "Crea un DataFrame a partir de una matriz con valores definidos por tí. Estos valores deberán incluir valores nulos. Luego muestra la cantidad de valores nulos por pantalla y modifica los valores nulos por la media que tenga dicha columna sin incluir los nulos. Muestra el resultado por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "V-3cunAXfQvm" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EV1ZJwU9fQ7a" + }, + "source": [ + "---\n", + "## Ejercicio 7" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4F-EBYAYfRxQ" + }, + "source": [ + "Importa en DataFrames distintos, al menos los datos de un CSV y un JSON contenidos en el fichero comprimido \"02-Pandas_ficheros.zip\". Muestra por pantalla la descripción básica de los datos de cada una de ellas:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Z6OwSjj3fSCG" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bZxKvry8fSVa" + }, + "source": [ + "---\n", + "## Ejercicio 8" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bfrAjupwfS8U" + }, + "source": [ + "Crea una matriz aleatoria 100x3 de números comprendidos entre el 0 y el 1 con Numpy. Exportala tanto a un fichero CSV como a un fichero JSON y comprueba el resultado abriendo dichos ficheros:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "y72zbKAefTM5" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "D_aVLrUnfTeH" + }, + "source": [ + "---\n", + "## Ejercicio 9" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uyWFLw3PfUTe" + }, + "source": [ + "Investiga qué es la correlación entre columnas. Cuando lo hayas entendido, crea una matriz 10x3 con datos manuales que entre la primera y segunda columna de una correlación de 1 en ambos sentidos. Muestra la matriz y su correlación entre columnas por pantalla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "RKiyYicSfUjh" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Complex.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Complex.py" new file mode 100644 index 0000000..8841c0b --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Complex.py" @@ -0,0 +1,13 @@ + +class Complex(): + + def __init__(self, realpart, imagpart) -> None: + self.r = realpart + self.i = imagpart + + +x = Complex(3.0, -4.5) +x.r, x.i + +print(x.r) +print(x.i) diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/MyClass.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/MyClass.py" new file mode 100644 index 0000000..577802d --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/MyClass.py" @@ -0,0 +1,6 @@ +class MyClass: + x = 5 + + +p1 = MyClass() +print(p1.x) diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Persona.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Persona.py" new file mode 100644 index 0000000..8abeaf2 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Persona.py" @@ -0,0 +1,19 @@ + +class Persona(): + + def __init__(self, nombre str, edad) -> None: + self.nombre = nombre + self.edad = edad + + def obtener_nombre(self): + return self.nombre + + def establecer_edad(self, nueva_edad): + self.edad = nueva_edad + + persona1 = Persona("Juan", 30) + + print(persona1.nombre) + # print(persona1.obtener_nombre()) + # persona1.establecer_edad(35) + print(persona1.edad) diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Punto.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Punto.py" new file mode 100644 index 0000000..b3f0a9d --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Punto.py" @@ -0,0 +1,16 @@ +import math as m + + +class Punto: + + def __init__(self, x: int = 0, y: int = 0) -> None: + self.x = x + self.y = y + + def mostrar(self): + return str(self.x) + ":" + str(self.y) + + def distancia(self, point): + dx = self.x - point.x + dy = self.y - point.y + return m.sqrt((dx * dy + dy * dy)) diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Punto2.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Punto2.py" new file mode 100644 index 0000000..83422b5 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/ClasesObjetos/Punto2.py" @@ -0,0 +1,47 @@ +# CREAR CLASE +# CREAR CONSTRUCTOR POR DEFECTO +# CREAR CONSTRUCTOR PARAMETRIZADO +# CREAR METODO & PROCEDIMIENTO +# CREAR CREAR OBJETOS + +# Importar libreria +import math as m + +# Crear la clase + + +class Punto2: + + # Constructor por defecto + def __init__(self) -> None: + self.x = 0 + self.y = 0 + + # Constructor parametrizado + def __init__(self, x: int = 0, y: int = 0) -> None: + self.x = x + self.y = y + +# Procedimiento set - Establece los valores + def distancia(self, point: object) -> float: + '''Devuelve la distancia entre ambos puntos.''' + dx = self.x - point.x + dy = self.y - point.y + return m.sqrt((dx * dy + dy * dy)) + +# Metodo get - Devuelve la distancia + def mostrar(self) -> str: + return str(self.x) + " : " + str(self.y) + + +# Crear 1 objeto desde un constructor() por defecto +punto1 = Punto2() +print(punto1.mostrar()) + +# Crear 2 objeto desde un constructor() parametrizado +punto2 = Punto2(10, 20) +punto2.mostrar() +distancia = punto1.distancia(punto2) +print(distancia) +print(punto1.distancia(punto2)) +print(punto1.mostrar()) diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/33_Ejercicios_de_POO_en_Python.ipynb" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/33_Ejercicios_de_POO_en_Python.ipynb" new file mode 100644 index 0000000..0787a59 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/33_Ejercicios_de_POO_en_Python.ipynb" @@ -0,0 +1,80 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Ejercicios de Programación orientada a objetos" + ], + "metadata": { + "id": "SebyFZnfVm_G" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 1\n", + "\n", + "Vamos a crear una clase llamada Persona. Sus atributos son: nombre, edad y DNI. Construye los siguientes métodos para la clase:\n", + "\n", + "* Un constructor, donde los datos pueden estar vacíos.\n", + "* Los setters y getters para cada uno de los atributos. Hay que validar las entradas de datos.\n", + "* mostrar(): Muestra los datos de la persona.\n", + "* esMayorDeEdad(): Devuelve un valor lógico indicando si es mayor de edad." + ], + "metadata": { + "id": "KPNSyUxmVqqb" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 2\n", + "\n", + "Crea una clase llamada Cuenta que tendrá los siguientes atributos: titular (que es una persona) y cantidad (puede tener decimales). El titular será obligatorio y la cantidad es opcional. Construye los siguientes métodos para la clase:\n", + "\n", + "* Un constructor, donde los datos pueden estar vacíos.\n", + "* Los setters y getters para cada uno de los atributos. El atributo no se puede modificar directamente, solo ingresando o retirando dinero.\n", + "* mostrar(): Muestra los datos de la cuenta.\n", + "* ingresar(cantidad): se ingresa una cantidad a la cuenta, si la cantidad introducida es negativa, no se hará nada.\n", + "* retirar(cantidad): se retira una cantidad a la cuenta. La cuenta puede estar en números rojos." + ], + "metadata": { + "id": "vi0EDnjEV08h" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Ejercicio 3\n", + "\n", + "Vamos a definir ahora una “Cuenta Joven”, para ello vamos a crear una nueva clase CuentaJoven que deriva de la anterior. Cuando se crea esta nueva clase, además del titular y la cantidad se debe guardar una bonificación que estará expresada en tanto por ciento.Construye los siguientes métodos para la clase:\n", + "\n", + "* Un constructor.\n", + "* Los setters y getters para el nuevo atributo.\n", + "* En esta ocasión los titulares de este tipo de cuenta tienen que ser mayor de edad., por lo tanto hay que crear un método esTitularValido() que devuelve verdadero si el titular es mayor de edad pero menor de 25 años y falso en caso contrario.\n", + "* Además la retirada de dinero sólo se podrá hacer si el titular es válido.\n", + "* El método mostrar() debe devolver el mensaje de “Cuenta Joven” y la bonificación de la cuenta.\n", + "\n", + "\n", + "Piensa los métodos heredados de la clase madre que hay que reescribir." + ], + "metadata": { + "id": "Scs3L5QLWFNB" + } + } + ] +} \ No newline at end of file diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/privado/CuentaBancaria.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/privado/CuentaBancaria.py" new file mode 100644 index 0000000..ae35603 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/privado/CuentaBancaria.py" @@ -0,0 +1,20 @@ +class CuentaBancaria(): + + # Atributo privado + _numero_cuenta = 123456789 + + def __init__(self, saldo): + self.saldo = saldo + + def depositar(self, cantidad): + self.saldo += cantidad + + def retirar(self, cantidad): + self.saldo -= cantidad + + +# Crear un objeto de la clase CuentaBancaria +cuenta = CuentaBancaria(100) + +# **Error:** No se puede acceder al atributo _numero_cuenta desde fuera de la clase +print(cuenta._numero_cuenta) diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/protegido/CuentaBancaria.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/protegido/CuentaBancaria.py" new file mode 100644 index 0000000..a497e98 --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/protegido/CuentaBancaria.py" @@ -0,0 +1,35 @@ +class CuentaBancaria: + + # Atributo protegido + _interes_anual = 0.05 + + def __init__(self, saldo): + self.saldo = saldo + + def depositar(self, cantidad): + self.saldo += cantidad + + def retirar(self, cantidad): + self.saldo -= cantidad + + +# Crear un objeto de la clase CuentaBancaria +cuenta = CuentaBancaria(100) + +# **Error:** No se puede acceder al atributo _interes_anual desde fuera de la clase +# print(cuenta._interes_anual) + +# **Correcto:** Se puede acceder al atributo _interes_anual desde una subclas + + +class CuentaAhorro(CuentaBancaria): + + def calcular_intereses(self): + return self.saldo * self._interes_anual + + +# Crear un objeto de la clase CuentaAhorro +cuenta_ahorro = CuentaAhorro(100) + +# Acceder al atributo _interes_anual desde la subclas +print(cuenta_ahorro._interes_anual) diff --git "a/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/publico/CuentaBancaria.py" "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/publico/CuentaBancaria.py" new file mode 100644 index 0000000..653a8fa --- /dev/null +++ "b/PIA/UT04. Librer\303\255as de programaci\303\263n de Aprendizaje Autom\303\241tico con Python/UT04. Teoria/Para Finalizar la parte de sintaxis de Python/encapsulacion/publico/CuentaBancaria.py" @@ -0,0 +1,32 @@ +class CuentaBancaria: + + # Atributo público + saldo = 0 + + def __init__(self, saldo): + self.saldo = saldo + + def depositar(self, cantidad): + self.saldo += cantidad + + def retirar(self, cantidad): + self.saldo -= cantidad + + +# Crear un objeto de la clase CuentaBancaria +cuenta = CuentaBancaria(100) + +# Acceder al saldo de la cuenta +print(cuenta.saldo) + +# Depositar dinero en la cuenta +cuenta.depositar(100) + +# Verificar el saldo de la cuenta +print(cuenta.saldo) + +# Retirar dinero de la cuenta +cuenta.retirar(50) + +# Verificar el saldo de la cuenta +print(cuenta.saldo) diff --git a/PIA/UT05. Redes Neuronales/00_firsts_steps_with_python.ipynb b/PIA/UT05. Redes Neuronales/00_firsts_steps_with_python.ipynb new file mode 100644 index 0000000..340cf63 --- /dev/null +++ b/PIA/UT05. Redes Neuronales/00_firsts_steps_with_python.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "X2Q3sYvlbzpm" + }, + "source": [ + "## Tu primera red neuronal en Python y Tensorflow\n", + "\n", + "Usaremos la función print() que veremos más adelante con profundidad." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "90Pbp_fZb4im", + "outputId": "5310e6ce-a30f-4da1-a71c-c3afdc693114" + }, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "bCwMfoCvb6dq" + }, + "outputs": [], + "source": [ + "# Datos reales sobre \n", + "# 7 entradas de los grados celsius\n", + "celsius = np.array([-40 , -10 , 0 , 8 , 15 , 22 , 38])\n", + "# 7 salida de los grados fharenheit\n", + "fahrenheit = np.array([-40 , 14 , 32 , 46 , 59 , 72 , 100] , dtype=float)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From C:\\Users\\Robot\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\keras\\src\\backend.py:873: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n", + "\n" + ] + } + ], + "source": [ + "# Keras : Framework nos permite simplificar las redes neuronales simples\n", + "# Capas \"Dense\" del tipo Keras : \n", + "# Son capas que tienen conexiones desde cada neurona a todas las neuronas de la siguiente capa\n", + "# ↓ La capa de salida solo tiene una \n", + "# ↓ neurona 'usamos la variable input shape'\n", + "# ↓ Indico que tenemos una entrada con\n", + "# ↓ una neurona 'nos autoregistra \n", + "# ↓ la capa de entrada' con una neurona\n", + "# ↓ ↓\n", + "# capa = tf.keras.layers.Dense(units=1 , input_shape=[1]) # units = 1 , input_shape = 1\n", + "# Utilizo el modelo secuencial entre otros modelos\n", + "# Indico la capa que creamos aunque ya tenemos el modelo preparado\n", + "# modelo = tf.keras.Sequential([capa]) # Sequential = linear stack of layers\n", + "# Compila el modelo para entrenar el modelo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**¿Qué es `input_shape=[1]`?**\n", + "\n", + "`input_shape=[1]` es un argumento que se pasa a la capa `Dense` de Keras para especificar la forma del tensor de entrada\n", + "En este caso, `input_shape=[1]` indica que el tensor de entrada a esta capa debe ser un vector unidimensional.\n", + "\n", + "**¿Qué representa `input_shape=[1]`?**\n", + "\n", + "`input_shape=[1]` representa la forma de los datos de entrada que se espera que reciba la capa. \n", + "En este caso, `input_shape=[1]` significa que la capa espera recibir datos de entrada que sean vectores unidimensionales.\n", + "\n", + "**¿De dónde viene `input_shape=[1]`?**\n", + "\n", + "`input_shape=[1]` viene de los datos con los que estás trabajando. Debes configurar `input_shape` para que coincida con la forma de tus datos de entrada. \n", + "Por ejemplo, si estás trabajando con datos que son vectores unidimensionales, entonces usarías `input_shape=[1]`\n", + "\n", + "**¿Cómo se usa `input_shape=[1]`?**\n", + "\n", + "`input_shape=[1]` se usa al definir la arquitectura de tu modelo de red neuronal. \n", + "Cuando agregas una capa a tu modelo usando `tf.keras.layers.Dense`, puedes especificar `input_shape=[1]` para indicar que esta capa debe esperar recibir vectores unidimensionales como entrada" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Agrego 2 capas y 3 neuronas en la capa oculta\n", + "oculta1 = tf.keras.layers.Dense(units=3 , input_shape=[1])\n", + "oculta2 = tf.keras.layers.Dense(units=3)\n", + "salida = tf.keras.layers.Dense(units=1)\n", + "modelo = tf.keras.Sequential([oculta1 , oculta2 , salida])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Adam = Método de descenso de gradiente estocástico que se basa en la estimación adaptativa de momentos de primer y segundo orden\n", + "# mean_squared_error = Calcula la media de cuadrados de errores entre etiquetas y predicciones\n", + "modelo.compile(\n", + " # Tasa de aprendizaje : 0.1 - ajustar pesos y sesgos\n", + " # ↓\n", + " # ↓\n", + " # ↓\n", + " optimizer=tf.keras.optimizers.Adam(0.1),\n", + " loss='mean_squared_error'\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Comenzando el entrenamiento...\n", + "Modelo entrenado!\n" + ] + } + ], + "source": [ + "print(\"Comenzando el entrenamiento...\")\n", + "# Ahora entrenamos nuestro modelo con datos usando la funcion fit\n", + "# 1º indicamos los datos de entrada y resultados esperados\n", + "# 2º epochs = solo tenemos 7 datos - una vuelta significa revisar los 7 una sola vez\n", + "# Tenemos que darle muchas vueltas a los datos para que se optimice lo max posible\n", + "# verbose = False → para evitar ruido en los datos\n", + "historial = modelo.fit(celsius , fahrenheit , epochs=1000 , verbose=False)\n", + "print(\"Modelo entrenado!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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5xCxygwAAOu4HYgSEhLO+gDGiooKxcfHe6SoSn369NGbb76ppUuX6h//+IdWrlypvn37qqKiQpJUUFCgmJgYl98JCgpSdHS0CgoKzDaxsbEubSrfV7Y53YQJE1RcXGy+du/e7dHrOhVTiAAAsJ7bQ2ZPPfWU7r77br388stmz8y6det077336umnn/ZocUOGDDF/bt++vTp06KDmzZtrxYoV6tWrl0e/61R2u/2MuUrewpAZAADWczsQ3XrrrTp69KhSUlIUFHTi18vLyxUUFKSRI0dq5MiRZtuioiLPVSqpWbNmatiwoXbs2KFevXopLi5O+/btc2lTXl6uoqIic95RXFycCgsLXdpUvv+tuUm+RA8RAADWczsQPffcc14oo2r27NmjAwcOqHHjxpKk1NRUHTx4UDk5OerSpYskadmyZXI6nUpJSTHbPPzwwyorK1OdOnUkSVlZWWrZsqXq169vzYWcwnZy7w4AAGARtwPR8OHDPfblhw8f1o4dO8z3u3btUm5urqKjoxUdHa3HHntMgwcPVlxcnL7//ns9+OCDatGihdLT0yVJrVu3Vp8+fXT77bdr5syZKisr05gxYzRkyBBzPtONN96oxx57TKNGjdL48eO1efNmPf/883r22Wc9dh0Xgr3MAACw3nk/mNET1q1bp86dO5ubwo4bN06dO3fWpEmTFBgYqI0bN+q6667TJZdcolGjRqlLly76/PPPXeb3zJ49W61atVKvXr3Ur18/XXnllXr11VfN85GRkfrss8+0a9cudenSRffff78mTZpULZ5BJJ2yysxpcSEAAPix89q6w1Ouvvrqc04mXrx48e9+RnR0tPkQxt/SoUMHff75527X5wts3QEAgPUs7SECm7sCAFAdEIgsxtYdAABY77wD0Y4dO7R48WIdO3ZMEs/ROV/0EAEAYD23A9GBAweUlpamSy65RP369dPevXslSaNGjdL999/v8QJrO5v5E4kIAACruB2I7rvvPgUFBSk/P1+hoaHm8RtuuMGtjV1xQsCvXUT0EAEAYB23V5l99tlnWrx4sZo0aeJy/OKLL9YPP/zgscL8xq9dRE4SEQAAlnG7h+jIkSMuPUOVioqKfLb/V23C1h0AAFjP7UDUo0cPvfnmm+Z7m80mp9OpadOm6ZprrvFocf7AxpAZAACWc3vIbNq0aerVq5fWrVun0tJS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mzdvNnJzc41+/foZiYmJxuHDh802d955p5GQkGAsXbrUWLdunXHZZZcZl19+uXm+vLzcaNeunZGWlmZs2LDB+OSTT4yGDRsaEyZMsOKSqr21a9caTZs2NTp06GDce++95nHus2cUFRUZSUlJxq233mqsWbPG2Llzp7F48WJjx44dZpupU6cakZGRxocffmh88803xnXXXWckJycbx44dM9v06dPH6Nixo7F69Wrj888/N1q0aGEMHTrUikuqlp588kmjQYMGxoIFC4xdu3YZc+fONerVq2c8//zzZhvus/s++eQT4+GHHzbmzZtnSDI++OADl/OeuKfFxcVGbGysMWzYMGPz5s3GO++8Y4SEhBj//Oc/L7h+ApFFunfvbmRkZJjvKyoqjPj4eCMzM9PCqmq2ffv2GZKMlStXGoZhGAcPHjTq1KljzJ0712yzbds2Q5KRnZ1tGMaJ/4ADAgKMgoICs80rr7xiREREGCUlJb69gGru0KFDxsUXX2xkZWUZV111lRmIuM+eM378eOPKK6/8zfNOp9OIi4sznnrqKfPYwYMHDbvdbrzzzjuGYRjG1q1bDUnG119/bbb59NNPDZvNZvz444/eK74G6d+/vzFy5EiXY4MGDTKGDRtmGAb32RNOD0SeuqczZsww6tev7/Lvxvjx442WLVtecM0MmVmgtLRUOTk5SktLM48FBAQoLS1N2dnZFlZWsxUXF0uSoqOjJUk5OTkqKytzuc+tWrVSYmKieZ+zs7PVvn17xcbGmm3S09PlcDi0ZcsWH1Zf/WVkZKh///4u91PiPnvSxx9/rK5du+rPf/6zYmJi1LlzZ/3rX/8yz+/atUsFBQUu9zoyMlIpKSku9zoqKkpdu3Y126SlpSkgIEBr1qzx3cVUY5dffrmWLl2qb7/9VpL0zTff6IsvvlDfvn0lcZ+9wVP3NDs7Wz179lRwcLDZJj09XXl5efrll18uqEY2d7XAzz//rIqKCpc/DpIUGxur7du3W1RVzeZ0OjV27FhdccUVateunSSpoKBAwcHBioqKcmkbGxurgoICs83Z/n+oPIcT5syZo/Xr1+vrr78+4xz32XN27typV155RePGjdPf/vY3ff3117rnnnsUHBys4cOHm/fqbPfy1HsdExPjcj4oKEjR0dHc61899NBDcjgcatWqlQIDA1VRUaEnn3xSw4YNkyTusxd46p4WFBQoOTn5jM+oPFe/fv3zrpFAhFohIyNDmzdv1hdffGF1KbXO7t27de+99yorK0t169a1upxazel0qmvXrvr73/8uSercubM2b96smTNnavjw4RZXV3u89957mj17tt5++221bdtWubm5Gjt2rOLj47nPfowhMws0bNhQgYGBZ6zCKSwsVFxcnEVV1VxjxozRggULtHz5cjVp0sQ8HhcXp9LSUh08eNCl/an3OS4u7qz/P1Sew4khsX379unSSy9VUFCQgoKCtHLlSr3wwgsKCgpSbGws99lDGjdurDZt2rgca926tfLz8yWdvFfn+rcjLi5O+/btczlfXl6uoqIi7vWvHnjgAT300EMaMmSI2rdvr5tvvln33XefMjMzJXGfvcFT99Sb/5YQiCwQHBysLl26aOnSpeYxp9OppUuXKjU11cLKahbDMDRmzBh98MEHWrZs2RndqF26dFGdOnVc7nNeXp7y8/PN+5yamqpNmza5/EeYlZWliIiIM/4w+atevXpp06ZNys3NNV9du3bVsGHDzJ+5z55xxRVXnPHoiG+//VZJSUmSpOTkZMXFxbnca4fDoTVr1rjc64MHDyonJ8dss2zZMjmdTqWkpPjgKqq/o0ePKiDA9c9fYGCgnE6nJO6zN3jqnqampmrVqlUqKysz22RlZally5YXNFwmiWX3VpkzZ45ht9uNWbNmGVu3bjXuuOMOIyoqymUVDs7trrvuMiIjI40VK1YYe/fuNV9Hjx4129x5551GYmKisWzZMmPdunVGamqqkZqaap6vXA7eu3dvIzc311i0aJHRqFEjloP/jlNXmRkG99lT1q5dawQFBRlPPvmk8d133xmzZ882QkNDjbfeestsM3XqVCMqKsr46KOPjI0bNxoDBgw469Llzp07G2vWrDG++OIL4+KLL/br5eCnGz58uHHRRReZy+7nzZtnNGzY0HjwwQfNNtxn9x06dMjYsGGDsWHDBkOSMX36dGPDhg3GDz/8YBiGZ+7pwYMHjdjYWOPmm282Nm/ebMyZM8cIDQ1l2X1N9+KLLxqJiYlGcHCw0b17d2P16tVWl1SjSDrr6/XXXzfbHDt2zBg9erRRv359IzQ01Lj++uuNvXv3unzO//73P6Nv375GSEiI0bBhQ+P+++83ysrKfHw1NcvpgYj77Dnz58832rVrZ9jtdqNVq1bGq6++6nLe6XQaEydONGJjYw273W706tXLyMvLc2lz4MABY+jQoUa9evWMiIgIY8SIEcahQ4d8eRnVmsPhMO69914jMTHRqFu3rtGsWTPj4YcfdlnKzX123/Lly8/6b/Lw4cMNw/DcPf3mm2+MK6+80rDb7cZFF11kTJ061SP12wzjlEdzAgAA+CHmEAEAAL9HIAIAAH6PQAQAAPwegQgAAPg9AhEAAPB7BCIAAOD3CEQAAMDvEYgAAIDfIxABAAC/RyACUK3t379fwcHBOnLkiMrKyhQWFmbu/v5bHn30UdlstjNerVq18lHVAGqaIKsLAIBzyc7OVseOHRUWFqY1a9YoOjpaiYmJv/t7bdu21ZIlS1yOBQXxTx6As6OHCEC19tVXX+mKK66QJH3xxRfmz78nKChIcXFxLq+GDRua55s2baopU6Zo6NChCgsL00UXXaSXX37Z5TPy8/M1YMAA1atXTxEREfrLX/6iwsJClzbz589Xt27dVLduXTVs2FDXX3+9ee6///2vunbtqvDwcMXFxenGG2/Uvn37zvdWAPAiAhGAaic/P19RUVGKiorS9OnT9c9//lNRUVH629/+pg8//FBRUVEaPXr0BX/PU089pY4dO2rDhg166KGHdO+99yorK0uS5HQ6NWDAABUVFWnlypXKysrSzp07dcMNN5i/v3DhQl1//fXq16+fNmzYoKVLl6p79+7m+bKyMk2ZMkXffPONPvzwQ/3vf//TrbfeesF1A/A8drsHUO2Ul5drz549cjgc6tq1q9atW6ewsDB16tRJCxcuVGJiourVq+fS43OqRx99VFOmTFFISIjL8ZtuukkzZ86UdKKHqHXr1vr000/N80OGDJHD4dAnn3yirKws9e3bV7t27VJCQoIkaevWrWrbtq3Wrl2rbt266fLLL1ezZs301ltvVem61q1bp27duunQoUOqV6/e+dwaAF5CDxGAaicoKEhNmzbV9u3b1a1bN3Xo0EEFBQWKjY1Vz5491bRp098MQ5Vatmyp3Nxcl9fjjz/u0iY1NfWM99u2bZMkbdu2TQkJCWYYkqQ2bdooKirKbJObm6tevXr9Zg05OTm69tprlZiYqPDwcF111VWS9LuTwgH4HjMMAVQ7bdu21Q8//KCysjI5nU7Vq1dP5eXlKi8vV7169ZSUlKQtW7ac8zOCg4PVokULr9Z5eg/UqY4cOaL09HSlp6dr9uzZatSokfLz85Wenq7S0lKv1gXAffQQAah2PvnkE+Xm5iouLk5vvfWWcnNz1a5dOz333HPKzc3VJ5984pHvWb169RnvW7duLUlq3bq1du/erd27d5vnt27dqoMHD6pNmzaSpA4dOmjp0qVn/ezt27frwIEDmjp1qnr06KFWrVoxoRqoxughAlDtJCUlqaCgQIWFhRowYIBsNpu2bNmiwYMHq3HjxlX6jPLychUUFLgcs9lsio2NNd9/+eWXmjZtmgYOHKisrCzNnTtXCxculCSlpaWpffv2GjZsmJ577jmVl5dr9OjRuuqqq9S1a1dJ0uTJk9WrVy81b95cQ4YMUXl5uT755BONHz9eiYmJCg4O1osvvqg777xTmzdv1pQpUzx0hwB4Gj1EAKqlFStWmMvZ165dqyZNmlQ5DEnSli1b1LhxY5dXUlKSS5v7779f69atU+fOnfXEE09o+vTpSk9Pl3QiPH300UeqX7++evbsqbS0NDVr1kzvvvuu+ftXX3215s6dq48//lidOnXSH/7wB61du1aS1KhRI82aNUtz585VmzZtNHXqVD399NMeuDMAvIFVZgD8UtOmTTV27FiNHTvW6lIAVAP0EAEAAL9HIAIAAH6PITMAAOD36CECAAB+j0AEAAD8HoEIAAD4PQIRAADwewQiAADg9whEAADA7xGIAACA3yMQAQAAv/f/AR2OUpcFOEuBAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Vamos a ver la función de perdida\n", + "# Nos indica como de mal están los resultados de la red en cada vuelta que dio\n", + "import matplotlib.pyplot as plt\n", + "plt.xlabel(\"# Epoca\")\n", + "plt.ylabel(\"Magnitud de perdida\")\n", + "plt.plot(historial.history[\"loss\"])\n", + "## Como le dimos 1000 vueltas - esas vueltas nos aparecen abajo entre\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hagamos una prediccion\n", + "1/1 [==============================] - 0s 101ms/step\n", + "El resultado es : [[211.74742]] fharenheit\n" + ] + } + ], + "source": [ + "print(\"Hagamos una prediccion\")\n", + "resultado = modelo.predict([100.0])\n", + "print(\"El resultado es : \" + str(resultado) + \" fharenheit\") # 12:20" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Variables internas del modelo\n", + "[array([[-0.2695609 , -0.4750531 , -0.34560877]], dtype=float32), array([-3.8606198, -3.8614678, -3.8500001], dtype=float32)]\n", + "[array([[ 1.357941 , -0.7542003 , -0.02827949],\n", + " [ 0.90737456, -0.59022605, 0.18399917],\n", + " [ 0.03215661, -1.3877195 , -0.4266336 ]], dtype=float32), array([-3.9244723, 3.8390677, 2.8068821], dtype=float32)]\n", + "[array([[-0.8319045],\n", + " [ 1.1460551],\n", + " [ 0.3192195]], dtype=float32), array([3.6084816], dtype=float32)]\n" + ] + } + ], + "source": [ + "print(\"Variables internas del modelo\")\n", + "# print(capa.get_weights()) # 12:30\n", + "print(oculta1.get_weights())\n", + "print(oculta2.get_weights())\n", + "print(salida.get_weights())" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/PIA/UT05. Redes Neuronales/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico.ipynb" "b/PIA/UT05. Redes Neuronales/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico.ipynb" new file mode 100644 index 0000000..0442f82 --- /dev/null +++ "b/PIA/UT05. Redes Neuronales/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico.ipynb" @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{"id":"hudS2R4RY-jl"},"source":["# El naufragio del Titanic como problema de Aprendizaje Automático\n","\n","### Planteamiento del problema\n","\n","El naufragio del Titanic es conocido por todos. En este cuaderno y a partir de un conjunto de datos reales exploraremos si la supervivencia de los pasajeros sería predecible a partir de algunas de sus características como su género o la clase en la que viajaban.\n","\n","Para ello construiremos un modelo de clasificación que dividirá a la población en dos clases:\n","\n","Supervivientes. Aquellas personas que lograron salvarse de la catástrofe (principalmente mediante botes salvavidas)\n","\n","No supervivientes. Aquellas personas que no sobrevivieron al naufragio.\n","\n","Nuestro conjunto de datos consta de la variable `survived` que valdrá 1 cuando la persona haya sobrevivido y 0 en caso contrario, por tanto se trata de un **problema de clasificación binaria**.\n","\n","\n","### Breve exploración de los datos\n","\n","Comenzamos cargando el conjunto de datos con el que vamos a trabajar. Este conjunto es bastante popular y se puede o bien descargar o bien extraer directamente del módulo `seaborn`. En este curso optaremos por esta segunda opción:"]},{"cell_type":"code","execution_count":2,"metadata":{"executionInfo":{"elapsed":1574,"status":"ok","timestamp":1695319126459,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"txMsIWfYbZZy"},"outputs":[],"source":["import seaborn as sns\n","datos_titanic = sns.load_dataset(\"titanic\")"]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":333,"status":"ok","timestamp":1695319135049,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"1jh1695DsqY5","outputId":"d58cc85a-9a50-4fbc-c226-d50a21a448cc"},"outputs":[{"data":{"text/plain":["(891, 15)"]},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["datos_titanic.shape"]},{"cell_type":"code","execution_count":4,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"executionInfo":{"elapsed":11,"status":"ok","timestamp":1695319152674,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"gGOEFjVb5TkM","outputId":"f003d229-ba98-4082-8ace-528a64abad74"},"outputs":[{"data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue
\n","
"],"text/plain":[" survived pclass sex age sibsp parch fare embarked class \\\n","0 0 3 male 22.0 1 0 7.2500 S Third \n","1 1 1 female 38.0 1 0 71.2833 C First \n","2 1 3 female 26.0 0 0 7.9250 S Third \n","3 1 1 female 35.0 1 0 53.1000 S First \n","4 0 3 male 35.0 0 0 8.0500 S Third \n","\n"," who adult_male deck embark_town alive alone \n","0 man True NaN Southampton no False \n","1 woman False C Cherbourg yes False \n","2 woman False NaN Southampton yes True \n","3 woman False C Southampton yes False \n","4 man True NaN Southampton no True "]},"execution_count":4,"metadata":{},"output_type":"execute_result"}],"source":["datos_titanic.head()"]},{"cell_type":"markdown","metadata":{"id":"w72nL-PgcgK8"},"source":["#### Diccionario de datos\n","\n"]},{"cell_type":"code","execution_count":5,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":226,"status":"ok","timestamp":1695319165456,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"IZfwko0pcZVn","outputId":"4d35902d-80cd-4a96-d69c-0f125ddfa7db"},"outputs":[{"data":{"text/plain":["Index(['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare',\n"," 'embarked', 'class', 'who', 'adult_male', 'deck', 'embark_town',\n"," 'alive', 'alone'],\n"," dtype='object')"]},"execution_count":5,"metadata":{},"output_type":"execute_result"}],"source":["datos_titanic.columns"]},{"cell_type":"markdown","metadata":{"id":"MSq28CYzhD8t"},"source":["## Diccionario de datos\n","\n","A continuación se enumeran y explican las 16 variables que componen este dataset:\n","\n","* **Survived**. Es una variable binaria que nos indica si la persona ha sobrevivido (1) o no (0).\n","* **PClass**. Es una variable categórica que nos indica la clase en la que viajaba el pasajero. Tiene tres niveles: primera clase (1), segunda clase (2) o tercera clase (3).\n","* **Sex**. Indica el sexo de la persona, solo considera hombre o mujer.\n","* **Age**. Indica la edad en años de la persona.\n","* **Sibsp**. Número de hermanos/esposos que la persona tiene a bordo del barco.\n","* **Parch**. Número de padres o hijos que la persona tiene a bordo del barco.\n","* **Fare**. El billete del pasajero.\n","* **Cabin**. Indica el número de cabina del pasajero.\n","* **Embarked**. Indica el puerto en el que embarcó el pasajero y toma tres posibles valores Cherbourg (C), Queenstown (Q) y Southampton (S).\n","* **Deck**. Indica la cubierta del barco en la que se encontraba el pasajero.\n","\n","Las siguientes variables son construidas a partir de las anteriores y no formaban parte del dataset anterior:\n","\n","* **class** Indican la clase por su nombre\n","* **who** Indican si era hombre, mujer o niño.\n","* **adult_male** Indica si se trataba o no de un hombre adulto.\n","* **embark_town** Equivalente a la variable Embarked pero usando los nombres\n","* **alive** Equivalente a survived pero con sí o no.\n","* **alone** Indica si el pasajero viajaba solo.\n","\n"]},{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"executionInfo":{"elapsed":10,"status":"ok","timestamp":1693771015756,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"TzF7bv9hhd8y","outputId":"78a9dfe2-abee-48f0-9a88-53c7161e7386"},"outputs":[{"data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue
\n","
"],"text/plain":[" survived pclass sex age sibsp parch fare embarked class \\\n","0 0 3 male 22.0 1 0 7.2500 S Third \n","1 1 1 female 38.0 1 0 71.2833 C First \n","2 1 3 female 26.0 0 0 7.9250 S Third \n","3 1 1 female 35.0 1 0 53.1000 S First \n","4 0 3 male 35.0 0 0 8.0500 S Third \n","\n"," who adult_male deck embark_town alive alone \n","0 man True NaN Southampton no False \n","1 woman False C Cherbourg yes False \n","2 woman False NaN Southampton yes True \n","3 woman False C Southampton yes False \n","4 man True NaN Southampton no True "]},"execution_count":6,"metadata":{},"output_type":"execute_result"}],"source":["datos_titanic.head()"]},{"cell_type":"markdown","metadata":{"id":"02A-EBYAeBSx"},"source":["Comenzamos explorando las variables para detectar valores nulos:"]},{"cell_type":"code","execution_count":7,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":302,"status":"ok","timestamp":1695319266023,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"hKXZc-qJceBH","outputId":"4ddedd99-6e02-4e91-9c6c-f8f482b977cb"},"outputs":[{"data":{"text/plain":["survived 0\n","pclass 0\n","sex 0\n","age 177\n","sibsp 0\n","parch 0\n","fare 0\n","embarked 2\n","class 0\n","who 0\n","adult_male 0\n","deck 688\n","embark_town 2\n","alive 0\n","alone 0\n","dtype: int64"]},"execution_count":7,"metadata":{},"output_type":"execute_result"}],"source":["datos_titanic.isna().sum()"]},{"cell_type":"markdown","metadata":{"id":"lZFbq0CzeNev"},"source":["Observamos que la mayor parte de las variables se encuentran completas a excepción de tres:\n","\n","* La edad que presenta 177 valores vacíos.\n","* La cabina que preseta 687 valores vacíos.\n","* La variable de embarcado que presenta 2 valores vacíos.\n","\n","\n","Hacemos una breve imputación de nulos:"]},{"cell_type":"code","execution_count":8,"metadata":{"executionInfo":{"elapsed":527,"status":"ok","timestamp":1695319385152,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"um9VR2YRnRgk"},"outputs":[{"name":"stderr","output_type":"stream","text":["C:\\Users\\Nocturno2324\\AppData\\Local\\Temp\\ipykernel_5176\\1259577514.py:1: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n","The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n","\n","For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n","\n","\n"," datos_titanic['age'].fillna(datos_titanic['age'].median(), inplace=True)\n","C:\\Users\\Nocturno2324\\AppData\\Local\\Temp\\ipykernel_5176\\1259577514.py:2: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n","The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n","\n","For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n","\n","\n"," datos_titanic['deck'].fillna(datos_titanic['deck'].mode()[0], inplace=True)\n","C:\\Users\\Nocturno2324\\AppData\\Local\\Temp\\ipykernel_5176\\1259577514.py:3: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n","The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n","\n","For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n","\n","\n"," datos_titanic['embark_town'].fillna(datos_titanic['embark_town'].mode()[0], inplace=True)\n"]}],"source":["datos_titanic['age'].fillna(datos_titanic['age'].median(), inplace=True)\n","datos_titanic['deck'].fillna(datos_titanic['deck'].mode()[0], inplace=True)\n","datos_titanic['embark_town'].fillna(datos_titanic['embark_town'].mode()[0], inplace=True)"]},{"cell_type":"markdown","metadata":{"id":"q1aOflSRnNP8"},"source":["Podemos estudiar además como se distribuye nuestra variable objetivo:"]},{"cell_type":"code","execution_count":9,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":251,"status":"ok","timestamp":1695319405263,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"FSuOTfn2cmsw","outputId":"9355c95e-235a-45c6-81a5-91d5d4b897d9"},"outputs":[{"data":{"text/plain":["survived\n","0 549\n","1 342\n","Name: count, dtype: int64"]},"execution_count":9,"metadata":{},"output_type":"execute_result"}],"source":["datos_titanic['survived'].value_counts()"]},{"cell_type":"markdown","metadata":{"id":"kxySK8SEe2Sl"},"source":["En ocasiones para entender bien un dataset conviene visualizar algunas de sus variables:"]},{"cell_type":"code","execution_count":10,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":468},"executionInfo":{"elapsed":767,"status":"ok","timestamp":1695319419619,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"XhhrjOH_efcR","outputId":"894a1a83-12f2-4b9a-9c5a-32e1e222e9a0"},"outputs":[{"data":{"text/plain":[""]},"execution_count":10,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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XfVWJoDWj+c3rsVm/aPPawEAALRirf6aHQAAgG9D7AAAAKMROwAAwGjEDvD/Pfnkk3rkkUcCPQ3gO8GyLE2YMEHR0dGy2Wz6+OOPAzKPv/zlLwF9fDQPIz6NBQBoXfLy8rR27Vrt2bNHXbt21e233x7oKcFgxA4AoNmdOnVKnTp10v333x/oqeA7gLex0CoNHjxYkyZN0pQpU3TbbbfJ6XRq1apVvi+TjIyM1J133qn33ntPknT58mWNGzdOCQkJCg8P1913360333zzWx+jvr5eubm5vnPuvfdebd68uTmWBxjtySef1KRJk1RSUiKbzaY77rjjHz7f9uzZI5vNpu3bt6tPnz4KDw/XkCFDVFFRoffee089evSQ3W7Xj3/8Y124cMF3Xl5engYNGqSoqCh16NBB//qv/6pTp0596/w++eQTDRs2TBEREXI6nRozZoy+/PLLJvvvgaZH7KDVWrdunW6//XYdPHhQkyZN0sSJE/Xoo4/q/vvv10cffaSUlBSNGTNGFy5cUH19vTp37qxNmzapuLhYOTk5eumll/Sb3/zmuvefm5ur9evXa8WKFTp69KimTp2q//iP/9DevXubcZWAed58803NnTtXnTt3VllZmQ4dOnTDz7fZs2frl7/8pfbt26fS0lI99thjWrRokTZs2KBt27Zpx44dWrJkie/46upqZWVl6cMPP1R+fr6CgoL0b//2b6qvr7/m3CorKzVkyBD16dNHH374ofLy8lReXq7HHnusSf+boIlZQCv0wAMPWIMGDfLdvnTpktW+fXtrzJgxvn1lZWWWJKuwsPCa95GRkWGlpaX5bqenp1sPP/ywZVmWdfHiRatdu3bWvn37/M4ZN26cNWrUqEZcCfDdtHDhQis+Pt6yrBt7vu3evduSZO3atcs3npuba0myTp065dv3k5/8xEpNTb3u4545c8aSZB05csSyLMs6ffq0Jck6fPiwZVmWNW/ePCslJcXvnNLSUkuSdfz48QavF4HFNTtotXr16uX7OTg4WB06dFBSUpJv35U/F1JRUSFJWrp0qd5++22VlJTom2++UW1trXr37n3N+z558qQuXLigH/3oR377a2tr1adPn0ZeCfDddjPPt7993judTrVr105du3b123fw4EHf7RMnTignJ0cHDhzQl19+6XtFp6SkRD179rxqLn/605+0e/duRUREXDV26tQp3XXXXQ1bJAKK2EGr1aZNG7/bNpvNb5/NZpP012tvNm7cqOeff16vv/663G63IiMj9dprr+nAgQPXvO/z589LkrZt26bvfe97fmP8zR2gcd3M8+3vn+PX+nfgb9+iGjFihOLj47Vq1SrFxsaqvr5ePXv2VG1t7XXnMmLECP385z+/aqxTp043tzC0GMQOvhMKCgp0//3369lnn/Xt+7aLFBMTExUWFqaSkhI98MADzTFF4DurqZ5vX331lY4fP65Vq1bpBz/4gSTpj3/847eec9999+m3v/2t7rjjDoWE8CvSFPyfxHdCt27dtH79em3fvl0JCQn6z//8Tx06dEgJCQnXPD4yMlLPP/+8pk6dqvr6eg0aNEhVVVUqKCiQ3W5Xenp6M68AMFdTPd9uu+02dejQQStXrlSnTp1UUlKiF1988VvPycjI0KpVqzRq1Ci98MILio6O1smTJ7Vx40b96le/UnBwcIPmgsAidvCd8JOf/ESHDx/W448/LpvNplGjRunZZ5/1fTT9WubNm6eOHTsqNzdXn332maKionTffffppZdeasaZA98NTfF8CwoK0saNGzV58mT17NlTd999txYvXqzBgwdf95zY2FgVFBRo+vTpSklJUU1NjeLj4zV06FAFBfEB5tbKZlmWFehJAAAANBUyFQAAGI3YAQAARiN2AACA0YgdAABgNGIHAAAYjdgBAABGI3YAAIDRiB0AAGA0YgcAABiN2AEAAEYjdgAAgNGIHQCt1ubNm5WUlKTw8HB16NBBycnJqq6uliT96le/Uo8ePdS2bVt1795dy5Yt85339NNPq1evXqqpqZEk1dbWqk+fPho7dmxA1gGgaRE7AFqlsrIyjRo1Sk8//bSOHTumPXv2aOTIkbIsS++8845ycnL0yiuv6NixY5o/f75mzpypdevWSZIWL16s6upqvfjii5Kkn/3sZ6qsrNQvf/nLQC4JQBMJCfQEAKAhysrKdOnSJY0cOVLx8fGSpKSkJEnSrFmz9Prrr2vkyJGSpISEBBUXF+utt95Senq6IiIi9Otf/1oPPPCAIiMjtWjRIu3evVt2uz1g6wHQdGyWZVmBngQA3KzLly8rNTVVBw8eVGpqqlJSUvTv//7vCg0NVUREhMLDwxUU9H8vXl+6dEkOh0Pl5eW+fS+99JJyc3M1ffp0vfrqq4FYBoBmwCs7AFql4OBg7dy5U/v27dOOHTu0ZMkS/exnP9OWLVskSatWrVL//v2vOueK+vp6FRQUKDg4WCdPnmzWuQNoXlyzA6DVstlsGjhwoObMmaPDhw8rNDRUBQUFio2N1WeffaY777zTb0tISPCd+9prr+nTTz/V3r17lZeXpzVr1gRwJQCaEq/sAGiVDhw4oPz8fKWkpCgmJkYHDhzQmTNn1KNHD82ZM0eTJ0+Ww+HQ0KFDVVNTow8//FBff/21srKydPjwYeXk5Gjz5s0aOHCg3njjDf30pz/VAw88oK5duwZ6aQAaGdfsAGiVjh07pqlTp+qjjz6S1+tVfHy8Jk2apMzMTEnShg0b9Nprr6m4uFjt27dXUlKSpkyZomHDhqlv374aNGiQ3nrrLd/9Pfzww/ryyy/1wQcf+L3dBaD1I3YAAIDRuGYHAAAYjdgBAABGI3YAAIDRiB0AAGA0YgcAABiN2AEAAEYjdgAAgNGIHQAAYDRiBwAAGI3YAQAARiN2AACA0f4fwNYtKEukIl4AAAAASUVORK5CYII=","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["sns.countplot(x='sex',data=datos_titanic)"]},{"cell_type":"code","execution_count":11,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":466},"executionInfo":{"elapsed":536,"status":"ok","timestamp":1695319462444,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"qRx-CbOme7vc","outputId":"06c8f086-73d6-4548-e1df-2bac72584c3a"},"outputs":[{"data":{"text/plain":[""]},"execution_count":11,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAjGUlEQVR4nO3de3TT9f3H8VdaaCmUpCvSlEqLd6BSYKsCGRtDrFSsHhjVKYdB1R5wWJjYDbt6EAWcdaCCcLg4jwKeWS+4gQPHpVZbVFouVTYEZeg6yw6kRaANVJuWNr8/fj/yMwOca9N+w4fn45ycQ77fT5L3tyecPk/yTWrz+Xw+AQAAGCrM6gEAAADaE7EDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKN1snqAUNDS0qLDhw+re/fustlsVo8DAAC+A5/Pp5MnTyohIUFhYed//YbYkXT48GElJiZaPQYAAGiFQ4cOqXfv3ufdT+xI6t69u6T//WHZ7XaLpwEAAN+Fx+NRYmKi//f4+RA7kv+tK7vdTuwAAHCB+U+noHCCMgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwmqWx89hjj8lmswVc+vXr59/f0NCgnJwc9ejRQ9HR0crMzFR1dXXAfVRVVSkjI0Ndu3ZVXFycZs2apdOnT3f0oQAAgBBl+UfPr732Wr399tv+6506/f9IDz74oN566y2tXbtWDodD06dP1/jx4/XBBx9Ikpqbm5WRkaH4+Hht375dR44c0eTJk9W5c2c98cQTHX4sAAAg9FgeO506dVJ8fPxZ2+vq6vTCCy+osLBQo0aNkiStWrVK/fv3V3l5uYYNG6atW7dq//79evvtt+V0OjV48GDNnz9feXl5euyxxxQREXHOx/R6vfJ6vf7rHo+nfQ4OAABYzvJzdg4ePKiEhARdccUVmjhxoqqqqiRJFRUVampqUlpamn9tv379lJSUpLKyMklSWVmZUlJS5HQ6/WvS09Pl8Xi0b9++8z5mQUGBHA6H/8KfigAAwFyWxs7QoUO1evVqbd68WStWrFBlZaV+/OMf6+TJk3K73YqIiFBMTEzAbZxOp9xutyTJ7XYHhM6Z/Wf2nU9+fr7q6ur8l0OHDgX3wAAAQMiw9G2sMWPG+P89cOBADR06VH369NHrr7+uqKiodnvcyMhIRUZGttv9AwCA0GH521jfFBMTo2uuuUafffaZ4uPj1djYqNra2oA11dXV/nN84uPjz/p01pnr5zoPCAAAXHxCKnZOnTqlzz//XL169VJqaqo6d+6s4uJi//4DBw6oqqpKLpdLkuRyubR3717V1NT41xQVFclutys5ObnD5wcAAKHH0rexfv3rX+u2225Tnz59dPjwYT366KMKDw/XhAkT5HA4lJ2drdzcXMXGxsput2vGjBlyuVwaNmyYJGn06NFKTk7WpEmTtGDBArndbs2ePVs5OTm8TQUAACRZHDv/+te/NGHCBB07dkw9e/bUj370I5WXl6tnz56SpEWLFiksLEyZmZnyer1KT0/X8uXL/bcPDw/Xxo0bNW3aNLlcLnXr1k1ZWVmaN2+eVYcEAABCjM3n8/msHsJqHo9HDodDdXV1stvtVo8DAMZKnfWS1SMghFQsnNym23/X398hdc4OAABAsBE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjBYysfPkk0/KZrNp5syZ/m0NDQ3KyclRjx49FB0drczMTFVXVwfcrqqqShkZGeratavi4uI0a9YsnT59uoOnBwAAoSokYmfXrl167rnnNHDgwIDtDz74oDZs2KC1a9eqtLRUhw8f1vjx4/37m5ublZGRocbGRm3fvl1r1qzR6tWrNWfOnI4+BAAAEKIsj51Tp05p4sSJev755/W9733Pv72urk4vvPCCnnnmGY0aNUqpqalatWqVtm/frvLycknS1q1btX//fv3hD3/Q4MGDNWbMGM2fP1/Lli1TY2OjVYcEAABCiOWxk5OTo4yMDKWlpQVsr6ioUFNTU8D2fv36KSkpSWVlZZKksrIypaSkyOl0+tekp6fL4/Fo3759531Mr9crj8cTcAEAAGbqZOWDv/rqq/rwww+1a9eus/a53W5FREQoJiYmYLvT6ZTb7fav+WbonNl/Zt/5FBQUaO7cuW2cHgAAXAgse2Xn0KFDeuCBB/Tyyy+rS5cuHfrY+fn5qqur818OHTrUoY8PAAA6jmWxU1FRoZqaGv3gBz9Qp06d1KlTJ5WWlmrJkiXq1KmTnE6nGhsbVVtbG3C76upqxcfHS5Li4+PP+nTWmetn1pxLZGSk7HZ7wAUAAJjJsti58cYbtXfvXu3Zs8d/ue666zRx4kT/vzt37qzi4mL/bQ4cOKCqqiq5XC5Jksvl0t69e1VTU+NfU1RUJLvdruTk5A4/JgAAEHosO2ene/fuGjBgQMC2bt26qUePHv7t2dnZys3NVWxsrOx2u2bMmCGXy6Vhw4ZJkkaPHq3k5GRNmjRJCxYskNvt1uzZs5WTk6PIyMgOPyYAABB6LD1B+T9ZtGiRwsLClJmZKa/Xq/T0dC1fvty/Pzw8XBs3btS0adPkcrnUrVs3ZWVlad68eRZODQAAQonN5/P5rB7Cah6PRw6HQ3V1dZy/AwDtKHXWS1aPgBBSsXBym27/XX9/W/49OwAAAO2J2AEAAEYjdgAAgNGIHQAAYDRiBwAAGI3YAQAARiN2AACA0YgdAABgNGIHAAAYjdgBAABGI3YAAIDRiB0AAGA0YgcAABiN2AEAAEYjdgAAgNGIHQAAYDRiBwAAGI3YAQAARiN2AACA0YgdAABgNGIHAAAYjdgBAABGI3YAAIDRiB0AAGA0YgcAABiN2AEAAEYjdgAAgNGIHQAAYDRiBwAAGI3YAQAARiN2AACA0YgdAABgNGIHAAAYjdgBAABGI3YAAIDRiB0AAGA0YgcAABiN2AEAAEYjdgAAgNGIHQAAYDRiBwAAGI3YAQAARiN2AACA0YgdAABgNGIHAAAYjdgBAABGI3YAAIDRiB0AAGA0YgcAABiN2AEAAEYjdgAAgNGIHQAAYDRiBwAAGI3YAQAARiN2AACA0YgdAABgNGIHAAAYjdgBAABGI3YAAIDRiB0AAGA0YgcAABjN0thZsWKFBg4cKLvdLrvdLpfLpU2bNvn3NzQ0KCcnRz169FB0dLQyMzNVXV0dcB9VVVXKyMhQ165dFRcXp1mzZun06dMdfSgAACBEWRo7vXv31pNPPqmKigrt3r1bo0aN0tixY7Vv3z5J0oMPPqgNGzZo7dq1Ki0t1eHDhzV+/Hj/7Zubm5WRkaHGxkZt375da9as0erVqzVnzhyrDgkAAIQYm8/n81k9xDfFxsZq4cKFuv3229WzZ08VFhbq9ttvlyR9+umn6t+/v8rKyjRs2DBt2rRJt956qw4fPiyn0ylJWrlypfLy8nT06FFFRER8p8f0eDxyOByqq6uT3W5vt2MDgItd6qyXrB4BIaRi4eQ23f67/v4OmXN2mpub9eqrr6q+vl4ul0sVFRVqampSWlqaf02/fv2UlJSksrIySVJZWZlSUlL8oSNJ6enp8ng8/leHzsXr9crj8QRcAACAmSyPnb179yo6OlqRkZH6xS9+oXXr1ik5OVlut1sRERGKiYkJWO90OuV2uyVJbrc7IHTO7D+z73wKCgrkcDj8l8TExOAeFAAACBmWx07fvn21Z88e7dixQ9OmTVNWVpb279/fro+Zn5+vuro6/+XQoUPt+ngAAMA6naweICIiQldddZUkKTU1Vbt27dKzzz6rO++8U42NjaqtrQ14dae6ulrx8fGSpPj4eO3cuTPg/s58WuvMmnOJjIxUZGRkkI8EAACEIstf2fl3LS0t8nq9Sk1NVefOnVVcXOzfd+DAAVVVVcnlckmSXC6X9u7dq5qaGv+aoqIi2e12JScnd/jsAAAg9Fj6yk5+fr7GjBmjpKQknTx5UoWFhSopKdGWLVvkcDiUnZ2t3NxcxcbGym63a8aMGXK5XBo2bJgkafTo0UpOTtakSZO0YMECud1uzZ49Wzk5ObxyAwAAJFkcOzU1NZo8ebKOHDkih8OhgQMHasuWLbrpppskSYsWLVJYWJgyMzPl9XqVnp6u5cuX+28fHh6ujRs3atq0aXK5XOrWrZuysrI0b948qw4JAACEmJD7nh0r8D07ANAx+J4dfNNF9z07AAAA7YHYAQAARiN2AACA0YgdAABgNGIHAAAYjdgBAABGa1XsjBo1SrW1tWdt93g8GjVqVFtnAgAACJpWxU5JSYkaGxvP2t7Q0KD33nuvzUMBAAAEy3/1Dcp/+9vf/P/ev3+/3G63/3pzc7M2b96sSy+9NHjTAQAAtNF/FTuDBw+WzWaTzWY759tVUVFRWrp0adCGAwAAaKv/KnYqKyvl8/l0xRVXaOfOnerZs6d/X0REhOLi4hQeHh70IQEAAFrrv4qdPn36SJJaWlraZRgAAIBga/VfPT948KDeffdd1dTUnBU/c+bMafNgAAAAwdCq2Hn++ec1bdo0XXLJJYqPj5fNZvPvs9lsxA4AAAgZrYqdxx9/XL/97W+Vl5cX7HkAAACCqlXfs3PixAndcccdwZ4FAAAg6FoVO3fccYe2bt0a7FkAAACCrlVvY1111VV65JFHVF5erpSUFHXu3Dlg/y9/+cugDAcAANBWrYqd3//+94qOjlZpaalKS0sD9tlsNmIHAACEjFbFTmVlZbDnAAAAaBetOmcHAADgQtGqV3buvffeb93/4osvtmoYAACAYGtV7Jw4cSLgelNTkz7++GPV1tae8w+EAgAAWKVVsbNu3bqztrW0tGjatGm68sor2zwUAABAsATtnJ2wsDDl5uZq0aJFwbpLAACANgvqCcqff/65Tp8+Hcy7BAAAaJNWvY2Vm5sbcN3n8+nIkSN66623lJWVFZTBAAAAgqFVsfPRRx8FXA8LC1PPnj319NNP/8dPagEAAHSkVsXOu+++G+w5AAAA2kWrYueMo0eP6sCBA5Kkvn37qmfPnkEZCgAAIFhadYJyfX297r33XvXq1UsjRozQiBEjlJCQoOzsbH311VfBnhEAAKDVWhU7ubm5Ki0t1YYNG1RbW6va2lq9+eabKi0t1a9+9atgzwgAANBqrXob649//KPeeOMNjRw50r/tlltuUVRUlH72s59pxYoVwZoPAACgTVr1ys5XX30lp9N51va4uDjexgIAACGlVbHjcrn06KOPqqGhwb/t66+/1ty5c+VyuYI2HAAAQFu16m2sxYsX6+abb1bv3r01aNAgSdJf//pXRUZGauvWrUEdEAAAoC1aFTspKSk6ePCgXn75ZX366aeSpAkTJmjixImKiooK6oAAAABt0arYKSgokNPp1JQpUwK2v/jiizp69Kjy8vKCMhwAAEBbteqcneeee079+vU7a/u1116rlStXtnkoAACAYGlV7LjdbvXq1eus7T179tSRI0faPBQAAECwtCp2EhMT9cEHH5y1/YMPPlBCQkKbhwIAAAiWVp2zM2XKFM2cOVNNTU0aNWqUJKm4uFgPPfQQ36AMAABCSqtiZ9asWTp27Jjuv/9+NTY2SpK6dOmivLw85efnB3VAAACAtmhV7NhsNv3ud7/TI488ok8++URRUVG6+uqrFRkZGez5AAAA2qRVsXNGdHS0rr/++mDNAgAAEHStOkEZAADgQkHsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADBam75UEP8vddZLVo+AEFKxcLLVIwAA/g+v7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwmqWxU1BQoOuvv17du3dXXFycxo0bpwMHDgSsaWhoUE5Ojnr06KHo6GhlZmaquro6YE1VVZUyMjLUtWtXxcXFadasWTp9+nRHHgoAAAhRlsZOaWmpcnJyVF5erqKiIjU1NWn06NGqr6/3r3nwwQe1YcMGrV27VqWlpTp8+LDGjx/v39/c3KyMjAw1NjZq+/btWrNmjVavXq05c+ZYcUgAACDEWPoNyps3bw64vnr1asXFxamiokIjRoxQXV2dXnjhBRUWFmrUqFGSpFWrVql///4qLy/XsGHDtHXrVu3fv19vv/22nE6nBg8erPnz5ysvL0+PPfaYIiIiznpcr9crr9frv+7xeNr3QAEAgGVC6pyduro6SVJsbKwkqaKiQk1NTUpLS/Ov6devn5KSklRWViZJKisrU0pKipxOp39Nenq6PB6P9u3bd87HKSgokMPh8F8SExPb65AAAIDFQiZ2WlpaNHPmTA0fPlwDBgyQJLndbkVERCgmJiZgrdPplNvt9q/5Zuic2X9m37nk5+errq7Ofzl06FCQjwYAAISKkPlDoDk5Ofr444/1/vvvt/tjRUZGKjIyst0fBwAAWC8kXtmZPn26Nm7cqHfffVe9e/f2b4+Pj1djY6Nqa2sD1ldXVys+Pt6/5t8/nXXm+pk1AADg4mVp7Ph8Pk2fPl3r1q3TO++8o8svvzxgf2pqqjp37qzi4mL/tgMHDqiqqkoul0uS5HK5tHfvXtXU1PjXFBUVyW63Kzk5uWMOBAAAhCxL38bKyclRYWGh3nzzTXXv3t1/jo3D4VBUVJQcDoeys7OVm5ur2NhY2e12zZgxQy6XS8OGDZMkjR49WsnJyZo0aZIWLFggt9ut2bNnKycnh7eqAACAtbGzYsUKSdLIkSMDtq9atUp33323JGnRokUKCwtTZmamvF6v0tPTtXz5cv/a8PBwbdy4UdOmTZPL5VK3bt2UlZWlefPmddRhAACAEGZp7Ph8vv+4pkuXLlq2bJmWLVt23jV9+vTRX/7yl2COBgAADBESJygDAAC0F2IHAAAYjdgBAABGI3YAAIDRQuYblAEEX+qsl6weASGkYuFkq0cALMErOwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMZmnsbNu2TbfddpsSEhJks9m0fv36gP0+n09z5sxRr169FBUVpbS0NB08eDBgzfHjxzVx4kTZ7XbFxMQoOztbp06d6sCjAAAAoczS2Kmvr9egQYO0bNmyc+5fsGCBlixZopUrV2rHjh3q1q2b0tPT1dDQ4F8zceJE7du3T0VFRdq4caO2bdumqVOndtQhAACAENfJygcfM2aMxowZc859Pp9Pixcv1uzZszV27FhJ0ksvvSSn06n169frrrvu0ieffKLNmzdr165duu666yRJS5cu1S233KKnnnpKCQkJHXYsAAAgNIXsOTuVlZVyu91KS0vzb3M4HBo6dKjKysokSWVlZYqJifGHjiSlpaUpLCxMO3bsOO99e71eeTyegAsAADBTyMaO2+2WJDmdzoDtTqfTv8/tdisuLi5gf6dOnRQbG+tfcy4FBQVyOBz+S2JiYpCnBwAAoSJkY6c95efnq66uzn85dOiQ1SMBAIB2ErKxEx8fL0mqrq4O2F5dXe3fFx8fr5qamoD9p0+f1vHjx/1rziUyMlJ2uz3gAgAAzBSysXP55ZcrPj5excXF/m0ej0c7duyQy+WSJLlcLtXW1qqiosK/5p133lFLS4uGDh3a4TMDAIDQY+mnsU6dOqXPPvvMf72yslJ79uxRbGyskpKSNHPmTD3++OO6+uqrdfnll+uRRx5RQkKCxo0bJ0nq37+/br75Zk2ZMkUrV65UU1OTpk+frrvuuotPYgEAAEkWx87u3bt1ww03+K/n5uZKkrKysrR69Wo99NBDqq+v19SpU1VbW6sf/ehH2rx5s7p06eK/zcsvv6zp06frxhtvVFhYmDIzM7VkyZIOPxYAABCaLI2dkSNHyufznXe/zWbTvHnzNG/evPOuiY2NVWFhYXuMBwAADBCy5+wAAAAEA7EDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxAwAAjEbsAAAAoxE7AADAaMQOAAAwmjGxs2zZMl122WXq0qWLhg4dqp07d1o9EgAACAFGxM5rr72m3NxcPfroo/rwww81aNAgpaenq6amxurRAACAxYyInWeeeUZTpkzRPffco+TkZK1cuVJdu3bViy++aPVoAADAYp2sHqCtGhsbVVFRofz8fP+2sLAwpaWlqays7Jy38Xq98nq9/ut1dXWSJI/H0+o5mr1ft/q2ME9bnkvBxPMS3xQKz0uek/imtj4nz9ze5/N967oLPna+/PJLNTc3y+l0Bmx3Op369NNPz3mbgoICzZ0796ztiYmJ7TIjLj6Opb+wegTgLDwvEWqC9Zw8efKkHA7Hefdf8LHTGvn5+crNzfVfb2lp0fHjx9WjRw/ZbDYLJ7uweTweJSYm6tChQ7Lb7VaPA0jieYnQw3MyeHw+n06ePKmEhIRvXXfBx84ll1yi8PBwVVdXB2yvrq5WfHz8OW8TGRmpyMjIgG0xMTHtNeJFx2638x8YIYfnJUINz8ng+LZXdM644E9QjoiIUGpqqoqLi/3bWlpaVFxcLJfLZeFkAAAgFFzwr+xIUm5urrKysnTddddpyJAhWrx4serr63XPPfdYPRoAALCYEbFz55136ujRo5ozZ47cbrcGDx6szZs3n3XSMtpXZGSkHn300bPeIgSsxPMSoYbnZMez+f7T57UAAAAuYBf8OTsAAADfhtgBAABGI3YAAIDRiB0AAGA0Ygdttm3bNt12221KSEiQzWbT+vXrrR4JF7mCggJdf/316t69u+Li4jRu3DgdOHDA6rFwkVuxYoUGDhzo/zJBl8ulTZs2WT3WRYHYQZvV19dr0KBBWrZsmdWjAJKk0tJS5eTkqLy8XEVFRWpqatLo0aNVX19v9Wi4iPXu3VtPPvmkKioqtHv3bo0aNUpjx47Vvn37rB7NeHz0HEFls9m0bt06jRs3zupRAL+jR48qLi5OpaWlGjFihNXjAH6xsbFauHChsrOzrR7FaEZ8qSAAfJu6ujpJ//uLBQgFzc3NWrt2rerr6/nTRh2A2AFgtJaWFs2cOVPDhw/XgAEDrB4HF7m9e/fK5XKpoaFB0dHRWrdunZKTk60ey3jEDgCj5eTk6OOPP9b7779v9SiA+vbtqz179qiurk5vvPGGsrKyVFpaSvC0M2IHgLGmT5+ujRs3atu2berdu7fV4wCKiIjQVVddJUlKTU3Vrl279Oyzz+q5556zeDKzETsAjOPz+TRjxgytW7dOJSUluvzyy60eCTinlpYWeb1eq8cwHrGDNjt16pQ+++wz//XKykrt2bNHsbGxSkpKsnAyXKxycnJUWFioN998U927d5fb7ZYkORwORUVFWTwdLlb5+fkaM2aMkpKSdPLkSRUWFqqkpERbtmyxejTj8dFztFlJSYluuOGGs7ZnZWVp9erVHT8QLno2m+2c21etWqW77767Y4cB/k92draKi4t15MgRORwODRw4UHl5ebrpppusHs14xA4AADAa36AMAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwAAwGjEDgAAMBqxA8AYJSUlstlsqq2ttXoUACGE2AEAAEYjdgAAgNGIHQAhZeTIkZo+fbqmT58uh8OhSy65RI888ojO/Bk/r9ervLw8JSYmKjIyUldddZVeeOGFc97XsWPHNGHCBF166aXq2rWrUlJS9MorrwSseeONN5SSkqKoqCj16NFDaWlpqq+vl/S/b4sNGTJE3bp1U0xMjIYPH64vvviifX8AAIKuk9UDAMC/W7NmjbKzs7Vz507t3r1bU6dOVVJSkqZMmaLJkyerrKxMS5Ys0aBBg1RZWakvv/zynPfT0NCg1NRU5eXlyW6366233tKkSZN05ZVXasiQITpy5IgmTJigBQsW6Kc//alOnjyp9957Tz6fT6dPn9a4ceM0ZcoUvfLKK2psbNTOnTvP+xfVAYQu/uo5gJAycuRI1dTUaN++ff6w+M1vfqM///nPWr9+vfr27auioiKlpaWddduSkhLdcMMNOnHihGJiYs55/7feeqv69eunp556Sh9++KFSU1P1z3/+U3369AlYd/z4cfXo0UMlJSX6yU9+EvTjBNBxeBsLQMgZNmxYwCsoLpdLBw8e1EcffaTw8PDvHB/Nzc2aP3++UlJSFBsbq+joaG3ZskVVVVWSpEGDBunGG29USkqK7rjjDj3//PM6ceKEJCk2NlZ333230tPTddttt+nZZ5/VkSNHgn+wANodsQPggtGlS5f/av3ChQv17LPPKi8vT++++6727Nmj9PR0NTY2SpLCw8NVVFSkTZs2KTk5WUuXLlXfvn1VWVkpSVq1apXKysr0wx/+UK+99pquueYalZeXB/24ALQvYgdAyNmxY0fA9fLycl199dUaNGiQWlpaVFpa+p3u54MPPtDYsWP185//XIMGDdIVV1yhv//97wFrbDabhg8frrlz5+qjjz5SRESE1q1b59///e9/X/n5+dq+fbsGDBigwsLCth8ggA5F7AAIOVVVVcrNzdWBAwf0yiuvaOnSpXrggQd02WWXKSsrS/fee6/Wr1+vyspKlZSU6PXXXz/n/Vx99dUqKirS9u3b9cknn+i+++5TdXW1f/+OHTv0xBNPaPfu3aqqqtKf/vQnHT16VP3791dlZaXy8/NVVlamL774Qlu3btXBgwfVv3//jvoxAAgSPo0FIORMnjxZX3/9tYYMGaLw8HA98MADmjp1qiRpxYoVevjhh3X//ffr2LFjSkpK0sMPP3zO+5k9e7b+8Y9/KD09XV27dtXUqVM1btw41dXVSZLsdru2bdumxYsXy+PxqE+fPnr66ac1ZswYVVdX69NPP9WaNWt07Ngx9erVSzk5Obrvvvs67OcAIDj4NBaAkDJy5EgNHjxYixcvtnoUAIbgbSwAAGA0YgcAABiNt7EAAIDReGUHAAAYjdgBAABGI3YAAIDRiB0AAGA0YgcAABiN2AEAAEYjdgAAgNGIHQAAYLT/AZyCKahS93x6AAAAAElFTkSuQmCC","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["sns.countplot(x='pclass',data=datos_titanic)"]},{"cell_type":"code","execution_count":12,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":467},"executionInfo":{"elapsed":8,"status":"ok","timestamp":1693771016259,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"R3vsSuwkfAm9","outputId":"d13772bc-0a2e-4fb4-c08b-a458c6fd9155"},"outputs":[{"data":{"text/plain":[""]},"execution_count":12,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["sns.countplot(x='who',data= datos_titanic)"]},{"cell_type":"markdown","metadata":{"id":"uxndM3XklcCh"},"source":["Para poder usar algoritmos debemos transformar las variables que utilizan strings en variables numéricas. Para ello usamos variables dummies:"]},{"cell_type":"code","execution_count":13,"metadata":{"executionInfo":{"elapsed":436,"status":"ok","timestamp":1695319518905,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"XBnENbjklnHL"},"outputs":[],"source":["datos_titanic = datos_titanic.drop([\"pclass\", \"embarked\", \"alive\"], axis=1)"]},{"cell_type":"code","execution_count":14,"metadata":{"executionInfo":{"elapsed":2,"status":"ok","timestamp":1695319520482,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"j5-N-ABFljEi"},"outputs":[],"source":["import pandas as pd\n","datos_titanic_limpios= pd.get_dummies(datos_titanic, columns=['sex', 'embark_town', 'class', 'who', 'deck'], drop_first= True) #automatiza la generación de dummies"]},{"cell_type":"code","execution_count":15,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":226},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1695319521530,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"K0femn8Vnt8p","outputId":"59b3ade1-463a-4b78-b541-5e3bc3274117"},"outputs":[{"data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
survivedagesibspparchfareadult_malealonesex_maleembark_town_Queenstownembark_town_Southamptonclass_Secondclass_Thirdwho_manwho_womandeck_Bdeck_Cdeck_Ddeck_Edeck_Fdeck_G
0022.0107.2500TrueFalseTrueFalseTrueFalseTrueTrueFalseFalseTrueFalseFalseFalseFalse
1138.01071.2833FalseFalseFalseFalseFalseFalseFalseFalseTrueFalseTrueFalseFalseFalseFalse
2126.0007.9250FalseTrueFalseFalseTrueFalseTrueFalseTrueFalseTrueFalseFalseFalseFalse
3135.01053.1000FalseFalseFalseFalseTrueFalseFalseFalseTrueFalseTrueFalseFalseFalseFalse
4035.0008.0500TrueTrueTrueFalseTrueFalseTrueTrueFalseFalseTrueFalseFalseFalseFalse
\n","
"],"text/plain":[" survived age sibsp parch fare adult_male alone sex_male \\\n","0 0 22.0 1 0 7.2500 True False True \n","1 1 38.0 1 0 71.2833 False False False \n","2 1 26.0 0 0 7.9250 False True False \n","3 1 35.0 1 0 53.1000 False False False \n","4 0 35.0 0 0 8.0500 True True True \n","\n"," embark_town_Queenstown embark_town_Southampton class_Second class_Third \\\n","0 False True False True \n","1 False False False False \n","2 False True False True \n","3 False True False False \n","4 False True False True \n","\n"," who_man who_woman deck_B deck_C deck_D deck_E deck_F deck_G \n","0 True False False True False False False False \n","1 False True False True False False False False \n","2 False True False True False False False False \n","3 False True False True False False False False \n","4 True False False True False False False False "]},"execution_count":15,"metadata":{},"output_type":"execute_result"}],"source":["datos_titanic_limpios.head()"]},{"cell_type":"markdown","metadata":{"id":"FmAL7arUjZbm"},"source":["Dividimos el conjunto en datos de entrenamiento y datos de validación separando las variables predictoras de la variable objetivo, es decir, aquella que vamos a buscar predecir:"]},{"cell_type":"code","execution_count":16,"metadata":{"executionInfo":{"elapsed":823,"status":"ok","timestamp":1695319581059,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"9VNH5wGchWvh"},"outputs":[],"source":["X = datos_titanic_limpios.drop('survived', axis=1)\n","y = datos_titanic_limpios['survived']"]},{"cell_type":"markdown","metadata":{"id":"cvdY9cHEjnPL"},"source":["Separamos nuestro conjunto de datos en uno de entrenamiento (casos que enseñaremos al modelo para que aprenda) y otro de validación (casos con los que evaluaremos si el modelo ha sido capaz de aprender o no):"]},{"cell_type":"code","execution_count":18,"metadata":{"executionInfo":{"elapsed":328,"status":"ok","timestamp":1695319591743,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"xqUdoapFjmgQ"},"outputs":[],"source":["from sklearn.model_selection import train_test_split\n","X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)"]},{"cell_type":"markdown","metadata":{"id":"tGl7VChwj3NE"},"source":["Una vez hemos separado los conjuntos de datos estamos listos para construir nuestro modelo.\n","\n","### Construcción del modelo\n","\n","A continuación vamos a construir un árbol de decisión uno de los modelos típicos de Aprendizaje Automático, para ello usaremos el módulo `scikit-learn`:"]},{"cell_type":"code","execution_count":19,"metadata":{"executionInfo":{"elapsed":526,"status":"ok","timestamp":1695319677750,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"fgBIXNkwj0Ce"},"outputs":[],"source":["from sklearn import tree\n","arbol = tree.DecisionTreeClassifier(max_depth = 3, min_samples_split = 5, random_state = 1)"]},{"cell_type":"markdown","metadata":{"id":"pNB5TaVqlD5v"},"source":["Con estas dos líneas de código ya hemos construido nuestra estructura de árbol. A continuación vamos a alimentarla con ejemplos para que pueda empezar a aprender. A este proceso lo llamamos **entrenamiento del modelo**:"]},{"cell_type":"code","execution_count":21,"metadata":{"executionInfo":{"elapsed":337,"status":"ok","timestamp":1695319713323,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"2bqx6Zy2k4lj"},"outputs":[],"source":["arbol = arbol.fit(X_train, y_train)"]},{"cell_type":"markdown","metadata":{"id":"vv31z2PYn2Um"},"source":["Usamos el modelo entrenado para realizar predicciones en test y ver si estamos obteniendo buenos resultados:"]},{"cell_type":"code","execution_count":22,"metadata":{"executionInfo":{"elapsed":205,"status":"ok","timestamp":1695319758849,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"xHvbrPImlPaT"},"outputs":[],"source":["predicciones_test = arbol.predict(X_test)"]},{"cell_type":"markdown","metadata":{"id":"Fmq2eST1n-yQ"},"source":["Podemos calcular de manera rápida la tasa de acierto en los conjuntos de entrenamiento y validación:"]},{"cell_type":"code","execution_count":23,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":278,"status":"ok","timestamp":1695319762724,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"ATjVdbAUoDGx","outputId":"35d580a5-5b95-4917-b370-5e81d84e5f82"},"outputs":[{"data":{"text/plain":["0.8339575530586767"]},"execution_count":23,"metadata":{},"output_type":"execute_result"}],"source":["arbol.score(X_train, y_train)"]},{"cell_type":"code","execution_count":25,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1693771146172,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"2vztTpAcoGVf","outputId":"5911cbbf-7463-48e9-9c48-1d4ed8fafa72"},"outputs":[{"data":{"text/plain":["0.8333333333333334"]},"execution_count":25,"metadata":{},"output_type":"execute_result"}],"source":["arbol.score(X_test, y_test)"]},{"cell_type":"markdown","metadata":{"id":"WbM2bgWhoLdK"},"source":["Nuestro modelo no tiene nada de sobreentrenamiento y posee una tasa de acierto de un 83%, nada desdeñable para ser un primer intento.\n","\n","Podemos explorar además cómo han sido los errores del modelo:"]},{"cell_type":"code","execution_count":26,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":450,"status":"ok","timestamp":1693772137204,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"ZdueHqNxrgtS","outputId":"dea47368-1a05-49d8-d54f-00325f722347"},"outputs":[{"name":"stdout","output_type":"stream","text":["[[46 8]\n"," [ 7 29]]\n"]}],"source":["from sklearn.metrics import confusion_matrix\n","matriz_confusion = confusion_matrix(y_test, predicciones_test)\n","print(matriz_confusion)"]},{"cell_type":"markdown","metadata":{"id":"SLEPBQ0Ergy_"},"source":["### Visualización de los resultados\n","\n","La principal ventaja de los árboles de decisión es que son modelos 100% explicables, y además de una forma muy sencilla y visual:"]},{"cell_type":"code","execution_count":30,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":518},"executionInfo":{"elapsed":387,"status":"ok","timestamp":1693771242641,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"cxqVnYENoJ9K","outputId":"12aabc23-38b3-4595-9c8a-1aba08debee5"},"outputs":[{"ename":"ExecutableNotFound","evalue":"failed to execute WindowsPath('dot'), make sure the Graphviz executables are on your systems' PATH","output_type":"error","traceback":["\u001b[1;31m---------------------------------------------------------------------------\u001b[0m","\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\backend\\execute.py:79\u001b[0m, in \u001b[0;36mrun_check\u001b[1;34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[0m\n\u001b[0;32m 78\u001b[0m kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstderr\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m subprocess\u001b[38;5;241m.\u001b[39mPIPE\n\u001b[1;32m---> 79\u001b[0m proc \u001b[38;5;241m=\u001b[39m \u001b[43m_run_input_lines\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_lines\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 80\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\backend\\execute.py:99\u001b[0m, in \u001b[0;36m_run_input_lines\u001b[1;34m(cmd, input_lines, kwargs)\u001b[0m\n\u001b[0;32m 98\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_run_input_lines\u001b[39m(cmd, input_lines, \u001b[38;5;241m*\u001b[39m, kwargs):\n\u001b[1;32m---> 99\u001b[0m popen \u001b[38;5;241m=\u001b[39m \u001b[43msubprocess\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mPopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstdin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msubprocess\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mPIPE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 101\u001b[0m stdin_write \u001b[38;5;241m=\u001b[39m popen\u001b[38;5;241m.\u001b[39mstdin\u001b[38;5;241m.\u001b[39mwrite\n","File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\\Lib\\subprocess.py:1026\u001b[0m, in \u001b[0;36mPopen.__init__\u001b[1;34m(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, user, group, extra_groups, encoding, errors, text, umask, pipesize, process_group)\u001b[0m\n\u001b[0;32m 1023\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mTextIOWrapper(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr,\n\u001b[0;32m 1024\u001b[0m encoding\u001b[38;5;241m=\u001b[39mencoding, errors\u001b[38;5;241m=\u001b[39merrors)\n\u001b[1;32m-> 1026\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execute_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexecutable\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpreexec_fn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclose_fds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1027\u001b[0m \u001b[43m \u001b[49m\u001b[43mpass_fds\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcwd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1028\u001b[0m \u001b[43m \u001b[49m\u001b[43mstartupinfo\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreationflags\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshell\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1029\u001b[0m \u001b[43m \u001b[49m\u001b[43mp2cread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mp2cwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1030\u001b[0m \u001b[43m \u001b[49m\u001b[43mc2pread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mc2pwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1031\u001b[0m \u001b[43m \u001b[49m\u001b[43merrread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1032\u001b[0m \u001b[43m \u001b[49m\u001b[43mrestore_signals\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1033\u001b[0m \u001b[43m \u001b[49m\u001b[43mgid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgids\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mumask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1034\u001b[0m \u001b[43m \u001b[49m\u001b[43mstart_new_session\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprocess_group\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1035\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[0;32m 1036\u001b[0m \u001b[38;5;66;03m# Cleanup if the child failed starting.\u001b[39;00m\n","File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\\Lib\\subprocess.py:1538\u001b[0m, in \u001b[0;36mPopen._execute_child\u001b[1;34m(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_gid, unused_gids, unused_uid, unused_umask, unused_start_new_session, unused_process_group)\u001b[0m\n\u001b[0;32m 1537\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 1538\u001b[0m hp, ht, pid, tid \u001b[38;5;241m=\u001b[39m \u001b[43m_winapi\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mCreateProcess\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexecutable\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1539\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# no special security\u001b[39;49;00m\n\u001b[0;32m 1540\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 1541\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mint\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mclose_fds\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1542\u001b[0m \u001b[43m \u001b[49m\u001b[43mcreationflags\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1543\u001b[0m \u001b[43m \u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1544\u001b[0m \u001b[43m \u001b[49m\u001b[43mcwd\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1545\u001b[0m \u001b[43m \u001b[49m\u001b[43mstartupinfo\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1546\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 1547\u001b[0m \u001b[38;5;66;03m# Child is launched. Close the parent's copy of those pipe\u001b[39;00m\n\u001b[0;32m 1548\u001b[0m \u001b[38;5;66;03m# handles that only the child should have open. You need\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1551\u001b[0m \u001b[38;5;66;03m# pipe will not close when the child process exits and the\u001b[39;00m\n\u001b[0;32m 1552\u001b[0m \u001b[38;5;66;03m# ReadFile will hang.\u001b[39;00m\n","\u001b[1;31mFileNotFoundError\u001b[0m: [WinError 2] El sistema no puede encontrar el archivo especificado","\nThe above exception was the direct cause of the following exception:\n","\u001b[1;31mExecutableNotFound\u001b[0m Traceback (most recent call last)","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\IPython\\core\\formatters.py:974\u001b[0m, in \u001b[0;36mMimeBundleFormatter.__call__\u001b[1;34m(self, obj, include, exclude)\u001b[0m\n\u001b[0;32m 971\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[0;32m 973\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 974\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43minclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 975\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 976\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\jupyter_integration.py:98\u001b[0m, in \u001b[0;36mJupyterIntegration._repr_mimebundle_\u001b[1;34m(self, include, exclude, **_)\u001b[0m\n\u001b[0;32m 96\u001b[0m include \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(include) \u001b[38;5;28;01mif\u001b[39;00m include \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jupyter_mimetype}\n\u001b[0;32m 97\u001b[0m include \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(exclude \u001b[38;5;129;01mor\u001b[39;00m [])\n\u001b[1;32m---> 98\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m{\u001b[49m\u001b[43mmimetype\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 99\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmimetype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mMIME_TYPES\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 100\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmimetype\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43minclude\u001b[49m\u001b[43m}\u001b[49m\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\jupyter_integration.py:98\u001b[0m, in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 96\u001b[0m include \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(include) \u001b[38;5;28;01mif\u001b[39;00m include \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jupyter_mimetype}\n\u001b[0;32m 97\u001b[0m include \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(exclude \u001b[38;5;129;01mor\u001b[39;00m [])\n\u001b[1;32m---> 98\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {mimetype: \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 99\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m mimetype, method_name \u001b[38;5;129;01min\u001b[39;00m MIME_TYPES\u001b[38;5;241m.\u001b[39mitems()\n\u001b[0;32m 100\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m mimetype \u001b[38;5;129;01min\u001b[39;00m include}\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\jupyter_integration.py:112\u001b[0m, in \u001b[0;36mJupyterIntegration._repr_image_svg_xml\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 110\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_repr_image_svg_xml\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mstr\u001b[39m:\n\u001b[0;32m 111\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the rendered graph as SVG string.\"\"\"\u001b[39;00m\n\u001b[1;32m--> 112\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpipe\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msvg\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mSVG_ENCODING\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\piping.py:104\u001b[0m, in \u001b[0;36mPipe.pipe\u001b[1;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpipe\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 56\u001b[0m \u001b[38;5;28mformat\u001b[39m: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m 57\u001b[0m renderer: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 61\u001b[0m engine: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m 62\u001b[0m encoding: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mUnion[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[0;32m 63\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the source piped through the Graphviz layout command.\u001b[39;00m\n\u001b[0;32m 64\u001b[0m \n\u001b[0;32m 65\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 102\u001b[0m \u001b[38;5;124;03m ' 104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_legacy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 105\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 106\u001b[0m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 107\u001b[0m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 108\u001b[0m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 109\u001b[0m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 110\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\_tools.py:171\u001b[0m, in \u001b[0;36mdeprecate_positional_args..decorator..wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 162\u001b[0m wanted \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 163\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, value \u001b[38;5;129;01min\u001b[39;00m deprecated\u001b[38;5;241m.\u001b[39mitems())\n\u001b[0;32m 164\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe signature of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m will be reduced\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 165\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msupported_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m positional args\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 166\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(supported)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: pass \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mwanted\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 167\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m as keyword arg(s)\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 168\u001b[0m stacklevel\u001b[38;5;241m=\u001b[39mstacklevel,\n\u001b[0;32m 169\u001b[0m category\u001b[38;5;241m=\u001b[39mcategory)\n\u001b[1;32m--> 171\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\piping.py:121\u001b[0m, in \u001b[0;36mPipe._pipe_legacy\u001b[1;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[0;32m 112\u001b[0m \u001b[38;5;129m@_tools\u001b[39m\u001b[38;5;241m.\u001b[39mdeprecate_positional_args(supported_number\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[0;32m 113\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_pipe_legacy\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 114\u001b[0m \u001b[38;5;28mformat\u001b[39m: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 119\u001b[0m engine: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m 120\u001b[0m encoding: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mUnion[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[1;32m--> 121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_future\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 122\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 123\u001b[0m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 124\u001b[0m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 125\u001b[0m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 126\u001b[0m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 127\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\piping.py:149\u001b[0m, in \u001b[0;36mPipe._pipe_future\u001b[1;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[0;32m 146\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m encoding \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 147\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m codecs\u001b[38;5;241m.\u001b[39mlookup(encoding) \u001b[38;5;129;01mis\u001b[39;00m codecs\u001b[38;5;241m.\u001b[39mlookup(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding):\n\u001b[0;32m 148\u001b[0m \u001b[38;5;66;03m# common case: both stdin and stdout need the same encoding\u001b[39;00m\n\u001b[1;32m--> 149\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_lines_string\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 150\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 151\u001b[0m raw \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_pipe_lines(\u001b[38;5;241m*\u001b[39margs, input_encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\backend\\piping.py:212\u001b[0m, in \u001b[0;36mpipe_lines_string\u001b[1;34m(engine, format, input_lines, encoding, renderer, formatter, neato_no_op, quiet)\u001b[0m\n\u001b[0;32m 206\u001b[0m cmd \u001b[38;5;241m=\u001b[39m dot_command\u001b[38;5;241m.\u001b[39mcommand(engine, \u001b[38;5;28mformat\u001b[39m,\n\u001b[0;32m 207\u001b[0m renderer\u001b[38;5;241m=\u001b[39mrenderer,\n\u001b[0;32m 208\u001b[0m formatter\u001b[38;5;241m=\u001b[39mformatter,\n\u001b[0;32m 209\u001b[0m neato_no_op\u001b[38;5;241m=\u001b[39mneato_no_op)\n\u001b[0;32m 210\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minput_lines\u001b[39m\u001b[38;5;124m'\u001b[39m: input_lines, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m'\u001b[39m: encoding}\n\u001b[1;32m--> 212\u001b[0m proc \u001b[38;5;241m=\u001b[39m \u001b[43mexecute\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcapture_output\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m proc\u001b[38;5;241m.\u001b[39mstdout\n","File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\graphviz\\backend\\execute.py:84\u001b[0m, in \u001b[0;36mrun_check\u001b[1;34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[0m\n\u001b[0;32m 82\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 83\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m e\u001b[38;5;241m.\u001b[39merrno \u001b[38;5;241m==\u001b[39m errno\u001b[38;5;241m.\u001b[39mENOENT:\n\u001b[1;32m---> 84\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ExecutableNotFound(cmd) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[0;32m 85\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[0;32m 87\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m quiet \u001b[38;5;129;01mand\u001b[39;00m proc\u001b[38;5;241m.\u001b[39mstderr:\n","\u001b[1;31mExecutableNotFound\u001b[0m: failed to execute WindowsPath('dot'), make sure the Graphviz executables are on your systems' PATH"]},{"data":{"text/plain":[""]},"execution_count":30,"metadata":{},"output_type":"execute_result"}],"source":["import graphviz\n","# Generación del árbol\n","dot_data = tree.export_graphviz(arbol, out_file=None,\n"," feature_names=X_train.columns,\n"," filled=True)\n","\n","# Visualizamos dicho árbol\n","graph = graphviz.Source(dot_data, format=\"png\")\n","graph"]},{"cell_type":"markdown","metadata":{"id":"biOEyIy1otsn"},"source":["Aunque esta visualización puede resultar un poco compleja de primeras en el fondo es sencilla.\n","\n","En la primera línea de cada cuadro tenemos una afirmación, por ejemplo, en la cúspide `who_man <= 0,5`. La variable `who_man` solo toma dos valores 0 cuando no es hombre (y la afirmación anterior sería cierta) o 1 cuando sí es hombre y la afirmación sería falsa.\n","\n","En la segunda línea gini es una medida matemática de impureza.\n","\n","En la tercera cuántas personas se encuentran en esa etapa. En este caso que estamos con la primera pregunta toda nuestra población ergo 801 personas.\n","\n","En la cuarta línea tenemos que de esas 801, 495 no sobrevivirán y 306 sí.\n","\n","Si bajamos un segundo nivel nos encontramos con `class_Third <= 0,5` que será cierta cuando la persona no vaya en tercera clase y falsa en caso de que sí vaya en tercera.\n","\n","En este nodo vemos que la impureza se ha reducido, en el tenemos ya solo a 314 personas de las cuales la mayoría 225 personas se salvan y solo 89 fallecen. Por otro lado vemos que si realmente se hubiera tratado de un hombre tendríamos 406 personas fallecen vs 81 se salvan ergo la primera pregunta es muy buena pues ya es capaz de generar una separación significativamente útil.\n","\n","A medida que vamos descenciendo por el árbol los nodos son cada vez más específicos y concentran más a un tipo determinado de población.\n","\n","\n","\n","¡Muchas gracias por tu atención durante esta lección! No dudes en explorar y mainpular este cuaderno, puedes probar a crear nuevas variables o descartar algunas de las utilizadas para obtener resultados distintos. También puedes interactuar con los parámetros para intentar obtener una tasa de acierto algo mejor."]}],"metadata":{"colab":{"authorship_tag":"ABX9TyNaL0pG7AhF+47QiGeS70+H","provenance":[]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.7"}},"nbformat":4,"nbformat_minor":0} diff --git "a/PIA/UT05. Redes Neuronales/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico/3.4_Resoluci\303\263n_de_un_problema_de_clasificaci\303\263n_en_Python (1).pdf" "b/PIA/UT05. Redes Neuronales/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico/3.4_Resoluci\303\263n_de_un_problema_de_clasificaci\303\263n_en_Python (1).pdf" new file mode 100644 index 0000000..cbad911 Binary files /dev/null and "b/PIA/UT05. Redes Neuronales/3.4._Clasificaci\303\263n_con_Aprendizaje_Autom\303\241tico/3.4_Resoluci\303\263n_de_un_problema_de_clasificaci\303\263n_en_Python (1).pdf" differ diff --git a/PIA/UT05. Redes Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales (2).ipynb b/PIA/UT05. Redes Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales (2).ipynb new file mode 100644 index 0000000..b6673a0 --- /dev/null +++ b/PIA/UT05. Redes Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales (2).ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{"id":"k0ZxdUKB0nWF"},"source":["# Un problema de visión artificial mediante redes neuronales\n","\n","### Planteamiento\n","\n","En este cuaderno vamos a resolver un problema de visión artificial. Construiremos una red neuronal capaz de recibir una fotografía de una prenda de ropa e indicarnos a cual de las siguientes diez categorías pertenece:\n","\n","1. Camisetas\n","2. Pantalones\n","3. Jerseys\n","4. Vestidos\n","5. Abrigos\n","6. Sandalias\n","7. Camisas\n","8. Zapatillas de deporte\n","9. Bolsos\n","10. Botines\n","\n","Para construir esta red neuronal emplearemos Keras: el marco de trabajo con redes neuronales diseñado por Google.\n","\n","### Breve exploración de los datos\n","\n","Comenzamos cargando el conjunto de datos. El conjunto de datos Fashion MNIST es uno de los más usados como iniciación a la Visión Artificial y se encuentra integrado dentro de Keras:\n"]},{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":11219,"status":"ok","timestamp":1695320643586,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"QbofznQ01h9x","outputId":"2dee3174-66c8-4b17-e5cc-699d8c3f2559"},"outputs":[{"ename":"ModuleNotFoundError","evalue":"No module named 'keras'","output_type":"error","traceback":["\u001b[1;31m---------------------------------------------------------------------------\u001b[0m","\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)","Cell \u001b[1;32mIn[1], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mkeras\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdatasets\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m fashion_mnist\n\u001b[0;32m 3\u001b[0m (imagenes_entrenamiento, etiquetas_entrenamiento), (imagenes_test, etiquetas_test) \u001b[38;5;241m=\u001b[39m fashion_mnist\u001b[38;5;241m.\u001b[39mload_data()\n","\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'keras'"]}],"source":["from keras.datasets import fashion_mnist\n","\n","(imagenes_entrenamiento, etiquetas_entrenamiento), (imagenes_test, etiquetas_test) = fashion_mnist.load_data()"]},{"cell_type":"markdown","metadata":{"id":"-8zOy_ff17hl"},"source":["Empleamos el atributo `shape` para ver el tamaño de nuestros datos:"]},{"cell_type":"code","execution_count":2,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":526,"status":"ok","timestamp":1695320690443,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"BXP4FosY1wdX","outputId":"74f76392-71e8-4ef5-b0a1-0d1ee1f240d7"},"outputs":[{"data":{"text/plain":["(60000, 28, 28)"]},"execution_count":2,"metadata":{},"output_type":"execute_result"}],"source":["imagenes_entrenamiento.shape"]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4,"status":"ok","timestamp":1695320707541,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"TAEFjDtt2FRd","outputId":"2124df00-0a0e-4da8-8215-41ac50a8eb3f"},"outputs":[{"data":{"text/plain":["(60000,)"]},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["etiquetas_entrenamiento.shape"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":2,"status":"ok","timestamp":1693767040472,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"ea-QalGS2Ho7","outputId":"1b81e7df-4219-4c54-e526-3ae7cbc7ba83"},"outputs":[{"data":{"text/plain":["(10000, 28, 28)"]},"execution_count":17,"metadata":{},"output_type":"execute_result"}],"source":["imagenes_test.shape"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":2,"status":"ok","timestamp":1693767040867,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"QUGssF3I2K-T","outputId":"d113f1fc-f047-4c5d-9547-65d8ff0c1159"},"outputs":[{"data":{"text/plain":["(10000,)"]},"execution_count":18,"metadata":{},"output_type":"execute_result"}],"source":["etiquetas_test.shape"]},{"cell_type":"markdown","metadata":{"id":"JBkaoGbm-nJN"},"source":["Podemos probar a visualizar alguna de estas imágenes. Si observamos el dato veremos que es una matriz de números:"]},{"cell_type":"code","execution_count":4,"metadata":{"executionInfo":{"elapsed":344,"status":"ok","timestamp":1695320725402,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"u0vrKO09-p2X"},"outputs":[],"source":["prenda = imagenes_entrenamiento[5]"]},{"cell_type":"markdown","metadata":{"id":"jWgGVXdd-y4d"},"source":["Podemos visualizar este conjunto de datos como una imagen usando el módulo matplotlib:"]},{"cell_type":"code","execution_count":5,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":430},"executionInfo":{"elapsed":828,"status":"ok","timestamp":1695320733449,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"Rc_ThpSe-z8u","outputId":"b21e0ca8-7c6f-4e6a-f1e3-3ec6b0e50204"},"outputs":[{"data":{"image/png":"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rF69OkhJSQlqamqslxZVv/zlL4OSkpKgsrIyeP/994O8vLwgLS0tOHnypPXSelVDQ0Pw8ccfBx9//HEgKXj66aeDjz/+OPj888+DIAiC3//+90FKSkqwc+fO4PDhw8Gtt94a5OTkBC0tLcYrj6yvOw8NDQ3Bgw8+GOzduzeorKwMdu/eHXzve98LJk2aFLS2tlovPWLuu+++IDk5OSgpKQmqq6u7t+bm5u597r333mDcuHHBO++8Exw4cCCYO3duMHfuXMNVR96lzkN5eXnw61//Ojhw4EBQWVkZ7Ny5M5gwYUIwb94845X31C8KKAiC4Pnnnw/GjRsXxMfHB3PmzAn27dtnvaSou/3224PMzMwgPj4+GDNmTHD77bcH5eXl1svqde+++24g6bxtxYoVQRCceyn2Y489FqSnpwehUChYsGBBUFZWZrvoXvB156G5uTlYuHBhMGrUqCAuLi4YP358sGrVqgH3TdqF/v+Sgs2bN3fv09LSEvz85z8PRowYEQwdOjS47bbbgurqartF94JLnYdjx44F8+bNC1JTU4NQKBRceeWVwa9+9augvr7eduFfwZ9jAACY6PPPAQEABiYKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAm/h+VJkqNPeSCcgAAAABJRU5ErkJggg==","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["import matplotlib.pyplot as plt\n","plt.imshow(prenda, cmap=plt.cm.binary)\n","plt.show()"]},{"cell_type":"markdown","metadata":{"id":"qWqbui3M5ZPb"},"source":["Para estandarizar los datos (buena práctica a la hora de trabajar con redes neuronales) vamos a hacer que todos los valores con los que trabajemos se encuentren entre 0 y 1:"]},{"cell_type":"code","execution_count":6,"metadata":{"executionInfo":{"elapsed":451,"status":"ok","timestamp":1695320805540,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"w9GwC6pj5jtd"},"outputs":[],"source":["imagenes_entrenamiento = imagenes_entrenamiento.reshape((60000, 28 * 28))\n","imagenes_entrenamiento = imagenes_entrenamiento.astype('float32') / 255\n","imagenes_test = imagenes_test.reshape((10000, 28 * 28))\n","imagenes_test = imagenes_test.astype('float32') / 255"]},{"cell_type":"markdown","metadata":{"id":"NSLWc4g_50ZZ"},"source":["Además convertiremos las etiquetas en variables categóricas para que el modelo entienda que tiene que predecir categorías y no aplique razonamientos numéricos, por ejemplo, que como 8 es zapatillas de deporte y 10 botines, los bolsos (9) son un punto intermedio entre ambos:"]},{"cell_type":"code","execution_count":7,"metadata":{"executionInfo":{"elapsed":362,"status":"ok","timestamp":1695320817327,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"H9r2_5cK6Dgn"},"outputs":[],"source":["from keras.utils import to_categorical\n","etiquetas_entrenamiento = to_categorical(etiquetas_entrenamiento)\n","etiquetas_test = to_categorical(etiquetas_test)"]},{"cell_type":"markdown","metadata":{"id":"iqHGRKrV5PFK"},"source":["### Resolución del problema"]},{"cell_type":"markdown","metadata":{"id":"avJB_tVV2TTN"},"source":["Una vez que tenemos cargados los datos con los que vamos a trabajar procedemos a construir la artquitectura de la red neuronal. Planteamos una red neuronal con dos capas:\n","\n","1. Una capa con 512 neuronas que procesarán toda la información.\n","2. Una capa final con diez neuronas, una por cada categoría que deseamos predecir.\n","\n","La idea es que cada neurona de la última capa prediga la probabilidad de cada categoría, es decir, la primera neurona indicará la probabilidad de que se trate de una camiseta, la segunda de un pantalón y así sucesivamente.\n","\n","Para construir la arquitectura de la red simplemente generaremos un modelo y le asociaremos dos capas:"]},{"cell_type":"code","execution_count":8,"metadata":{"executionInfo":{"elapsed":745,"status":"ok","timestamp":1695320937650,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"fFNokeOk2Mgy"},"outputs":[],"source":["from keras import models\n","from keras import layers\n","\n","red_neuronal = models.Sequential() # indicamos que vamos a construir un modelo secuencial\n","red_neuronal.add(layers.Dense(512, activation='relu', input_shape=(28*28,))) # añadimos la primera capa con 512 neuronas, una función de activación y la forma de los datos de entrada\n","red_neuronal.add(layers.Dense(10, activation=\"softmax\"))"]},{"cell_type":"markdown","metadata":{"id":"jwHz5A7B3bYw"},"source":["__Nota.__ Las funciones de activación de cada capa indican qué transformaciones matemáticas sufrirán los datos al terminar de atravesar dicha capa. Al fin y al cabo podemos pensar en cada capa como una transformación y un filtro de datos.\n","\n","Con estas dos líneas hemos construido la arquitectura de nuestra primera red neuronal. Una vez hecho esto debemos compilar el modelo, es decir, darle las indicaciones necesarias para que pueda ser entrenado.\n","\n","Al compilar el modelo el indicaremos qué tipo de optimizador utilizar, qué función de pérdida y qué métricas deseamos monitorizar.\n","\n","Cuando abordamos un problema de aprendizaje profundo siempre estaremos en el fondo abordando un problema de optimización. En este caso buscamos el modelo que menos se equivoque al realizar las predicciones sobre las prendas, por eso debemos definir un optimizador y una función de pérdida que buscamos reducir. La métrica será una medida que nos interese monitorizar, en este caso por ejemplo monitorizaremos la tasa de acierto:"]},{"cell_type":"code","execution_count":9,"metadata":{"executionInfo":{"elapsed":527,"status":"ok","timestamp":1695320999308,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"o0oV0hTi3amo"},"outputs":[],"source":["red_neuronal.compile(optimizer=\"rmsprop\", loss=\"categorical_crossentropy\", metrics=[\"accuracy\"])"]},{"cell_type":"markdown","metadata":{"id":"RjrjKvFs6Mv3"},"source":["Nuestra arquitectura ya está diseñada y nuestra red compilada por lo que ya estamos listos para entrenar nuestra primera red neuronal. Para ello simplemente alimentaremos el modelo con imágenes y sus etiquetas. Además le indicaremos cuántas iteraciones (epochs) queremos que haga, es decir, cuántas veces queremos que repase los datos y un tamaño de lote (batch size) que hace referencia a cuántas imágenes van a procesarse de cada vez:"]},{"cell_type":"code","execution_count":10,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":143156,"status":"ok","timestamp":1695321185890,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"JFMafdQ15JGP","outputId":"269b7b57-d6a6-45fe-e62a-7aae37369ea3"},"outputs":[{"name":"stdout","output_type":"stream","text":["Epoch 1/25\n","469/469 [==============================] - 6s 11ms/step - loss: 0.5634 - accuracy: 0.8003\n","Epoch 2/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.3878 - accuracy: 0.8590\n","Epoch 3/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.3399 - accuracy: 0.8753\n","Epoch 4/25\n","469/469 [==============================] - 5s 11ms/step - loss: 0.3118 - accuracy: 0.8844\n","Epoch 5/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.2938 - accuracy: 0.8909\n","Epoch 6/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.2784 - accuracy: 0.8972\n","Epoch 7/25\n","469/469 [==============================] - 5s 11ms/step - loss: 0.2650 - accuracy: 0.9010\n","Epoch 8/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.2543 - accuracy: 0.9057\n","Epoch 9/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.2447 - accuracy: 0.9092\n","Epoch 10/25\n","469/469 [==============================] - 5s 11ms/step - loss: 0.2356 - accuracy: 0.9123\n","Epoch 11/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.2267 - accuracy: 0.9159\n","Epoch 12/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.2171 - accuracy: 0.9196\n","Epoch 13/25\n","469/469 [==============================] - 6s 12ms/step - loss: 0.2110 - accuracy: 0.9210\n","Epoch 14/25\n","469/469 [==============================] - 5s 11ms/step - loss: 0.2049 - accuracy: 0.9239\n","Epoch 15/25\n","469/469 [==============================] - 5s 11ms/step - loss: 0.1987 - accuracy: 0.9258\n","Epoch 16/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.1916 - accuracy: 0.9290\n","Epoch 17/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.1869 - accuracy: 0.9304\n","Epoch 18/25\n","469/469 [==============================] - 5s 11ms/step - loss: 0.1810 - accuracy: 0.9335\n","Epoch 19/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.1768 - accuracy: 0.9349\n","Epoch 20/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.1726 - accuracy: 0.9356\n","Epoch 21/25\n","469/469 [==============================] - 5s 11ms/step - loss: 0.1668 - accuracy: 0.9381\n","Epoch 22/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.1647 - accuracy: 0.9388\n","Epoch 23/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.1570 - accuracy: 0.9420\n","Epoch 24/25\n","469/469 [==============================] - 5s 11ms/step - loss: 0.1524 - accuracy: 0.9448\n","Epoch 25/25\n","469/469 [==============================] - 4s 9ms/step - loss: 0.1516 - accuracy: 0.9448\n"]},{"data":{"text/plain":[""]},"execution_count":10,"metadata":{},"output_type":"execute_result"}],"source":["red_neuronal.fit(imagenes_entrenamiento, etiquetas_entrenamiento, epochs=25, batch_size=128)"]},{"cell_type":"markdown","metadata":{"id":"nVSzANJm9tZG"},"source":["¡Ya tenemos nuestro modelo construido y entrenado! Vamos a evaluar cómo de bien nos ha ido:"]},{"cell_type":"code","execution_count":11,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1225,"status":"ok","timestamp":1695321215129,"user":{"displayName":"AN","userId":"07770316912620247459"},"user_tz":-120},"id":"o84sGALe6s1e","outputId":"b0edae0e-9452-4a8e-fee5-8030bc90ad14"},"outputs":[{"name":"stdout","output_type":"stream","text":["313/313 [==============================] - 1s 3ms/step - loss: 0.4125 - accuracy: 0.8889\n","Nuestro modelo acierta en el conjunto de evaluación en un porcentaje de: 88.88999819755554 %.\n"]}],"source":["perdida_test, acierto_test = red_neuronal.evaluate(imagenes_test, etiquetas_test)\n","print('Nuestro modelo acierta en el conjunto de evaluación en un porcentaje de:', acierto_test * 100, \"%.\")"]},{"cell_type":"markdown","metadata":{"id":"JtlRTaFz_nPq"},"source":["Con estas pocas líneas de código hemos sido capaces de construir y entrenar un modelo capaz de procesar imágenes y predecir su clasificación, en concreto, a partir de fotos de ropa en baja resolución es capaz de clasificarlas en diez categorías con una tasa de acierto del 90%.\n","\n","¡Esta tasa aún es mejorable, te animo a tomando este cuaderno como base probar a construir tus propias redes, con más capas o distintos parámetros para ver si logras obtener un resultado mejor!\n","\n","¡Muchas gracias!"]}],"metadata":{"colab":{"authorship_tag":"ABX9TyPmXnTH0svS6+NLeI1iDLCF","provenance":[]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.7"}},"nbformat":4,"nbformat_minor":0} diff --git "a/PIA/UT05. Redes Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales/3.5_Resoluci\303\263n_de_un_problema_de_Deep_Learning_en_Python.pdf" "b/PIA/UT05. Redes Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales/3.5_Resoluci\303\263n_de_un_problema_de_Deep_Learning_en_Python.pdf" new file mode 100644 index 0000000..9aff390 Binary files /dev/null and "b/PIA/UT05. Redes Neuronales/3.5._Fashion_MNIST_con_Redes_Neuronales/3.5_Resoluci\303\263n_de_un_problema_de_Deep_Learning_en_Python.pdf" differ diff --git a/PIA/UT05. Redes Neuronales/5.4.Reconocimiento_Perro_&_Gatos/deep-learning-clasificacion-mascotas.ipynb b/PIA/UT05. Redes Neuronales/5.4.Reconocimiento_Perro_&_Gatos/deep-learning-clasificacion-mascotas.ipynb new file mode 100644 index 0000000..a2a0da7 --- /dev/null +++ b/PIA/UT05. Redes Neuronales/5.4.Reconocimiento_Perro_&_Gatos/deep-learning-clasificacion-mascotas.ipynb @@ -0,0 +1,519 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Categorizando mascotas con redes neuronales" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Introducción\n", + "\n", + "En este cuaderno Jupyter aprenderás a clasificar imágenes de mascotas de forma automática, utilizando la potencia de las redes neuronales convolucionales, la técnica puntera que ha supuesto el _boom_ del Deep Learning." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Carga de datos\n", + "Habremos descargado el conjunto de datos **Oxford pets** del URL y extraído las imágenes a una carpeta `images`. La siguiente celda organiza los archivos en dos clases (perros y gatos) y en dos subconjuntos (entrenamiento y test) para facilitar las tareas posteriores:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Descargar e instalamos la libreria TensorFlow\n", + "%pip install tensorflow" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: tensorflow in c:\\users\\robot\\anaconda3\\lib\\site-packages (2.15.0)\n", + "Requirement already satisfied: tensorflow-intel==2.15.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow) (2.15.0)\n", + "Requirement already satisfied: absl-py>=1.0.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.1.0)\n", + "Requirement already satisfied: astunparse>=1.6.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.6.3)\n", + "Requirement already satisfied: flatbuffers>=23.5.26 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (23.5.26)\n", + "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (0.5.4)\n", + "Requirement already satisfied: google-pasta>=0.1.1 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (0.2.0)\n", + "Requirement already satisfied: h5py>=2.9.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (3.9.0)\n", + "Requirement already satisfied: libclang>=13.0.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (16.0.6)\n", + "Requirement already satisfied: ml-dtypes~=0.2.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (0.2.0)\n", + "Requirement already satisfied: numpy<2.0.0,>=1.23.5 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.24.3)\n", + "Requirement already satisfied: opt-einsum>=2.3.2 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (3.3.0)\n", + "Requirement already satisfied: packaging in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (23.1)\n", + "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (4.25.3)\n", + "Requirement already satisfied: setuptools in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (68.0.0)\n", + "Requirement already satisfied: six>=1.12.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.16.0)\n", + "Requirement already satisfied: termcolor>=1.1.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.4.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.6 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (4.7.1)\n", + "Requirement already satisfied: wrapt<1.15,>=1.11.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.14.1)\n", + "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (0.31.0)\n", + "Requirement already satisfied: grpcio<2.0,>=1.24.3 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (1.60.1)\n", + "Requirement already satisfied: tensorboard<2.16,>=2.15 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.15.2)\n", + "Requirement already satisfied: tensorflow-estimator<2.16,>=2.15.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.15.0)\n", + "Requirement already satisfied: keras<2.16,>=2.15.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorflow-intel==2.15.0->tensorflow) (2.15.0)\n", + "Requirement already satisfied: wheel<1.0,>=0.23.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from astunparse>=1.6.0->tensorflow-intel==2.15.0->tensorflow) (0.38.4)\n", + "Requirement already satisfied: google-auth<3,>=1.6.3 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.28.0)\n", + "Requirement already satisfied: google-auth-oauthlib<2,>=0.5 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (1.2.0)\n", + "Requirement already satisfied: markdown>=2.6.8 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (3.4.1)\n", + "Requirement already satisfied: requests<3,>=2.21.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.31.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (0.7.2)\n", + "Requirement already satisfied: werkzeug>=1.0.1 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.2.3)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (5.3.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (0.2.8)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (4.9)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from google-auth-oauthlib<2,>=0.5->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (1.3.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.0.4)\n", + "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (3.4)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (1.26.16)\n", + "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2024.2.2)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from werkzeug>=1.0.1->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (2.1.1)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (0.4.8)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in c:\\users\\robot\\anaconda3\\lib\\site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<2,>=0.5->tensorboard<2.16,>=2.15->tensorflow-intel==2.15.0->tensorflow) (3.2.2)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "# Importamos las librerías necesarias para la descarga y extracción de los archivos\n", + "# La librería os nos permite interactuar con el sistema operativo y la librería tarfile nos permite trabajar con archivos comprimidos\n", + "import os\n", + "import tarfile\n", + "# La librería urllib.request nos permite descargar archivos de la web\n", + "# requests nos permite hacer peticiones a servidores web y trabajar con sus respuestas\n", + "import urllib.request\n", + "\n", + "# Definir la URL del archivo comprimido\n", + "url1 = \"https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz\"\n", + "\n", + "url2 = \"https://thor.robots.ox.ac.uk/~vgg/data/pets/annotations.tar.gz\"\n", + "\n", + "# Definir el directorio para almacenar el contenido extraído\n", + "directory1 = \"images\"\n", + "directory2 = \"annotations\"\n", + "\n", + "# Crea un directorio para almacenar los archivos extraídos\n", + "os.makedirs(directory1, exist_ok=True)\n", + "os.makedirs(directory2, exist_ok=True)\n", + "\n", + "# Descargar el archivo comprimido\n", + "filename1, _ = urllib.request.urlretrieve(url1)\n", + "filename2, _ = urllib.request.urlretrieve(url2)\n", + "\n", + "# Extraer el contenido del archivo comprimido\n", + "with tarfile.open(filename1, \"r:gz\") as tar:\n", + " tar.extractall(directory1)\n", + "\n", + "# Extraer el contenido del archivo comprimido\n", + "with tarfile.open(filename2, \"r:gz\") as tar:\n", + " tar.extractall(directory2)\n", + "\n", + "# Eliminar el archivo comprimido\n", + "os.remove(filename1)\n", + "os.remove(filename2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T12:52:19.533323800Z", + "start_time": "2024-02-19T12:52:19.499115500Z" + } + }, + "outputs": [], + "source": [ + "# Importamos las librerías necesarias para el desarrollo del modelo de machine learning\n", + "import os\n", + "\n", + "# Definimos las rutas de las carpetas que contienen las imágenes y las anotaciones\n", + "images_path = \"images/images\"\n", + "# Anotaciones de las imágenes\n", + "annotations_path = \"annotations/annotations\"\n", + "\n", + "# open() abre el archivo que se le pasa como argumento y readlines() lee todas las líneas del archivo y las devuelve como una lista\n", + "trainval = open(os.path.join(annotations_path, \"trainval.txt\")).readlines()\n", + "test = open(os.path.join(annotations_path, \"test.txt\")).readlines()\n", + "\n", + "# Creamos las carpetas necesarias para clasificar las imágenes en función de si son de gatos o de perros\n", + "os.makedirs(os.path.join(images_path, \"train\", \"cats\"), exist_ok=True)\n", + "os.makedirs(os.path.join(images_path, \"train\", \"dogs\"), exist_ok=True)\n", + "os.makedirs(os.path.join(images_path, \"test\", \"cats\"), exist_ok=True)\n", + "os.makedirs(os.path.join(images_path, \"test\", \"dogs\"), exist_ok=True)\n", + "\n", + "# Definimos una función que clasifica las imágenes en función de si son de gatos o de perros\n", + "def classify_image(line, subset):\n", + "# basename : Devuelve el último componente de la ruta que se le pasa como argumento\n", + " basename = line.split(\" \")[0]\n", + "# species : Devuelve el tercer componente de la línea que se le pasa como argumento\n", + " species = line.split(\" \")[2]\n", + "# subfolder : Es igual a \"cats\" si species es igual a \"1\" y \"dogs\" en caso contrario \n", + " subfolder = \"cats\" if species == \"1\" else \"dogs\"\n", + "# oldpath : Es igual a la ruta de la imagen \n", + " oldpath = os.path.join(images_path, f\"{basename}.jpg\")\n", + "# newpath : Es igual a la ruta de la imagen en función de si es de gato o de perro \n", + " newpath = os.path.join(images_path, subset, subfolder, f\"{basename}.jpg\")\n", + "# si oldpath : Es un archivo, se renombra a newpath\n", + " if os.path.isfile(oldpath):\n", + " # os.rename() renombra el archivo que se le pasa como primer argumento con el nombre que se le pasa como segundo argumento\n", + " os.rename(oldpath, newpath)\n", + "\n", + "# Clasificamos las imágenes en función de si son de gatos o de perros\n", + "for line in trainval:\n", + " classify_image(line, \"train\")\n", + "\n", + "# Clasificamos las imágenes en función de si son de gatos o de perros\n", + "for line in test:\n", + " classify_image(line, \"test\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "start_time": "2024-02-19T12:51:16.357929400Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From c:\\Users\\Robot\\anaconda3\\Lib\\site-packages\\keras\\src\\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.\n", + "\n", + "Found 3680 images belonging to 2 classes.\n", + "Found 3669 images belonging to 2 classes.\n" + ] + } + ], + "source": [ + "# Importamos las librerías necesarias para el desarrollo del modelo de machine learning\n", + "# La librería tensorflow.keras.preprocessing.image contiene la clase ImageDataGenerator \n", + "# que permite generar lotes de tensores con datos de imagen en tiempo real\n", + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "\n", + "# Creamos un generador de datos de imagen para el conjunto de entrenamiento\n", + "generador_entrenamiento = ImageDataGenerator()\n", + "# flow_from_directory() genera lotes de tensores con datos de imagen en tiempo real\n", + "datos_entrenamiento = generador_entrenamiento.flow_from_directory(\"images/train\")\n", + "# ImageDataGenerator() genera lotes de tensores con datos de imagen en tiempo real\n", + "generador_test = ImageDataGenerator()\n", + "# flow_from_directory() genera lotes de tensores con datos de imagen en tiempo real\n", + "datos_test = generador_test.flow_from_directory(\"images/test\", class_mode=None)\n", + "# next(datos_test) devuelve el siguiente lote de tensores con datos de imagen\n", + "algunas_imagenes = next(datos_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualización\n", + "\n", + "Podemos visualizar algún ejemplo de imagen a continuación:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T12:51:17.684260700Z", + "start_time": "2024-02-19T12:51:16.397928700Z" + } + }, + "outputs": [], + "source": [ + "# matplotlib.pyplot es una colección de funciones que hacen que matplotlib funcione como MATLAB\n", + "from matplotlib import pyplot as plt\n", + "\n", + "# Mostramos algunas imágenes\n", + "plt.imshow(algunas_imagenes[0]/255.)\n", + "# plt.axis('off') elimina los ejes de la imagen para que no se muestren en el gráfico\n", + "plt.axis('off')\n", + "# plt.show() muestra el gráfico\n", + "plt.show()\n", + "# plt.imshow() muestra la imagen que se le pasa como argumento en el gráfico para que se muestre en el gráfico la siguiente imagen\n", + "plt.imshow(algunas_imagenes[1]/255.)\n", + "# plt.axis('off') elimina los ejes de la imagen para que no se muestren en el gráfico para que no se muestren en el gráfico\n", + "plt.axis('off')\n", + "# plt.show() muestra el gráfico\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Carga del modelo\n", + "\n", + "Nuestro objetivo será crear un modelo capaz de responder a la pregunta \"¿Corresponde esta imagen a un gato o a un perro?\". En lugar de diseñar una nueva red neuronal desde cero, podemos cargar una red ya construida y, mejor aún, los parámetros optimizados para el conjunto de datos `Imagenet` de todo tipo de imágenes, de forma que nuestra red viene ya \"preparada\" para reconocer imágenes y no partimos de cero al entrenar. Esta estrategia se conoce como _transfer learning_.\n", + "\n", + "Importaremos la red InceptionV3 desde la biblioteca de modelos ya entrenados de Tensorflow. Esta red se basa en un componente llamado \"bloque Inception\": encadena varios de estos bloques para extraer información de la imagen." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T12:51:17.690260100Z", + "start_time": "2024-02-19T12:51:17.688263400Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From c:\\Users\\Robot\\anaconda3\\Lib\\site-packages\\keras\\src\\backend.py:1398: The name tf.executing_eagerly_outside_functions is deprecated. Please use tf.compat.v1.executing_eagerly_outside_functions instead.\n", + "\n", + "WARNING:tensorflow:From c:\\Users\\Robot\\anaconda3\\Lib\\site-packages\\keras\\src\\layers\\normalization\\batch_normalization.py:979: The name tf.nn.fused_batch_norm is deprecated. Please use tf.compat.v1.nn.fused_batch_norm instead.\n", + "\n" + ] + } + ], + "source": [ + "# Importamos las librerías necesarias para el desarrollo del modelo de machine learning\n", + "# keras es una API de redes neuronales de alto nivel escrita en Python que se utiliza para el desarrollo de modelos de machine learning y deep learning su función principal es la de ser una interfaz de alto nivel para la biblioteca TensorFlow\n", + "# applications contiene una serie de modelos pre-entrenados que se pueden utilizar para el desarrollo de modelos de machine learning y deep learning\n", + "from tensorflow.keras import applications\n", + "# InceptionV3 es una red neuronal convolucional que se utiliza para el desarrollo de modelos de machine learning y deep learning\n", + "# Su función principal es la de ser una interfaz de alto nivel para la biblioteca TensorFlow\n", + "inception = applications.InceptionV3(include_top=False, input_shape=(256, 256, 3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ajustes del modelo\n", + "\n", + "En la siguiente celda añadimos a la red InceptionV3 un par de capas que nos permiten obtener una predicción a partir de la información que haya inferido de la imagen." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "start_time": "2024-02-19T12:51:17.693259900Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From c:\\Users\\Robot\\anaconda3\\Lib\\site-packages\\keras\\src\\optimizers\\__init__.py:309: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n", + "\n" + ] + } + ], + "source": [ + "# Importamos las librerías necesarias para el desarrollo del modelo de machine learning\n", + "# keras es una API de redes neuronales de alto nivel escrita en Python que se utiliza \n", + "# para el desarrollo de modelos de machine learning y deep learning su función principal \n", + "# es la de ser una interfaz de alto nivel para la biblioteca TensorFlow\n", + "\n", + "# tensorflow.keras.layers contiene las clases Flatten y Dense\n", + "# La clase Flatten que se utiliza para aplanar los datos de entrada en una red neuronal \n", + "# La clase Dense que se utiliza para crear capas densas en una red neuronal\n", + "from tensorflow.keras.layers import Flatten, Dense\n", + "# tensorflow.keras.models contiene la clase Sequential que se utiliza para crear modelos de machine learning \n", + "from tensorflow.keras.models import Sequential\n", + "\n", + "# Creamos la variable predictor que es igual a un modelo secuencial que contiene una capa Flatten, una capa Dense con 128 neuronas y una función de activación relu y una capa Dense con 2 neuronas y una función de activación softmax\n", + "predictor = Sequential([\n", + " Flatten(), \n", + " # Dense() crea una capa densa en una red neuronal de 128 neuronas y una función de activación recibe como argumento la función de activación relu \n", + " # \"relu\" : es una función de activación que se utiliza en las redes neuronales\n", + " Dense(128, activation=\"relu\"), \n", + " # Dense() tiene 2 neuronas y una función de activación softmax \n", + " # \"softmax\" : se utiliza en las redes neuronales para clasificación y su función principal es la de convertir los valores de las neuronas en probabilidades\n", + " Dense(2, activation=\"softmax\")\n", + "])\n", + "# Sequential() crea un modelo secuencial que recibe como argumento una lista de capas\n", + "# inception : es un modelo pre-entrenado que se utiliza como capa de extracción de características\n", + "# predictor : es un modelo secuencial que se utiliza como clasificador\n", + "modelo = Sequential([inception, predictor])\n", + "# compile() compila el modelo que se le pasa como argumento\n", + "# funcion optimizer : es el optimizador que se utiliza para el entrenamiento del modelo \n", + "# El parametro \"adam\" es un optimizador que se utiliza en las redes neuronales\n", + "# funcion loss : es la función de pérdida que se utiliza para el entrenamiento del modelo \n", + "# El parametro \"categorical_crossentropy\" es una función de pérdida que se utiliza en las redes neuronales\n", + "modelo.compile(optimizer=\"adam\", loss=\"categorical_crossentropy\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Entrenamiento\n", + "\n", + "Una vez creado el modelo que ya tiene la estructura final para responder preguntas de \"sí/no\", ajustamos sus parámetros (que inicialmente son aleatorios) al conjunto de imágenes que vamos a utilizar para entrenar:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "start_time": "2024-02-19T12:51:17.697260300Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "115/115 [==============================] - 425s 4s/step - loss: 0.0491\n", + "Epoch 2/10\n", + "115/115 [==============================] - 424s 4s/step - loss: 0.0187\n", + "Epoch 3/10\n", + "115/115 [==============================] - 426s 4s/step - loss: 0.0104\n", + "Epoch 4/10\n", + "115/115 [==============================] - 428s 4s/step - loss: 0.0279\n", + "Epoch 5/10\n", + "115/115 [==============================] - 428s 4s/step - loss: 0.0126\n", + "Epoch 6/10\n", + "115/115 [==============================] - 444s 4s/step - loss: 0.0294\n", + "Epoch 7/10\n", + "115/115 [==============================] - 430s 4s/step - loss: 0.0199\n", + "Epoch 8/10\n", + "115/115 [==============================] - 441s 4s/step - loss: 0.0417\n", + "Epoch 9/10\n", + "115/115 [==============================] - 459s 4s/step - loss: 0.0219\n", + "Epoch 10/10\n", + "115/115 [==============================] - 446s 4s/step - loss: 0.0233\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# modelo.fit(datos_entrenamiento, epochs=50)\n", + "# fit() entrena el modelo que se le pasa como argumento \n", + "# datos_entrenamiento : es el conjunto de datos de entrenamiento que se utiliza para el entrenamiento del modelo\n", + "# epochs : es el número de épocas que se utiliza para el entrenamiento del modelo\n", + "modelo.fit(datos_entrenamiento, epochs=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Predicción\n", + "\n", + "Nuestro modelo ya está listo. En la siguiente celda tomamos algunas imágenes del subconjunto de test (imágenes que nunca han sido vistas por la red neuronal) y comprobamos cuáles son las predicciones del modelo: ¿acertará todos los perros y gatos?" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "start_time": "2024-02-19T12:51:17.699265100Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 3s 3s/step\n" + ] + } + ], + "source": [ + "# next(datos_test) devuelve el siguiente lote de tensores con datos de imagen\n", + "lote_test = next(datos_test)\n", + "\n", + "# modelo.predict(lote_test) devuelve las predicciones del modelo que se le pasa como argumento\n", + "probs = modelo.predict(lote_test)\n", + "# La librería numpy es una biblioteca de funciones matemáticas de alto nivel que se utiliza para el desarrollo de modelos de machine learning y deep learning\n", + "import numpy as np\n", + "# np.argmax(probs, -1) devuelve el índice del valor máximo de las predicciones\n", + "# probs : es el conjunto de predicciones que se le pasa como argumento\n", + "# -1 : es el eje en el que se busca el valor máximo\n", + "clase = np.argmax(probs, -1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2024-02-19T12:51:17.701262200Z" + } + }, + "outputs": [], + "source": [ + "# Mostramos las predicciones para las imágenes del lote de test\n", + "mostrar_imagenes = 10\n", + "\n", + "# Mostramos las predicciones para las imágenes del lote de test mediante un bucle for que recorre el rango de mostrar_imagenes \n", + "for i in range(mostrar_imagenes):\n", + "# plt.imshow() muestra la imagen que se le pasa como argumento en el gráfico para que se muestre en el gráfico la siguiente imagen \n", + " plt.imshow(lote_test[i]/255.)\n", + "# plt.axis('off') elimina los ejes de la imagen para que no se muestren en el gráfico\n", + " plt.axis('off')\n", + "# plt.show() muestra el gráfico \n", + " plt.show()\n", + "# print() muestra el texto que se le pasa como argumento y el resultado de la predicción que se le pasa como argumento \n", + " print(\"Predicción:\", \"perro\" if clase[i] else \"gato\")" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "dbd3e46b1708d560de477de7a0c449c08f8861f449ab70b5724e76cdf2c24cff" + }, + "kernelspec": { + "display_name": "Python 3.8.12 ('pytorch')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/PIA/UT05. Redes Neuronales/ejercicio.py b/PIA/UT05. Redes Neuronales/ejercicio.py new file mode 100644 index 0000000..4458618 --- /dev/null +++ b/PIA/UT05. Redes Neuronales/ejercicio.py @@ -0,0 +1 @@ +import tensorflow as tf diff --git "a/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/__pycache__/chatbot.cpython-310.pyc" "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/__pycache__/chatbot.cpython-310.pyc" new file mode 100644 index 0000000..6b789ec Binary files /dev/null and "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/__pycache__/chatbot.cpython-310.pyc" differ diff --git "a/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/chatbot.py" "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/chatbot.py" new file mode 100644 index 0000000..f59ac5a --- /dev/null +++ "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/chatbot.py" @@ -0,0 +1,308 @@ +# Importamos las librerías necesarias +# tkinter es una librería de Python que nos permite crear interfaces gráficas de usuario. +from tkinter import * +# La librería tkinter es una librería de Python que nos permite crear interfaces gráficas de usuario. +import tkinter +# La librería numpy es una librería de Python que nos permite +# trabajar con matrices y vectores de forma eficiente. +# La librería keras es una librería de Python que nos permite crear y entrenar modelos de redes neuronales. +# load_model es una librería de Python que nos permite cargar modelos de redes neuronales. +# models es una librería de Python que nos permite cargar modelos de redes neuronales. +# keras es una librería de Python que nos permite crear y entrenar modelos de redes neuronales. +from keras.models import load_model +# La librería random es una librería de Python que nos permite generar números aleatorios. +import random +# La librería json es una librería de Python que nos permite trabajar con archivos JSON. +import json +# La librería numpy es una librería de Python que nos permite trabajar +# con matrices y vectores de forma eficiente. +import numpy as np +# La librería pickle es una librería de Python que nos permite guardar +# y cargar objetos de Python en archivos. +import pickle +# La librería nltk es una librería de procesamiento de lenguaje natural +# que nos ayudará a tokenizar las palabras de las frases que el usuario escriba +# y a lematizarlas para que el modelo pueda entenderlas. +import nltk +# stem es una librería de Python que nos permite realizar el proceso de stemming +# en las palabras de las frases que el usuario escriba. +# El stemming es el proceso de reducir las palabras a su raíz o base. +# La librería WordNetLemmatizer es una librería de Python que nos permite realizar +# el proceso de lematización en las palabras de las frases que el usuario escriba. +from nltk.stem import WordNetLemmatizer + +# WordNetLemmatizer es una clase de la librería nltk que nos permitirá lematizar las palabras. +# lemmatizer es una variable que almacenará un objeto de la clase WordNetLemmatizer. +# Esta linea de código crea un objeto de la clase WordNetLemmatizer. +lemmatizer = WordNetLemmatizer() + +# Esta linea de código carga el modelo de la red neuronal que hemos entrenado. +# chatbot_model.h5 es un archivo que contiene el modelo de la red neuronal que hemos entrenado. +# model es una variable que almacenará el modelo de la red neuronal que hemos entrenado. +# load_model es una función de la librería keras que nos permitirá cargar el modelo de la red neuronal. +model = load_model('chatbot_model.h5') + +# Esta linea de código carga los datos de entrenamiento del modelo de la red neuronal. +# la funcion read() lee el contenido del archivo y lo almacena en la variable intents. +# intents.json es un archivo que contiene los datos de entrenamiento del modelo de la red neuronal. +# open() es una función de Python que nos permite abrir un archivo. +# loads es una función de Python que nos permite cargar un archivo JSON. +# json es una librería de Python que nos permite trabajar con archivos JSON. +# intents es una variable que almacenará los datos de entrenamiento del modelo de la red neuronal. +intents = json.loads(open('intents.json').read()) +# Esta linea de código carga las palabras que el modelo de la red neuronal ha aprendido. +# rb es un modo de apertura de archivos en Python que nos permite leer un archivo binario. +# words.pkl es un archivo que contiene las palabras que el modelo de la red neuronal ha aprendido. +# open() es una función de Python que nos permite abrir un archivo. +# load() es una función de Python que nos permite cargar un objeto de Python en un archivo. +# pickle es una librería de Python que nos permite guardar y cargar objetos de Python en archivos. +# words es una variable que almacenará las palabras que el modelo de la red neuronal ha aprendido. +words = pickle.load(open('words.pkl', 'rb')) +# rb es un modo de apertura de archivos en Python que nos permite leer un archivo binario. +# classes.pkl es un archivo que contiene las clases que el modelo de la red neuronal ha aprendido. +# open() es una función de Python que nos permite abrir un archivo. +# load() es una función de Python que nos permite cargar un objeto de Python en un archivo. +# pickle es una librería de Python que nos permite guardar y cargar objetos de Python en archivos. +# classes es una variable que almacenará las clases que el modelo de la red neuronal ha aprendido. +# Esta linea de código carga las clases que el modelo de la red neuronal ha aprendido. +classes = pickle.load(open('classes.pkl', 'rb')) + +# Este método se encarga de limpiar la frase que el usuario escriba. + + +def clean_up_sentence(sentence): + # tokenizar el patrón - dividir palabras en array + sentence_words = nltk.word_tokenize(sentence) + # stem cada palabra - crear la forma abreviada de la palabra + sentence_words = [lemmatizer.lemmatize( + # esta linea de código lematiza las palabras de la frase que el usuario escriba. + word.lower()) for word in sentence_words] + # Devolver array de palabras de la frase + return sentence_words + +# devolver array de palabras de la 'bag': 0 o 1 para cada palabra de la 'bag' que existe en la frase + +# Esta función crea una 'bag' de palabras a partir de las palabras de las frases que el usuario escriba. +# Este metodo se encarga de crear una 'bag' de palabras a partir de las palabras de las frases que el usuario escriba. + + +def bow(sentence, words, show_details=True): + # tokenizar el patrón + sentence_words = clean_up_sentence(sentence) + # [0]*len(words) crea una lista de ceros con la longitud de las palabras que el modelo ha aprendido. + # bag de palabras - matriz de N palabras, matriz de vocabulario + # bag es una variable que almacenará la 'bag' de palabras. + # bag es una lista de ceros con la longitud de las palabras que el modelo ha aprendido. + bag = [0]*len(words) + # sentence_words es una lista de palabras que el usuario ha escrito. + for s in sentence_words: + # lematizar palabras de la frase de entrada - crear la forma abreviada de la palabra actual en la frase de entrada + # enumerate() es una función de Python que nos permite recorrer una lista y obtener el índice y el valor de cada elemento. + # para cada palabra en la frase de entrada lematizar la palabra y obtener el índice y el valor de cada elemento. + for i, w in enumerate(words): + # si la palabra actual está en la 'bag' de palabras + if w == s: + # asignar 1 si la palabra actual está en la posición del vocabulario + bag[i] = 1 + # Si se muestran detalles imprimir la palabra actual en la 'bag' de palabras. + # show_details es una variable que nos permitirá mostrar los detalles de la 'bag' de palabras. + if show_details: + print("found in bag: %s" % w) +# Devolver la 'bag' de palabras de la frase de entrada - matriz de 0 y 1 para cada palabra de la 'bag' que existe en la frase de entrada + return (np.array(bag)) + +# Esta función predice la clase de la frase que el usuario escriba. +# sentence es una variable que almacenará la frase que el usuario escriba. +# model es una variable que almacenará el modelo de la red neuronal que hemos entrenado. + + +def predict_class(sentence, model): + # show_details es una variable que nos permitirá mostrar los detalles de la 'bag' de palabras. + # words es una variable que almacenará las palabras que el modelo de la red neuronal ha aprendido. + # sentence es una variable que almacenará la frase que el usuario escriba. + # bow() es una función que nos permitirá crear una 'bag' de palabras a partir de las palabras de las frases que el usuario escriba. + p = bow(sentence, words, show_details=False) + # [0] es una función de Python que nos permitirá obtener el primer elemento de una lista. + # p es una variable que almacenará la 'bag' de palabras de la frase que el usuario escriba. + # model.predict() es una función de Python que nos permitirá predecir la clase de la frase que el usuario escriba. + # np.array() es una función de Python que nos permitirá convertir una lista en un array. + # res es una variable que almacenará la predicción de la clase de la frase que el usuario escriba. + res = model.predict(np.array([p]))[0] + # ERROR_THRESHOLD es una variable que almacenará el umbral de error. + # el 0.25 es el umbral de error que hemos establecido para la predicción de la clase de la frase que el usuario escriba. + ERROR_THRESHOLD = 0.25 + # r es una variable que almacenará el valor de cada elemento. + # res es una variable que almacenará la predicción de la clase de la frase que el usuario escriba. + # enumerate() es una función de Python que nos permitirá recorrer una lista y obtener el índice y el valor de cada elemento. + # r es un valor de la predicción de la clase de la frase que el usuario escriba. + # i es una variable que almacenará el índice de cada elemento. + # for i, r in enumerate(res) si r es mayor que ERROR_THRESHOLD. + # [i, r] es una lista que almacenará el índice y el valor de cada elemento. + # results es una variable que almacenará los resultados de la predicción de la clase de la frase que el usuario escriba. + results = [[i, r] for i, r in enumerate(res) if r > ERROR_THRESHOLD] + # ordenar por fuerza de probabilidad + # reverse=True es una función de Python que nos permitirá ordenar los resultados de la predicción de la clase de la frase que el usuario escriba de forma descendente. + # x[1] es una función de Python que nos permitirá obtener el segundo elemento de una lista. + # lambda x: x[1] es una función de Python que nos permitirá ordenar los resultados de la predicción de la clase de la frase que el usuario escriba. + # key es una función de Python que nos permitirá ordenar los resultados de la predicción de la clase de la frase que el usuario escriba. + # results.sort() es una función de Python que nos permitirá ordenar los resultados de la predicción de la clase de la frase que el usuario escriba. + results.sort(key=lambda x: x[1], reverse=True) + # return_list es una variable que almacenará la lista de resultados de la predicción de la clase de la frase que el usuario escriba. + return_list = [] + # for r in results: para cada resultado en los resultados. + for r in results: + # str() es una función de Python que nos permitirá convertir un número en una cadena de texto. + # r[0] es una función de Python que nos permitirá obtener el primer elemento de una lista. + # probability es una variable que almacenará la probabilidad de cada resultado. + # classes es una variable que almacenará las clases que el modelo de la red neuronal ha aprendido. + # {"intent": classes[r[0]], "probability": str(r[1])} es un diccionario que almacenará la clase y la probabilidad de cada resultado. + # return_list.append() es una función de Python que nos permitirá añadir un elemento a una lista. + return_list.append({"intent": classes[r[0]], "probability": str(r[1])}) + # return return_list es una función de Python que nos permitirá devolver la lista de resultados de la predicción de la clase de la frase que el usuario escriba. + return return_list + +# Esta función obtiene la respuesta de la clase de la frase que el usuario escriba. +# intents_json es una variable que almacenará los datos de entrenamiento del modelo de la red neuronal. +# ints es una variable que almacenará la predicción de la clase de la frase que el usuario escriba. + + +def getResponse(ints, intents_json): + # Si la longitud de ints es mayor que 0 entonces la variable tag almacenará la clase de la frase que el usuario escriba. + if len(ints) > 0: + # ints[0]['intent'] es una función de Python que nos permitirá obtener el primer elemento de una lista. + tag = ints[0]['intent'] + else: + # noanswer es una variable que almacenará la clase de la frase que el usuario escriba. + tag = 'noanswer' + # ints[0]['intent'] es una función de Python que nos permitirá obtener el primer elemento de una lista. + # tag es una variable que almacenará la clase de la frase que el usuario escriba. + # intents_json['intents'] es una función de Python que nos permitirá obtener los datos de entrenamiento del modelo de la red neuronal. + list_of_intents = intents_json['intents'] + # list_of_intents es una variable que almacenará los datos de entrenamiento del modelo de la red neuronal. + # for i in list_of_intents: para cada i en la lista de intenciones. + for i in list_of_intents: + # i['tag'] es una función de Python que nos permitirá obtener la clase de cada intención. + if (i['tag'] == tag): + # Se utiliza la función random.choice() para obtener una respuesta aleatoria de la clase de la frase que el usuario escriba. + # i['responses'] es una función de Python que nos permitirá obtener las respuestas de cada intención. + # choice() es una función de Python que nos permitirá obtener una respuesta aleatoria de la clase de la frase que el usuario escriba. + # random es una librería de Python que nos permitirá generar números aleatorios. + # result es una variable que almacenará la respuesta de la clase de la frase que el usuario escriba. + result = random.choice(i['responses']) + break +# return result es una función de Python que nos permitirá devolver la respuesta de la clase de la frase que el usuario escriba. + return result + +# Esta función se utiliza para obtener la respuesta del chatbot. + + +def chatbot_response(msg): + # model es una variable que almacenará el modelo de la red neuronal que hemos entrenado. + # msg es una variable que almacenará la frase que el usuario escriba. + # predict_class() es una función que nos permitirá predecir la clase de la frase que el usuario escriba. + # ints es una variable que almacenará la predicción de la clase de la frase que el usuario escriba. + ints = predict_class(msg, model) + # intents es una variable que almacenará los datos de entrenamiento del modelo de la red neuronal. + # ints es una variable que almacenará la predicción de la clase de la frase que el usuario escriba. + # getResponse() es una función que nos permitirá obtener la respuesta de la clase de la frase que el usuario escriba. + res = getResponse(ints, intents) + # return res es una función de Python que nos permitirá devolver la respuesta del chatbot. + return res + + +# Creación de GUI con tkinter +# Esta función se utiliza para enviar el mensaje del usuario al chatbot. +def send(): + # msg es una variable que almacenará el mensaje del usuario. + # string.strip() es una función de Python que nos permitirá eliminar los espacios en blanco al principio y al final de una cadena de texto. + # get() es una función de Python que nos permitirá obtener el texto de una caja de entrada. + # EntryBox.get() es una función de Python que nos permitirá obtener el texto de una caja de entrada. + msg = EntryBox.get("1.0", 'end-1c').strip() + # END es una constante de Python que nos permitirá obtener el final de una cadena de texto. + # EntryBox.delete() es una función de Python que nos permitirá eliminar el texto de una caja de entrada. + EntryBox.delete("0.0", END) + +# Si el mensaje del usuario no está vacío. + if msg != '': + # ChatLog.config() es una función de Python que nos permitirá configurar el chat. + # state es una variable que almacenará el estado del chat. + # NORMAL es una constante de Python que nos permitirá configurar el chat. + ChatLog.config(state=NORMAL) + # msg es una variable que almacenará el mensaje del usuario. + # END es una constante de Python que nos permitirá obtener el final de una cadena de texto. + # ChatLog.insert() es una función de Python que nos permitirá insertar un mensaje en el chat. + ChatLog.insert(END, "You: " + msg + '\n\n') + # font es una variable que almacenará el tipo de letra del chat. + # foreground es una variable que almacenará el color del texto del chat. + # ChatLog.config() es una función de Python que nos permitirá configurar el chat. + ChatLog.config(foreground="#442265", font=("Verdana", 12)) +# msg es una variable que almacenará el mensaje del usuario. +# chatbot_response() es una función que nos permitirá obtener la respuesta del chatbot. +# res es una variable que almacenará la respuesta del chatbot. + res = chatbot_response(msg) + # res es una variable que almacenará la respuesta del chatbot. + # END es una constante de Python que nos permitirá obtener el final de una cadena de texto. + # ChatLog.insert() es una función de Python que nos permitirá insertar un mensaje en el chat. + ChatLog.insert(END, "Bot: " + res + '\n\n') + # DISABLED es una constante de Python que nos permitirá configurar el chat. + # state es una variable que almacenará el estado del chat. + # ChatLog.config() es una función de Python que nos permitirá configurar el chat. + ChatLog.config(state=DISABLED) + # END es una constante de Python que nos permitirá obtener el final de una cadena de texto. + # ChatLog.yview() es una función de Python que nos permitirá desplazar el chat. + ChatLog.yview(END) + + +# En esta linea de código se crea la ventana principal de la aplicación. +base = Tk() +# En esta linea de código se establece el título de la ventana principal de la aplicación. +base.title("ChatBot") +# En esta linea de código se establece el tamaño de la ventana principal de la aplicación. +base.geometry("400x500") +# base.resizable() es una función de Python que nos permitirá configurar el tamaño de la ventana principal de la aplicación. +base.resizable(width=FALSE, height=FALSE) + +# Crear ventana de chat +ChatLog = Text(base, bd=0, bg="white", height="8", width="50", font="Arial",) + +# Se establece el chat como solo lectura. +# state es una variable que almacenará el estado del chat. +# ChatLog.config() es una función de Python que nos permitirá configurar el chat. +ChatLog.config(state=DISABLED) + +# cursor es una variable que almacenará el cursor del chat. +# command es una variable que almacenará el comando del chat. +# ChatLog.yview() es una función de Python que nos permitirá desplazar el chat. +# base es una variable que almacenará la ventana principal de la aplicación. +# Scrollbar() es una función de Python que nos permitirá crear una barra de desplazamiento. +scrollbar = Scrollbar(base, command=ChatLog.yview, cursor="heart") +# set es una función de Python que nos permitirá configurar el chat. +# scrollbar es una variable que almacenará la barra de desplazamiento. +# ChatLog['yscrollcommand'] es una función de Python que nos permitirá desplazar el chat. +ChatLog['yscrollcommand'] = scrollbar.set + +# Crear botón para enviar mensaje +SendButton = Button(base, font=("Verdana", 12, 'bold'), text="Send", width="12", height=5, + bd=0, bg="#32de97", activebackground="#3c9d9b", fg='#ffffff', + # send es una variable que almacenará la función send() + # que se utiliza para enviar el mensaje del usuario al chatbot. + command=send) + +# Crear la casilla para introducir el mensaje +EntryBox = Text(base, bd=0, bg="white", width="29", height="5", font="Arial") +# EntryBox.bind("", send) + + +# Coloca todos los componentes en la pantalla +# place() es una función de Python que nos permitirá colocar los componentes en la pantalla. +scrollbar.place(x=376, y=6, height=386) +# ChatLog.place() es una función de Python que nos permitirá colocar el chat en la pantalla. +ChatLog.place(x=6, y=6, height=386, width=370) +# EntryBox.place() es una función de Python que nos permitirá colocar la caja de entrada en la pantalla. +EntryBox.place(x=128, y=401, height=90, width=265) +# SendButton.place() es una función de Python que nos permitirá colocar el botón de enviar en la pantalla. +SendButton.place(x=6, y=401, height=90) + +# Esta linea de código se utiliza para iniciar la ventana principal de la aplicación. +# mainloop() es una función de Python que nos permitirá iniciar la ventana principal de la aplicación. +base.mainloop() diff --git "a/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/chatbot_model.h5" "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/chatbot_model.h5" new file mode 100644 index 0000000..ae7485a Binary files /dev/null and "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/chatbot_model.h5" differ diff --git "a/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/classes.pkl" "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/classes.pkl" new file mode 100644 index 0000000..ae6978d Binary files /dev/null and "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/classes.pkl" differ diff --git "a/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/explicacion_intents.txt" "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/explicacion_intents.txt" new file mode 100644 index 0000000..c2ffb50 --- /dev/null +++ "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/explicacion_intents.txt" @@ -0,0 +1,20 @@ + "intents": [ + { + + "tag": "saludo", # Intención + "patterns": [ # Preguntas que el usuario puede hacer + "Hola", + "¿Cómo estás?", + "¿Hay alguien ahí?", + "Hey", + "Hola, ¿qué tal?", + "Hello", + "Buenos días" + ], + "responses": [ # Respuestas que el chatbot puede dar al usuario cuando se detecta el tag "saludo" + "Hola, ¿en qué puedo ayudarle?" + ], + "context": [ # Contexto de la conversación que se mantiene en la siguiente interacción con el usuario para mantener la conversación coherente y fluida en el tiempo. + "" + ] + \ No newline at end of file diff --git "a/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/intents.json" "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/intents.json" new file mode 100644 index 0000000..5b5bd0b --- /dev/null +++ "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/intents.json" @@ -0,0 +1,400 @@ +{ + "intents": [ + { + "tag": "hola", + "patterns": [ + "hola", + "hola que tal", + "que tal", + "mis saludos", + "saludos", + "buenas", + "buen dia", + "buenos dias", + "buenas tardes", + "saludos asistente" + ], + "responses": [ + "Hola, ¿en qué puedo ayudarle?", + "Hola, un placer ayudarle", + "Digame en qué puedo ayudarle" + ], + "context": [ + "" + ] + }, + { + "tag": "ayuda", + "patterns": [ + "ayuda", + "ayudame", + "necesito ayuda", + "me puedes ayudar", + "puedes ayudarme", + "solicito ayuda", + "quiero ayuda", + "puedes ofrecerme ayuda", + "puedes darme ayuda", + "puedes echarme una mano" + ], + "responses": [ + "¡Claro! ¿En qué puedo ayudarte?", + "¡Por supuesto! ¿En qué puedo ayudarte?", + "¡Por supuesto! ¿En qué puedo ayudarte hoy?" + ], + "context": [ + "hospital" + ] + }, + { + "tag": "hospital", + "patterns": [ + "hospital", + "hospitales", + "donde está el hospital más cercano", + "donde está el hospital más cercano a mi ubicación", + "donde puedo encontrar un hospital", + "donde puedo encontrar un hospital cerca de mi", + "donde está el hospital más cercano a mi casa", + "donde está el hospital más cercano a mi ubicación", + "donde está el hospital más cercano a mi trabajo" + ], + "responses": [ + "¿En qué ciudad se encuentra usted?", + "¿En qué ciudad está usted?", + "¿Cual es la ciudad en la que se encuentra?" + ], + "context": [ + "" + ] + }, + { + "tag": "hospital_ubicacion_almeria", + "patterns": [ + "almeria", + "Almeria", + "soy almeria", + "estoy almeria", + "vivo en almeria", + "me encuentro en almeria", + "en almeria" + ], + "responses": [ + "El hospital más cercano a Almería es el Hospital Universitario Torrecárdenas. Está en la Carretera de Torrecárdenas, s/n, 04009 Almería", + "El Hospital Universitario Torrecárdenas es el hospital más cercano a Almería. Está en la Carretera de Torrecárdenas, s/n, 04009 Almería" + ], + "context": [ + "" + ] + }, + { + "tag": "hospital_ubicacion_madrid", + "patterns": [ + "madrid", + "Madrid", + "soy madrid", + "estoy madrid", + "vivo en madrid", + "me encuentro en madrid", + "en madrid" + ], + "responses": [ + "El hospital más cercano a Madrid es el Hospital Universitario La Paz. Está en Paseo de la Castellana, 261, 28046 Madrid", + "El Hospital Universitario La Paz es el hospital más cercano a Madrid. Está en Paseo de la Castellana, 261, 28046 Madrid" + ], + "context": [ + "" + ] + }, + { + "tag": "hospital_ubicacion_barcelona", + "patterns": [ + "barcelona", + "Barcelona", + "soy barcelona", + "estoy barcelona", + "vivo en barcelona", + "me encuentro en barcelona", + "en barcelona" + ], + "responses": [ + "El hospital más cercano a Barcelona es el Hospital Clínic de Barcelona. Está en Carrer de Villarroel, 170, 08036 Barcelona", + "El Hospital Clínic de Barcelona es el hospital más cercano a Barcelona. Está en Carrer de Villarroel, 170, 08036 Barcelona" + ], + "context": [ + "" + ] + }, + { + "tag": "hospital_ubicacion_malaga", + "patterns": [ + "malaga", + "Malaga", + "soy malaga", + "estoy malaga", + "vivo en malaga", + "me encuentro en malaga", + "en malaga" + ], + "responses": [ + "El hospital más cercano a Málaga es el Hospital Regional Universitario de Málaga. Está en Avenida Carlos Haya, s/n, 29010 Málaga", + "El Hospital Regional Universitario de Málaga es el hospital más cercano a Málaga. Está en Avenida Carlos Haya, s/n, 29010 Málaga" + ], + "context": [ + "" + ] + }, + { + "tag": "telefono_emergencia", + "patterns": [ + "emergencia", + "Cual es el telefono de emergencia", + "telefono de emergencia", + "telefono de emergencia en España", + "telefono de emergencia de mi ciudad", + "telefono de emergencia de mi ubicacion", + "telefono de emergencia de mi localidad", + "telefono de emergencia de mi provincia", + "telefono de emergencia de mi pais", + "telefono de emergencia de mi region" + ], + "responses": [ + "El teléfono de emergencia en España es el 112.", + "El telefono es el 112." + ], + "context": [ + "ambulancia_ubicacion" + ] + }, + { + "tag": "llamar_emergencia", + "patterns": [ + "emergencias", + "llama a emergencias", + "llamar a emergencias", + "llamar a emergencias de España", + "llamar a emergencias de mi ciudad", + "llamar a emergencias de mi ubicacion", + "llamar a emergencias de mi localidad", + "llamar a emergencias de mi provincia", + "llamar a emergencias de mi pais", + "llamar a emergencias de mi region" + ], + "responses": [ + "Llamando a emergencias. Por favor, indique su emergencia.", + "Llamando a emergencias. ¿En qué puedo ayudarle?" + ], + "context": [ + "ambulancia_ubicacion" + ] + }, + { + "tag": "emergencia_accidente", + "patterns": [ + "accidente", + "accidente de coche", + "accidente de moto", + "accidente de bicicleta", + "accidente de trafico", + "accidente de trabajo", + "accidente domestico", + "accidente en la calle", + "accidente en la carretera" + ], + "responses": [ + "Por favor, no mueva al paciente. La ambulancia está en camino.", + "Por favor, mantenga la calma , no mueva al paciente. La ambulancia está en camino." + ], + "context": [ + "ambulancia_ubicacion" + ] + }, + { + "tag": "emergencia_infarto", + "patterns": [ + "ataque", + "ataque corazon", + "ataque al corazon", + "infarto", + "infartos", + "le ha dado un infarto", + "esta sufriendo un infarto", + "ataque al miocardio", + "ataque al pecho", + "dolor en el pecho", + "dolor en el brazo izquierdo", + "fuerte dolor en el pecho" + ], + "responses": [ + "Mantenga la calma, afloje la ropa del afectado y realice RPC en caso de que sea necesario , La ambulancia está en camino" + ], + "context": [ + "ambulancia_ubicacion" + ] + }, + { + "tag": "emergencia_herida", + "patterns": [ + "herida", + "heridas", + "herida en la mano", + "herida en el brazo", + "herida en la pierna", + "herida en la cabeza", + "herida en el cuerpo", + "herida en la cara", + "herida en la espalda", + "herida en el cuello", + "herida en el pecho", + "herida en el abdomen" + ], + "responses": [ + "Mantenga la calma, limpie la herida con agua y jabón y cúbrala con un apósito estéril. La ambulancia está en camino" + ], + "context": [ + "ambulancia_ubicacion" + ] + }, + { + "tag": "emergencia_corte", + "patterns": [ + "corte", + "cortes", + "corte en la mano", + "corte en el brazo", + "corte en la pierna", + "corte en la cabeza", + "corte en el cuerpo", + "corte en la cara", + "corte en la espalda", + "corte en el cuello" + ], + "responses": [ + "Presiona con una gasa si hay hemorragia, limpia la herida con agua y jabón neutro, cubre la herida. La ambulancia está en camino" + ], + "context": [ + "ambulancia_ubicacion" + ] + }, + { + "tag": "emergencia_golpe_calor", + "patterns": [ + "insolacion", + "ha sufrido un golpe de calor", + "ha sufrido insolacion", + "ha sufrido una insolacion", + "golpe de calor", + "tiene un golpe de calor", + "golpe de calor en la calle", + "golpe de calor en la playa", + "golpe de calor en la piscina", + "golpe de calor en el trabajo", + "golpe de calor en casa" + ], + "responses": [ + "Mantenga la calma, lleve al afectado a un lugar fresco y ofrezcale agua. La ambulancia está en camino" + ], + "context": [ + "ambulancia_ubicacion" + ] + }, + { + "tag": "ambulancia", + "patterns": [ + "ambulancia", + "ambulancias", + "ambulancia urgente", + "necesito una ambulancia", + "envia una ambulancia", + "puedes enviar una ambulancia", + "enviame una ambulancia", + "necesito una ambulancia ahora", + "necesito una ambulancia urgente" + ], + "responses": [ + "Indica tu ubicación para enviar una ambulancia.", + "Por favor, indícame tu ubicación para enviar una ambulancia.", + "Para enviar una ambulancia, necesito saber tu ubicación." + ], + "context": [ + "ambulancia_ubicacion" + ] + }, + { + "tag": "ambulancia_ubicacion", + "patterns": [ + "mi ubicacion", + "mi ubicacion es esta", + "esta es mi ubicacion", + "me encuentro en", + "me ubico en", + "la ubicacion es", + "te envio mi ubicacion", + "me encuentro en", + "enviame una ambulancia" + ], + "responses": [ + "Ubicación recibida. Enviando ambulancia.", + "Gracias por tu ubicación. Enviando ambulancia.", + "Ambulancia en camino." + ], + "context": [ + "adios" + ] + }, + { + "tag": "gracias", + "patterns": [ + "gracias", + "gracias por la ayuda", + "gracias por ayudarme", + "muchas gracias por todo", + "gracias por ser tan útil", + "gracias por ser tan amable", + "gracias por ser tan servicial" + ], + "responses": [ + "Encantado de ayudarle.", + "¡De nada! Estoy aquí para ayudarle.", + "¡No hay de qué! Estoy aquí para ayudarle." + ], + "context": [ + "" + ] + }, + { + "tag": "adios", + "patterns": [ + "adios", + "Adios", + "Adios y gracias", + "hasta luego", + "encantado de charlar", + "hasta la proxima", + "nos vemos", + "hasta pronto" + ], + "responses": [ + "¡Adiós! Que tengas un buen día.", + "¡Hasta luego! Que tengas un buen día.", + "¡Hasta la próxima! Que tengas un buen día." + ], + "context": [ + "" + ] + }, + { + "tag": "noanswer", + "patterns": [], + "responses": [ + "Lo siento, no te entendí.", + "No estoy seguro de entender lo que dice , repitalo por favor.", + "Necesito más información , puedes repetirlo por favor", + "No estoy seguro de entender , puedes repetirlo por favor" + ], + "context": [ + "" + ] + } + ] +} \ No newline at end of file diff --git "a/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/training_bot.py" "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/training_bot.py" new file mode 100644 index 0000000..8c338ab --- /dev/null +++ "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/training_bot.py" @@ -0,0 +1,237 @@ +# Cargamos las librerías necesarias para el entrenamiento del chatbot y la creación de la red neuronal que lo soporta +# random se encarga de la selección aleatoria de los datos para el entrenamiento de la red neuronal +import random +# json se encarga de la lectura de los archivos json que contienen los datos para el entrenamiento de la red neuronal +import json +# pickle se encarga de la serialización y deserialización de los datos para el entrenamiento de la red neuronal +import pickle +# numpy se encarga de la manipulación de los datos en forma de matrices y vectores para el entrenamiento de la red neuronal +import numpy as np + +# Usamos la libreria para el procesamiento de texto y la creación de la red neuronal llamada nltk +import nltk +# Invocamos la librería para el procesamiento de texto y la creación de la red neuronal +# stem se encarga de pasar las palabras a su forma raíz +# WordNetLemmatizer es una clase que se encarga de pasar las palabras a su forma raíz +from nltk.stem import WordNetLemmatizer + +# Para crear la red neuronal +# Importamos las librerías necesarias para la creación de la red neuronal +# keras es una librería que se encarga de la creación de redes neuronales +# moodels se encarga de la creación de los modelos de la red neuronal +# Sequential se encarga de la creación de la red neuronal +from keras.models import Sequential +# layers se encarga de la creación de las capas de la red neuronal +# Dense se encarga de la creación de las capas de la red neuronal +# Activation se encarga de la creación de las funciones de activación de la red neuronal +# Dropout se encarga de la creación de las capas de dropout de la red neuronal +from keras.layers import Dense, Activation, Dropout +# optimizers se encarga de la creación de los optimizadores de la red neuronal +# SGD es un optimizador de la red neuronal +from keras.optimizers import SGD + +# WordNetLemmatizer es una clase que se encarga de pasar las palabras a su forma raíz +# lemmatizer se encarga de pasar las palabras a su forma raíz +lemmatizer = WordNetLemmatizer() + +# Cargamos los datos de entrenamiento del chatbot +# intents es un archivo json que contiene los datos de entrenamiento del chatbot +# open se encarga de abrir el archivo json +# loads se encarga de cargar los datos del archivo json +# json.loads se encarga de cargar los datos del archivo json +# intents se encarga de cargar los datos del archivo json +intents = json.loads(open('intents.json').read()) + +# Inicializamos las listas que contendrán las palabras, las categorías y los documentos +# En este fragmento de código se clasifican los patrones y las categorías +# punkt se encarga de la tokenización de las palabras +# wordnet se encarga de la lematización de las palabras +# omw-1.4 se encarga de la lematización de las palabras +nltk.download('punkt') +nltk.download('wordnet') +nltk.download('omw-1.4') + +# Inicializamos las listas que contendrán las palabras, las categorías y los documentos +words = [] +classes = [] +documents = [] +ignore_letters = ['?', '!', '¿', '.', ','] + +# Clasifica los patrones y las categorías +# intent es un archivo json que contiene los datos de entrenamiento del chatbot +# intents['intents'] es un archivo json que contiene los datos de entrenamiento del chatbot +for intent in intents['intents']: + # patterns es un archivo json que contiene los datos de entrenamiento del chatbot + # intent['patterns'] es un archivo json que contiene los datos de entrenamiento del chatbot + for pattern in intent['patterns']: + # word_list es una lista que contiene las palabras de los patrones + # pattern es una lista que contiene los patrones + # nltk.word_tokenize se encarga de tokenizar las palabras + # word_list es una lista que contiene las palabras de los patrones + word_list = nltk.word_tokenize(pattern) + # extend se encarga de añadir las palabras a la lista de palabras + # words es una lista que contiene las palabras + words.extend(word_list) + # tags es una lista que contiene las categorías + # intent['tag'] es una lista que contiene las categorías + # word_list es una lista que contiene las palabras de los patrones + # append se encarga de añadir las palabras a la lista de palabras + # documents es una lista que contiene las palabras y las categorías + documents.append((word_list, intent["tag"])) + # classes es una lista que contiene las categorías + # intent['tag'] es una lista que contiene las categorías + if intent["tag"] not in classes: + # append se encarga de añadir las palabras a la lista de palabras + # classes es una lista que contiene las categorías + classes.append(intent["tag"]) + +# words es una lista que contiene las palabras +# lemmatizer.lemmatize se encarga de pasar las palabras a su forma raíz +# words es una lista que contiene las palabras +words = [lemmatizer.lemmatize(word) + # for se encarga de recorrer las palabras de la lista de palabras + # ignore_letters es una lista que contiene los signos de puntuación + # word es una palabra de la lista de palabras + # words es una lista que contiene las palabras + for word in words if word not in ignore_letters] +# words es una lista que contiene las palabras +# set se encarga de crear un conjunto de palabras +# sorted se encarga de ordenar las palabras de la lista de palabras +words = sorted(set(words)) + +# classes es una lista que contiene las categorías +# wb se encarga de abrir el archivo en modo de escritura binaria +pickle.dump(words, open('words.pkl', 'wb')) +pickle.dump(classes, open('classes.pkl', 'wb')) + +# Pasa la información a unos y ceros según las palabras presentes en cada categoría para hacer el entrenamiento +training = [] +# output_empty es una lista que contiene ceros según las categorías +# len se encarga de contar las categorías +output_empty = [0]*len(classes) +# Esta parte del código se encarga de pasar la información a unos y ceros según las palabras presentes en cada categoría para hacer el entrenamiento +# document es una lista que contiene las palabras y las categorías +# documents es una lista que contiene las palabras y las categorías +for document in documents: + # bag es una lista que contiene unos y ceros según las palabras presentes en cada categoría + bag = [] + # document[0] es una lista que contiene las palabras de los patrones + # word_patterns es una lista que contiene las palabras de los patrones + word_patterns = document[0] + # lemmatizer.lemmatize se encarga de pasar las palabras a su forma raíz + word_patterns = [lemmatizer.lemmatize( + # word_patterns es una lista que contiene las palabras de los patrones + # word es una palabra de la lista de palabras + # word.lower se encarga de pasar las palabras a minúsculas + word.lower()) for word in word_patterns] + # words es una lista que contiene las palabras + # word_patterns es una lista que contiene las palabras de los patrones +# Esta parte del código word in words se encarga de recorrer las palabras de la lista de palabras y word_patterns es una lista que contiene las palabras de los patrones + for word in words: + # Esta parte del código word in words se encarga de recorrer las palabras de la lista de palabras y word_patterns es una lista que contiene las palabras de los patrones + # append se encarga de añadir las palabras a la lista de palabras + bag.append(1) if word in word_patterns else bag.append(0) + # output_empty es una lista que contiene ceros según las categorías + # output_row es una lista que contiene ceros según las categorías + output_row = list(output_empty) + # index se encarga de contar las categorías + # classes es una lista que contiene las categorías + # output_row es una lista que contiene ceros según las categorías + output_row[classes.index(document[1])] = 1 + # output_row es una lista que contiene ceros según las categorías + # bag es una lista que contiene unos y ceros según las palabras presentes en cada categoría + # append se encarga de añadir las palabras a la lista de palabras + # traning es una lista que contiene unos y ceros según las palabras presentes en cada categoría + training.append([bag, output_row]) + +# Esta parte del código se encarga de seleccionar aleatoriamente los datos para el entrenamiento de la red neuronal +# training es una lista que contiene unos y ceros según las palabras presentes en cada categoría +# random.shuffle se encarga de seleccionar aleatoriamente los datos para el entrenamiento de la red neuronal +random.shuffle(training) + +# Esta parte del código se encarga de convertir los datos a un array +# dtype se encarga de especificar el tipo de datos +# training es una lista que contiene unos y ceros según las palabras presentes en cada categoría +# np.array se encarga de convertir los datos a un array +# training es una lista que contiene unos y ceros según las palabras presentes en cada categoría +training = np.array(training, dtype=object) +print(training) + +# Esta parte del código se encarga de repartir los datos para pasarlos a la red +# training es una lista que contiene unos y ceros según las palabras presentes en cada categoría +# training[:, 0] es una lista que contiene las palabras de los patrones +# training[:, 1] es una lista que contiene las categorías +# train_x es una lista que contiene las palabras de los patrones +# train_y es una lista que contiene las categorías +train_x = list(training[:, 0]) +train_y = list(training[:, 1]) + +# En esta parte del código se crea la red neuronal +# y se compila el modelo de la red neuronal +# para el entrenamiento del chatbot y +# se guarda el modelo de la red neuronal en un archivo h5 +# para su uso posterior en el chatbot funcional + +# Sequential se encarga de la creación de la red neuronal +# Dense se encarga de la creación de las capas de la red neuronal +# Activation se encarga de la creación de las funciones de activación de la red neuronal +# train_x es una lista que contiene las palabras de los patrones +# input_shape se encarga de especificar la forma de los datos de entrada +# 128 es el número de neuronas de la capa oculta de la red neuronal +# Dense se encarga de la creación de las capas de la red neuronal +# El uso de Dropout puede ayudar a hacer que el modelo sea más robusto +# y menos dependiente de cualquier neurona individual, +# por lo tanto menos probable de sobreajustar a los datos de entrenamiento. +model = Sequential() +model.add(Dense(128, input_shape=(len(train_x[0]),), activation='relu')) # Dense Layer 1 se encarga de la creación de las capas de la red neuronal +model.add(Dropout(0.5)) # Dropout Layer 1 se encarga de la creación de las capas de dropout de la red neuronal +model.add(Dense(64, activation='relu')) # Dense Layer 2 +model.add(Dropout(0.5)) + +# En esta linea de código se crea la capa de salida de la red neuronal +# La función de activación softmax convierte un vector de números reales en un vector de probabilidades. +# Cada número en el vector de salida de la función softmax representa la probabilidad de que +# la entrada pertenezca a una clase específica. +# Es común usar la función softmax en la última capa de un modelo de clasificación +# Está creando una nueva capa densa. len(train_y[0]) es el número de neuronas en la capa, +# que en este caso es igual al número de elementos en el primer elemento de train_y. activation='softmax' +# indica que se debe usar la función de activación softmax en esta capa. +model.add(Dense(len(train_y[0]), activation='softmax')) # Dense Layer 3 + +# En esta parte del código se crea el optimizador y se compila el modelo de la red neuronal +# Creamos el optimizador y lo compilamos +# nesterov es un parámetro booleano que indica si se debe aplicar Nesterov momentum que se utiliza para acelerar la convergencia +# momentum es un parámetro que se utiliza para acelerar la convergencia de la red neuronal +# learning_rate es un parámetro que indica la tasa de aprendizaje de la red neuronal +# SGD es un optimizador de la red neuronal +sgd = SGD(learning_rate=0.001, momentum=0.9, nesterov=True) +# metrics se encarga de medir el rendimiento de la red neuronal durante el entrenamiento y las pruebas de la red neuronal +# accuracy es una métrica que mide la precisión de la red neuronal +# sgd es un optimizador de la red neuronal y se encarga de la compilación de la red neuronal +# optimizer se encarga de la compilación de la red neuronal +# categorical_crossentropy es una función de pérdida que se utiliza en la clasificación multiclase +# loss se encarga de la compilación de la red neuronal su funcion es medir la precisión de la red neuronal +# compile se encarga de compilar el modelo de la red neuronal +# model es una red neuronal que se encarga de la creación de la red neuronal +model.compile(loss='categorical_crossentropy', + optimizer=sgd, metrics=['accuracy']) + +# En esta parte del código se entrena el modelo y se guarda el modelo de la red neuronal +# Entrenamos el modelo y lo guardamos +# verbose se encarga de mostrar el progreso del entrenamiento de la red neuronal +# batch_size es el número de muestras que se utilizan en cada iteración del entrenamiento de la red neuronal cuanto más grande sea el tamaño del lote, más rápido se completará el entrenamiento +# epochs es el número de veces que se entrena la red neuronal +# np.array se encarga de convertir los datos a un array +# el parametro train_y tiene la lista de las categorias de las palabras de los patrones +# el parametro train_x tiene la lista de las palabras de los patrones +# model es una red neuronal que se encarga de la creación de la red neuronal +# fit se encarga de entrenar la red neuronal +# train_process es una red neuronal que se encarga de entrenar la red neuronal +train_process = model.fit(np.array(train_x), np.array(train_y), epochs=100, batch_size=5, verbose=1) + +# Guardamos el modelo de la red neuronal en un archivo h5 para su uso posterior en el chatbot funcional +# train_process es una red neuronal que se encarga de entrenar la red neuronal +# chatbot_model.h5 es un archivo h5 que contiene el modelo de la red neuronal +# save se encarga de guardar el modelo de la red neuronal +# model es una red neuronal que se encarga de la creación de la red neuronal +model.save("chatbot_model.h5", train_process) diff --git "a/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/words.pkl" "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/words.pkl" new file mode 100644 index 0000000..9794861 Binary files /dev/null and "b/PIA/UT06. Ajustes del modelo de aprendizaje autom\303\241tico/#ChatBotFuncional/words.pkl" differ diff --git a/PIA/index.html b/PIA/index.html new file mode 100644 index 0000000..f3559af --- /dev/null +++ b/PIA/index.html @@ -0,0 +1,11 @@ + + + + + + Python Basico + + +

Python Basico

+ + \ No newline at end of file diff --git a/README.md b/README.md index 3f7fbaf..c3ce409 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,11 @@ -# Programación en Inteligencia Artificial + +# Programación en Inteligencia Artificial + * Utilizando el lenguaje de programación ``Python`` + +* Utilizando la biblioteca + +1. ``Numpy`` + +1. ``Pandas`` + diff --git a/SAA/2_2_Titanic/Tarea_Titanic.ipynb b/SAA/2_2_Titanic/Tarea_Titanic.ipynb new file mode 100644 index 0000000..f285593 --- /dev/null +++ b/SAA/2_2_Titanic/Tarea_Titanic.ipynb @@ -0,0 +1,464 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Predecir la supervivencia del Titanic\n", + "\n", + "@autor : Raul Vela.\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "########### LIBRERIAS A UTILIZAR \n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.svm import SVC\n", + "from sklearn.neighbors import KNeighborsClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "########### IMPORTAR LOS DATOS\n", + "\n", + "# Importamos los datos a utilizar desde la web oficial de Kaggle\n", + "url_test = 'G:\\\\Otros ordenadores\\\\Mi PC\\\\CURSO BD & IA\\\\Python_PIA2\\\\SAA\\\\2_2_Titanic\\\\content\\\\test.csv'\n", + "url_train = 'G:\\\\Otros ordenadores\\\\Mi PC\\CURSO BD & IA\\\\Python_PIA2\\\\SAA\\\\2_2_Titanic\\\\content\\\\train.csv'\n", + "\n", + "df_test = pd.read_csv(url_test)\n", + "df_train = pd.read_csv(url_train)\n", + "\n", + "#Se guardan los datos en un archivo para siempre tenerlos disponibles\n", + "dir_test = 'G:\\\\Otros ordenadores\\\\Mi PC\\\\CURSO BD & IA\\\\Python_PIA2\\\\SAA\\\\2_2_Titanic\\\\content\\\\titanic_test.csv'\n", + "dir_train = 'G:\\\\Otros ordenadores\\\\Mi PC\\\\CURSO BD & IA\\\\Python_PIA2\\\\SAA\\\\2_2_Titanic\\\\content\\\\titanic_train.csv'\n", + "\n", + "df_test.to_csv(dir_test)\n", + "df_train.to_csv(dir_train)\n", + "\n", + "#Importar los datos de los archivos .csv almacenados\n", + "df_test = pd.read_csv(dir_test)\n", + "df_train = pd.read_csv(dir_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cantidad de datos:\n", + "(891, 13)\n", + "(418, 12)\n", + "Tipos de datos:\n", + "\n", + "RangeIndex: 891 entries, 0 to 890\n", + "Data columns (total 13 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 Unnamed: 0 891 non-null int64 \n", + " 1 PassengerId 891 non-null int64 \n", + " 2 Survived 891 non-null int64 \n", + " 3 Pclass 891 non-null int64 \n", + " 4 Name 891 non-null object \n", + " 5 Sex 891 non-null object \n", + " 6 Age 714 non-null float64\n", + " 7 SibSp 891 non-null int64 \n", + " 8 Parch 891 non-null int64 \n", + " 9 Ticket 891 non-null object \n", + " 10 Fare 891 non-null float64\n", + " 11 Cabin 204 non-null object \n", + " 12 Embarked 889 non-null object \n", + "dtypes: float64(2), int64(6), object(5)\n", + "memory usage: 90.6+ KB\n", + "None\n", + "\n", + "RangeIndex: 418 entries, 0 to 417\n", + "Data columns (total 12 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 Unnamed: 0 418 non-null int64 \n", + " 1 PassengerId 418 non-null int64 \n", + " 2 Pclass 418 non-null int64 \n", + " 3 Name 418 non-null object \n", + " 4 Sex 418 non-null object \n", + " 5 Age 332 non-null float64\n", + " 6 SibSp 418 non-null int64 \n", + " 7 Parch 418 non-null int64 \n", + " 8 Ticket 418 non-null object \n", + " 9 Fare 417 non-null float64\n", + " 10 Cabin 91 non-null object \n", + " 11 Embarked 418 non-null object \n", + "dtypes: float64(2), int64(5), object(5)\n", + "memory usage: 39.3+ KB\n", + "None\n", + "Datos faltantes:\n", + "Unnamed: 0 0\n", + "PassengerId 0\n", + "Survived 0\n", + "Pclass 0\n", + "Name 0\n", + "Sex 0\n", + "Age 177\n", + "SibSp 0\n", + "Parch 0\n", + "Ticket 0\n", + "Fare 0\n", + "Cabin 687\n", + "Embarked 2\n", + "dtype: int64\n", + "Unnamed: 0 0\n", + "PassengerId 0\n", + "Pclass 0\n", + "Name 0\n", + "Sex 0\n", + "Age 86\n", + "SibSp 0\n", + "Parch 0\n", + "Ticket 0\n", + "Fare 1\n", + "Cabin 327\n", + "Embarked 0\n", + "dtype: int64\n", + "Estadísticas del dataset:\n", + " Unnamed: 0 PassengerId Survived Pclass Age \\\n", + "count 891.000000 891.000000 891.000000 891.000000 714.000000 \n", + "mean 445.000000 446.000000 0.383838 2.308642 29.699118 \n", + "std 257.353842 257.353842 0.486592 0.836071 14.526497 \n", + "min 0.000000 1.000000 0.000000 1.000000 0.420000 \n", + "25% 222.500000 223.500000 0.000000 2.000000 20.125000 \n", + "50% 445.000000 446.000000 0.000000 3.000000 28.000000 \n", + "75% 667.500000 668.500000 1.000000 3.000000 38.000000 \n", + "max 890.000000 891.000000 1.000000 3.000000 80.000000 \n", + "\n", + " SibSp Parch Fare \n", + "count 891.000000 891.000000 891.000000 \n", + "mean 0.523008 0.381594 32.204208 \n", + "std 1.102743 0.806057 49.693429 \n", + "min 0.000000 0.000000 0.000000 \n", + "25% 0.000000 0.000000 7.910400 \n", + "50% 0.000000 0.000000 14.454200 \n", + "75% 1.000000 0.000000 31.000000 \n", + "max 8.000000 6.000000 512.329200 \n", + " Unnamed: 0 PassengerId Pclass Age SibSp \\\n", + "count 418.000000 418.000000 418.000000 332.000000 418.000000 \n", + "mean 208.500000 1100.500000 2.265550 30.272590 0.447368 \n", + "std 120.810458 120.810458 0.841838 14.181209 0.896760 \n", + "min 0.000000 892.000000 1.000000 0.170000 0.000000 \n", + "25% 104.250000 996.250000 1.000000 21.000000 0.000000 \n", + "50% 208.500000 1100.500000 3.000000 27.000000 0.000000 \n", + "75% 312.750000 1204.750000 3.000000 39.000000 1.000000 \n", + "max 417.000000 1309.000000 3.000000 76.000000 8.000000 \n", + "\n", + " Parch Fare \n", + "count 418.000000 417.000000 \n", + "mean 0.392344 35.627188 \n", + "std 0.981429 55.907576 \n", + "min 0.000000 0.000000 \n", + "25% 0.000000 7.895800 \n", + "50% 0.000000 14.454200 \n", + "75% 0.000000 31.500000 \n", + "max 9.000000 512.329200 \n" + ] + } + ], + "source": [ + "########### ENTENDIMIENTO DE LOS DATOS\n", + "\n", + "#Verifico la cantidad de datos que hay en los dataset\n", + "print('Cantidad de datos:')\n", + "print(df_train.shape)\n", + "print(df_test.shape)\n", + "#Verifico el tipo de datos contenida en ambos dataset\n", + "print('Tipos de datos:')\n", + "print(df_train.info())\n", + "print(df_test.info())\n", + "#Verifico los datos faltantes de los dataset\n", + "print('Datos faltantes:')\n", + "print(pd.isnull(df_train).sum())\n", + "print(pd.isnull(df_test).sum())\n", + "#Verifico las estadísticas del dataset\n", + "print('Estadísticas del dataset:')\n", + "print(df_train.describe())\n", + "print(df_test.describe())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "29.69911764705882\n", + "30.272590361445783\n", + "Unnamed: 0 0\n", + "Survived 0\n", + "Pclass 0\n", + "Sex 0\n", + "Age 0\n", + "SibSp 0\n", + "Parch 0\n", + "Fare 0\n", + "Embarked 0\n", + "dtype: int64\n", + "Unnamed: 0 0\n", + "PassengerId 0\n", + "Pclass 0\n", + "Sex 0\n", + "Age 0\n", + "SibSp 0\n", + "Parch 0\n", + "Fare 0\n", + "Embarked 0\n", + "dtype: int64\n", + "(889, 9)\n", + "(417, 9)\n", + " Unnamed: 0 PassengerId Pclass Sex Age SibSp Parch Fare Embarked\n", + "0 0 892 3 1 5 0 0 7.8292 0\n", + "1 1 893 3 0 6 1 0 7.0000 1\n", + "2 2 894 2 1 7 0 0 9.6875 0\n", + "3 3 895 3 1 5 0 0 8.6625 1\n", + "4 4 896 3 0 4 1 1 12.2875 1\n", + " Unnamed: 0 Survived Pclass Sex Age SibSp Parch Fare Embarked\n", + "0 0 0 3 1 4 1 0 7.2500 1.0\n", + "1 1 1 1 0 5 1 0 71.2833 2.0\n", + "2 2 1 3 0 5 0 0 7.9250 1.0\n", + "3 3 1 1 0 5 1 0 53.1000 1.0\n", + "4 4 0 3 1 5 0 0 8.0500 1.0\n" + ] + } + ], + "source": [ + "##########PREPROCESAMIENTO DE LA DATA \n", + "\n", + "#Cambio los datos de sexos en números\n", + "df_train['Sex'].replace(['female','male'],[0,1],inplace=True)\n", + "df_test['Sex'].replace(['female','male'],[0,1],inplace=True)\n", + "\n", + "#Cambio los datos de embarque en números\n", + "df_train['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True)\n", + "df_test['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True)\n", + "\n", + "#Reemplazo los datos faltantes en la edad por la media de esta columna\n", + "print(df_train[\"Age\"].mean())\n", + "print(df_test[\"Age\"].mean())\n", + "promedio = 30\n", + "df_train['Age'] = df_train['Age'].replace(np.nan, promedio)\n", + "df_test['Age'] = df_test['Age'].replace(np.nan, promedio)\n", + "\n", + "#Creo varios grupos de acuerdo a bandas de las edades\n", + "#Bandas: 0-8, 9-15, 16-18, 19-25, 26-40, 41-60, 61-100\n", + "bins = [0, 8, 15, 18, 25, 40, 60, 100]\n", + "names = ['1', '2', '3', '4', '5', '6', '7']\n", + "df_train['Age'] = pd.cut(df_train['Age'], bins, labels = names)\n", + "df_test['Age'] = pd.cut(df_test['Age'], bins, labels = names)\n", + "\n", + "#Se elimina la columna de \"Cabin\" ya que tiene muchos datos perdidos\n", + "df_train.drop(['Cabin'], axis = 1, inplace=True)\n", + "df_test.drop(['Cabin'], axis = 1, inplace=True)\n", + "\n", + "#Elimino las columnas que considero que no son necesarias para el analisis\n", + "df_train = df_train.drop(['PassengerId','Name','Ticket'], axis=1)\n", + "df_test = df_test.drop(['Name','Ticket'], axis=1)\n", + "\n", + "#Se elimina las filas con los datos perdidos\n", + "df_train.dropna(axis=0, how='any', inplace=True)\n", + "df_test.dropna(axis=0, how='any', inplace=True)\n", + "\n", + "#Verifico los datos\n", + "print(pd.isnull(df_train).sum())\n", + "print(pd.isnull(df_test).sum())\n", + "\n", + "print(df_train.shape)\n", + "print(df_test.shape)\n", + "\n", + "print(df_test.head())\n", + "print(df_train.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Precisión Regresión Logística:\n", + "0.7651195499296765\n", + "Precisión Soporte de Vectores:\n", + "0.6568213783403657\n", + "Precisión Vecinos más Cercanos:\n", + "0.8171589310829818\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\Robot\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:460: ConvergenceWarning: lbfgs failed to converge (status=1):\n", + "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", + "\n", + "Increase the number of iterations (max_iter) or scale the data as shown in:\n", + " https://scikit-learn.org/stable/modules/preprocessing.html\n", + "Please also refer to the documentation for alternative solver options:\n", + " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", + " n_iter_i = _check_optimize_result(\n" + ] + } + ], + "source": [ + "##########APLICACIÓN DE ALGORITMOS DE MACHINE LEARNING \n", + "\n", + "#Separo la columna con la información de los sobrevivientes\n", + "X = np.array(df_train.drop(['Survived'], axis=1))\n", + "y = np.array(df_train['Survived'])\n", + "\n", + "#Separo los datos de \"train\" en entrenamiento y prueba para probar los algoritmos\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", + "\n", + "##Regresión logística\n", + "logreg = LogisticRegression()\n", + "logreg.fit(X_train, y_train)\n", + "Y_pred = logreg.predict(X_test)\n", + "print('Precisión Regresión Logística:')\n", + "print(logreg.score(X_train, y_train))\n", + "\n", + "##Support Vector Machines\n", + "svc = SVC()\n", + "svc.fit(X_train, y_train)\n", + "Y_pred = svc.predict(X_test)\n", + "print('Precisión Soporte de Vectores:')\n", + "print(svc.score(X_train, y_train))\n", + "\n", + "##KN neighbors\n", + "knn = KNeighborsClassifier(n_neighbors = 3)\n", + "knn.fit(X_train, y_train)\n", + "Y_pred = knn.predict(X_test)\n", + "print('Precisión Vecinos más Cercanos:')\n", + "print(knn.score(X_train, y_train))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predicción Regresión Logística:\n", + " PassengerId Survived\n", + "0 892 0\n", + "1 893 0\n", + "2 894 0\n", + "3 895 0\n", + "4 896 0\n", + "Predicción Soporte de Vectores:\n", + " PassengerId Survived\n", + "0 892 0\n", + "1 893 0\n", + "2 894 0\n", + "3 895 0\n", + "4 896 0\n", + "Predicción Vecinos más Cercanos:\n", + " PassengerId Survived\n", + "0 892 0\n", + "1 893 0\n", + "2 894 0\n", + "3 895 0\n", + "4 896 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\Robot\\anaconda3\\Lib\\site-packages\\sklearn\\base.py:457: UserWarning: X has feature names, but SVC was fitted without feature names\n", + " warnings.warn(\n", + "c:\\Users\\Robot\\anaconda3\\Lib\\site-packages\\sklearn\\base.py:457: UserWarning: X has feature names, but KNeighborsClassifier was fitted without feature names\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "##########PREDICCIÓN UTILIZANDO LOS MODELOS\n", + "\n", + "ids = df_test['PassengerId']\n", + "\n", + "##Regresión logística\n", + "prediccion_logreg = logreg.predict(df_test.drop('PassengerId', axis=1).values)\n", + "out_logreg = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_logreg })\n", + "print('Predicción Regresión Logística:')\n", + "print(out_logreg.head())\n", + "\n", + "\n", + "##Support Vector Machines\n", + "prediccion_svc = svc.predict(df_test.drop('PassengerId', axis=1))\n", + "out_svc = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_svc })\n", + "print('Predicción Soporte de Vectores:')\n", + "print(out_svc.head())\n", + "\n", + "##K neighbors\n", + "prediccion_knn = knn.predict(df_test.drop('PassengerId', axis=1))\n", + "out_knn = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_knn })\n", + "print('Predicción Vecinos más Cercanos:')\n", + "print(out_knn.head())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/SAA/2_2_Titanic/content/test.csv b/SAA/2_2_Titanic/content/test.csv new file mode 100644 index 0000000..f705412 --- /dev/null +++ b/SAA/2_2_Titanic/content/test.csv @@ -0,0 +1,419 @@ +PassengerId,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked +892,3,"Kelly, Mr. James",male,34.5,0,0,330911,7.8292,,Q +893,3,"Wilkes, Mrs. James (Ellen Needs)",female,47,1,0,363272,7,,S +894,2,"Myles, Mr. Thomas Francis",male,62,0,0,240276,9.6875,,Q +895,3,"Wirz, Mr. Albert",male,27,0,0,315154,8.6625,,S +896,3,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)",female,22,1,1,3101298,12.2875,,S +897,3,"Svensson, Mr. Johan Cervin",male,14,0,0,7538,9.225,,S +898,3,"Connolly, Miss. Kate",female,30,0,0,330972,7.6292,,Q +899,2,"Caldwell, Mr. Albert Francis",male,26,1,1,248738,29,,S +900,3,"Abrahim, Mrs. Joseph (Sophie Halaut Easu)",female,18,0,0,2657,7.2292,,C +901,3,"Davies, Mr. John Samuel",male,21,2,0,A/4 48871,24.15,,S +902,3,"Ilieff, Mr. Ylio",male,,0,0,349220,7.8958,,S +903,1,"Jones, Mr. Charles Cresson",male,46,0,0,694,26,,S +904,1,"Snyder, Mrs. John Pillsbury (Nelle Stevenson)",female,23,1,0,21228,82.2667,B45,S +905,2,"Howard, Mr. Benjamin",male,63,1,0,24065,26,,S +906,1,"Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)",female,47,1,0,W.E.P. 5734,61.175,E31,S +907,2,"del Carlo, Mrs. Sebastiano (Argenia Genovesi)",female,24,1,0,SC/PARIS 2167,27.7208,,C +908,2,"Keane, Mr. Daniel",male,35,0,0,233734,12.35,,Q +909,3,"Assaf, Mr. Gerios",male,21,0,0,2692,7.225,,C +910,3,"Ilmakangas, Miss. Ida Livija",female,27,1,0,STON/O2. 3101270,7.925,,S +911,3,"Assaf Khalil, Mrs. Mariana (Miriam"")""",female,45,0,0,2696,7.225,,C +912,1,"Rothschild, Mr. Martin",male,55,1,0,PC 17603,59.4,,C +913,3,"Olsen, Master. Artur Karl",male,9,0,1,C 17368,3.1708,,S +914,1,"Flegenheim, Mrs. Alfred (Antoinette)",female,,0,0,PC 17598,31.6833,,S +915,1,"Williams, Mr. Richard Norris II",male,21,0,1,PC 17597,61.3792,,C +916,1,"Ryerson, Mrs. Arthur Larned (Emily Maria Borie)",female,48,1,3,PC 17608,262.375,B57 B59 B63 B66,C +917,3,"Robins, Mr. Alexander A",male,50,1,0,A/5. 3337,14.5,,S +918,1,"Ostby, Miss. Helene Ragnhild",female,22,0,1,113509,61.9792,B36,C +919,3,"Daher, Mr. Shedid",male,22.5,0,0,2698,7.225,,C +920,1,"Brady, Mr. John Bertram",male,41,0,0,113054,30.5,A21,S +921,3,"Samaan, Mr. Elias",male,,2,0,2662,21.6792,,C +922,2,"Louch, Mr. Charles Alexander",male,50,1,0,SC/AH 3085,26,,S +923,2,"Jefferys, Mr. Clifford Thomas",male,24,2,0,C.A. 31029,31.5,,S +924,3,"Dean, Mrs. Bertram (Eva Georgetta Light)",female,33,1,2,C.A. 2315,20.575,,S +925,3,"Johnston, Mrs. Andrew G (Elizabeth Lily"" Watson)""",female,,1,2,W./C. 6607,23.45,,S +926,1,"Mock, Mr. Philipp Edmund",male,30,1,0,13236,57.75,C78,C +927,3,"Katavelas, Mr. Vassilios (Catavelas Vassilios"")""",male,18.5,0,0,2682,7.2292,,C +928,3,"Roth, Miss. Sarah A",female,,0,0,342712,8.05,,S +929,3,"Cacic, Miss. Manda",female,21,0,0,315087,8.6625,,S +930,3,"Sap, Mr. Julius",male,25,0,0,345768,9.5,,S +931,3,"Hee, Mr. Ling",male,,0,0,1601,56.4958,,S +932,3,"Karun, Mr. Franz",male,39,0,1,349256,13.4167,,C +933,1,"Franklin, Mr. Thomas Parham",male,,0,0,113778,26.55,D34,S +934,3,"Goldsmith, Mr. Nathan",male,41,0,0,SOTON/O.Q. 3101263,7.85,,S +935,2,"Corbett, Mrs. Walter H (Irene Colvin)",female,30,0,0,237249,13,,S +936,1,"Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons)",female,45,1,0,11753,52.5542,D19,S +937,3,"Peltomaki, Mr. Nikolai Johannes",male,25,0,0,STON/O 2. 3101291,7.925,,S +938,1,"Chevre, Mr. Paul Romaine",male,45,0,0,PC 17594,29.7,A9,C +939,3,"Shaughnessy, Mr. Patrick",male,,0,0,370374,7.75,,Q +940,1,"Bucknell, Mrs. William Robert (Emma Eliza Ward)",female,60,0,0,11813,76.2917,D15,C +941,3,"Coutts, Mrs. William (Winnie Minnie"" Treanor)""",female,36,0,2,C.A. 37671,15.9,,S +942,1,"Smith, Mr. Lucien Philip",male,24,1,0,13695,60,C31,S +943,2,"Pulbaum, Mr. Franz",male,27,0,0,SC/PARIS 2168,15.0333,,C +944,2,"Hocking, Miss. Ellen Nellie""""",female,20,2,1,29105,23,,S +945,1,"Fortune, Miss. Ethel Flora",female,28,3,2,19950,263,C23 C25 C27,S +946,2,"Mangiavacchi, Mr. Serafino Emilio",male,,0,0,SC/A.3 2861,15.5792,,C +947,3,"Rice, Master. Albert",male,10,4,1,382652,29.125,,Q +948,3,"Cor, Mr. Bartol",male,35,0,0,349230,7.8958,,S +949,3,"Abelseth, Mr. Olaus Jorgensen",male,25,0,0,348122,7.65,F G63,S +950,3,"Davison, Mr. Thomas Henry",male,,1,0,386525,16.1,,S +951,1,"Chaudanson, Miss. Victorine",female,36,0,0,PC 17608,262.375,B61,C +952,3,"Dika, Mr. Mirko",male,17,0,0,349232,7.8958,,S +953,2,"McCrae, Mr. Arthur Gordon",male,32,0,0,237216,13.5,,S +954,3,"Bjorklund, Mr. Ernst Herbert",male,18,0,0,347090,7.75,,S +955,3,"Bradley, Miss. Bridget Delia",female,22,0,0,334914,7.725,,Q +956,1,"Ryerson, Master. John Borie",male,13,2,2,PC 17608,262.375,B57 B59 B63 B66,C +957,2,"Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller)",female,,0,0,F.C.C. 13534,21,,S +958,3,"Burns, Miss. Mary Delia",female,18,0,0,330963,7.8792,,Q +959,1,"Moore, Mr. Clarence Bloomfield",male,47,0,0,113796,42.4,,S +960,1,"Tucker, Mr. Gilbert Milligan Jr",male,31,0,0,2543,28.5375,C53,C +961,1,"Fortune, Mrs. Mark (Mary McDougald)",female,60,1,4,19950,263,C23 C25 C27,S +962,3,"Mulvihill, Miss. Bertha E",female,24,0,0,382653,7.75,,Q +963,3,"Minkoff, Mr. Lazar",male,21,0,0,349211,7.8958,,S +964,3,"Nieminen, Miss. Manta Josefina",female,29,0,0,3101297,7.925,,S +965,1,"Ovies y Rodriguez, Mr. Servando",male,28.5,0,0,PC 17562,27.7208,D43,C +966,1,"Geiger, Miss. Amalie",female,35,0,0,113503,211.5,C130,C +967,1,"Keeping, Mr. Edwin",male,32.5,0,0,113503,211.5,C132,C +968,3,"Miles, Mr. Frank",male,,0,0,359306,8.05,,S +969,1,"Cornell, Mrs. Robert Clifford (Malvina Helen Lamson)",female,55,2,0,11770,25.7,C101,S +970,2,"Aldworth, Mr. Charles Augustus",male,30,0,0,248744,13,,S +971,3,"Doyle, Miss. Elizabeth",female,24,0,0,368702,7.75,,Q +972,3,"Boulos, Master. Akar",male,6,1,1,2678,15.2458,,C +973,1,"Straus, Mr. Isidor",male,67,1,0,PC 17483,221.7792,C55 C57,S +974,1,"Case, Mr. Howard Brown",male,49,0,0,19924,26,,S +975,3,"Demetri, Mr. Marinko",male,,0,0,349238,7.8958,,S +976,2,"Lamb, Mr. John Joseph",male,,0,0,240261,10.7083,,Q +977,3,"Khalil, Mr. Betros",male,,1,0,2660,14.4542,,C +978,3,"Barry, Miss. Julia",female,27,0,0,330844,7.8792,,Q +979,3,"Badman, Miss. Emily Louisa",female,18,0,0,A/4 31416,8.05,,S +980,3,"O'Donoghue, Ms. Bridget",female,,0,0,364856,7.75,,Q +981,2,"Wells, Master. Ralph Lester",male,2,1,1,29103,23,,S +982,3,"Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson)",female,22,1,0,347072,13.9,,S +983,3,"Pedersen, Mr. Olaf",male,,0,0,345498,7.775,,S +984,1,"Davidson, Mrs. Thornton (Orian Hays)",female,27,1,2,F.C. 12750,52,B71,S +985,3,"Guest, Mr. Robert",male,,0,0,376563,8.05,,S +986,1,"Birnbaum, Mr. Jakob",male,25,0,0,13905,26,,C +987,3,"Tenglin, Mr. Gunnar Isidor",male,25,0,0,350033,7.7958,,S +988,1,"Cavendish, Mrs. Tyrell William (Julia Florence Siegel)",female,76,1,0,19877,78.85,C46,S +989,3,"Makinen, Mr. Kalle Edvard",male,29,0,0,STON/O 2. 3101268,7.925,,S +990,3,"Braf, Miss. Elin Ester Maria",female,20,0,0,347471,7.8542,,S +991,3,"Nancarrow, Mr. William Henry",male,33,0,0,A./5. 3338,8.05,,S +992,1,"Stengel, Mrs. Charles Emil Henry (Annie May Morris)",female,43,1,0,11778,55.4417,C116,C +993,2,"Weisz, Mr. Leopold",male,27,1,0,228414,26,,S +994,3,"Foley, Mr. William",male,,0,0,365235,7.75,,Q +995,3,"Johansson Palmquist, Mr. Oskar Leander",male,26,0,0,347070,7.775,,S +996,3,"Thomas, Mrs. Alexander (Thamine Thelma"")""",female,16,1,1,2625,8.5167,,C +997,3,"Holthen, Mr. Johan Martin",male,28,0,0,C 4001,22.525,,S +998,3,"Buckley, Mr. Daniel",male,21,0,0,330920,7.8208,,Q +999,3,"Ryan, Mr. Edward",male,,0,0,383162,7.75,,Q +1000,3,"Willer, Mr. Aaron (Abi Weller"")""",male,,0,0,3410,8.7125,,S +1001,2,"Swane, Mr. George",male,18.5,0,0,248734,13,F,S +1002,2,"Stanton, Mr. Samuel Ward",male,41,0,0,237734,15.0458,,C +1003,3,"Shine, Miss. Ellen Natalia",female,,0,0,330968,7.7792,,Q +1004,1,"Evans, Miss. Edith Corse",female,36,0,0,PC 17531,31.6792,A29,C +1005,3,"Buckley, Miss. Katherine",female,18.5,0,0,329944,7.2833,,Q +1006,1,"Straus, Mrs. Isidor (Rosalie Ida Blun)",female,63,1,0,PC 17483,221.7792,C55 C57,S +1007,3,"Chronopoulos, Mr. Demetrios",male,18,1,0,2680,14.4542,,C +1008,3,"Thomas, Mr. John",male,,0,0,2681,6.4375,,C +1009,3,"Sandstrom, Miss. Beatrice Irene",female,1,1,1,PP 9549,16.7,G6,S +1010,1,"Beattie, Mr. Thomson",male,36,0,0,13050,75.2417,C6,C +1011,2,"Chapman, Mrs. John Henry (Sara Elizabeth Lawry)",female,29,1,0,SC/AH 29037,26,,S +1012,2,"Watt, Miss. Bertha J",female,12,0,0,C.A. 33595,15.75,,S +1013,3,"Kiernan, Mr. John",male,,1,0,367227,7.75,,Q +1014,1,"Schabert, Mrs. Paul (Emma Mock)",female,35,1,0,13236,57.75,C28,C +1015,3,"Carver, Mr. Alfred John",male,28,0,0,392095,7.25,,S +1016,3,"Kennedy, Mr. John",male,,0,0,368783,7.75,,Q +1017,3,"Cribb, Miss. Laura Alice",female,17,0,1,371362,16.1,,S +1018,3,"Brobeck, Mr. Karl Rudolf",male,22,0,0,350045,7.7958,,S +1019,3,"McCoy, Miss. Alicia",female,,2,0,367226,23.25,,Q +1020,2,"Bowenur, Mr. Solomon",male,42,0,0,211535,13,,S +1021,3,"Petersen, Mr. Marius",male,24,0,0,342441,8.05,,S +1022,3,"Spinner, Mr. Henry John",male,32,0,0,STON/OQ. 369943,8.05,,S +1023,1,"Gracie, Col. Archibald IV",male,53,0,0,113780,28.5,C51,C +1024,3,"Lefebre, Mrs. Frank (Frances)",female,,0,4,4133,25.4667,,S +1025,3,"Thomas, Mr. Charles P",male,,1,0,2621,6.4375,,C +1026,3,"Dintcheff, Mr. Valtcho",male,43,0,0,349226,7.8958,,S +1027,3,"Carlsson, Mr. Carl Robert",male,24,0,0,350409,7.8542,,S +1028,3,"Zakarian, Mr. Mapriededer",male,26.5,0,0,2656,7.225,,C +1029,2,"Schmidt, Mr. August",male,26,0,0,248659,13,,S +1030,3,"Drapkin, Miss. Jennie",female,23,0,0,SOTON/OQ 392083,8.05,,S +1031,3,"Goodwin, Mr. Charles Frederick",male,40,1,6,CA 2144,46.9,,S +1032,3,"Goodwin, Miss. Jessie Allis",female,10,5,2,CA 2144,46.9,,S +1033,1,"Daniels, Miss. Sarah",female,33,0,0,113781,151.55,,S +1034,1,"Ryerson, Mr. Arthur Larned",male,61,1,3,PC 17608,262.375,B57 B59 B63 B66,C +1035,2,"Beauchamp, Mr. Henry James",male,28,0,0,244358,26,,S +1036,1,"Lindeberg-Lind, Mr. Erik Gustaf (Mr Edward Lingrey"")""",male,42,0,0,17475,26.55,,S +1037,3,"Vander Planke, Mr. Julius",male,31,3,0,345763,18,,S +1038,1,"Hilliard, Mr. Herbert Henry",male,,0,0,17463,51.8625,E46,S +1039,3,"Davies, Mr. Evan",male,22,0,0,SC/A4 23568,8.05,,S +1040,1,"Crafton, Mr. John Bertram",male,,0,0,113791,26.55,,S +1041,2,"Lahtinen, Rev. William",male,30,1,1,250651,26,,S +1042,1,"Earnshaw, Mrs. Boulton (Olive Potter)",female,23,0,1,11767,83.1583,C54,C +1043,3,"Matinoff, Mr. Nicola",male,,0,0,349255,7.8958,,C +1044,3,"Storey, Mr. Thomas",male,60.5,0,0,3701,,,S +1045,3,"Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist)",female,36,0,2,350405,12.1833,,S +1046,3,"Asplund, Master. Filip Oscar",male,13,4,2,347077,31.3875,,S +1047,3,"Duquemin, Mr. Joseph",male,24,0,0,S.O./P.P. 752,7.55,,S +1048,1,"Bird, Miss. Ellen",female,29,0,0,PC 17483,221.7792,C97,S +1049,3,"Lundin, Miss. Olga Elida",female,23,0,0,347469,7.8542,,S +1050,1,"Borebank, Mr. John James",male,42,0,0,110489,26.55,D22,S +1051,3,"Peacock, Mrs. Benjamin (Edith Nile)",female,26,0,2,SOTON/O.Q. 3101315,13.775,,S +1052,3,"Smyth, Miss. Julia",female,,0,0,335432,7.7333,,Q +1053,3,"Touma, Master. Georges Youssef",male,7,1,1,2650,15.2458,,C +1054,2,"Wright, Miss. Marion",female,26,0,0,220844,13.5,,S +1055,3,"Pearce, Mr. Ernest",male,,0,0,343271,7,,S +1056,2,"Peruschitz, Rev. Joseph Maria",male,41,0,0,237393,13,,S +1057,3,"Kink-Heilmann, Mrs. Anton (Luise Heilmann)",female,26,1,1,315153,22.025,,S +1058,1,"Brandeis, Mr. Emil",male,48,0,0,PC 17591,50.4958,B10,C +1059,3,"Ford, Mr. Edward Watson",male,18,2,2,W./C. 6608,34.375,,S +1060,1,"Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick)",female,,0,0,17770,27.7208,,C +1061,3,"Hellstrom, Miss. Hilda Maria",female,22,0,0,7548,8.9625,,S +1062,3,"Lithman, Mr. Simon",male,,0,0,S.O./P.P. 251,7.55,,S +1063,3,"Zakarian, Mr. Ortin",male,27,0,0,2670,7.225,,C +1064,3,"Dyker, Mr. Adolf Fredrik",male,23,1,0,347072,13.9,,S +1065,3,"Torfa, Mr. Assad",male,,0,0,2673,7.2292,,C +1066,3,"Asplund, Mr. Carl Oscar Vilhelm Gustafsson",male,40,1,5,347077,31.3875,,S +1067,2,"Brown, Miss. Edith Eileen",female,15,0,2,29750,39,,S +1068,2,"Sincock, Miss. Maude",female,20,0,0,C.A. 33112,36.75,,S +1069,1,"Stengel, Mr. Charles Emil Henry",male,54,1,0,11778,55.4417,C116,C +1070,2,"Becker, Mrs. Allen Oliver (Nellie E Baumgardner)",female,36,0,3,230136,39,F4,S +1071,1,"Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll)",female,64,0,2,PC 17756,83.1583,E45,C +1072,2,"McCrie, Mr. James Matthew",male,30,0,0,233478,13,,S +1073,1,"Compton, Mr. Alexander Taylor Jr",male,37,1,1,PC 17756,83.1583,E52,C +1074,1,"Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson)",female,18,1,0,113773,53.1,D30,S +1075,3,"Lane, Mr. Patrick",male,,0,0,7935,7.75,,Q +1076,1,"Douglas, Mrs. Frederick Charles (Mary Helene Baxter)",female,27,1,1,PC 17558,247.5208,B58 B60,C +1077,2,"Maybery, Mr. Frank Hubert",male,40,0,0,239059,16,,S +1078,2,"Phillips, Miss. Alice Frances Louisa",female,21,0,1,S.O./P.P. 2,21,,S +1079,3,"Davies, Mr. Joseph",male,17,2,0,A/4 48873,8.05,,S +1080,3,"Sage, Miss. Ada",female,,8,2,CA. 2343,69.55,,S +1081,2,"Veal, Mr. James",male,40,0,0,28221,13,,S +1082,2,"Angle, Mr. William A",male,34,1,0,226875,26,,S +1083,1,"Salomon, Mr. Abraham L",male,,0,0,111163,26,,S +1084,3,"van Billiard, Master. Walter John",male,11.5,1,1,A/5. 851,14.5,,S +1085,2,"Lingane, Mr. John",male,61,0,0,235509,12.35,,Q +1086,2,"Drew, Master. Marshall Brines",male,8,0,2,28220,32.5,,S +1087,3,"Karlsson, Mr. Julius Konrad Eugen",male,33,0,0,347465,7.8542,,S +1088,1,"Spedden, Master. Robert Douglas",male,6,0,2,16966,134.5,E34,C +1089,3,"Nilsson, Miss. Berta Olivia",female,18,0,0,347066,7.775,,S +1090,2,"Baimbrigge, Mr. Charles Robert",male,23,0,0,C.A. 31030,10.5,,S +1091,3,"Rasmussen, Mrs. (Lena Jacobsen Solvang)",female,,0,0,65305,8.1125,,S +1092,3,"Murphy, Miss. Nora",female,,0,0,36568,15.5,,Q +1093,3,"Danbom, Master. Gilbert Sigvard Emanuel",male,0.33,0,2,347080,14.4,,S +1094,1,"Astor, Col. John Jacob",male,47,1,0,PC 17757,227.525,C62 C64,C +1095,2,"Quick, Miss. Winifred Vera",female,8,1,1,26360,26,,S +1096,2,"Andrew, Mr. Frank Thomas",male,25,0,0,C.A. 34050,10.5,,S +1097,1,"Omont, Mr. Alfred Fernand",male,,0,0,F.C. 12998,25.7417,,C +1098,3,"McGowan, Miss. Katherine",female,35,0,0,9232,7.75,,Q +1099,2,"Collett, Mr. Sidney C Stuart",male,24,0,0,28034,10.5,,S +1100,1,"Rosenbaum, Miss. Edith Louise",female,33,0,0,PC 17613,27.7208,A11,C +1101,3,"Delalic, Mr. Redjo",male,25,0,0,349250,7.8958,,S +1102,3,"Andersen, Mr. Albert Karvin",male,32,0,0,C 4001,22.525,,S +1103,3,"Finoli, Mr. Luigi",male,,0,0,SOTON/O.Q. 3101308,7.05,,S +1104,2,"Deacon, Mr. Percy William",male,17,0,0,S.O.C. 14879,73.5,,S +1105,2,"Howard, Mrs. Benjamin (Ellen Truelove Arman)",female,60,1,0,24065,26,,S +1106,3,"Andersson, Miss. Ida Augusta Margareta",female,38,4,2,347091,7.775,,S +1107,1,"Head, Mr. Christopher",male,42,0,0,113038,42.5,B11,S +1108,3,"Mahon, Miss. Bridget Delia",female,,0,0,330924,7.8792,,Q +1109,1,"Wick, Mr. George Dennick",male,57,1,1,36928,164.8667,,S +1110,1,"Widener, Mrs. George Dunton (Eleanor Elkins)",female,50,1,1,113503,211.5,C80,C +1111,3,"Thomson, Mr. Alexander Morrison",male,,0,0,32302,8.05,,S +1112,2,"Duran y More, Miss. Florentina",female,30,1,0,SC/PARIS 2148,13.8583,,C +1113,3,"Reynolds, Mr. Harold J",male,21,0,0,342684,8.05,,S +1114,2,"Cook, Mrs. (Selena Rogers)",female,22,0,0,W./C. 14266,10.5,F33,S +1115,3,"Karlsson, Mr. Einar Gervasius",male,21,0,0,350053,7.7958,,S +1116,1,"Candee, Mrs. Edward (Helen Churchill Hungerford)",female,53,0,0,PC 17606,27.4458,,C +1117,3,"Moubarek, Mrs. George (Omine Amenia"" Alexander)""",female,,0,2,2661,15.2458,,C +1118,3,"Asplund, Mr. Johan Charles",male,23,0,0,350054,7.7958,,S +1119,3,"McNeill, Miss. Bridget",female,,0,0,370368,7.75,,Q +1120,3,"Everett, Mr. Thomas James",male,40.5,0,0,C.A. 6212,15.1,,S +1121,2,"Hocking, Mr. Samuel James Metcalfe",male,36,0,0,242963,13,,S +1122,2,"Sweet, Mr. George Frederick",male,14,0,0,220845,65,,S +1123,1,"Willard, Miss. Constance",female,21,0,0,113795,26.55,,S +1124,3,"Wiklund, Mr. Karl Johan",male,21,1,0,3101266,6.4958,,S +1125,3,"Linehan, Mr. Michael",male,,0,0,330971,7.8792,,Q +1126,1,"Cumings, Mr. John Bradley",male,39,1,0,PC 17599,71.2833,C85,C +1127,3,"Vendel, Mr. Olof Edvin",male,20,0,0,350416,7.8542,,S +1128,1,"Warren, Mr. Frank Manley",male,64,1,0,110813,75.25,D37,C +1129,3,"Baccos, Mr. Raffull",male,20,0,0,2679,7.225,,C +1130,2,"Hiltunen, Miss. Marta",female,18,1,1,250650,13,,S +1131,1,"Douglas, Mrs. Walter Donald (Mahala Dutton)",female,48,1,0,PC 17761,106.425,C86,C +1132,1,"Lindstrom, Mrs. Carl Johan (Sigrid Posse)",female,55,0,0,112377,27.7208,,C +1133,2,"Christy, Mrs. (Alice Frances)",female,45,0,2,237789,30,,S +1134,1,"Spedden, Mr. Frederic Oakley",male,45,1,1,16966,134.5,E34,C +1135,3,"Hyman, Mr. Abraham",male,,0,0,3470,7.8875,,S +1136,3,"Johnston, Master. William Arthur Willie""""",male,,1,2,W./C. 6607,23.45,,S +1137,1,"Kenyon, Mr. Frederick R",male,41,1,0,17464,51.8625,D21,S +1138,2,"Karnes, Mrs. J Frank (Claire Bennett)",female,22,0,0,F.C.C. 13534,21,,S +1139,2,"Drew, Mr. James Vivian",male,42,1,1,28220,32.5,,S +1140,2,"Hold, Mrs. Stephen (Annie Margaret Hill)",female,29,1,0,26707,26,,S +1141,3,"Khalil, Mrs. Betros (Zahie Maria"" Elias)""",female,,1,0,2660,14.4542,,C +1142,2,"West, Miss. Barbara J",female,0.92,1,2,C.A. 34651,27.75,,S +1143,3,"Abrahamsson, Mr. Abraham August Johannes",male,20,0,0,SOTON/O2 3101284,7.925,,S +1144,1,"Clark, Mr. Walter Miller",male,27,1,0,13508,136.7792,C89,C +1145,3,"Salander, Mr. Karl Johan",male,24,0,0,7266,9.325,,S +1146,3,"Wenzel, Mr. Linhart",male,32.5,0,0,345775,9.5,,S +1147,3,"MacKay, Mr. George William",male,,0,0,C.A. 42795,7.55,,S +1148,3,"Mahon, Mr. John",male,,0,0,AQ/4 3130,7.75,,Q +1149,3,"Niklasson, Mr. Samuel",male,28,0,0,363611,8.05,,S +1150,2,"Bentham, Miss. Lilian W",female,19,0,0,28404,13,,S +1151,3,"Midtsjo, Mr. Karl Albert",male,21,0,0,345501,7.775,,S +1152,3,"de Messemaeker, Mr. Guillaume Joseph",male,36.5,1,0,345572,17.4,,S +1153,3,"Nilsson, Mr. August Ferdinand",male,21,0,0,350410,7.8542,,S +1154,2,"Wells, Mrs. Arthur Henry (Addie"" Dart Trevaskis)""",female,29,0,2,29103,23,,S +1155,3,"Klasen, Miss. Gertrud Emilia",female,1,1,1,350405,12.1833,,S +1156,2,"Portaluppi, Mr. Emilio Ilario Giuseppe",male,30,0,0,C.A. 34644,12.7375,,C +1157,3,"Lyntakoff, Mr. Stanko",male,,0,0,349235,7.8958,,S +1158,1,"Chisholm, Mr. Roderick Robert Crispin",male,,0,0,112051,0,,S +1159,3,"Warren, Mr. Charles William",male,,0,0,C.A. 49867,7.55,,S +1160,3,"Howard, Miss. May Elizabeth",female,,0,0,A. 2. 39186,8.05,,S +1161,3,"Pokrnic, Mr. Mate",male,17,0,0,315095,8.6625,,S +1162,1,"McCaffry, Mr. Thomas Francis",male,46,0,0,13050,75.2417,C6,C +1163,3,"Fox, Mr. Patrick",male,,0,0,368573,7.75,,Q +1164,1,"Clark, Mrs. Walter Miller (Virginia McDowell)",female,26,1,0,13508,136.7792,C89,C +1165,3,"Lennon, Miss. Mary",female,,1,0,370371,15.5,,Q +1166,3,"Saade, Mr. Jean Nassr",male,,0,0,2676,7.225,,C +1167,2,"Bryhl, Miss. Dagmar Jenny Ingeborg ",female,20,1,0,236853,26,,S +1168,2,"Parker, Mr. Clifford Richard",male,28,0,0,SC 14888,10.5,,S +1169,2,"Faunthorpe, Mr. Harry",male,40,1,0,2926,26,,S +1170,2,"Ware, Mr. John James",male,30,1,0,CA 31352,21,,S +1171,2,"Oxenham, Mr. Percy Thomas",male,22,0,0,W./C. 14260,10.5,,S +1172,3,"Oreskovic, Miss. Jelka",female,23,0,0,315085,8.6625,,S +1173,3,"Peacock, Master. Alfred Edward",male,0.75,1,1,SOTON/O.Q. 3101315,13.775,,S +1174,3,"Fleming, Miss. Honora",female,,0,0,364859,7.75,,Q +1175,3,"Touma, Miss. Maria Youssef",female,9,1,1,2650,15.2458,,C +1176,3,"Rosblom, Miss. Salli Helena",female,2,1,1,370129,20.2125,,S +1177,3,"Dennis, Mr. William",male,36,0,0,A/5 21175,7.25,,S +1178,3,"Franklin, Mr. Charles (Charles Fardon)",male,,0,0,SOTON/O.Q. 3101314,7.25,,S +1179,1,"Snyder, Mr. John Pillsbury",male,24,1,0,21228,82.2667,B45,S +1180,3,"Mardirosian, Mr. Sarkis",male,,0,0,2655,7.2292,F E46,C +1181,3,"Ford, Mr. Arthur",male,,0,0,A/5 1478,8.05,,S +1182,1,"Rheims, Mr. George Alexander Lucien",male,,0,0,PC 17607,39.6,,S +1183,3,"Daly, Miss. Margaret Marcella Maggie""""",female,30,0,0,382650,6.95,,Q +1184,3,"Nasr, Mr. Mustafa",male,,0,0,2652,7.2292,,C +1185,1,"Dodge, Dr. Washington",male,53,1,1,33638,81.8583,A34,S +1186,3,"Wittevrongel, Mr. Camille",male,36,0,0,345771,9.5,,S +1187,3,"Angheloff, Mr. Minko",male,26,0,0,349202,7.8958,,S +1188,2,"Laroche, Miss. Louise",female,1,1,2,SC/Paris 2123,41.5792,,C +1189,3,"Samaan, Mr. Hanna",male,,2,0,2662,21.6792,,C +1190,1,"Loring, Mr. Joseph Holland",male,30,0,0,113801,45.5,,S +1191,3,"Johansson, Mr. Nils",male,29,0,0,347467,7.8542,,S +1192,3,"Olsson, Mr. Oscar Wilhelm",male,32,0,0,347079,7.775,,S +1193,2,"Malachard, Mr. Noel",male,,0,0,237735,15.0458,D,C +1194,2,"Phillips, Mr. Escott Robert",male,43,0,1,S.O./P.P. 2,21,,S +1195,3,"Pokrnic, Mr. Tome",male,24,0,0,315092,8.6625,,S +1196,3,"McCarthy, Miss. Catherine Katie""""",female,,0,0,383123,7.75,,Q +1197,1,"Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead)",female,64,1,1,112901,26.55,B26,S +1198,1,"Allison, Mr. Hudson Joshua Creighton",male,30,1,2,113781,151.55,C22 C26,S +1199,3,"Aks, Master. Philip Frank",male,0.83,0,1,392091,9.35,,S +1200,1,"Hays, Mr. Charles Melville",male,55,1,1,12749,93.5,B69,S +1201,3,"Hansen, Mrs. Claus Peter (Jennie L Howard)",female,45,1,0,350026,14.1083,,S +1202,3,"Cacic, Mr. Jego Grga",male,18,0,0,315091,8.6625,,S +1203,3,"Vartanian, Mr. David",male,22,0,0,2658,7.225,,C +1204,3,"Sadowitz, Mr. Harry",male,,0,0,LP 1588,7.575,,S +1205,3,"Carr, Miss. Jeannie",female,37,0,0,368364,7.75,,Q +1206,1,"White, Mrs. John Stuart (Ella Holmes)",female,55,0,0,PC 17760,135.6333,C32,C +1207,3,"Hagardon, Miss. Kate",female,17,0,0,AQ/3. 30631,7.7333,,Q +1208,1,"Spencer, Mr. William Augustus",male,57,1,0,PC 17569,146.5208,B78,C +1209,2,"Rogers, Mr. Reginald Harry",male,19,0,0,28004,10.5,,S +1210,3,"Jonsson, Mr. Nils Hilding",male,27,0,0,350408,7.8542,,S +1211,2,"Jefferys, Mr. Ernest Wilfred",male,22,2,0,C.A. 31029,31.5,,S +1212,3,"Andersson, Mr. Johan Samuel",male,26,0,0,347075,7.775,,S +1213,3,"Krekorian, Mr. Neshan",male,25,0,0,2654,7.2292,F E57,C +1214,2,"Nesson, Mr. Israel",male,26,0,0,244368,13,F2,S +1215,1,"Rowe, Mr. Alfred G",male,33,0,0,113790,26.55,,S +1216,1,"Kreuchen, Miss. Emilie",female,39,0,0,24160,211.3375,,S +1217,3,"Assam, Mr. Ali",male,23,0,0,SOTON/O.Q. 3101309,7.05,,S +1218,2,"Becker, Miss. Ruth Elizabeth",female,12,2,1,230136,39,F4,S +1219,1,"Rosenshine, Mr. George (Mr George Thorne"")""",male,46,0,0,PC 17585,79.2,,C +1220,2,"Clarke, Mr. Charles Valentine",male,29,1,0,2003,26,,S +1221,2,"Enander, Mr. Ingvar",male,21,0,0,236854,13,,S +1222,2,"Davies, Mrs. John Morgan (Elizabeth Agnes Mary White) ",female,48,0,2,C.A. 33112,36.75,,S +1223,1,"Dulles, Mr. William Crothers",male,39,0,0,PC 17580,29.7,A18,C +1224,3,"Thomas, Mr. Tannous",male,,0,0,2684,7.225,,C +1225,3,"Nakid, Mrs. Said (Waika Mary"" Mowad)""",female,19,1,1,2653,15.7417,,C +1226,3,"Cor, Mr. Ivan",male,27,0,0,349229,7.8958,,S +1227,1,"Maguire, Mr. John Edward",male,30,0,0,110469,26,C106,S +1228,2,"de Brito, Mr. Jose Joaquim",male,32,0,0,244360,13,,S +1229,3,"Elias, Mr. Joseph",male,39,0,2,2675,7.2292,,C +1230,2,"Denbury, Mr. Herbert",male,25,0,0,C.A. 31029,31.5,,S +1231,3,"Betros, Master. Seman",male,,0,0,2622,7.2292,,C +1232,2,"Fillbrook, Mr. Joseph Charles",male,18,0,0,C.A. 15185,10.5,,S +1233,3,"Lundstrom, Mr. Thure Edvin",male,32,0,0,350403,7.5792,,S +1234,3,"Sage, Mr. John George",male,,1,9,CA. 2343,69.55,,S +1235,1,"Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake)",female,58,0,1,PC 17755,512.3292,B51 B53 B55,C +1236,3,"van Billiard, Master. James William",male,,1,1,A/5. 851,14.5,,S +1237,3,"Abelseth, Miss. Karen Marie",female,16,0,0,348125,7.65,,S +1238,2,"Botsford, Mr. William Hull",male,26,0,0,237670,13,,S +1239,3,"Whabee, Mrs. George Joseph (Shawneene Abi-Saab)",female,38,0,0,2688,7.2292,,C +1240,2,"Giles, Mr. Ralph",male,24,0,0,248726,13.5,,S +1241,2,"Walcroft, Miss. Nellie",female,31,0,0,F.C.C. 13528,21,,S +1242,1,"Greenfield, Mrs. Leo David (Blanche Strouse)",female,45,0,1,PC 17759,63.3583,D10 D12,C +1243,2,"Stokes, Mr. Philip Joseph",male,25,0,0,F.C.C. 13540,10.5,,S +1244,2,"Dibden, Mr. William",male,18,0,0,S.O.C. 14879,73.5,,S +1245,2,"Herman, Mr. Samuel",male,49,1,2,220845,65,,S +1246,3,"Dean, Miss. Elizabeth Gladys Millvina""""",female,0.17,1,2,C.A. 2315,20.575,,S +1247,1,"Julian, Mr. Henry Forbes",male,50,0,0,113044,26,E60,S +1248,1,"Brown, Mrs. John Murray (Caroline Lane Lamson)",female,59,2,0,11769,51.4792,C101,S +1249,3,"Lockyer, Mr. Edward",male,,0,0,1222,7.8792,,S +1250,3,"O'Keefe, Mr. Patrick",male,,0,0,368402,7.75,,Q +1251,3,"Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson)",female,30,1,0,349910,15.55,,S +1252,3,"Sage, Master. William Henry",male,14.5,8,2,CA. 2343,69.55,,S +1253,2,"Mallet, Mrs. Albert (Antoinette Magnin)",female,24,1,1,S.C./PARIS 2079,37.0042,,C +1254,2,"Ware, Mrs. John James (Florence Louise Long)",female,31,0,0,CA 31352,21,,S +1255,3,"Strilic, Mr. Ivan",male,27,0,0,315083,8.6625,,S +1256,1,"Harder, Mrs. George Achilles (Dorothy Annan)",female,25,1,0,11765,55.4417,E50,C +1257,3,"Sage, Mrs. John (Annie Bullen)",female,,1,9,CA. 2343,69.55,,S +1258,3,"Caram, Mr. Joseph",male,,1,0,2689,14.4583,,C +1259,3,"Riihivouri, Miss. Susanna Juhantytar Sanni""""",female,22,0,0,3101295,39.6875,,S +1260,1,"Gibson, Mrs. Leonard (Pauline C Boeson)",female,45,0,1,112378,59.4,,C +1261,2,"Pallas y Castello, Mr. Emilio",male,29,0,0,SC/PARIS 2147,13.8583,,C +1262,2,"Giles, Mr. Edgar",male,21,1,0,28133,11.5,,S +1263,1,"Wilson, Miss. Helen Alice",female,31,0,0,16966,134.5,E39 E41,C +1264,1,"Ismay, Mr. Joseph Bruce",male,49,0,0,112058,0,B52 B54 B56,S +1265,2,"Harbeck, Mr. William H",male,44,0,0,248746,13,,S +1266,1,"Dodge, Mrs. Washington (Ruth Vidaver)",female,54,1,1,33638,81.8583,A34,S +1267,1,"Bowen, Miss. Grace Scott",female,45,0,0,PC 17608,262.375,,C +1268,3,"Kink, Miss. Maria",female,22,2,0,315152,8.6625,,S +1269,2,"Cotterill, Mr. Henry Harry""""",male,21,0,0,29107,11.5,,S +1270,1,"Hipkins, Mr. William Edward",male,55,0,0,680,50,C39,S +1271,3,"Asplund, Master. Carl Edgar",male,5,4,2,347077,31.3875,,S +1272,3,"O'Connor, Mr. Patrick",male,,0,0,366713,7.75,,Q +1273,3,"Foley, Mr. Joseph",male,26,0,0,330910,7.8792,,Q +1274,3,"Risien, Mrs. Samuel (Emma)",female,,0,0,364498,14.5,,S +1275,3,"McNamee, Mrs. Neal (Eileen O'Leary)",female,19,1,0,376566,16.1,,S +1276,2,"Wheeler, Mr. Edwin Frederick""""",male,,0,0,SC/PARIS 2159,12.875,,S +1277,2,"Herman, Miss. Kate",female,24,1,2,220845,65,,S +1278,3,"Aronsson, Mr. Ernst Axel Algot",male,24,0,0,349911,7.775,,S +1279,2,"Ashby, Mr. John",male,57,0,0,244346,13,,S +1280,3,"Canavan, Mr. Patrick",male,21,0,0,364858,7.75,,Q +1281,3,"Palsson, Master. Paul Folke",male,6,3,1,349909,21.075,,S +1282,1,"Payne, Mr. Vivian Ponsonby",male,23,0,0,12749,93.5,B24,S +1283,1,"Lines, Mrs. Ernest H (Elizabeth Lindsey James)",female,51,0,1,PC 17592,39.4,D28,S +1284,3,"Abbott, Master. Eugene Joseph",male,13,0,2,C.A. 2673,20.25,,S +1285,2,"Gilbert, Mr. William",male,47,0,0,C.A. 30769,10.5,,S +1286,3,"Kink-Heilmann, Mr. Anton",male,29,3,1,315153,22.025,,S +1287,1,"Smith, Mrs. Lucien Philip (Mary Eloise Hughes)",female,18,1,0,13695,60,C31,S +1288,3,"Colbert, Mr. Patrick",male,24,0,0,371109,7.25,,Q +1289,1,"Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli)",female,48,1,1,13567,79.2,B41,C +1290,3,"Larsson-Rondberg, Mr. Edvard A",male,22,0,0,347065,7.775,,S +1291,3,"Conlon, Mr. Thomas Henry",male,31,0,0,21332,7.7333,,Q +1292,1,"Bonnell, Miss. Caroline",female,30,0,0,36928,164.8667,C7,S +1293,2,"Gale, Mr. Harry",male,38,1,0,28664,21,,S +1294,1,"Gibson, Miss. Dorothy Winifred",female,22,0,1,112378,59.4,,C +1295,1,"Carrau, Mr. Jose Pedro",male,17,0,0,113059,47.1,,S +1296,1,"Frauenthal, Mr. Isaac Gerald",male,43,1,0,17765,27.7208,D40,C +1297,2,"Nourney, Mr. Alfred (Baron von Drachstedt"")""",male,20,0,0,SC/PARIS 2166,13.8625,D38,C +1298,2,"Ware, Mr. William Jeffery",male,23,1,0,28666,10.5,,S +1299,1,"Widener, Mr. George Dunton",male,50,1,1,113503,211.5,C80,C +1300,3,"Riordan, Miss. Johanna Hannah""""",female,,0,0,334915,7.7208,,Q +1301,3,"Peacock, Miss. Treasteall",female,3,1,1,SOTON/O.Q. 3101315,13.775,,S +1302,3,"Naughton, Miss. Hannah",female,,0,0,365237,7.75,,Q +1303,1,"Minahan, Mrs. William Edward (Lillian E Thorpe)",female,37,1,0,19928,90,C78,Q +1304,3,"Henriksson, Miss. Jenny Lovisa",female,28,0,0,347086,7.775,,S +1305,3,"Spector, Mr. Woolf",male,,0,0,A.5. 3236,8.05,,S +1306,1,"Oliva y Ocana, Dona. Fermina",female,39,0,0,PC 17758,108.9,C105,C +1307,3,"Saether, Mr. Simon Sivertsen",male,38.5,0,0,SOTON/O.Q. 3101262,7.25,,S +1308,3,"Ware, Mr. Frederick",male,,0,0,359309,8.05,,S +1309,3,"Peter, Master. Michael J",male,,1,1,2668,22.3583,,C diff --git a/SAA/2_2_Titanic/content/titanic_test.csv b/SAA/2_2_Titanic/content/titanic_test.csv new file mode 100644 index 0000000..2c6ac90 --- /dev/null +++ b/SAA/2_2_Titanic/content/titanic_test.csv @@ -0,0 +1,419 @@ +,PassengerId,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked +0,892,3,"Kelly, Mr. James",male,34.5,0,0,330911,7.8292,,Q +1,893,3,"Wilkes, Mrs. James (Ellen Needs)",female,47.0,1,0,363272,7.0,,S +2,894,2,"Myles, Mr. Thomas Francis",male,62.0,0,0,240276,9.6875,,Q +3,895,3,"Wirz, Mr. Albert",male,27.0,0,0,315154,8.6625,,S +4,896,3,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)",female,22.0,1,1,3101298,12.2875,,S +5,897,3,"Svensson, Mr. Johan Cervin",male,14.0,0,0,7538,9.225,,S +6,898,3,"Connolly, Miss. Kate",female,30.0,0,0,330972,7.6292,,Q +7,899,2,"Caldwell, Mr. Albert Francis",male,26.0,1,1,248738,29.0,,S +8,900,3,"Abrahim, Mrs. Joseph (Sophie Halaut Easu)",female,18.0,0,0,2657,7.2292,,C +9,901,3,"Davies, Mr. John Samuel",male,21.0,2,0,A/4 48871,24.15,,S +10,902,3,"Ilieff, Mr. Ylio",male,,0,0,349220,7.8958,,S +11,903,1,"Jones, Mr. Charles Cresson",male,46.0,0,0,694,26.0,,S +12,904,1,"Snyder, Mrs. John Pillsbury (Nelle Stevenson)",female,23.0,1,0,21228,82.2667,B45,S +13,905,2,"Howard, Mr. Benjamin",male,63.0,1,0,24065,26.0,,S +14,906,1,"Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)",female,47.0,1,0,W.E.P. 5734,61.175,E31,S +15,907,2,"del Carlo, Mrs. Sebastiano (Argenia Genovesi)",female,24.0,1,0,SC/PARIS 2167,27.7208,,C +16,908,2,"Keane, Mr. Daniel",male,35.0,0,0,233734,12.35,,Q +17,909,3,"Assaf, Mr. Gerios",male,21.0,0,0,2692,7.225,,C +18,910,3,"Ilmakangas, Miss. Ida Livija",female,27.0,1,0,STON/O2. 3101270,7.925,,S +19,911,3,"Assaf Khalil, Mrs. Mariana (Miriam"")""",female,45.0,0,0,2696,7.225,,C +20,912,1,"Rothschild, Mr. Martin",male,55.0,1,0,PC 17603,59.4,,C +21,913,3,"Olsen, Master. Artur Karl",male,9.0,0,1,C 17368,3.1708,,S +22,914,1,"Flegenheim, Mrs. Alfred (Antoinette)",female,,0,0,PC 17598,31.6833,,S +23,915,1,"Williams, Mr. Richard Norris II",male,21.0,0,1,PC 17597,61.3792,,C +24,916,1,"Ryerson, Mrs. Arthur Larned (Emily Maria Borie)",female,48.0,1,3,PC 17608,262.375,B57 B59 B63 B66,C +25,917,3,"Robins, Mr. Alexander A",male,50.0,1,0,A/5. 3337,14.5,,S +26,918,1,"Ostby, Miss. Helene Ragnhild",female,22.0,0,1,113509,61.9792,B36,C +27,919,3,"Daher, Mr. Shedid",male,22.5,0,0,2698,7.225,,C +28,920,1,"Brady, Mr. John Bertram",male,41.0,0,0,113054,30.5,A21,S +29,921,3,"Samaan, Mr. Elias",male,,2,0,2662,21.6792,,C +30,922,2,"Louch, Mr. Charles Alexander",male,50.0,1,0,SC/AH 3085,26.0,,S +31,923,2,"Jefferys, Mr. Clifford Thomas",male,24.0,2,0,C.A. 31029,31.5,,S +32,924,3,"Dean, Mrs. Bertram (Eva Georgetta Light)",female,33.0,1,2,C.A. 2315,20.575,,S +33,925,3,"Johnston, Mrs. Andrew G (Elizabeth Lily"" Watson)""",female,,1,2,W./C. 6607,23.45,,S +34,926,1,"Mock, Mr. Philipp Edmund",male,30.0,1,0,13236,57.75,C78,C +35,927,3,"Katavelas, Mr. Vassilios (Catavelas Vassilios"")""",male,18.5,0,0,2682,7.2292,,C +36,928,3,"Roth, Miss. Sarah A",female,,0,0,342712,8.05,,S +37,929,3,"Cacic, Miss. Manda",female,21.0,0,0,315087,8.6625,,S +38,930,3,"Sap, Mr. Julius",male,25.0,0,0,345768,9.5,,S +39,931,3,"Hee, Mr. Ling",male,,0,0,1601,56.4958,,S +40,932,3,"Karun, Mr. Franz",male,39.0,0,1,349256,13.4167,,C +41,933,1,"Franklin, Mr. Thomas Parham",male,,0,0,113778,26.55,D34,S +42,934,3,"Goldsmith, Mr. Nathan",male,41.0,0,0,SOTON/O.Q. 3101263,7.85,,S +43,935,2,"Corbett, Mrs. Walter H (Irene Colvin)",female,30.0,0,0,237249,13.0,,S +44,936,1,"Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons)",female,45.0,1,0,11753,52.5542,D19,S +45,937,3,"Peltomaki, Mr. Nikolai Johannes",male,25.0,0,0,STON/O 2. 3101291,7.925,,S +46,938,1,"Chevre, Mr. Paul Romaine",male,45.0,0,0,PC 17594,29.7,A9,C +47,939,3,"Shaughnessy, Mr. Patrick",male,,0,0,370374,7.75,,Q +48,940,1,"Bucknell, Mrs. William Robert (Emma Eliza Ward)",female,60.0,0,0,11813,76.2917,D15,C +49,941,3,"Coutts, Mrs. William (Winnie Minnie"" Treanor)""",female,36.0,0,2,C.A. 37671,15.9,,S +50,942,1,"Smith, Mr. Lucien Philip",male,24.0,1,0,13695,60.0,C31,S +51,943,2,"Pulbaum, Mr. Franz",male,27.0,0,0,SC/PARIS 2168,15.0333,,C +52,944,2,"Hocking, Miss. Ellen Nellie""""",female,20.0,2,1,29105,23.0,,S +53,945,1,"Fortune, Miss. Ethel Flora",female,28.0,3,2,19950,263.0,C23 C25 C27,S +54,946,2,"Mangiavacchi, Mr. Serafino Emilio",male,,0,0,SC/A.3 2861,15.5792,,C +55,947,3,"Rice, Master. Albert",male,10.0,4,1,382652,29.125,,Q +56,948,3,"Cor, Mr. Bartol",male,35.0,0,0,349230,7.8958,,S +57,949,3,"Abelseth, Mr. Olaus Jorgensen",male,25.0,0,0,348122,7.65,F G63,S +58,950,3,"Davison, Mr. Thomas Henry",male,,1,0,386525,16.1,,S +59,951,1,"Chaudanson, Miss. Victorine",female,36.0,0,0,PC 17608,262.375,B61,C +60,952,3,"Dika, Mr. Mirko",male,17.0,0,0,349232,7.8958,,S +61,953,2,"McCrae, Mr. Arthur Gordon",male,32.0,0,0,237216,13.5,,S +62,954,3,"Bjorklund, Mr. Ernst Herbert",male,18.0,0,0,347090,7.75,,S +63,955,3,"Bradley, Miss. Bridget Delia",female,22.0,0,0,334914,7.725,,Q +64,956,1,"Ryerson, Master. John Borie",male,13.0,2,2,PC 17608,262.375,B57 B59 B63 B66,C +65,957,2,"Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller)",female,,0,0,F.C.C. 13534,21.0,,S +66,958,3,"Burns, Miss. Mary Delia",female,18.0,0,0,330963,7.8792,,Q +67,959,1,"Moore, Mr. Clarence Bloomfield",male,47.0,0,0,113796,42.4,,S +68,960,1,"Tucker, Mr. Gilbert Milligan Jr",male,31.0,0,0,2543,28.5375,C53,C +69,961,1,"Fortune, Mrs. Mark (Mary McDougald)",female,60.0,1,4,19950,263.0,C23 C25 C27,S +70,962,3,"Mulvihill, Miss. Bertha E",female,24.0,0,0,382653,7.75,,Q +71,963,3,"Minkoff, Mr. Lazar",male,21.0,0,0,349211,7.8958,,S +72,964,3,"Nieminen, Miss. Manta Josefina",female,29.0,0,0,3101297,7.925,,S +73,965,1,"Ovies y Rodriguez, Mr. Servando",male,28.5,0,0,PC 17562,27.7208,D43,C +74,966,1,"Geiger, Miss. Amalie",female,35.0,0,0,113503,211.5,C130,C +75,967,1,"Keeping, Mr. Edwin",male,32.5,0,0,113503,211.5,C132,C +76,968,3,"Miles, Mr. Frank",male,,0,0,359306,8.05,,S +77,969,1,"Cornell, Mrs. Robert Clifford (Malvina Helen Lamson)",female,55.0,2,0,11770,25.7,C101,S +78,970,2,"Aldworth, Mr. Charles Augustus",male,30.0,0,0,248744,13.0,,S +79,971,3,"Doyle, Miss. Elizabeth",female,24.0,0,0,368702,7.75,,Q +80,972,3,"Boulos, Master. Akar",male,6.0,1,1,2678,15.2458,,C +81,973,1,"Straus, Mr. Isidor",male,67.0,1,0,PC 17483,221.7792,C55 C57,S +82,974,1,"Case, Mr. Howard Brown",male,49.0,0,0,19924,26.0,,S +83,975,3,"Demetri, Mr. Marinko",male,,0,0,349238,7.8958,,S +84,976,2,"Lamb, Mr. John Joseph",male,,0,0,240261,10.7083,,Q +85,977,3,"Khalil, Mr. Betros",male,,1,0,2660,14.4542,,C +86,978,3,"Barry, Miss. Julia",female,27.0,0,0,330844,7.8792,,Q +87,979,3,"Badman, Miss. Emily Louisa",female,18.0,0,0,A/4 31416,8.05,,S +88,980,3,"O'Donoghue, Ms. Bridget",female,,0,0,364856,7.75,,Q +89,981,2,"Wells, Master. Ralph Lester",male,2.0,1,1,29103,23.0,,S +90,982,3,"Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson)",female,22.0,1,0,347072,13.9,,S +91,983,3,"Pedersen, Mr. Olaf",male,,0,0,345498,7.775,,S +92,984,1,"Davidson, Mrs. Thornton (Orian Hays)",female,27.0,1,2,F.C. 12750,52.0,B71,S +93,985,3,"Guest, Mr. Robert",male,,0,0,376563,8.05,,S +94,986,1,"Birnbaum, Mr. Jakob",male,25.0,0,0,13905,26.0,,C +95,987,3,"Tenglin, Mr. Gunnar Isidor",male,25.0,0,0,350033,7.7958,,S +96,988,1,"Cavendish, Mrs. Tyrell William (Julia Florence Siegel)",female,76.0,1,0,19877,78.85,C46,S +97,989,3,"Makinen, Mr. Kalle Edvard",male,29.0,0,0,STON/O 2. 3101268,7.925,,S +98,990,3,"Braf, Miss. Elin Ester Maria",female,20.0,0,0,347471,7.8542,,S +99,991,3,"Nancarrow, Mr. William Henry",male,33.0,0,0,A./5. 3338,8.05,,S +100,992,1,"Stengel, Mrs. Charles Emil Henry (Annie May Morris)",female,43.0,1,0,11778,55.4417,C116,C +101,993,2,"Weisz, Mr. Leopold",male,27.0,1,0,228414,26.0,,S +102,994,3,"Foley, Mr. William",male,,0,0,365235,7.75,,Q +103,995,3,"Johansson Palmquist, Mr. Oskar Leander",male,26.0,0,0,347070,7.775,,S +104,996,3,"Thomas, Mrs. Alexander (Thamine Thelma"")""",female,16.0,1,1,2625,8.5167,,C +105,997,3,"Holthen, Mr. Johan Martin",male,28.0,0,0,C 4001,22.525,,S +106,998,3,"Buckley, Mr. Daniel",male,21.0,0,0,330920,7.8208,,Q +107,999,3,"Ryan, Mr. Edward",male,,0,0,383162,7.75,,Q +108,1000,3,"Willer, Mr. Aaron (Abi Weller"")""",male,,0,0,3410,8.7125,,S +109,1001,2,"Swane, Mr. George",male,18.5,0,0,248734,13.0,F,S +110,1002,2,"Stanton, Mr. Samuel Ward",male,41.0,0,0,237734,15.0458,,C +111,1003,3,"Shine, Miss. Ellen Natalia",female,,0,0,330968,7.7792,,Q +112,1004,1,"Evans, Miss. Edith Corse",female,36.0,0,0,PC 17531,31.6792,A29,C +113,1005,3,"Buckley, Miss. Katherine",female,18.5,0,0,329944,7.2833,,Q +114,1006,1,"Straus, Mrs. Isidor (Rosalie Ida Blun)",female,63.0,1,0,PC 17483,221.7792,C55 C57,S +115,1007,3,"Chronopoulos, Mr. Demetrios",male,18.0,1,0,2680,14.4542,,C +116,1008,3,"Thomas, Mr. John",male,,0,0,2681,6.4375,,C +117,1009,3,"Sandstrom, Miss. Beatrice Irene",female,1.0,1,1,PP 9549,16.7,G6,S +118,1010,1,"Beattie, Mr. Thomson",male,36.0,0,0,13050,75.2417,C6,C +119,1011,2,"Chapman, Mrs. John Henry (Sara Elizabeth Lawry)",female,29.0,1,0,SC/AH 29037,26.0,,S +120,1012,2,"Watt, Miss. Bertha J",female,12.0,0,0,C.A. 33595,15.75,,S +121,1013,3,"Kiernan, Mr. John",male,,1,0,367227,7.75,,Q +122,1014,1,"Schabert, Mrs. Paul (Emma Mock)",female,35.0,1,0,13236,57.75,C28,C +123,1015,3,"Carver, Mr. Alfred John",male,28.0,0,0,392095,7.25,,S +124,1016,3,"Kennedy, Mr. John",male,,0,0,368783,7.75,,Q +125,1017,3,"Cribb, Miss. Laura Alice",female,17.0,0,1,371362,16.1,,S +126,1018,3,"Brobeck, Mr. Karl Rudolf",male,22.0,0,0,350045,7.7958,,S +127,1019,3,"McCoy, Miss. Alicia",female,,2,0,367226,23.25,,Q +128,1020,2,"Bowenur, Mr. Solomon",male,42.0,0,0,211535,13.0,,S +129,1021,3,"Petersen, Mr. Marius",male,24.0,0,0,342441,8.05,,S +130,1022,3,"Spinner, Mr. Henry John",male,32.0,0,0,STON/OQ. 369943,8.05,,S +131,1023,1,"Gracie, Col. Archibald IV",male,53.0,0,0,113780,28.5,C51,C +132,1024,3,"Lefebre, Mrs. Frank (Frances)",female,,0,4,4133,25.4667,,S +133,1025,3,"Thomas, Mr. Charles P",male,,1,0,2621,6.4375,,C +134,1026,3,"Dintcheff, Mr. Valtcho",male,43.0,0,0,349226,7.8958,,S +135,1027,3,"Carlsson, Mr. Carl Robert",male,24.0,0,0,350409,7.8542,,S +136,1028,3,"Zakarian, Mr. Mapriededer",male,26.5,0,0,2656,7.225,,C +137,1029,2,"Schmidt, Mr. August",male,26.0,0,0,248659,13.0,,S +138,1030,3,"Drapkin, Miss. Jennie",female,23.0,0,0,SOTON/OQ 392083,8.05,,S +139,1031,3,"Goodwin, Mr. Charles Frederick",male,40.0,1,6,CA 2144,46.9,,S +140,1032,3,"Goodwin, Miss. Jessie Allis",female,10.0,5,2,CA 2144,46.9,,S +141,1033,1,"Daniels, Miss. Sarah",female,33.0,0,0,113781,151.55,,S +142,1034,1,"Ryerson, Mr. Arthur Larned",male,61.0,1,3,PC 17608,262.375,B57 B59 B63 B66,C +143,1035,2,"Beauchamp, Mr. Henry James",male,28.0,0,0,244358,26.0,,S +144,1036,1,"Lindeberg-Lind, Mr. Erik Gustaf (Mr Edward Lingrey"")""",male,42.0,0,0,17475,26.55,,S +145,1037,3,"Vander Planke, Mr. Julius",male,31.0,3,0,345763,18.0,,S +146,1038,1,"Hilliard, Mr. Herbert Henry",male,,0,0,17463,51.8625,E46,S +147,1039,3,"Davies, Mr. Evan",male,22.0,0,0,SC/A4 23568,8.05,,S +148,1040,1,"Crafton, Mr. John Bertram",male,,0,0,113791,26.55,,S +149,1041,2,"Lahtinen, Rev. William",male,30.0,1,1,250651,26.0,,S +150,1042,1,"Earnshaw, Mrs. Boulton (Olive Potter)",female,23.0,0,1,11767,83.1583,C54,C +151,1043,3,"Matinoff, Mr. Nicola",male,,0,0,349255,7.8958,,C +152,1044,3,"Storey, Mr. Thomas",male,60.5,0,0,3701,,,S +153,1045,3,"Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist)",female,36.0,0,2,350405,12.1833,,S +154,1046,3,"Asplund, Master. Filip Oscar",male,13.0,4,2,347077,31.3875,,S +155,1047,3,"Duquemin, Mr. Joseph",male,24.0,0,0,S.O./P.P. 752,7.55,,S +156,1048,1,"Bird, Miss. Ellen",female,29.0,0,0,PC 17483,221.7792,C97,S +157,1049,3,"Lundin, Miss. Olga Elida",female,23.0,0,0,347469,7.8542,,S +158,1050,1,"Borebank, Mr. John James",male,42.0,0,0,110489,26.55,D22,S +159,1051,3,"Peacock, Mrs. Benjamin (Edith Nile)",female,26.0,0,2,SOTON/O.Q. 3101315,13.775,,S +160,1052,3,"Smyth, Miss. Julia",female,,0,0,335432,7.7333,,Q +161,1053,3,"Touma, Master. Georges Youssef",male,7.0,1,1,2650,15.2458,,C +162,1054,2,"Wright, Miss. Marion",female,26.0,0,0,220844,13.5,,S +163,1055,3,"Pearce, Mr. Ernest",male,,0,0,343271,7.0,,S +164,1056,2,"Peruschitz, Rev. Joseph Maria",male,41.0,0,0,237393,13.0,,S +165,1057,3,"Kink-Heilmann, Mrs. Anton (Luise Heilmann)",female,26.0,1,1,315153,22.025,,S +166,1058,1,"Brandeis, Mr. Emil",male,48.0,0,0,PC 17591,50.4958,B10,C +167,1059,3,"Ford, Mr. Edward Watson",male,18.0,2,2,W./C. 6608,34.375,,S +168,1060,1,"Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick)",female,,0,0,17770,27.7208,,C +169,1061,3,"Hellstrom, Miss. Hilda Maria",female,22.0,0,0,7548,8.9625,,S +170,1062,3,"Lithman, Mr. Simon",male,,0,0,S.O./P.P. 251,7.55,,S +171,1063,3,"Zakarian, Mr. Ortin",male,27.0,0,0,2670,7.225,,C +172,1064,3,"Dyker, Mr. Adolf Fredrik",male,23.0,1,0,347072,13.9,,S +173,1065,3,"Torfa, Mr. Assad",male,,0,0,2673,7.2292,,C +174,1066,3,"Asplund, Mr. Carl Oscar Vilhelm Gustafsson",male,40.0,1,5,347077,31.3875,,S +175,1067,2,"Brown, Miss. Edith Eileen",female,15.0,0,2,29750,39.0,,S +176,1068,2,"Sincock, Miss. Maude",female,20.0,0,0,C.A. 33112,36.75,,S +177,1069,1,"Stengel, Mr. Charles Emil Henry",male,54.0,1,0,11778,55.4417,C116,C +178,1070,2,"Becker, Mrs. Allen Oliver (Nellie E Baumgardner)",female,36.0,0,3,230136,39.0,F4,S +179,1071,1,"Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll)",female,64.0,0,2,PC 17756,83.1583,E45,C +180,1072,2,"McCrie, Mr. James Matthew",male,30.0,0,0,233478,13.0,,S +181,1073,1,"Compton, Mr. Alexander Taylor Jr",male,37.0,1,1,PC 17756,83.1583,E52,C +182,1074,1,"Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson)",female,18.0,1,0,113773,53.1,D30,S +183,1075,3,"Lane, Mr. Patrick",male,,0,0,7935,7.75,,Q +184,1076,1,"Douglas, Mrs. Frederick Charles (Mary Helene Baxter)",female,27.0,1,1,PC 17558,247.5208,B58 B60,C +185,1077,2,"Maybery, Mr. Frank Hubert",male,40.0,0,0,239059,16.0,,S +186,1078,2,"Phillips, Miss. Alice Frances Louisa",female,21.0,0,1,S.O./P.P. 2,21.0,,S +187,1079,3,"Davies, Mr. Joseph",male,17.0,2,0,A/4 48873,8.05,,S +188,1080,3,"Sage, Miss. Ada",female,,8,2,CA. 2343,69.55,,S +189,1081,2,"Veal, Mr. James",male,40.0,0,0,28221,13.0,,S +190,1082,2,"Angle, Mr. William A",male,34.0,1,0,226875,26.0,,S +191,1083,1,"Salomon, Mr. Abraham L",male,,0,0,111163,26.0,,S +192,1084,3,"van Billiard, Master. Walter John",male,11.5,1,1,A/5. 851,14.5,,S +193,1085,2,"Lingane, Mr. John",male,61.0,0,0,235509,12.35,,Q +194,1086,2,"Drew, Master. Marshall Brines",male,8.0,0,2,28220,32.5,,S +195,1087,3,"Karlsson, Mr. Julius Konrad Eugen",male,33.0,0,0,347465,7.8542,,S +196,1088,1,"Spedden, Master. Robert Douglas",male,6.0,0,2,16966,134.5,E34,C +197,1089,3,"Nilsson, Miss. Berta Olivia",female,18.0,0,0,347066,7.775,,S +198,1090,2,"Baimbrigge, Mr. Charles Robert",male,23.0,0,0,C.A. 31030,10.5,,S +199,1091,3,"Rasmussen, Mrs. (Lena Jacobsen Solvang)",female,,0,0,65305,8.1125,,S +200,1092,3,"Murphy, Miss. Nora",female,,0,0,36568,15.5,,Q +201,1093,3,"Danbom, Master. Gilbert Sigvard Emanuel",male,0.33,0,2,347080,14.4,,S +202,1094,1,"Astor, Col. John Jacob",male,47.0,1,0,PC 17757,227.525,C62 C64,C +203,1095,2,"Quick, Miss. Winifred Vera",female,8.0,1,1,26360,26.0,,S +204,1096,2,"Andrew, Mr. Frank Thomas",male,25.0,0,0,C.A. 34050,10.5,,S +205,1097,1,"Omont, Mr. Alfred Fernand",male,,0,0,F.C. 12998,25.7417,,C +206,1098,3,"McGowan, Miss. Katherine",female,35.0,0,0,9232,7.75,,Q +207,1099,2,"Collett, Mr. Sidney C Stuart",male,24.0,0,0,28034,10.5,,S +208,1100,1,"Rosenbaum, Miss. Edith Louise",female,33.0,0,0,PC 17613,27.7208,A11,C +209,1101,3,"Delalic, Mr. Redjo",male,25.0,0,0,349250,7.8958,,S +210,1102,3,"Andersen, Mr. Albert Karvin",male,32.0,0,0,C 4001,22.525,,S +211,1103,3,"Finoli, Mr. Luigi",male,,0,0,SOTON/O.Q. 3101308,7.05,,S +212,1104,2,"Deacon, Mr. Percy William",male,17.0,0,0,S.O.C. 14879,73.5,,S +213,1105,2,"Howard, Mrs. Benjamin (Ellen Truelove Arman)",female,60.0,1,0,24065,26.0,,S +214,1106,3,"Andersson, Miss. Ida Augusta Margareta",female,38.0,4,2,347091,7.775,,S +215,1107,1,"Head, Mr. Christopher",male,42.0,0,0,113038,42.5,B11,S +216,1108,3,"Mahon, Miss. Bridget Delia",female,,0,0,330924,7.8792,,Q +217,1109,1,"Wick, Mr. George Dennick",male,57.0,1,1,36928,164.8667,,S +218,1110,1,"Widener, Mrs. George Dunton (Eleanor Elkins)",female,50.0,1,1,113503,211.5,C80,C +219,1111,3,"Thomson, Mr. Alexander Morrison",male,,0,0,32302,8.05,,S +220,1112,2,"Duran y More, Miss. Florentina",female,30.0,1,0,SC/PARIS 2148,13.8583,,C +221,1113,3,"Reynolds, Mr. Harold J",male,21.0,0,0,342684,8.05,,S +222,1114,2,"Cook, Mrs. (Selena Rogers)",female,22.0,0,0,W./C. 14266,10.5,F33,S +223,1115,3,"Karlsson, Mr. Einar Gervasius",male,21.0,0,0,350053,7.7958,,S +224,1116,1,"Candee, Mrs. Edward (Helen Churchill Hungerford)",female,53.0,0,0,PC 17606,27.4458,,C +225,1117,3,"Moubarek, Mrs. George (Omine Amenia"" Alexander)""",female,,0,2,2661,15.2458,,C +226,1118,3,"Asplund, Mr. Johan Charles",male,23.0,0,0,350054,7.7958,,S +227,1119,3,"McNeill, Miss. Bridget",female,,0,0,370368,7.75,,Q +228,1120,3,"Everett, Mr. Thomas James",male,40.5,0,0,C.A. 6212,15.1,,S +229,1121,2,"Hocking, Mr. Samuel James Metcalfe",male,36.0,0,0,242963,13.0,,S +230,1122,2,"Sweet, Mr. George Frederick",male,14.0,0,0,220845,65.0,,S +231,1123,1,"Willard, Miss. Constance",female,21.0,0,0,113795,26.55,,S +232,1124,3,"Wiklund, Mr. Karl Johan",male,21.0,1,0,3101266,6.4958,,S +233,1125,3,"Linehan, Mr. Michael",male,,0,0,330971,7.8792,,Q +234,1126,1,"Cumings, Mr. John Bradley",male,39.0,1,0,PC 17599,71.2833,C85,C +235,1127,3,"Vendel, Mr. Olof Edvin",male,20.0,0,0,350416,7.8542,,S +236,1128,1,"Warren, Mr. Frank Manley",male,64.0,1,0,110813,75.25,D37,C +237,1129,3,"Baccos, Mr. Raffull",male,20.0,0,0,2679,7.225,,C +238,1130,2,"Hiltunen, Miss. Marta",female,18.0,1,1,250650,13.0,,S +239,1131,1,"Douglas, Mrs. Walter Donald (Mahala Dutton)",female,48.0,1,0,PC 17761,106.425,C86,C +240,1132,1,"Lindstrom, Mrs. Carl Johan (Sigrid Posse)",female,55.0,0,0,112377,27.7208,,C +241,1133,2,"Christy, Mrs. (Alice Frances)",female,45.0,0,2,237789,30.0,,S +242,1134,1,"Spedden, Mr. Frederic Oakley",male,45.0,1,1,16966,134.5,E34,C +243,1135,3,"Hyman, Mr. Abraham",male,,0,0,3470,7.8875,,S +244,1136,3,"Johnston, Master. William Arthur Willie""""",male,,1,2,W./C. 6607,23.45,,S +245,1137,1,"Kenyon, Mr. Frederick R",male,41.0,1,0,17464,51.8625,D21,S +246,1138,2,"Karnes, Mrs. J Frank (Claire Bennett)",female,22.0,0,0,F.C.C. 13534,21.0,,S +247,1139,2,"Drew, Mr. James Vivian",male,42.0,1,1,28220,32.5,,S +248,1140,2,"Hold, Mrs. Stephen (Annie Margaret Hill)",female,29.0,1,0,26707,26.0,,S +249,1141,3,"Khalil, Mrs. Betros (Zahie Maria"" Elias)""",female,,1,0,2660,14.4542,,C +250,1142,2,"West, Miss. Barbara J",female,0.92,1,2,C.A. 34651,27.75,,S +251,1143,3,"Abrahamsson, Mr. Abraham August Johannes",male,20.0,0,0,SOTON/O2 3101284,7.925,,S +252,1144,1,"Clark, Mr. Walter Miller",male,27.0,1,0,13508,136.7792,C89,C +253,1145,3,"Salander, Mr. Karl Johan",male,24.0,0,0,7266,9.325,,S +254,1146,3,"Wenzel, Mr. Linhart",male,32.5,0,0,345775,9.5,,S +255,1147,3,"MacKay, Mr. George William",male,,0,0,C.A. 42795,7.55,,S +256,1148,3,"Mahon, Mr. John",male,,0,0,AQ/4 3130,7.75,,Q +257,1149,3,"Niklasson, Mr. Samuel",male,28.0,0,0,363611,8.05,,S +258,1150,2,"Bentham, Miss. Lilian W",female,19.0,0,0,28404,13.0,,S +259,1151,3,"Midtsjo, Mr. Karl Albert",male,21.0,0,0,345501,7.775,,S +260,1152,3,"de Messemaeker, Mr. Guillaume Joseph",male,36.5,1,0,345572,17.4,,S +261,1153,3,"Nilsson, Mr. August Ferdinand",male,21.0,0,0,350410,7.8542,,S +262,1154,2,"Wells, Mrs. Arthur Henry (Addie"" Dart Trevaskis)""",female,29.0,0,2,29103,23.0,,S +263,1155,3,"Klasen, Miss. Gertrud Emilia",female,1.0,1,1,350405,12.1833,,S +264,1156,2,"Portaluppi, Mr. Emilio Ilario Giuseppe",male,30.0,0,0,C.A. 34644,12.7375,,C +265,1157,3,"Lyntakoff, Mr. Stanko",male,,0,0,349235,7.8958,,S +266,1158,1,"Chisholm, Mr. Roderick Robert Crispin",male,,0,0,112051,0.0,,S +267,1159,3,"Warren, Mr. Charles William",male,,0,0,C.A. 49867,7.55,,S +268,1160,3,"Howard, Miss. May Elizabeth",female,,0,0,A. 2. 39186,8.05,,S +269,1161,3,"Pokrnic, Mr. Mate",male,17.0,0,0,315095,8.6625,,S +270,1162,1,"McCaffry, Mr. Thomas Francis",male,46.0,0,0,13050,75.2417,C6,C +271,1163,3,"Fox, Mr. Patrick",male,,0,0,368573,7.75,,Q +272,1164,1,"Clark, Mrs. Walter Miller (Virginia McDowell)",female,26.0,1,0,13508,136.7792,C89,C +273,1165,3,"Lennon, Miss. Mary",female,,1,0,370371,15.5,,Q +274,1166,3,"Saade, Mr. Jean Nassr",male,,0,0,2676,7.225,,C +275,1167,2,"Bryhl, Miss. Dagmar Jenny Ingeborg ",female,20.0,1,0,236853,26.0,,S +276,1168,2,"Parker, Mr. Clifford Richard",male,28.0,0,0,SC 14888,10.5,,S +277,1169,2,"Faunthorpe, Mr. Harry",male,40.0,1,0,2926,26.0,,S +278,1170,2,"Ware, Mr. John James",male,30.0,1,0,CA 31352,21.0,,S +279,1171,2,"Oxenham, Mr. Percy Thomas",male,22.0,0,0,W./C. 14260,10.5,,S +280,1172,3,"Oreskovic, Miss. Jelka",female,23.0,0,0,315085,8.6625,,S +281,1173,3,"Peacock, Master. Alfred Edward",male,0.75,1,1,SOTON/O.Q. 3101315,13.775,,S +282,1174,3,"Fleming, Miss. Honora",female,,0,0,364859,7.75,,Q +283,1175,3,"Touma, Miss. Maria Youssef",female,9.0,1,1,2650,15.2458,,C +284,1176,3,"Rosblom, Miss. Salli Helena",female,2.0,1,1,370129,20.2125,,S +285,1177,3,"Dennis, Mr. William",male,36.0,0,0,A/5 21175,7.25,,S +286,1178,3,"Franklin, Mr. Charles (Charles Fardon)",male,,0,0,SOTON/O.Q. 3101314,7.25,,S +287,1179,1,"Snyder, Mr. John Pillsbury",male,24.0,1,0,21228,82.2667,B45,S +288,1180,3,"Mardirosian, Mr. Sarkis",male,,0,0,2655,7.2292,F E46,C +289,1181,3,"Ford, Mr. Arthur",male,,0,0,A/5 1478,8.05,,S +290,1182,1,"Rheims, Mr. George Alexander Lucien",male,,0,0,PC 17607,39.6,,S +291,1183,3,"Daly, Miss. Margaret Marcella Maggie""""",female,30.0,0,0,382650,6.95,,Q +292,1184,3,"Nasr, Mr. Mustafa",male,,0,0,2652,7.2292,,C +293,1185,1,"Dodge, Dr. Washington",male,53.0,1,1,33638,81.8583,A34,S +294,1186,3,"Wittevrongel, Mr. Camille",male,36.0,0,0,345771,9.5,,S +295,1187,3,"Angheloff, Mr. Minko",male,26.0,0,0,349202,7.8958,,S +296,1188,2,"Laroche, Miss. Louise",female,1.0,1,2,SC/Paris 2123,41.5792,,C +297,1189,3,"Samaan, Mr. Hanna",male,,2,0,2662,21.6792,,C +298,1190,1,"Loring, Mr. Joseph Holland",male,30.0,0,0,113801,45.5,,S +299,1191,3,"Johansson, Mr. Nils",male,29.0,0,0,347467,7.8542,,S +300,1192,3,"Olsson, Mr. Oscar Wilhelm",male,32.0,0,0,347079,7.775,,S +301,1193,2,"Malachard, Mr. Noel",male,,0,0,237735,15.0458,D,C +302,1194,2,"Phillips, Mr. Escott Robert",male,43.0,0,1,S.O./P.P. 2,21.0,,S +303,1195,3,"Pokrnic, Mr. Tome",male,24.0,0,0,315092,8.6625,,S +304,1196,3,"McCarthy, Miss. Catherine Katie""""",female,,0,0,383123,7.75,,Q +305,1197,1,"Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead)",female,64.0,1,1,112901,26.55,B26,S +306,1198,1,"Allison, Mr. Hudson Joshua Creighton",male,30.0,1,2,113781,151.55,C22 C26,S +307,1199,3,"Aks, Master. Philip Frank",male,0.83,0,1,392091,9.35,,S +308,1200,1,"Hays, Mr. Charles Melville",male,55.0,1,1,12749,93.5,B69,S +309,1201,3,"Hansen, Mrs. Claus Peter (Jennie L Howard)",female,45.0,1,0,350026,14.1083,,S +310,1202,3,"Cacic, Mr. Jego Grga",male,18.0,0,0,315091,8.6625,,S +311,1203,3,"Vartanian, Mr. David",male,22.0,0,0,2658,7.225,,C +312,1204,3,"Sadowitz, Mr. Harry",male,,0,0,LP 1588,7.575,,S +313,1205,3,"Carr, Miss. Jeannie",female,37.0,0,0,368364,7.75,,Q +314,1206,1,"White, Mrs. John Stuart (Ella Holmes)",female,55.0,0,0,PC 17760,135.6333,C32,C +315,1207,3,"Hagardon, Miss. Kate",female,17.0,0,0,AQ/3. 30631,7.7333,,Q +316,1208,1,"Spencer, Mr. William Augustus",male,57.0,1,0,PC 17569,146.5208,B78,C +317,1209,2,"Rogers, Mr. Reginald Harry",male,19.0,0,0,28004,10.5,,S +318,1210,3,"Jonsson, Mr. Nils Hilding",male,27.0,0,0,350408,7.8542,,S +319,1211,2,"Jefferys, Mr. Ernest Wilfred",male,22.0,2,0,C.A. 31029,31.5,,S +320,1212,3,"Andersson, Mr. Johan Samuel",male,26.0,0,0,347075,7.775,,S +321,1213,3,"Krekorian, Mr. Neshan",male,25.0,0,0,2654,7.2292,F E57,C +322,1214,2,"Nesson, Mr. Israel",male,26.0,0,0,244368,13.0,F2,S +323,1215,1,"Rowe, Mr. Alfred G",male,33.0,0,0,113790,26.55,,S +324,1216,1,"Kreuchen, Miss. Emilie",female,39.0,0,0,24160,211.3375,,S +325,1217,3,"Assam, Mr. Ali",male,23.0,0,0,SOTON/O.Q. 3101309,7.05,,S +326,1218,2,"Becker, Miss. Ruth Elizabeth",female,12.0,2,1,230136,39.0,F4,S +327,1219,1,"Rosenshine, Mr. George (Mr George Thorne"")""",male,46.0,0,0,PC 17585,79.2,,C +328,1220,2,"Clarke, Mr. Charles Valentine",male,29.0,1,0,2003,26.0,,S +329,1221,2,"Enander, Mr. Ingvar",male,21.0,0,0,236854,13.0,,S +330,1222,2,"Davies, Mrs. John Morgan (Elizabeth Agnes Mary White) ",female,48.0,0,2,C.A. 33112,36.75,,S +331,1223,1,"Dulles, Mr. William Crothers",male,39.0,0,0,PC 17580,29.7,A18,C +332,1224,3,"Thomas, Mr. Tannous",male,,0,0,2684,7.225,,C +333,1225,3,"Nakid, Mrs. Said (Waika Mary"" Mowad)""",female,19.0,1,1,2653,15.7417,,C +334,1226,3,"Cor, Mr. Ivan",male,27.0,0,0,349229,7.8958,,S +335,1227,1,"Maguire, Mr. John Edward",male,30.0,0,0,110469,26.0,C106,S +336,1228,2,"de Brito, Mr. Jose Joaquim",male,32.0,0,0,244360,13.0,,S +337,1229,3,"Elias, Mr. Joseph",male,39.0,0,2,2675,7.2292,,C +338,1230,2,"Denbury, Mr. Herbert",male,25.0,0,0,C.A. 31029,31.5,,S +339,1231,3,"Betros, Master. Seman",male,,0,0,2622,7.2292,,C +340,1232,2,"Fillbrook, Mr. Joseph Charles",male,18.0,0,0,C.A. 15185,10.5,,S +341,1233,3,"Lundstrom, Mr. Thure Edvin",male,32.0,0,0,350403,7.5792,,S +342,1234,3,"Sage, Mr. John George",male,,1,9,CA. 2343,69.55,,S +343,1235,1,"Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake)",female,58.0,0,1,PC 17755,512.3292,B51 B53 B55,C +344,1236,3,"van Billiard, Master. James William",male,,1,1,A/5. 851,14.5,,S +345,1237,3,"Abelseth, Miss. Karen Marie",female,16.0,0,0,348125,7.65,,S +346,1238,2,"Botsford, Mr. William Hull",male,26.0,0,0,237670,13.0,,S +347,1239,3,"Whabee, Mrs. George Joseph (Shawneene Abi-Saab)",female,38.0,0,0,2688,7.2292,,C +348,1240,2,"Giles, Mr. Ralph",male,24.0,0,0,248726,13.5,,S +349,1241,2,"Walcroft, Miss. Nellie",female,31.0,0,0,F.C.C. 13528,21.0,,S +350,1242,1,"Greenfield, Mrs. Leo David (Blanche Strouse)",female,45.0,0,1,PC 17759,63.3583,D10 D12,C +351,1243,2,"Stokes, Mr. Philip Joseph",male,25.0,0,0,F.C.C. 13540,10.5,,S +352,1244,2,"Dibden, Mr. William",male,18.0,0,0,S.O.C. 14879,73.5,,S +353,1245,2,"Herman, Mr. Samuel",male,49.0,1,2,220845,65.0,,S +354,1246,3,"Dean, Miss. Elizabeth Gladys Millvina""""",female,0.17,1,2,C.A. 2315,20.575,,S +355,1247,1,"Julian, Mr. Henry Forbes",male,50.0,0,0,113044,26.0,E60,S +356,1248,1,"Brown, Mrs. John Murray (Caroline Lane Lamson)",female,59.0,2,0,11769,51.4792,C101,S +357,1249,3,"Lockyer, Mr. Edward",male,,0,0,1222,7.8792,,S +358,1250,3,"O'Keefe, Mr. Patrick",male,,0,0,368402,7.75,,Q +359,1251,3,"Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson)",female,30.0,1,0,349910,15.55,,S +360,1252,3,"Sage, Master. William Henry",male,14.5,8,2,CA. 2343,69.55,,S +361,1253,2,"Mallet, Mrs. Albert (Antoinette Magnin)",female,24.0,1,1,S.C./PARIS 2079,37.0042,,C +362,1254,2,"Ware, Mrs. John James (Florence Louise Long)",female,31.0,0,0,CA 31352,21.0,,S +363,1255,3,"Strilic, Mr. Ivan",male,27.0,0,0,315083,8.6625,,S +364,1256,1,"Harder, Mrs. George Achilles (Dorothy Annan)",female,25.0,1,0,11765,55.4417,E50,C +365,1257,3,"Sage, Mrs. John (Annie Bullen)",female,,1,9,CA. 2343,69.55,,S +366,1258,3,"Caram, Mr. Joseph",male,,1,0,2689,14.4583,,C +367,1259,3,"Riihivouri, Miss. Susanna Juhantytar Sanni""""",female,22.0,0,0,3101295,39.6875,,S +368,1260,1,"Gibson, Mrs. Leonard (Pauline C Boeson)",female,45.0,0,1,112378,59.4,,C +369,1261,2,"Pallas y Castello, Mr. Emilio",male,29.0,0,0,SC/PARIS 2147,13.8583,,C +370,1262,2,"Giles, Mr. Edgar",male,21.0,1,0,28133,11.5,,S +371,1263,1,"Wilson, Miss. Helen Alice",female,31.0,0,0,16966,134.5,E39 E41,C +372,1264,1,"Ismay, Mr. Joseph Bruce",male,49.0,0,0,112058,0.0,B52 B54 B56,S +373,1265,2,"Harbeck, Mr. William H",male,44.0,0,0,248746,13.0,,S +374,1266,1,"Dodge, Mrs. Washington (Ruth Vidaver)",female,54.0,1,1,33638,81.8583,A34,S +375,1267,1,"Bowen, Miss. Grace Scott",female,45.0,0,0,PC 17608,262.375,,C +376,1268,3,"Kink, Miss. Maria",female,22.0,2,0,315152,8.6625,,S +377,1269,2,"Cotterill, Mr. Henry Harry""""",male,21.0,0,0,29107,11.5,,S +378,1270,1,"Hipkins, Mr. William Edward",male,55.0,0,0,680,50.0,C39,S +379,1271,3,"Asplund, Master. Carl Edgar",male,5.0,4,2,347077,31.3875,,S +380,1272,3,"O'Connor, Mr. Patrick",male,,0,0,366713,7.75,,Q +381,1273,3,"Foley, Mr. Joseph",male,26.0,0,0,330910,7.8792,,Q +382,1274,3,"Risien, Mrs. Samuel (Emma)",female,,0,0,364498,14.5,,S +383,1275,3,"McNamee, Mrs. Neal (Eileen O'Leary)",female,19.0,1,0,376566,16.1,,S +384,1276,2,"Wheeler, Mr. Edwin Frederick""""",male,,0,0,SC/PARIS 2159,12.875,,S +385,1277,2,"Herman, Miss. Kate",female,24.0,1,2,220845,65.0,,S +386,1278,3,"Aronsson, Mr. Ernst Axel Algot",male,24.0,0,0,349911,7.775,,S +387,1279,2,"Ashby, Mr. John",male,57.0,0,0,244346,13.0,,S +388,1280,3,"Canavan, Mr. Patrick",male,21.0,0,0,364858,7.75,,Q +389,1281,3,"Palsson, Master. Paul Folke",male,6.0,3,1,349909,21.075,,S +390,1282,1,"Payne, Mr. Vivian Ponsonby",male,23.0,0,0,12749,93.5,B24,S +391,1283,1,"Lines, Mrs. Ernest H (Elizabeth Lindsey James)",female,51.0,0,1,PC 17592,39.4,D28,S +392,1284,3,"Abbott, Master. Eugene Joseph",male,13.0,0,2,C.A. 2673,20.25,,S +393,1285,2,"Gilbert, Mr. William",male,47.0,0,0,C.A. 30769,10.5,,S +394,1286,3,"Kink-Heilmann, Mr. Anton",male,29.0,3,1,315153,22.025,,S +395,1287,1,"Smith, Mrs. Lucien Philip (Mary Eloise Hughes)",female,18.0,1,0,13695,60.0,C31,S +396,1288,3,"Colbert, Mr. Patrick",male,24.0,0,0,371109,7.25,,Q +397,1289,1,"Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli)",female,48.0,1,1,13567,79.2,B41,C +398,1290,3,"Larsson-Rondberg, Mr. Edvard A",male,22.0,0,0,347065,7.775,,S +399,1291,3,"Conlon, Mr. Thomas Henry",male,31.0,0,0,21332,7.7333,,Q +400,1292,1,"Bonnell, Miss. Caroline",female,30.0,0,0,36928,164.8667,C7,S +401,1293,2,"Gale, Mr. Harry",male,38.0,1,0,28664,21.0,,S +402,1294,1,"Gibson, Miss. Dorothy Winifred",female,22.0,0,1,112378,59.4,,C +403,1295,1,"Carrau, Mr. Jose Pedro",male,17.0,0,0,113059,47.1,,S +404,1296,1,"Frauenthal, Mr. Isaac Gerald",male,43.0,1,0,17765,27.7208,D40,C +405,1297,2,"Nourney, Mr. Alfred (Baron von Drachstedt"")""",male,20.0,0,0,SC/PARIS 2166,13.8625,D38,C +406,1298,2,"Ware, Mr. William Jeffery",male,23.0,1,0,28666,10.5,,S +407,1299,1,"Widener, Mr. George Dunton",male,50.0,1,1,113503,211.5,C80,C +408,1300,3,"Riordan, Miss. Johanna Hannah""""",female,,0,0,334915,7.7208,,Q +409,1301,3,"Peacock, Miss. Treasteall",female,3.0,1,1,SOTON/O.Q. 3101315,13.775,,S +410,1302,3,"Naughton, Miss. Hannah",female,,0,0,365237,7.75,,Q +411,1303,1,"Minahan, Mrs. William Edward (Lillian E Thorpe)",female,37.0,1,0,19928,90.0,C78,Q +412,1304,3,"Henriksson, Miss. Jenny Lovisa",female,28.0,0,0,347086,7.775,,S +413,1305,3,"Spector, Mr. Woolf",male,,0,0,A.5. 3236,8.05,,S +414,1306,1,"Oliva y Ocana, Dona. Fermina",female,39.0,0,0,PC 17758,108.9,C105,C +415,1307,3,"Saether, Mr. Simon Sivertsen",male,38.5,0,0,SOTON/O.Q. 3101262,7.25,,S +416,1308,3,"Ware, Mr. Frederick",male,,0,0,359309,8.05,,S +417,1309,3,"Peter, Master. Michael J",male,,1,1,2668,22.3583,,C diff --git a/SAA/2_2_Titanic/content/titanic_train.csv b/SAA/2_2_Titanic/content/titanic_train.csv new file mode 100644 index 0000000..84f1cdb --- /dev/null +++ b/SAA/2_2_Titanic/content/titanic_train.csv @@ -0,0 +1,892 @@ +,PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked +0,1,0,3,"Braund, Mr. Owen Harris",male,22.0,1,0,A/5 21171,7.25,,S +1,2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38.0,1,0,PC 17599,71.2833,C85,C +2,3,1,3,"Heikkinen, Miss. Laina",female,26.0,0,0,STON/O2. 3101282,7.925,,S +3,4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35.0,1,0,113803,53.1,C123,S +4,5,0,3,"Allen, Mr. William Henry",male,35.0,0,0,373450,8.05,,S +5,6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q +6,7,0,1,"McCarthy, Mr. Timothy J",male,54.0,0,0,17463,51.8625,E46,S +7,8,0,3,"Palsson, Master. Gosta Leonard",male,2.0,3,1,349909,21.075,,S +8,9,1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27.0,0,2,347742,11.1333,,S +9,10,1,2,"Nasser, Mrs. Nicholas (Adele Achem)",female,14.0,1,0,237736,30.0708,,C +10,11,1,3,"Sandstrom, Miss. Marguerite Rut",female,4.0,1,1,PP 9549,16.7,G6,S +11,12,1,1,"Bonnell, Miss. Elizabeth",female,58.0,0,0,113783,26.55,C103,S +12,13,0,3,"Saundercock, Mr. William Henry",male,20.0,0,0,A/5. 2151,8.05,,S +13,14,0,3,"Andersson, Mr. Anders Johan",male,39.0,1,5,347082,31.275,,S +14,15,0,3,"Vestrom, Miss. Hulda Amanda Adolfina",female,14.0,0,0,350406,7.8542,,S +15,16,1,2,"Hewlett, Mrs. (Mary D Kingcome) ",female,55.0,0,0,248706,16.0,,S +16,17,0,3,"Rice, Master. Eugene",male,2.0,4,1,382652,29.125,,Q +17,18,1,2,"Williams, Mr. Charles Eugene",male,,0,0,244373,13.0,,S +18,19,0,3,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)",female,31.0,1,0,345763,18.0,,S +19,20,1,3,"Masselmani, Mrs. Fatima",female,,0,0,2649,7.225,,C +20,21,0,2,"Fynney, Mr. Joseph J",male,35.0,0,0,239865,26.0,,S +21,22,1,2,"Beesley, Mr. Lawrence",male,34.0,0,0,248698,13.0,D56,S +22,23,1,3,"McGowan, Miss. Anna ""Annie""",female,15.0,0,0,330923,8.0292,,Q +23,24,1,1,"Sloper, Mr. William Thompson",male,28.0,0,0,113788,35.5,A6,S +24,25,0,3,"Palsson, Miss. Torborg Danira",female,8.0,3,1,349909,21.075,,S +25,26,1,3,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)",female,38.0,1,5,347077,31.3875,,S +26,27,0,3,"Emir, Mr. Farred Chehab",male,,0,0,2631,7.225,,C +27,28,0,1,"Fortune, Mr. Charles Alexander",male,19.0,3,2,19950,263.0,C23 C25 C27,S +28,29,1,3,"O'Dwyer, Miss. Ellen ""Nellie""",female,,0,0,330959,7.8792,,Q +29,30,0,3,"Todoroff, Mr. Lalio",male,,0,0,349216,7.8958,,S +30,31,0,1,"Uruchurtu, Don. Manuel E",male,40.0,0,0,PC 17601,27.7208,,C +31,32,1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)",female,,1,0,PC 17569,146.5208,B78,C +32,33,1,3,"Glynn, Miss. Mary Agatha",female,,0,0,335677,7.75,,Q +33,34,0,2,"Wheadon, Mr. Edward H",male,66.0,0,0,C.A. 24579,10.5,,S +34,35,0,1,"Meyer, Mr. Edgar Joseph",male,28.0,1,0,PC 17604,82.1708,,C +35,36,0,1,"Holverson, Mr. Alexander Oskar",male,42.0,1,0,113789,52.0,,S +36,37,1,3,"Mamee, Mr. Hanna",male,,0,0,2677,7.2292,,C +37,38,0,3,"Cann, Mr. Ernest Charles",male,21.0,0,0,A./5. 2152,8.05,,S +38,39,0,3,"Vander Planke, Miss. Augusta Maria",female,18.0,2,0,345764,18.0,,S +39,40,1,3,"Nicola-Yarred, Miss. Jamila",female,14.0,1,0,2651,11.2417,,C +40,41,0,3,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)",female,40.0,1,0,7546,9.475,,S +41,42,0,2,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)",female,27.0,1,0,11668,21.0,,S +42,43,0,3,"Kraeff, Mr. Theodor",male,,0,0,349253,7.8958,,C +43,44,1,2,"Laroche, Miss. Simonne Marie Anne Andree",female,3.0,1,2,SC/Paris 2123,41.5792,,C +44,45,1,3,"Devaney, Miss. Margaret Delia",female,19.0,0,0,330958,7.8792,,Q +45,46,0,3,"Rogers, Mr. William John",male,,0,0,S.C./A.4. 23567,8.05,,S +46,47,0,3,"Lennon, Mr. Denis",male,,1,0,370371,15.5,,Q +47,48,1,3,"O'Driscoll, Miss. Bridget",female,,0,0,14311,7.75,,Q +48,49,0,3,"Samaan, Mr. Youssef",male,,2,0,2662,21.6792,,C +49,50,0,3,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)",female,18.0,1,0,349237,17.8,,S +50,51,0,3,"Panula, Master. Juha Niilo",male,7.0,4,1,3101295,39.6875,,S +51,52,0,3,"Nosworthy, Mr. Richard Cater",male,21.0,0,0,A/4. 39886,7.8,,S +52,53,1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)",female,49.0,1,0,PC 17572,76.7292,D33,C +53,54,1,2,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)",female,29.0,1,0,2926,26.0,,S +54,55,0,1,"Ostby, Mr. Engelhart Cornelius",male,65.0,0,1,113509,61.9792,B30,C +55,56,1,1,"Woolner, Mr. Hugh",male,,0,0,19947,35.5,C52,S +56,57,1,2,"Rugg, Miss. Emily",female,21.0,0,0,C.A. 31026,10.5,,S +57,58,0,3,"Novel, Mr. Mansouer",male,28.5,0,0,2697,7.2292,,C +58,59,1,2,"West, Miss. Constance Mirium",female,5.0,1,2,C.A. 34651,27.75,,S +59,60,0,3,"Goodwin, Master. William Frederick",male,11.0,5,2,CA 2144,46.9,,S +60,61,0,3,"Sirayanian, Mr. Orsen",male,22.0,0,0,2669,7.2292,,C +61,62,1,1,"Icard, Miss. Amelie",female,38.0,0,0,113572,80.0,B28, +62,63,0,1,"Harris, Mr. Henry Birkhardt",male,45.0,1,0,36973,83.475,C83,S +63,64,0,3,"Skoog, Master. Harald",male,4.0,3,2,347088,27.9,,S +64,65,0,1,"Stewart, Mr. Albert A",male,,0,0,PC 17605,27.7208,,C +65,66,1,3,"Moubarek, Master. Gerios",male,,1,1,2661,15.2458,,C +66,67,1,2,"Nye, Mrs. (Elizabeth Ramell)",female,29.0,0,0,C.A. 29395,10.5,F33,S +67,68,0,3,"Crease, Mr. Ernest James",male,19.0,0,0,S.P. 3464,8.1583,,S +68,69,1,3,"Andersson, Miss. Erna Alexandra",female,17.0,4,2,3101281,7.925,,S +69,70,0,3,"Kink, Mr. Vincenz",male,26.0,2,0,315151,8.6625,,S +70,71,0,2,"Jenkin, Mr. Stephen Curnow",male,32.0,0,0,C.A. 33111,10.5,,S +71,72,0,3,"Goodwin, Miss. Lillian Amy",female,16.0,5,2,CA 2144,46.9,,S +72,73,0,2,"Hood, Mr. Ambrose Jr",male,21.0,0,0,S.O.C. 14879,73.5,,S +73,74,0,3,"Chronopoulos, Mr. Apostolos",male,26.0,1,0,2680,14.4542,,C +74,75,1,3,"Bing, Mr. Lee",male,32.0,0,0,1601,56.4958,,S +75,76,0,3,"Moen, Mr. Sigurd Hansen",male,25.0,0,0,348123,7.65,F G73,S +76,77,0,3,"Staneff, Mr. Ivan",male,,0,0,349208,7.8958,,S +77,78,0,3,"Moutal, Mr. Rahamin Haim",male,,0,0,374746,8.05,,S +78,79,1,2,"Caldwell, Master. Alden Gates",male,0.83,0,2,248738,29.0,,S +79,80,1,3,"Dowdell, Miss. Elizabeth",female,30.0,0,0,364516,12.475,,S +80,81,0,3,"Waelens, Mr. Achille",male,22.0,0,0,345767,9.0,,S +81,82,1,3,"Sheerlinck, Mr. Jan Baptist",male,29.0,0,0,345779,9.5,,S +82,83,1,3,"McDermott, Miss. Brigdet Delia",female,,0,0,330932,7.7875,,Q +83,84,0,1,"Carrau, Mr. Francisco M",male,28.0,0,0,113059,47.1,,S +84,85,1,2,"Ilett, Miss. Bertha",female,17.0,0,0,SO/C 14885,10.5,,S +85,86,1,3,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)",female,33.0,3,0,3101278,15.85,,S +86,87,0,3,"Ford, Mr. William Neal",male,16.0,1,3,W./C. 6608,34.375,,S +87,88,0,3,"Slocovski, Mr. Selman Francis",male,,0,0,SOTON/OQ 392086,8.05,,S +88,89,1,1,"Fortune, Miss. Mabel Helen",female,23.0,3,2,19950,263.0,C23 C25 C27,S +89,90,0,3,"Celotti, Mr. Francesco",male,24.0,0,0,343275,8.05,,S +90,91,0,3,"Christmann, Mr. Emil",male,29.0,0,0,343276,8.05,,S +91,92,0,3,"Andreasson, Mr. Paul Edvin",male,20.0,0,0,347466,7.8542,,S +92,93,0,1,"Chaffee, Mr. Herbert Fuller",male,46.0,1,0,W.E.P. 5734,61.175,E31,S +93,94,0,3,"Dean, Mr. Bertram Frank",male,26.0,1,2,C.A. 2315,20.575,,S +94,95,0,3,"Coxon, Mr. Daniel",male,59.0,0,0,364500,7.25,,S +95,96,0,3,"Shorney, Mr. Charles Joseph",male,,0,0,374910,8.05,,S +96,97,0,1,"Goldschmidt, Mr. George B",male,71.0,0,0,PC 17754,34.6542,A5,C +97,98,1,1,"Greenfield, Mr. William Bertram",male,23.0,0,1,PC 17759,63.3583,D10 D12,C +98,99,1,2,"Doling, Mrs. John T (Ada Julia Bone)",female,34.0,0,1,231919,23.0,,S +99,100,0,2,"Kantor, Mr. Sinai",male,34.0,1,0,244367,26.0,,S +100,101,0,3,"Petranec, Miss. Matilda",female,28.0,0,0,349245,7.8958,,S +101,102,0,3,"Petroff, Mr. Pastcho (""Pentcho"")",male,,0,0,349215,7.8958,,S +102,103,0,1,"White, Mr. Richard Frasar",male,21.0,0,1,35281,77.2875,D26,S +103,104,0,3,"Johansson, Mr. Gustaf Joel",male,33.0,0,0,7540,8.6542,,S +104,105,0,3,"Gustafsson, Mr. Anders Vilhelm",male,37.0,2,0,3101276,7.925,,S +105,106,0,3,"Mionoff, Mr. Stoytcho",male,28.0,0,0,349207,7.8958,,S +106,107,1,3,"Salkjelsvik, Miss. Anna Kristine",female,21.0,0,0,343120,7.65,,S +107,108,1,3,"Moss, Mr. Albert Johan",male,,0,0,312991,7.775,,S +108,109,0,3,"Rekic, Mr. Tido",male,38.0,0,0,349249,7.8958,,S +109,110,1,3,"Moran, Miss. Bertha",female,,1,0,371110,24.15,,Q +110,111,0,1,"Porter, Mr. Walter Chamberlain",male,47.0,0,0,110465,52.0,C110,S +111,112,0,3,"Zabour, Miss. Hileni",female,14.5,1,0,2665,14.4542,,C +112,113,0,3,"Barton, Mr. David John",male,22.0,0,0,324669,8.05,,S +113,114,0,3,"Jussila, Miss. Katriina",female,20.0,1,0,4136,9.825,,S +114,115,0,3,"Attalah, Miss. Malake",female,17.0,0,0,2627,14.4583,,C +115,116,0,3,"Pekoniemi, Mr. Edvard",male,21.0,0,0,STON/O 2. 3101294,7.925,,S +116,117,0,3,"Connors, Mr. Patrick",male,70.5,0,0,370369,7.75,,Q +117,118,0,2,"Turpin, Mr. William John Robert",male,29.0,1,0,11668,21.0,,S +118,119,0,1,"Baxter, Mr. Quigg Edmond",male,24.0,0,1,PC 17558,247.5208,B58 B60,C +119,120,0,3,"Andersson, Miss. Ellis Anna Maria",female,2.0,4,2,347082,31.275,,S +120,121,0,2,"Hickman, Mr. Stanley George",male,21.0,2,0,S.O.C. 14879,73.5,,S +121,122,0,3,"Moore, Mr. Leonard Charles",male,,0,0,A4. 54510,8.05,,S +122,123,0,2,"Nasser, Mr. Nicholas",male,32.5,1,0,237736,30.0708,,C +123,124,1,2,"Webber, Miss. Susan",female,32.5,0,0,27267,13.0,E101,S +124,125,0,1,"White, Mr. Percival Wayland",male,54.0,0,1,35281,77.2875,D26,S +125,126,1,3,"Nicola-Yarred, Master. Elias",male,12.0,1,0,2651,11.2417,,C +126,127,0,3,"McMahon, Mr. Martin",male,,0,0,370372,7.75,,Q +127,128,1,3,"Madsen, Mr. Fridtjof Arne",male,24.0,0,0,C 17369,7.1417,,S +128,129,1,3,"Peter, Miss. Anna",female,,1,1,2668,22.3583,F E69,C +129,130,0,3,"Ekstrom, Mr. Johan",male,45.0,0,0,347061,6.975,,S +130,131,0,3,"Drazenoic, Mr. Jozef",male,33.0,0,0,349241,7.8958,,C +131,132,0,3,"Coelho, Mr. Domingos Fernandeo",male,20.0,0,0,SOTON/O.Q. 3101307,7.05,,S +132,133,0,3,"Robins, Mrs. Alexander A (Grace Charity Laury)",female,47.0,1,0,A/5. 3337,14.5,,S +133,134,1,2,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)",female,29.0,1,0,228414,26.0,,S +134,135,0,2,"Sobey, Mr. Samuel James Hayden",male,25.0,0,0,C.A. 29178,13.0,,S +135,136,0,2,"Richard, Mr. Emile",male,23.0,0,0,SC/PARIS 2133,15.0458,,C +136,137,1,1,"Newsom, Miss. Helen Monypeny",female,19.0,0,2,11752,26.2833,D47,S +137,138,0,1,"Futrelle, Mr. Jacques Heath",male,37.0,1,0,113803,53.1,C123,S +138,139,0,3,"Osen, Mr. Olaf Elon",male,16.0,0,0,7534,9.2167,,S +139,140,0,1,"Giglio, Mr. Victor",male,24.0,0,0,PC 17593,79.2,B86,C +140,141,0,3,"Boulos, Mrs. Joseph (Sultana)",female,,0,2,2678,15.2458,,C +141,142,1,3,"Nysten, Miss. Anna Sofia",female,22.0,0,0,347081,7.75,,S +142,143,1,3,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)",female,24.0,1,0,STON/O2. 3101279,15.85,,S +143,144,0,3,"Burke, Mr. Jeremiah",male,19.0,0,0,365222,6.75,,Q +144,145,0,2,"Andrew, Mr. Edgardo Samuel",male,18.0,0,0,231945,11.5,,S +145,146,0,2,"Nicholls, Mr. Joseph Charles",male,19.0,1,1,C.A. 33112,36.75,,S +146,147,1,3,"Andersson, Mr. August Edvard (""Wennerstrom"")",male,27.0,0,0,350043,7.7958,,S +147,148,0,3,"Ford, Miss. Robina Maggie ""Ruby""",female,9.0,2,2,W./C. 6608,34.375,,S +148,149,0,2,"Navratil, Mr. Michel (""Louis M Hoffman"")",male,36.5,0,2,230080,26.0,F2,S +149,150,0,2,"Byles, Rev. Thomas Roussel Davids",male,42.0,0,0,244310,13.0,,S +150,151,0,2,"Bateman, Rev. Robert James",male,51.0,0,0,S.O.P. 1166,12.525,,S +151,152,1,1,"Pears, Mrs. Thomas (Edith Wearne)",female,22.0,1,0,113776,66.6,C2,S +152,153,0,3,"Meo, Mr. Alfonzo",male,55.5,0,0,A.5. 11206,8.05,,S +153,154,0,3,"van Billiard, Mr. Austin Blyler",male,40.5,0,2,A/5. 851,14.5,,S +154,155,0,3,"Olsen, Mr. Ole Martin",male,,0,0,Fa 265302,7.3125,,S +155,156,0,1,"Williams, Mr. Charles Duane",male,51.0,0,1,PC 17597,61.3792,,C +156,157,1,3,"Gilnagh, Miss. Katherine ""Katie""",female,16.0,0,0,35851,7.7333,,Q +157,158,0,3,"Corn, Mr. Harry",male,30.0,0,0,SOTON/OQ 392090,8.05,,S +158,159,0,3,"Smiljanic, Mr. Mile",male,,0,0,315037,8.6625,,S +159,160,0,3,"Sage, Master. Thomas Henry",male,,8,2,CA. 2343,69.55,,S +160,161,0,3,"Cribb, Mr. John Hatfield",male,44.0,0,1,371362,16.1,,S +161,162,1,2,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)",female,40.0,0,0,C.A. 33595,15.75,,S +162,163,0,3,"Bengtsson, Mr. John Viktor",male,26.0,0,0,347068,7.775,,S +163,164,0,3,"Calic, Mr. Jovo",male,17.0,0,0,315093,8.6625,,S +164,165,0,3,"Panula, Master. Eino Viljami",male,1.0,4,1,3101295,39.6875,,S +165,166,1,3,"Goldsmith, Master. Frank John William ""Frankie""",male,9.0,0,2,363291,20.525,,S +166,167,1,1,"Chibnall, Mrs. (Edith Martha Bowerman)",female,,0,1,113505,55.0,E33,S +167,168,0,3,"Skoog, Mrs. William (Anna Bernhardina Karlsson)",female,45.0,1,4,347088,27.9,,S +168,169,0,1,"Baumann, Mr. John D",male,,0,0,PC 17318,25.925,,S +169,170,0,3,"Ling, Mr. Lee",male,28.0,0,0,1601,56.4958,,S +170,171,0,1,"Van der hoef, Mr. Wyckoff",male,61.0,0,0,111240,33.5,B19,S +171,172,0,3,"Rice, Master. Arthur",male,4.0,4,1,382652,29.125,,Q +172,173,1,3,"Johnson, Miss. Eleanor Ileen",female,1.0,1,1,347742,11.1333,,S +173,174,0,3,"Sivola, Mr. Antti Wilhelm",male,21.0,0,0,STON/O 2. 3101280,7.925,,S +174,175,0,1,"Smith, Mr. James Clinch",male,56.0,0,0,17764,30.6958,A7,C +175,176,0,3,"Klasen, Mr. Klas Albin",male,18.0,1,1,350404,7.8542,,S +176,177,0,3,"Lefebre, Master. Henry Forbes",male,,3,1,4133,25.4667,,S +177,178,0,1,"Isham, Miss. Ann Elizabeth",female,50.0,0,0,PC 17595,28.7125,C49,C +178,179,0,2,"Hale, Mr. Reginald",male,30.0,0,0,250653,13.0,,S +179,180,0,3,"Leonard, Mr. Lionel",male,36.0,0,0,LINE,0.0,,S +180,181,0,3,"Sage, Miss. Constance Gladys",female,,8,2,CA. 2343,69.55,,S +181,182,0,2,"Pernot, Mr. Rene",male,,0,0,SC/PARIS 2131,15.05,,C +182,183,0,3,"Asplund, Master. Clarence Gustaf Hugo",male,9.0,4,2,347077,31.3875,,S +183,184,1,2,"Becker, Master. Richard F",male,1.0,2,1,230136,39.0,F4,S +184,185,1,3,"Kink-Heilmann, Miss. Luise Gretchen",female,4.0,0,2,315153,22.025,,S +185,186,0,1,"Rood, Mr. Hugh Roscoe",male,,0,0,113767,50.0,A32,S +186,187,1,3,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)",female,,1,0,370365,15.5,,Q +187,188,1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")",male,45.0,0,0,111428,26.55,,S +188,189,0,3,"Bourke, Mr. John",male,40.0,1,1,364849,15.5,,Q +189,190,0,3,"Turcin, Mr. Stjepan",male,36.0,0,0,349247,7.8958,,S +190,191,1,2,"Pinsky, Mrs. (Rosa)",female,32.0,0,0,234604,13.0,,S +191,192,0,2,"Carbines, Mr. William",male,19.0,0,0,28424,13.0,,S +192,193,1,3,"Andersen-Jensen, Miss. Carla Christine Nielsine",female,19.0,1,0,350046,7.8542,,S +193,194,1,2,"Navratil, Master. Michel M",male,3.0,1,1,230080,26.0,F2,S +194,195,1,1,"Brown, Mrs. James Joseph (Margaret Tobin)",female,44.0,0,0,PC 17610,27.7208,B4,C +195,196,1,1,"Lurette, Miss. Elise",female,58.0,0,0,PC 17569,146.5208,B80,C +196,197,0,3,"Mernagh, Mr. Robert",male,,0,0,368703,7.75,,Q +197,198,0,3,"Olsen, Mr. Karl Siegwart Andreas",male,42.0,0,1,4579,8.4042,,S +198,199,1,3,"Madigan, Miss. Margaret ""Maggie""",female,,0,0,370370,7.75,,Q +199,200,0,2,"Yrois, Miss. Henriette (""Mrs Harbeck"")",female,24.0,0,0,248747,13.0,,S +200,201,0,3,"Vande Walle, Mr. Nestor Cyriel",male,28.0,0,0,345770,9.5,,S +201,202,0,3,"Sage, Mr. Frederick",male,,8,2,CA. 2343,69.55,,S +202,203,0,3,"Johanson, Mr. Jakob Alfred",male,34.0,0,0,3101264,6.4958,,S +203,204,0,3,"Youseff, Mr. Gerious",male,45.5,0,0,2628,7.225,,C +204,205,1,3,"Cohen, Mr. Gurshon ""Gus""",male,18.0,0,0,A/5 3540,8.05,,S +205,206,0,3,"Strom, Miss. Telma Matilda",female,2.0,0,1,347054,10.4625,G6,S +206,207,0,3,"Backstrom, Mr. Karl Alfred",male,32.0,1,0,3101278,15.85,,S +207,208,1,3,"Albimona, Mr. Nassef Cassem",male,26.0,0,0,2699,18.7875,,C +208,209,1,3,"Carr, Miss. Helen ""Ellen""",female,16.0,0,0,367231,7.75,,Q +209,210,1,1,"Blank, Mr. Henry",male,40.0,0,0,112277,31.0,A31,C +210,211,0,3,"Ali, Mr. Ahmed",male,24.0,0,0,SOTON/O.Q. 3101311,7.05,,S +211,212,1,2,"Cameron, Miss. Clear Annie",female,35.0,0,0,F.C.C. 13528,21.0,,S +212,213,0,3,"Perkin, Mr. John Henry",male,22.0,0,0,A/5 21174,7.25,,S +213,214,0,2,"Givard, Mr. Hans Kristensen",male,30.0,0,0,250646,13.0,,S +214,215,0,3,"Kiernan, Mr. Philip",male,,1,0,367229,7.75,,Q +215,216,1,1,"Newell, Miss. Madeleine",female,31.0,1,0,35273,113.275,D36,C +216,217,1,3,"Honkanen, Miss. Eliina",female,27.0,0,0,STON/O2. 3101283,7.925,,S +217,218,0,2,"Jacobsohn, Mr. Sidney Samuel",male,42.0,1,0,243847,27.0,,S +218,219,1,1,"Bazzani, Miss. Albina",female,32.0,0,0,11813,76.2917,D15,C +219,220,0,2,"Harris, Mr. Walter",male,30.0,0,0,W/C 14208,10.5,,S +220,221,1,3,"Sunderland, Mr. Victor Francis",male,16.0,0,0,SOTON/OQ 392089,8.05,,S +221,222,0,2,"Bracken, Mr. James H",male,27.0,0,0,220367,13.0,,S +222,223,0,3,"Green, Mr. George Henry",male,51.0,0,0,21440,8.05,,S +223,224,0,3,"Nenkoff, Mr. Christo",male,,0,0,349234,7.8958,,S +224,225,1,1,"Hoyt, Mr. Frederick Maxfield",male,38.0,1,0,19943,90.0,C93,S +225,226,0,3,"Berglund, Mr. Karl Ivar Sven",male,22.0,0,0,PP 4348,9.35,,S +226,227,1,2,"Mellors, Mr. William John",male,19.0,0,0,SW/PP 751,10.5,,S +227,228,0,3,"Lovell, Mr. John Hall (""Henry"")",male,20.5,0,0,A/5 21173,7.25,,S +228,229,0,2,"Fahlstrom, Mr. Arne Jonas",male,18.0,0,0,236171,13.0,,S +229,230,0,3,"Lefebre, Miss. Mathilde",female,,3,1,4133,25.4667,,S +230,231,1,1,"Harris, Mrs. Henry Birkhardt (Irene Wallach)",female,35.0,1,0,36973,83.475,C83,S +231,232,0,3,"Larsson, Mr. Bengt Edvin",male,29.0,0,0,347067,7.775,,S +232,233,0,2,"Sjostedt, Mr. Ernst Adolf",male,59.0,0,0,237442,13.5,,S +233,234,1,3,"Asplund, Miss. Lillian Gertrud",female,5.0,4,2,347077,31.3875,,S +234,235,0,2,"Leyson, Mr. Robert William Norman",male,24.0,0,0,C.A. 29566,10.5,,S +235,236,0,3,"Harknett, Miss. Alice Phoebe",female,,0,0,W./C. 6609,7.55,,S +236,237,0,2,"Hold, Mr. Stephen",male,44.0,1,0,26707,26.0,,S +237,238,1,2,"Collyer, Miss. Marjorie ""Lottie""",female,8.0,0,2,C.A. 31921,26.25,,S +238,239,0,2,"Pengelly, Mr. Frederick William",male,19.0,0,0,28665,10.5,,S +239,240,0,2,"Hunt, Mr. George Henry",male,33.0,0,0,SCO/W 1585,12.275,,S +240,241,0,3,"Zabour, Miss. Thamine",female,,1,0,2665,14.4542,,C +241,242,1,3,"Murphy, Miss. Katherine ""Kate""",female,,1,0,367230,15.5,,Q +242,243,0,2,"Coleridge, Mr. Reginald Charles",male,29.0,0,0,W./C. 14263,10.5,,S +243,244,0,3,"Maenpaa, Mr. Matti Alexanteri",male,22.0,0,0,STON/O 2. 3101275,7.125,,S +244,245,0,3,"Attalah, Mr. Sleiman",male,30.0,0,0,2694,7.225,,C +245,246,0,1,"Minahan, Dr. William Edward",male,44.0,2,0,19928,90.0,C78,Q +246,247,0,3,"Lindahl, Miss. Agda Thorilda Viktoria",female,25.0,0,0,347071,7.775,,S +247,248,1,2,"Hamalainen, Mrs. William (Anna)",female,24.0,0,2,250649,14.5,,S +248,249,1,1,"Beckwith, Mr. Richard Leonard",male,37.0,1,1,11751,52.5542,D35,S +249,250,0,2,"Carter, Rev. Ernest Courtenay",male,54.0,1,0,244252,26.0,,S +250,251,0,3,"Reed, Mr. James George",male,,0,0,362316,7.25,,S +251,252,0,3,"Strom, Mrs. Wilhelm (Elna Matilda Persson)",female,29.0,1,1,347054,10.4625,G6,S +252,253,0,1,"Stead, Mr. William Thomas",male,62.0,0,0,113514,26.55,C87,S +253,254,0,3,"Lobb, Mr. William Arthur",male,30.0,1,0,A/5. 3336,16.1,,S +254,255,0,3,"Rosblom, Mrs. Viktor (Helena Wilhelmina)",female,41.0,0,2,370129,20.2125,,S +255,256,1,3,"Touma, Mrs. Darwis (Hanne Youssef Razi)",female,29.0,0,2,2650,15.2458,,C +256,257,1,1,"Thorne, Mrs. Gertrude Maybelle",female,,0,0,PC 17585,79.2,,C +257,258,1,1,"Cherry, Miss. Gladys",female,30.0,0,0,110152,86.5,B77,S +258,259,1,1,"Ward, Miss. Anna",female,35.0,0,0,PC 17755,512.3292,,C +259,260,1,2,"Parrish, Mrs. (Lutie Davis)",female,50.0,0,1,230433,26.0,,S +260,261,0,3,"Smith, Mr. Thomas",male,,0,0,384461,7.75,,Q +261,262,1,3,"Asplund, Master. Edvin Rojj Felix",male,3.0,4,2,347077,31.3875,,S +262,263,0,1,"Taussig, Mr. Emil",male,52.0,1,1,110413,79.65,E67,S +263,264,0,1,"Harrison, Mr. William",male,40.0,0,0,112059,0.0,B94,S +264,265,0,3,"Henry, Miss. Delia",female,,0,0,382649,7.75,,Q +265,266,0,2,"Reeves, Mr. David",male,36.0,0,0,C.A. 17248,10.5,,S +266,267,0,3,"Panula, Mr. Ernesti Arvid",male,16.0,4,1,3101295,39.6875,,S +267,268,1,3,"Persson, Mr. Ernst Ulrik",male,25.0,1,0,347083,7.775,,S +268,269,1,1,"Graham, Mrs. William Thompson (Edith Junkins)",female,58.0,0,1,PC 17582,153.4625,C125,S +269,270,1,1,"Bissette, Miss. Amelia",female,35.0,0,0,PC 17760,135.6333,C99,S +270,271,0,1,"Cairns, Mr. Alexander",male,,0,0,113798,31.0,,S +271,272,1,3,"Tornquist, Mr. William Henry",male,25.0,0,0,LINE,0.0,,S +272,273,1,2,"Mellinger, Mrs. (Elizabeth Anne Maidment)",female,41.0,0,1,250644,19.5,,S +273,274,0,1,"Natsch, Mr. Charles H",male,37.0,0,1,PC 17596,29.7,C118,C +274,275,1,3,"Healy, Miss. Hanora ""Nora""",female,,0,0,370375,7.75,,Q +275,276,1,1,"Andrews, Miss. Kornelia Theodosia",female,63.0,1,0,13502,77.9583,D7,S +276,277,0,3,"Lindblom, Miss. Augusta Charlotta",female,45.0,0,0,347073,7.75,,S +277,278,0,2,"Parkes, Mr. Francis ""Frank""",male,,0,0,239853,0.0,,S +278,279,0,3,"Rice, Master. Eric",male,7.0,4,1,382652,29.125,,Q +279,280,1,3,"Abbott, Mrs. Stanton (Rosa Hunt)",female,35.0,1,1,C.A. 2673,20.25,,S +280,281,0,3,"Duane, Mr. Frank",male,65.0,0,0,336439,7.75,,Q +281,282,0,3,"Olsson, Mr. Nils Johan Goransson",male,28.0,0,0,347464,7.8542,,S +282,283,0,3,"de Pelsmaeker, Mr. Alfons",male,16.0,0,0,345778,9.5,,S +283,284,1,3,"Dorking, Mr. Edward Arthur",male,19.0,0,0,A/5. 10482,8.05,,S +284,285,0,1,"Smith, Mr. Richard William",male,,0,0,113056,26.0,A19,S +285,286,0,3,"Stankovic, Mr. Ivan",male,33.0,0,0,349239,8.6625,,C +286,287,1,3,"de Mulder, Mr. Theodore",male,30.0,0,0,345774,9.5,,S +287,288,0,3,"Naidenoff, Mr. Penko",male,22.0,0,0,349206,7.8958,,S +288,289,1,2,"Hosono, Mr. Masabumi",male,42.0,0,0,237798,13.0,,S +289,290,1,3,"Connolly, Miss. Kate",female,22.0,0,0,370373,7.75,,Q +290,291,1,1,"Barber, Miss. Ellen ""Nellie""",female,26.0,0,0,19877,78.85,,S +291,292,1,1,"Bishop, Mrs. Dickinson H (Helen Walton)",female,19.0,1,0,11967,91.0792,B49,C +292,293,0,2,"Levy, Mr. Rene Jacques",male,36.0,0,0,SC/Paris 2163,12.875,D,C +293,294,0,3,"Haas, Miss. Aloisia",female,24.0,0,0,349236,8.85,,S +294,295,0,3,"Mineff, Mr. Ivan",male,24.0,0,0,349233,7.8958,,S +295,296,0,1,"Lewy, Mr. Ervin G",male,,0,0,PC 17612,27.7208,,C +296,297,0,3,"Hanna, Mr. Mansour",male,23.5,0,0,2693,7.2292,,C +297,298,0,1,"Allison, Miss. Helen Loraine",female,2.0,1,2,113781,151.55,C22 C26,S +298,299,1,1,"Saalfeld, Mr. Adolphe",male,,0,0,19988,30.5,C106,S +299,300,1,1,"Baxter, Mrs. James (Helene DeLaudeniere Chaput)",female,50.0,0,1,PC 17558,247.5208,B58 B60,C +300,301,1,3,"Kelly, Miss. Anna Katherine ""Annie Kate""",female,,0,0,9234,7.75,,Q +301,302,1,3,"McCoy, Mr. Bernard",male,,2,0,367226,23.25,,Q +302,303,0,3,"Johnson, Mr. William Cahoone Jr",male,19.0,0,0,LINE,0.0,,S +303,304,1,2,"Keane, Miss. Nora A",female,,0,0,226593,12.35,E101,Q +304,305,0,3,"Williams, Mr. Howard Hugh ""Harry""",male,,0,0,A/5 2466,8.05,,S +305,306,1,1,"Allison, Master. Hudson Trevor",male,0.92,1,2,113781,151.55,C22 C26,S +306,307,1,1,"Fleming, Miss. Margaret",female,,0,0,17421,110.8833,,C +307,308,1,1,"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)",female,17.0,1,0,PC 17758,108.9,C65,C +308,309,0,2,"Abelson, Mr. Samuel",male,30.0,1,0,P/PP 3381,24.0,,C +309,310,1,1,"Francatelli, Miss. Laura Mabel",female,30.0,0,0,PC 17485,56.9292,E36,C +310,311,1,1,"Hays, Miss. Margaret Bechstein",female,24.0,0,0,11767,83.1583,C54,C +311,312,1,1,"Ryerson, Miss. Emily Borie",female,18.0,2,2,PC 17608,262.375,B57 B59 B63 B66,C +312,313,0,2,"Lahtinen, Mrs. William (Anna Sylfven)",female,26.0,1,1,250651,26.0,,S +313,314,0,3,"Hendekovic, Mr. Ignjac",male,28.0,0,0,349243,7.8958,,S +314,315,0,2,"Hart, Mr. Benjamin",male,43.0,1,1,F.C.C. 13529,26.25,,S +315,316,1,3,"Nilsson, Miss. Helmina Josefina",female,26.0,0,0,347470,7.8542,,S +316,317,1,2,"Kantor, Mrs. Sinai (Miriam Sternin)",female,24.0,1,0,244367,26.0,,S +317,318,0,2,"Moraweck, Dr. Ernest",male,54.0,0,0,29011,14.0,,S +318,319,1,1,"Wick, Miss. Mary Natalie",female,31.0,0,2,36928,164.8667,C7,S +319,320,1,1,"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)",female,40.0,1,1,16966,134.5,E34,C +320,321,0,3,"Dennis, Mr. Samuel",male,22.0,0,0,A/5 21172,7.25,,S +321,322,0,3,"Danoff, Mr. Yoto",male,27.0,0,0,349219,7.8958,,S +322,323,1,2,"Slayter, Miss. Hilda Mary",female,30.0,0,0,234818,12.35,,Q +323,324,1,2,"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)",female,22.0,1,1,248738,29.0,,S +324,325,0,3,"Sage, Mr. George John Jr",male,,8,2,CA. 2343,69.55,,S +325,326,1,1,"Young, Miss. Marie Grice",female,36.0,0,0,PC 17760,135.6333,C32,C +326,327,0,3,"Nysveen, Mr. Johan Hansen",male,61.0,0,0,345364,6.2375,,S +327,328,1,2,"Ball, Mrs. (Ada E Hall)",female,36.0,0,0,28551,13.0,D,S +328,329,1,3,"Goldsmith, Mrs. Frank John (Emily Alice Brown)",female,31.0,1,1,363291,20.525,,S +329,330,1,1,"Hippach, Miss. Jean Gertrude",female,16.0,0,1,111361,57.9792,B18,C +330,331,1,3,"McCoy, Miss. Agnes",female,,2,0,367226,23.25,,Q +331,332,0,1,"Partner, Mr. Austen",male,45.5,0,0,113043,28.5,C124,S +332,333,0,1,"Graham, Mr. George Edward",male,38.0,0,1,PC 17582,153.4625,C91,S +333,334,0,3,"Vander Planke, Mr. Leo Edmondus",male,16.0,2,0,345764,18.0,,S +334,335,1,1,"Frauenthal, Mrs. Henry William (Clara Heinsheimer)",female,,1,0,PC 17611,133.65,,S +335,336,0,3,"Denkoff, Mr. Mitto",male,,0,0,349225,7.8958,,S +336,337,0,1,"Pears, Mr. Thomas Clinton",male,29.0,1,0,113776,66.6,C2,S +337,338,1,1,"Burns, Miss. Elizabeth Margaret",female,41.0,0,0,16966,134.5,E40,C +338,339,1,3,"Dahl, Mr. Karl Edwart",male,45.0,0,0,7598,8.05,,S +339,340,0,1,"Blackwell, Mr. Stephen Weart",male,45.0,0,0,113784,35.5,T,S +340,341,1,2,"Navratil, Master. Edmond Roger",male,2.0,1,1,230080,26.0,F2,S +341,342,1,1,"Fortune, Miss. Alice Elizabeth",female,24.0,3,2,19950,263.0,C23 C25 C27,S +342,343,0,2,"Collander, Mr. Erik Gustaf",male,28.0,0,0,248740,13.0,,S +343,344,0,2,"Sedgwick, Mr. Charles Frederick Waddington",male,25.0,0,0,244361,13.0,,S +344,345,0,2,"Fox, Mr. Stanley Hubert",male,36.0,0,0,229236,13.0,,S +345,346,1,2,"Brown, Miss. Amelia ""Mildred""",female,24.0,0,0,248733,13.0,F33,S +346,347,1,2,"Smith, Miss. Marion Elsie",female,40.0,0,0,31418,13.0,,S +347,348,1,3,"Davison, Mrs. Thomas Henry (Mary E Finck)",female,,1,0,386525,16.1,,S +348,349,1,3,"Coutts, Master. William Loch ""William""",male,3.0,1,1,C.A. 37671,15.9,,S +349,350,0,3,"Dimic, Mr. Jovan",male,42.0,0,0,315088,8.6625,,S +350,351,0,3,"Odahl, Mr. Nils Martin",male,23.0,0,0,7267,9.225,,S +351,352,0,1,"Williams-Lambert, Mr. Fletcher Fellows",male,,0,0,113510,35.0,C128,S +352,353,0,3,"Elias, Mr. Tannous",male,15.0,1,1,2695,7.2292,,C +353,354,0,3,"Arnold-Franchi, Mr. Josef",male,25.0,1,0,349237,17.8,,S +354,355,0,3,"Yousif, Mr. Wazli",male,,0,0,2647,7.225,,C +355,356,0,3,"Vanden Steen, Mr. Leo Peter",male,28.0,0,0,345783,9.5,,S +356,357,1,1,"Bowerman, Miss. Elsie Edith",female,22.0,0,1,113505,55.0,E33,S +357,358,0,2,"Funk, Miss. Annie Clemmer",female,38.0,0,0,237671,13.0,,S +358,359,1,3,"McGovern, Miss. Mary",female,,0,0,330931,7.8792,,Q +359,360,1,3,"Mockler, Miss. Helen Mary ""Ellie""",female,,0,0,330980,7.8792,,Q +360,361,0,3,"Skoog, Mr. Wilhelm",male,40.0,1,4,347088,27.9,,S +361,362,0,2,"del Carlo, Mr. Sebastiano",male,29.0,1,0,SC/PARIS 2167,27.7208,,C +362,363,0,3,"Barbara, Mrs. (Catherine David)",female,45.0,0,1,2691,14.4542,,C +363,364,0,3,"Asim, Mr. Adola",male,35.0,0,0,SOTON/O.Q. 3101310,7.05,,S +364,365,0,3,"O'Brien, Mr. Thomas",male,,1,0,370365,15.5,,Q +365,366,0,3,"Adahl, Mr. Mauritz Nils Martin",male,30.0,0,0,C 7076,7.25,,S +366,367,1,1,"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)",female,60.0,1,0,110813,75.25,D37,C +367,368,1,3,"Moussa, Mrs. (Mantoura Boulos)",female,,0,0,2626,7.2292,,C +368,369,1,3,"Jermyn, Miss. Annie",female,,0,0,14313,7.75,,Q +369,370,1,1,"Aubart, Mme. Leontine Pauline",female,24.0,0,0,PC 17477,69.3,B35,C +370,371,1,1,"Harder, Mr. George Achilles",male,25.0,1,0,11765,55.4417,E50,C +371,372,0,3,"Wiklund, Mr. Jakob Alfred",male,18.0,1,0,3101267,6.4958,,S +372,373,0,3,"Beavan, Mr. William Thomas",male,19.0,0,0,323951,8.05,,S +373,374,0,1,"Ringhini, Mr. Sante",male,22.0,0,0,PC 17760,135.6333,,C +374,375,0,3,"Palsson, Miss. Stina Viola",female,3.0,3,1,349909,21.075,,S +375,376,1,1,"Meyer, Mrs. Edgar Joseph (Leila Saks)",female,,1,0,PC 17604,82.1708,,C +376,377,1,3,"Landergren, Miss. Aurora Adelia",female,22.0,0,0,C 7077,7.25,,S +377,378,0,1,"Widener, Mr. Harry Elkins",male,27.0,0,2,113503,211.5,C82,C +378,379,0,3,"Betros, Mr. Tannous",male,20.0,0,0,2648,4.0125,,C +379,380,0,3,"Gustafsson, Mr. Karl Gideon",male,19.0,0,0,347069,7.775,,S +380,381,1,1,"Bidois, Miss. Rosalie",female,42.0,0,0,PC 17757,227.525,,C +381,382,1,3,"Nakid, Miss. Maria (""Mary"")",female,1.0,0,2,2653,15.7417,,C +382,383,0,3,"Tikkanen, Mr. Juho",male,32.0,0,0,STON/O 2. 3101293,7.925,,S +383,384,1,1,"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)",female,35.0,1,0,113789,52.0,,S +384,385,0,3,"Plotcharsky, Mr. Vasil",male,,0,0,349227,7.8958,,S +385,386,0,2,"Davies, Mr. Charles Henry",male,18.0,0,0,S.O.C. 14879,73.5,,S +386,387,0,3,"Goodwin, Master. Sidney Leonard",male,1.0,5,2,CA 2144,46.9,,S +387,388,1,2,"Buss, Miss. Kate",female,36.0,0,0,27849,13.0,,S +388,389,0,3,"Sadlier, Mr. Matthew",male,,0,0,367655,7.7292,,Q +389,390,1,2,"Lehmann, Miss. Bertha",female,17.0,0,0,SC 1748,12.0,,C +390,391,1,1,"Carter, Mr. William Ernest",male,36.0,1,2,113760,120.0,B96 B98,S +391,392,1,3,"Jansson, Mr. Carl Olof",male,21.0,0,0,350034,7.7958,,S +392,393,0,3,"Gustafsson, Mr. Johan Birger",male,28.0,2,0,3101277,7.925,,S +393,394,1,1,"Newell, Miss. Marjorie",female,23.0,1,0,35273,113.275,D36,C +394,395,1,3,"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)",female,24.0,0,2,PP 9549,16.7,G6,S +395,396,0,3,"Johansson, Mr. Erik",male,22.0,0,0,350052,7.7958,,S +396,397,0,3,"Olsson, Miss. Elina",female,31.0,0,0,350407,7.8542,,S +397,398,0,2,"McKane, Mr. Peter David",male,46.0,0,0,28403,26.0,,S +398,399,0,2,"Pain, Dr. Alfred",male,23.0,0,0,244278,10.5,,S +399,400,1,2,"Trout, Mrs. William H (Jessie L)",female,28.0,0,0,240929,12.65,,S +400,401,1,3,"Niskanen, Mr. Juha",male,39.0,0,0,STON/O 2. 3101289,7.925,,S +401,402,0,3,"Adams, Mr. John",male,26.0,0,0,341826,8.05,,S +402,403,0,3,"Jussila, Miss. Mari Aina",female,21.0,1,0,4137,9.825,,S +403,404,0,3,"Hakkarainen, Mr. Pekka Pietari",male,28.0,1,0,STON/O2. 3101279,15.85,,S +404,405,0,3,"Oreskovic, Miss. Marija",female,20.0,0,0,315096,8.6625,,S +405,406,0,2,"Gale, Mr. Shadrach",male,34.0,1,0,28664,21.0,,S +406,407,0,3,"Widegren, Mr. Carl/Charles Peter",male,51.0,0,0,347064,7.75,,S +407,408,1,2,"Richards, Master. William Rowe",male,3.0,1,1,29106,18.75,,S +408,409,0,3,"Birkeland, Mr. Hans Martin Monsen",male,21.0,0,0,312992,7.775,,S +409,410,0,3,"Lefebre, Miss. Ida",female,,3,1,4133,25.4667,,S +410,411,0,3,"Sdycoff, Mr. Todor",male,,0,0,349222,7.8958,,S +411,412,0,3,"Hart, Mr. Henry",male,,0,0,394140,6.8583,,Q +412,413,1,1,"Minahan, Miss. Daisy E",female,33.0,1,0,19928,90.0,C78,Q +413,414,0,2,"Cunningham, Mr. Alfred Fleming",male,,0,0,239853,0.0,,S +414,415,1,3,"Sundman, Mr. Johan Julian",male,44.0,0,0,STON/O 2. 3101269,7.925,,S +415,416,0,3,"Meek, Mrs. Thomas (Annie Louise Rowley)",female,,0,0,343095,8.05,,S +416,417,1,2,"Drew, Mrs. James Vivian (Lulu Thorne Christian)",female,34.0,1,1,28220,32.5,,S +417,418,1,2,"Silven, Miss. Lyyli Karoliina",female,18.0,0,2,250652,13.0,,S +418,419,0,2,"Matthews, Mr. William John",male,30.0,0,0,28228,13.0,,S +419,420,0,3,"Van Impe, Miss. Catharina",female,10.0,0,2,345773,24.15,,S +420,421,0,3,"Gheorgheff, Mr. Stanio",male,,0,0,349254,7.8958,,C +421,422,0,3,"Charters, Mr. David",male,21.0,0,0,A/5. 13032,7.7333,,Q +422,423,0,3,"Zimmerman, Mr. Leo",male,29.0,0,0,315082,7.875,,S +423,424,0,3,"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)",female,28.0,1,1,347080,14.4,,S +424,425,0,3,"Rosblom, Mr. Viktor Richard",male,18.0,1,1,370129,20.2125,,S +425,426,0,3,"Wiseman, Mr. Phillippe",male,,0,0,A/4. 34244,7.25,,S +426,427,1,2,"Clarke, Mrs. Charles V (Ada Maria Winfield)",female,28.0,1,0,2003,26.0,,S +427,428,1,2,"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")",female,19.0,0,0,250655,26.0,,S +428,429,0,3,"Flynn, Mr. James",male,,0,0,364851,7.75,,Q +429,430,1,3,"Pickard, Mr. Berk (Berk Trembisky)",male,32.0,0,0,SOTON/O.Q. 392078,8.05,E10,S +430,431,1,1,"Bjornstrom-Steffansson, Mr. Mauritz Hakan",male,28.0,0,0,110564,26.55,C52,S +431,432,1,3,"Thorneycroft, Mrs. Percival (Florence Kate White)",female,,1,0,376564,16.1,,S +432,433,1,2,"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)",female,42.0,1,0,SC/AH 3085,26.0,,S +433,434,0,3,"Kallio, Mr. Nikolai Erland",male,17.0,0,0,STON/O 2. 3101274,7.125,,S +434,435,0,1,"Silvey, Mr. William Baird",male,50.0,1,0,13507,55.9,E44,S +435,436,1,1,"Carter, Miss. Lucile Polk",female,14.0,1,2,113760,120.0,B96 B98,S +436,437,0,3,"Ford, Miss. Doolina Margaret ""Daisy""",female,21.0,2,2,W./C. 6608,34.375,,S +437,438,1,2,"Richards, Mrs. Sidney (Emily Hocking)",female,24.0,2,3,29106,18.75,,S +438,439,0,1,"Fortune, Mr. Mark",male,64.0,1,4,19950,263.0,C23 C25 C27,S +439,440,0,2,"Kvillner, Mr. Johan Henrik Johannesson",male,31.0,0,0,C.A. 18723,10.5,,S +440,441,1,2,"Hart, Mrs. Benjamin (Esther Ada Bloomfield)",female,45.0,1,1,F.C.C. 13529,26.25,,S +441,442,0,3,"Hampe, Mr. Leon",male,20.0,0,0,345769,9.5,,S +442,443,0,3,"Petterson, Mr. Johan Emil",male,25.0,1,0,347076,7.775,,S +443,444,1,2,"Reynaldo, Ms. Encarnacion",female,28.0,0,0,230434,13.0,,S +444,445,1,3,"Johannesen-Bratthammer, Mr. Bernt",male,,0,0,65306,8.1125,,S +445,446,1,1,"Dodge, Master. Washington",male,4.0,0,2,33638,81.8583,A34,S +446,447,1,2,"Mellinger, Miss. Madeleine Violet",female,13.0,0,1,250644,19.5,,S +447,448,1,1,"Seward, Mr. Frederic Kimber",male,34.0,0,0,113794,26.55,,S +448,449,1,3,"Baclini, Miss. Marie Catherine",female,5.0,2,1,2666,19.2583,,C +449,450,1,1,"Peuchen, Major. Arthur Godfrey",male,52.0,0,0,113786,30.5,C104,S +450,451,0,2,"West, Mr. Edwy Arthur",male,36.0,1,2,C.A. 34651,27.75,,S +451,452,0,3,"Hagland, Mr. Ingvald Olai Olsen",male,,1,0,65303,19.9667,,S +452,453,0,1,"Foreman, Mr. Benjamin Laventall",male,30.0,0,0,113051,27.75,C111,C +453,454,1,1,"Goldenberg, Mr. Samuel L",male,49.0,1,0,17453,89.1042,C92,C +454,455,0,3,"Peduzzi, Mr. Joseph",male,,0,0,A/5 2817,8.05,,S +455,456,1,3,"Jalsevac, Mr. Ivan",male,29.0,0,0,349240,7.8958,,C +456,457,0,1,"Millet, Mr. Francis Davis",male,65.0,0,0,13509,26.55,E38,S +457,458,1,1,"Kenyon, Mrs. Frederick R (Marion)",female,,1,0,17464,51.8625,D21,S +458,459,1,2,"Toomey, Miss. Ellen",female,50.0,0,0,F.C.C. 13531,10.5,,S +459,460,0,3,"O'Connor, Mr. Maurice",male,,0,0,371060,7.75,,Q +460,461,1,1,"Anderson, Mr. Harry",male,48.0,0,0,19952,26.55,E12,S +461,462,0,3,"Morley, Mr. William",male,34.0,0,0,364506,8.05,,S +462,463,0,1,"Gee, Mr. Arthur H",male,47.0,0,0,111320,38.5,E63,S +463,464,0,2,"Milling, Mr. Jacob Christian",male,48.0,0,0,234360,13.0,,S +464,465,0,3,"Maisner, Mr. Simon",male,,0,0,A/S 2816,8.05,,S +465,466,0,3,"Goncalves, Mr. Manuel Estanslas",male,38.0,0,0,SOTON/O.Q. 3101306,7.05,,S +466,467,0,2,"Campbell, Mr. William",male,,0,0,239853,0.0,,S +467,468,0,1,"Smart, Mr. John Montgomery",male,56.0,0,0,113792,26.55,,S +468,469,0,3,"Scanlan, Mr. James",male,,0,0,36209,7.725,,Q +469,470,1,3,"Baclini, Miss. Helene Barbara",female,0.75,2,1,2666,19.2583,,C +470,471,0,3,"Keefe, Mr. Arthur",male,,0,0,323592,7.25,,S +471,472,0,3,"Cacic, Mr. Luka",male,38.0,0,0,315089,8.6625,,S +472,473,1,2,"West, Mrs. Edwy Arthur (Ada Mary Worth)",female,33.0,1,2,C.A. 34651,27.75,,S +473,474,1,2,"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)",female,23.0,0,0,SC/AH Basle 541,13.7917,D,C +474,475,0,3,"Strandberg, Miss. Ida Sofia",female,22.0,0,0,7553,9.8375,,S +475,476,0,1,"Clifford, Mr. George Quincy",male,,0,0,110465,52.0,A14,S +476,477,0,2,"Renouf, Mr. Peter Henry",male,34.0,1,0,31027,21.0,,S +477,478,0,3,"Braund, Mr. Lewis Richard",male,29.0,1,0,3460,7.0458,,S +478,479,0,3,"Karlsson, Mr. Nils August",male,22.0,0,0,350060,7.5208,,S +479,480,1,3,"Hirvonen, Miss. Hildur E",female,2.0,0,1,3101298,12.2875,,S +480,481,0,3,"Goodwin, Master. Harold Victor",male,9.0,5,2,CA 2144,46.9,,S +481,482,0,2,"Frost, Mr. Anthony Wood ""Archie""",male,,0,0,239854,0.0,,S +482,483,0,3,"Rouse, Mr. Richard Henry",male,50.0,0,0,A/5 3594,8.05,,S +483,484,1,3,"Turkula, Mrs. (Hedwig)",female,63.0,0,0,4134,9.5875,,S +484,485,1,1,"Bishop, Mr. Dickinson H",male,25.0,1,0,11967,91.0792,B49,C +485,486,0,3,"Lefebre, Miss. Jeannie",female,,3,1,4133,25.4667,,S +486,487,1,1,"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)",female,35.0,1,0,19943,90.0,C93,S +487,488,0,1,"Kent, Mr. Edward Austin",male,58.0,0,0,11771,29.7,B37,C +488,489,0,3,"Somerton, Mr. Francis William",male,30.0,0,0,A.5. 18509,8.05,,S +489,490,1,3,"Coutts, Master. Eden Leslie ""Neville""",male,9.0,1,1,C.A. 37671,15.9,,S +490,491,0,3,"Hagland, Mr. Konrad Mathias Reiersen",male,,1,0,65304,19.9667,,S +491,492,0,3,"Windelov, Mr. Einar",male,21.0,0,0,SOTON/OQ 3101317,7.25,,S +492,493,0,1,"Molson, Mr. Harry Markland",male,55.0,0,0,113787,30.5,C30,S +493,494,0,1,"Artagaveytia, Mr. Ramon",male,71.0,0,0,PC 17609,49.5042,,C +494,495,0,3,"Stanley, Mr. Edward Roland",male,21.0,0,0,A/4 45380,8.05,,S +495,496,0,3,"Yousseff, Mr. Gerious",male,,0,0,2627,14.4583,,C +496,497,1,1,"Eustis, Miss. Elizabeth Mussey",female,54.0,1,0,36947,78.2667,D20,C +497,498,0,3,"Shellard, Mr. Frederick William",male,,0,0,C.A. 6212,15.1,,S +498,499,0,1,"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)",female,25.0,1,2,113781,151.55,C22 C26,S +499,500,0,3,"Svensson, Mr. Olof",male,24.0,0,0,350035,7.7958,,S +500,501,0,3,"Calic, Mr. Petar",male,17.0,0,0,315086,8.6625,,S +501,502,0,3,"Canavan, Miss. Mary",female,21.0,0,0,364846,7.75,,Q +502,503,0,3,"O'Sullivan, Miss. Bridget Mary",female,,0,0,330909,7.6292,,Q +503,504,0,3,"Laitinen, Miss. Kristina Sofia",female,37.0,0,0,4135,9.5875,,S +504,505,1,1,"Maioni, Miss. Roberta",female,16.0,0,0,110152,86.5,B79,S +505,506,0,1,"Penasco y Castellana, Mr. Victor de Satode",male,18.0,1,0,PC 17758,108.9,C65,C +506,507,1,2,"Quick, Mrs. Frederick Charles (Jane Richards)",female,33.0,0,2,26360,26.0,,S +507,508,1,1,"Bradley, Mr. George (""George Arthur Brayton"")",male,,0,0,111427,26.55,,S +508,509,0,3,"Olsen, Mr. Henry Margido",male,28.0,0,0,C 4001,22.525,,S +509,510,1,3,"Lang, Mr. Fang",male,26.0,0,0,1601,56.4958,,S +510,511,1,3,"Daly, Mr. Eugene Patrick",male,29.0,0,0,382651,7.75,,Q +511,512,0,3,"Webber, Mr. James",male,,0,0,SOTON/OQ 3101316,8.05,,S +512,513,1,1,"McGough, Mr. James Robert",male,36.0,0,0,PC 17473,26.2875,E25,S +513,514,1,1,"Rothschild, Mrs. Martin (Elizabeth L. Barrett)",female,54.0,1,0,PC 17603,59.4,,C +514,515,0,3,"Coleff, Mr. Satio",male,24.0,0,0,349209,7.4958,,S +515,516,0,1,"Walker, Mr. William Anderson",male,47.0,0,0,36967,34.0208,D46,S +516,517,1,2,"Lemore, Mrs. (Amelia Milley)",female,34.0,0,0,C.A. 34260,10.5,F33,S +517,518,0,3,"Ryan, Mr. Patrick",male,,0,0,371110,24.15,,Q +518,519,1,2,"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)",female,36.0,1,0,226875,26.0,,S +519,520,0,3,"Pavlovic, Mr. Stefo",male,32.0,0,0,349242,7.8958,,S +520,521,1,1,"Perreault, Miss. Anne",female,30.0,0,0,12749,93.5,B73,S +521,522,0,3,"Vovk, Mr. Janko",male,22.0,0,0,349252,7.8958,,S +522,523,0,3,"Lahoud, Mr. Sarkis",male,,0,0,2624,7.225,,C +523,524,1,1,"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)",female,44.0,0,1,111361,57.9792,B18,C +524,525,0,3,"Kassem, Mr. Fared",male,,0,0,2700,7.2292,,C +525,526,0,3,"Farrell, Mr. James",male,40.5,0,0,367232,7.75,,Q +526,527,1,2,"Ridsdale, Miss. Lucy",female,50.0,0,0,W./C. 14258,10.5,,S +527,528,0,1,"Farthing, Mr. John",male,,0,0,PC 17483,221.7792,C95,S +528,529,0,3,"Salonen, Mr. Johan Werner",male,39.0,0,0,3101296,7.925,,S +529,530,0,2,"Hocking, Mr. Richard George",male,23.0,2,1,29104,11.5,,S +530,531,1,2,"Quick, Miss. Phyllis May",female,2.0,1,1,26360,26.0,,S +531,532,0,3,"Toufik, Mr. Nakli",male,,0,0,2641,7.2292,,C +532,533,0,3,"Elias, Mr. Joseph Jr",male,17.0,1,1,2690,7.2292,,C +533,534,1,3,"Peter, Mrs. Catherine (Catherine Rizk)",female,,0,2,2668,22.3583,,C +534,535,0,3,"Cacic, Miss. Marija",female,30.0,0,0,315084,8.6625,,S +535,536,1,2,"Hart, Miss. Eva Miriam",female,7.0,0,2,F.C.C. 13529,26.25,,S +536,537,0,1,"Butt, Major. Archibald Willingham",male,45.0,0,0,113050,26.55,B38,S +537,538,1,1,"LeRoy, Miss. Bertha",female,30.0,0,0,PC 17761,106.425,,C +538,539,0,3,"Risien, Mr. Samuel Beard",male,,0,0,364498,14.5,,S +539,540,1,1,"Frolicher, Miss. Hedwig Margaritha",female,22.0,0,2,13568,49.5,B39,C +540,541,1,1,"Crosby, Miss. Harriet R",female,36.0,0,2,WE/P 5735,71.0,B22,S +541,542,0,3,"Andersson, Miss. Ingeborg Constanzia",female,9.0,4,2,347082,31.275,,S +542,543,0,3,"Andersson, Miss. Sigrid Elisabeth",female,11.0,4,2,347082,31.275,,S +543,544,1,2,"Beane, Mr. Edward",male,32.0,1,0,2908,26.0,,S +544,545,0,1,"Douglas, Mr. Walter Donald",male,50.0,1,0,PC 17761,106.425,C86,C +545,546,0,1,"Nicholson, Mr. Arthur Ernest",male,64.0,0,0,693,26.0,,S +546,547,1,2,"Beane, Mrs. Edward (Ethel Clarke)",female,19.0,1,0,2908,26.0,,S +547,548,1,2,"Padro y Manent, Mr. Julian",male,,0,0,SC/PARIS 2146,13.8625,,C +548,549,0,3,"Goldsmith, Mr. Frank John",male,33.0,1,1,363291,20.525,,S +549,550,1,2,"Davies, Master. John Morgan Jr",male,8.0,1,1,C.A. 33112,36.75,,S +550,551,1,1,"Thayer, Mr. John Borland Jr",male,17.0,0,2,17421,110.8833,C70,C +551,552,0,2,"Sharp, Mr. Percival James R",male,27.0,0,0,244358,26.0,,S +552,553,0,3,"O'Brien, Mr. Timothy",male,,0,0,330979,7.8292,,Q +553,554,1,3,"Leeni, Mr. Fahim (""Philip Zenni"")",male,22.0,0,0,2620,7.225,,C +554,555,1,3,"Ohman, Miss. Velin",female,22.0,0,0,347085,7.775,,S +555,556,0,1,"Wright, Mr. George",male,62.0,0,0,113807,26.55,,S +556,557,1,1,"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")",female,48.0,1,0,11755,39.6,A16,C +557,558,0,1,"Robbins, Mr. Victor",male,,0,0,PC 17757,227.525,,C +558,559,1,1,"Taussig, Mrs. Emil (Tillie Mandelbaum)",female,39.0,1,1,110413,79.65,E67,S +559,560,1,3,"de Messemaeker, Mrs. Guillaume Joseph (Emma)",female,36.0,1,0,345572,17.4,,S +560,561,0,3,"Morrow, Mr. Thomas Rowan",male,,0,0,372622,7.75,,Q +561,562,0,3,"Sivic, Mr. Husein",male,40.0,0,0,349251,7.8958,,S +562,563,0,2,"Norman, Mr. Robert Douglas",male,28.0,0,0,218629,13.5,,S +563,564,0,3,"Simmons, Mr. John",male,,0,0,SOTON/OQ 392082,8.05,,S +564,565,0,3,"Meanwell, Miss. (Marion Ogden)",female,,0,0,SOTON/O.Q. 392087,8.05,,S +565,566,0,3,"Davies, Mr. Alfred J",male,24.0,2,0,A/4 48871,24.15,,S +566,567,0,3,"Stoytcheff, Mr. Ilia",male,19.0,0,0,349205,7.8958,,S +567,568,0,3,"Palsson, Mrs. Nils (Alma Cornelia Berglund)",female,29.0,0,4,349909,21.075,,S +568,569,0,3,"Doharr, Mr. Tannous",male,,0,0,2686,7.2292,,C +569,570,1,3,"Jonsson, Mr. Carl",male,32.0,0,0,350417,7.8542,,S +570,571,1,2,"Harris, Mr. George",male,62.0,0,0,S.W./PP 752,10.5,,S +571,572,1,1,"Appleton, Mrs. Edward Dale (Charlotte Lamson)",female,53.0,2,0,11769,51.4792,C101,S +572,573,1,1,"Flynn, Mr. John Irwin (""Irving"")",male,36.0,0,0,PC 17474,26.3875,E25,S +573,574,1,3,"Kelly, Miss. Mary",female,,0,0,14312,7.75,,Q +574,575,0,3,"Rush, Mr. Alfred George John",male,16.0,0,0,A/4. 20589,8.05,,S +575,576,0,3,"Patchett, Mr. George",male,19.0,0,0,358585,14.5,,S +576,577,1,2,"Garside, Miss. Ethel",female,34.0,0,0,243880,13.0,,S +577,578,1,1,"Silvey, Mrs. William Baird (Alice Munger)",female,39.0,1,0,13507,55.9,E44,S +578,579,0,3,"Caram, Mrs. Joseph (Maria Elias)",female,,1,0,2689,14.4583,,C +579,580,1,3,"Jussila, Mr. Eiriik",male,32.0,0,0,STON/O 2. 3101286,7.925,,S +580,581,1,2,"Christy, Miss. Julie Rachel",female,25.0,1,1,237789,30.0,,S +581,582,1,1,"Thayer, Mrs. John Borland (Marian Longstreth Morris)",female,39.0,1,1,17421,110.8833,C68,C +582,583,0,2,"Downton, Mr. William James",male,54.0,0,0,28403,26.0,,S +583,584,0,1,"Ross, Mr. John Hugo",male,36.0,0,0,13049,40.125,A10,C +584,585,0,3,"Paulner, Mr. Uscher",male,,0,0,3411,8.7125,,C +585,586,1,1,"Taussig, Miss. Ruth",female,18.0,0,2,110413,79.65,E68,S +586,587,0,2,"Jarvis, Mr. John Denzil",male,47.0,0,0,237565,15.0,,S +587,588,1,1,"Frolicher-Stehli, Mr. Maxmillian",male,60.0,1,1,13567,79.2,B41,C +588,589,0,3,"Gilinski, Mr. Eliezer",male,22.0,0,0,14973,8.05,,S +589,590,0,3,"Murdlin, Mr. Joseph",male,,0,0,A./5. 3235,8.05,,S +590,591,0,3,"Rintamaki, Mr. Matti",male,35.0,0,0,STON/O 2. 3101273,7.125,,S +591,592,1,1,"Stephenson, Mrs. Walter Bertram (Martha Eustis)",female,52.0,1,0,36947,78.2667,D20,C +592,593,0,3,"Elsbury, Mr. William James",male,47.0,0,0,A/5 3902,7.25,,S +593,594,0,3,"Bourke, Miss. Mary",female,,0,2,364848,7.75,,Q +594,595,0,2,"Chapman, Mr. John Henry",male,37.0,1,0,SC/AH 29037,26.0,,S +595,596,0,3,"Van Impe, Mr. Jean Baptiste",male,36.0,1,1,345773,24.15,,S +596,597,1,2,"Leitch, Miss. Jessie Wills",female,,0,0,248727,33.0,,S +597,598,0,3,"Johnson, Mr. Alfred",male,49.0,0,0,LINE,0.0,,S +598,599,0,3,"Boulos, Mr. Hanna",male,,0,0,2664,7.225,,C +599,600,1,1,"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")",male,49.0,1,0,PC 17485,56.9292,A20,C +600,601,1,2,"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)",female,24.0,2,1,243847,27.0,,S +601,602,0,3,"Slabenoff, Mr. Petco",male,,0,0,349214,7.8958,,S +602,603,0,1,"Harrington, Mr. Charles H",male,,0,0,113796,42.4,,S +603,604,0,3,"Torber, Mr. Ernst William",male,44.0,0,0,364511,8.05,,S +604,605,1,1,"Homer, Mr. Harry (""Mr E Haven"")",male,35.0,0,0,111426,26.55,,C +605,606,0,3,"Lindell, Mr. Edvard Bengtsson",male,36.0,1,0,349910,15.55,,S +606,607,0,3,"Karaic, Mr. Milan",male,30.0,0,0,349246,7.8958,,S +607,608,1,1,"Daniel, Mr. Robert Williams",male,27.0,0,0,113804,30.5,,S +608,609,1,2,"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)",female,22.0,1,2,SC/Paris 2123,41.5792,,C +609,610,1,1,"Shutes, Miss. Elizabeth W",female,40.0,0,0,PC 17582,153.4625,C125,S +610,611,0,3,"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)",female,39.0,1,5,347082,31.275,,S +611,612,0,3,"Jardin, Mr. Jose Neto",male,,0,0,SOTON/O.Q. 3101305,7.05,,S +612,613,1,3,"Murphy, Miss. Margaret Jane",female,,1,0,367230,15.5,,Q +613,614,0,3,"Horgan, Mr. John",male,,0,0,370377,7.75,,Q +614,615,0,3,"Brocklebank, Mr. William Alfred",male,35.0,0,0,364512,8.05,,S +615,616,1,2,"Herman, Miss. Alice",female,24.0,1,2,220845,65.0,,S +616,617,0,3,"Danbom, Mr. Ernst Gilbert",male,34.0,1,1,347080,14.4,,S +617,618,0,3,"Lobb, Mrs. William Arthur (Cordelia K Stanlick)",female,26.0,1,0,A/5. 3336,16.1,,S +618,619,1,2,"Becker, Miss. Marion Louise",female,4.0,2,1,230136,39.0,F4,S +619,620,0,2,"Gavey, Mr. Lawrence",male,26.0,0,0,31028,10.5,,S +620,621,0,3,"Yasbeck, Mr. Antoni",male,27.0,1,0,2659,14.4542,,C +621,622,1,1,"Kimball, Mr. Edwin Nelson Jr",male,42.0,1,0,11753,52.5542,D19,S +622,623,1,3,"Nakid, Mr. Sahid",male,20.0,1,1,2653,15.7417,,C +623,624,0,3,"Hansen, Mr. Henry Damsgaard",male,21.0,0,0,350029,7.8542,,S +624,625,0,3,"Bowen, Mr. David John ""Dai""",male,21.0,0,0,54636,16.1,,S +625,626,0,1,"Sutton, Mr. Frederick",male,61.0,0,0,36963,32.3208,D50,S +626,627,0,2,"Kirkland, Rev. Charles Leonard",male,57.0,0,0,219533,12.35,,Q +627,628,1,1,"Longley, Miss. Gretchen Fiske",female,21.0,0,0,13502,77.9583,D9,S +628,629,0,3,"Bostandyeff, Mr. Guentcho",male,26.0,0,0,349224,7.8958,,S +629,630,0,3,"O'Connell, Mr. Patrick D",male,,0,0,334912,7.7333,,Q +630,631,1,1,"Barkworth, Mr. Algernon Henry Wilson",male,80.0,0,0,27042,30.0,A23,S +631,632,0,3,"Lundahl, Mr. Johan Svensson",male,51.0,0,0,347743,7.0542,,S +632,633,1,1,"Stahelin-Maeglin, Dr. Max",male,32.0,0,0,13214,30.5,B50,C +633,634,0,1,"Parr, Mr. William Henry Marsh",male,,0,0,112052,0.0,,S +634,635,0,3,"Skoog, Miss. Mabel",female,9.0,3,2,347088,27.9,,S +635,636,1,2,"Davis, Miss. Mary",female,28.0,0,0,237668,13.0,,S +636,637,0,3,"Leinonen, Mr. Antti Gustaf",male,32.0,0,0,STON/O 2. 3101292,7.925,,S +637,638,0,2,"Collyer, Mr. Harvey",male,31.0,1,1,C.A. 31921,26.25,,S +638,639,0,3,"Panula, Mrs. Juha (Maria Emilia Ojala)",female,41.0,0,5,3101295,39.6875,,S +639,640,0,3,"Thorneycroft, Mr. Percival",male,,1,0,376564,16.1,,S +640,641,0,3,"Jensen, Mr. Hans Peder",male,20.0,0,0,350050,7.8542,,S +641,642,1,1,"Sagesser, Mlle. Emma",female,24.0,0,0,PC 17477,69.3,B35,C +642,643,0,3,"Skoog, Miss. Margit Elizabeth",female,2.0,3,2,347088,27.9,,S +643,644,1,3,"Foo, Mr. Choong",male,,0,0,1601,56.4958,,S +644,645,1,3,"Baclini, Miss. Eugenie",female,0.75,2,1,2666,19.2583,,C +645,646,1,1,"Harper, Mr. Henry Sleeper",male,48.0,1,0,PC 17572,76.7292,D33,C +646,647,0,3,"Cor, Mr. Liudevit",male,19.0,0,0,349231,7.8958,,S +647,648,1,1,"Simonius-Blumer, Col. Oberst Alfons",male,56.0,0,0,13213,35.5,A26,C +648,649,0,3,"Willey, Mr. Edward",male,,0,0,S.O./P.P. 751,7.55,,S +649,650,1,3,"Stanley, Miss. Amy Zillah Elsie",female,23.0,0,0,CA. 2314,7.55,,S +650,651,0,3,"Mitkoff, Mr. Mito",male,,0,0,349221,7.8958,,S +651,652,1,2,"Doling, Miss. Elsie",female,18.0,0,1,231919,23.0,,S +652,653,0,3,"Kalvik, Mr. Johannes Halvorsen",male,21.0,0,0,8475,8.4333,,S +653,654,1,3,"O'Leary, Miss. Hanora ""Norah""",female,,0,0,330919,7.8292,,Q +654,655,0,3,"Hegarty, Miss. Hanora ""Nora""",female,18.0,0,0,365226,6.75,,Q +655,656,0,2,"Hickman, Mr. Leonard Mark",male,24.0,2,0,S.O.C. 14879,73.5,,S +656,657,0,3,"Radeff, Mr. Alexander",male,,0,0,349223,7.8958,,S +657,658,0,3,"Bourke, Mrs. John (Catherine)",female,32.0,1,1,364849,15.5,,Q +658,659,0,2,"Eitemiller, Mr. George Floyd",male,23.0,0,0,29751,13.0,,S +659,660,0,1,"Newell, Mr. Arthur Webster",male,58.0,0,2,35273,113.275,D48,C +660,661,1,1,"Frauenthal, Dr. Henry William",male,50.0,2,0,PC 17611,133.65,,S +661,662,0,3,"Badt, Mr. Mohamed",male,40.0,0,0,2623,7.225,,C +662,663,0,1,"Colley, Mr. Edward Pomeroy",male,47.0,0,0,5727,25.5875,E58,S +663,664,0,3,"Coleff, Mr. Peju",male,36.0,0,0,349210,7.4958,,S +664,665,1,3,"Lindqvist, Mr. Eino William",male,20.0,1,0,STON/O 2. 3101285,7.925,,S +665,666,0,2,"Hickman, Mr. Lewis",male,32.0,2,0,S.O.C. 14879,73.5,,S +666,667,0,2,"Butler, Mr. Reginald Fenton",male,25.0,0,0,234686,13.0,,S +667,668,0,3,"Rommetvedt, Mr. Knud Paust",male,,0,0,312993,7.775,,S +668,669,0,3,"Cook, Mr. Jacob",male,43.0,0,0,A/5 3536,8.05,,S +669,670,1,1,"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)",female,,1,0,19996,52.0,C126,S +670,671,1,2,"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)",female,40.0,1,1,29750,39.0,,S +671,672,0,1,"Davidson, Mr. Thornton",male,31.0,1,0,F.C. 12750,52.0,B71,S +672,673,0,2,"Mitchell, Mr. Henry Michael",male,70.0,0,0,C.A. 24580,10.5,,S +673,674,1,2,"Wilhelms, Mr. Charles",male,31.0,0,0,244270,13.0,,S +674,675,0,2,"Watson, Mr. Ennis Hastings",male,,0,0,239856,0.0,,S +675,676,0,3,"Edvardsson, Mr. Gustaf Hjalmar",male,18.0,0,0,349912,7.775,,S +676,677,0,3,"Sawyer, Mr. Frederick Charles",male,24.5,0,0,342826,8.05,,S +677,678,1,3,"Turja, Miss. Anna Sofia",female,18.0,0,0,4138,9.8417,,S +678,679,0,3,"Goodwin, Mrs. Frederick (Augusta Tyler)",female,43.0,1,6,CA 2144,46.9,,S +679,680,1,1,"Cardeza, Mr. Thomas Drake Martinez",male,36.0,0,1,PC 17755,512.3292,B51 B53 B55,C +680,681,0,3,"Peters, Miss. Katie",female,,0,0,330935,8.1375,,Q +681,682,1,1,"Hassab, Mr. Hammad",male,27.0,0,0,PC 17572,76.7292,D49,C +682,683,0,3,"Olsvigen, Mr. Thor Anderson",male,20.0,0,0,6563,9.225,,S +683,684,0,3,"Goodwin, Mr. Charles Edward",male,14.0,5,2,CA 2144,46.9,,S +684,685,0,2,"Brown, Mr. Thomas William Solomon",male,60.0,1,1,29750,39.0,,S +685,686,0,2,"Laroche, Mr. Joseph Philippe Lemercier",male,25.0,1,2,SC/Paris 2123,41.5792,,C +686,687,0,3,"Panula, Mr. Jaako Arnold",male,14.0,4,1,3101295,39.6875,,S +687,688,0,3,"Dakic, Mr. Branko",male,19.0,0,0,349228,10.1708,,S +688,689,0,3,"Fischer, Mr. Eberhard Thelander",male,18.0,0,0,350036,7.7958,,S +689,690,1,1,"Madill, Miss. Georgette Alexandra",female,15.0,0,1,24160,211.3375,B5,S +690,691,1,1,"Dick, Mr. Albert Adrian",male,31.0,1,0,17474,57.0,B20,S +691,692,1,3,"Karun, Miss. Manca",female,4.0,0,1,349256,13.4167,,C +692,693,1,3,"Lam, Mr. Ali",male,,0,0,1601,56.4958,,S +693,694,0,3,"Saad, Mr. Khalil",male,25.0,0,0,2672,7.225,,C +694,695,0,1,"Weir, Col. John",male,60.0,0,0,113800,26.55,,S +695,696,0,2,"Chapman, Mr. Charles Henry",male,52.0,0,0,248731,13.5,,S +696,697,0,3,"Kelly, Mr. James",male,44.0,0,0,363592,8.05,,S +697,698,1,3,"Mullens, Miss. Katherine ""Katie""",female,,0,0,35852,7.7333,,Q +698,699,0,1,"Thayer, Mr. John Borland",male,49.0,1,1,17421,110.8833,C68,C +699,700,0,3,"Humblen, Mr. Adolf Mathias Nicolai Olsen",male,42.0,0,0,348121,7.65,F G63,S +700,701,1,1,"Astor, Mrs. John Jacob (Madeleine Talmadge Force)",female,18.0,1,0,PC 17757,227.525,C62 C64,C +701,702,1,1,"Silverthorne, Mr. Spencer Victor",male,35.0,0,0,PC 17475,26.2875,E24,S +702,703,0,3,"Barbara, Miss. Saiide",female,18.0,0,1,2691,14.4542,,C +703,704,0,3,"Gallagher, Mr. Martin",male,25.0,0,0,36864,7.7417,,Q +704,705,0,3,"Hansen, Mr. Henrik Juul",male,26.0,1,0,350025,7.8542,,S +705,706,0,2,"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")",male,39.0,0,0,250655,26.0,,S +706,707,1,2,"Kelly, Mrs. Florence ""Fannie""",female,45.0,0,0,223596,13.5,,S +707,708,1,1,"Calderhead, Mr. Edward Pennington",male,42.0,0,0,PC 17476,26.2875,E24,S +708,709,1,1,"Cleaver, Miss. Alice",female,22.0,0,0,113781,151.55,,S +709,710,1,3,"Moubarek, Master. Halim Gonios (""William George"")",male,,1,1,2661,15.2458,,C +710,711,1,1,"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")",female,24.0,0,0,PC 17482,49.5042,C90,C +711,712,0,1,"Klaber, Mr. Herman",male,,0,0,113028,26.55,C124,S +712,713,1,1,"Taylor, Mr. Elmer Zebley",male,48.0,1,0,19996,52.0,C126,S +713,714,0,3,"Larsson, Mr. August Viktor",male,29.0,0,0,7545,9.4833,,S +714,715,0,2,"Greenberg, Mr. Samuel",male,52.0,0,0,250647,13.0,,S +715,716,0,3,"Soholt, Mr. Peter Andreas Lauritz Andersen",male,19.0,0,0,348124,7.65,F G73,S +716,717,1,1,"Endres, Miss. Caroline Louise",female,38.0,0,0,PC 17757,227.525,C45,C +717,718,1,2,"Troutt, Miss. Edwina Celia ""Winnie""",female,27.0,0,0,34218,10.5,E101,S +718,719,0,3,"McEvoy, Mr. Michael",male,,0,0,36568,15.5,,Q +719,720,0,3,"Johnson, Mr. Malkolm Joackim",male,33.0,0,0,347062,7.775,,S +720,721,1,2,"Harper, Miss. Annie Jessie ""Nina""",female,6.0,0,1,248727,33.0,,S +721,722,0,3,"Jensen, Mr. Svend Lauritz",male,17.0,1,0,350048,7.0542,,S +722,723,0,2,"Gillespie, Mr. William Henry",male,34.0,0,0,12233,13.0,,S +723,724,0,2,"Hodges, Mr. Henry Price",male,50.0,0,0,250643,13.0,,S +724,725,1,1,"Chambers, Mr. Norman Campbell",male,27.0,1,0,113806,53.1,E8,S +725,726,0,3,"Oreskovic, Mr. Luka",male,20.0,0,0,315094,8.6625,,S +726,727,1,2,"Renouf, Mrs. Peter Henry (Lillian Jefferys)",female,30.0,3,0,31027,21.0,,S +727,728,1,3,"Mannion, Miss. Margareth",female,,0,0,36866,7.7375,,Q +728,729,0,2,"Bryhl, Mr. Kurt Arnold Gottfrid",male,25.0,1,0,236853,26.0,,S +729,730,0,3,"Ilmakangas, Miss. Pieta Sofia",female,25.0,1,0,STON/O2. 3101271,7.925,,S +730,731,1,1,"Allen, Miss. Elisabeth Walton",female,29.0,0,0,24160,211.3375,B5,S +731,732,0,3,"Hassan, Mr. Houssein G N",male,11.0,0,0,2699,18.7875,,C +732,733,0,2,"Knight, Mr. Robert J",male,,0,0,239855,0.0,,S +733,734,0,2,"Berriman, Mr. William John",male,23.0,0,0,28425,13.0,,S +734,735,0,2,"Troupiansky, Mr. Moses Aaron",male,23.0,0,0,233639,13.0,,S +735,736,0,3,"Williams, Mr. Leslie",male,28.5,0,0,54636,16.1,,S +736,737,0,3,"Ford, Mrs. Edward (Margaret Ann Watson)",female,48.0,1,3,W./C. 6608,34.375,,S +737,738,1,1,"Lesurer, Mr. Gustave J",male,35.0,0,0,PC 17755,512.3292,B101,C +738,739,0,3,"Ivanoff, Mr. Kanio",male,,0,0,349201,7.8958,,S +739,740,0,3,"Nankoff, Mr. Minko",male,,0,0,349218,7.8958,,S +740,741,1,1,"Hawksford, Mr. Walter James",male,,0,0,16988,30.0,D45,S +741,742,0,1,"Cavendish, Mr. Tyrell William",male,36.0,1,0,19877,78.85,C46,S +742,743,1,1,"Ryerson, Miss. Susan Parker ""Suzette""",female,21.0,2,2,PC 17608,262.375,B57 B59 B63 B66,C +743,744,0,3,"McNamee, Mr. Neal",male,24.0,1,0,376566,16.1,,S +744,745,1,3,"Stranden, Mr. Juho",male,31.0,0,0,STON/O 2. 3101288,7.925,,S +745,746,0,1,"Crosby, Capt. Edward Gifford",male,70.0,1,1,WE/P 5735,71.0,B22,S +746,747,0,3,"Abbott, Mr. Rossmore Edward",male,16.0,1,1,C.A. 2673,20.25,,S +747,748,1,2,"Sinkkonen, Miss. Anna",female,30.0,0,0,250648,13.0,,S +748,749,0,1,"Marvin, Mr. Daniel Warner",male,19.0,1,0,113773,53.1,D30,S +749,750,0,3,"Connaghton, Mr. Michael",male,31.0,0,0,335097,7.75,,Q +750,751,1,2,"Wells, Miss. Joan",female,4.0,1,1,29103,23.0,,S +751,752,1,3,"Moor, Master. Meier",male,6.0,0,1,392096,12.475,E121,S +752,753,0,3,"Vande Velde, Mr. Johannes Joseph",male,33.0,0,0,345780,9.5,,S +753,754,0,3,"Jonkoff, Mr. Lalio",male,23.0,0,0,349204,7.8958,,S +754,755,1,2,"Herman, Mrs. Samuel (Jane Laver)",female,48.0,1,2,220845,65.0,,S +755,756,1,2,"Hamalainen, Master. Viljo",male,0.67,1,1,250649,14.5,,S +756,757,0,3,"Carlsson, Mr. August Sigfrid",male,28.0,0,0,350042,7.7958,,S +757,758,0,2,"Bailey, Mr. Percy Andrew",male,18.0,0,0,29108,11.5,,S +758,759,0,3,"Theobald, Mr. Thomas Leonard",male,34.0,0,0,363294,8.05,,S +759,760,1,1,"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)",female,33.0,0,0,110152,86.5,B77,S +760,761,0,3,"Garfirth, Mr. John",male,,0,0,358585,14.5,,S +761,762,0,3,"Nirva, Mr. Iisakki Antino Aijo",male,41.0,0,0,SOTON/O2 3101272,7.125,,S +762,763,1,3,"Barah, Mr. Hanna Assi",male,20.0,0,0,2663,7.2292,,C +763,764,1,1,"Carter, Mrs. William Ernest (Lucile Polk)",female,36.0,1,2,113760,120.0,B96 B98,S +764,765,0,3,"Eklund, Mr. Hans Linus",male,16.0,0,0,347074,7.775,,S +765,766,1,1,"Hogeboom, Mrs. John C (Anna Andrews)",female,51.0,1,0,13502,77.9583,D11,S +766,767,0,1,"Brewe, Dr. Arthur Jackson",male,,0,0,112379,39.6,,C +767,768,0,3,"Mangan, Miss. Mary",female,30.5,0,0,364850,7.75,,Q +768,769,0,3,"Moran, Mr. Daniel J",male,,1,0,371110,24.15,,Q +769,770,0,3,"Gronnestad, Mr. Daniel Danielsen",male,32.0,0,0,8471,8.3625,,S +770,771,0,3,"Lievens, Mr. Rene Aime",male,24.0,0,0,345781,9.5,,S +771,772,0,3,"Jensen, Mr. Niels Peder",male,48.0,0,0,350047,7.8542,,S +772,773,0,2,"Mack, Mrs. (Mary)",female,57.0,0,0,S.O./P.P. 3,10.5,E77,S +773,774,0,3,"Elias, Mr. Dibo",male,,0,0,2674,7.225,,C +774,775,1,2,"Hocking, Mrs. Elizabeth (Eliza Needs)",female,54.0,1,3,29105,23.0,,S +775,776,0,3,"Myhrman, Mr. Pehr Fabian Oliver Malkolm",male,18.0,0,0,347078,7.75,,S +776,777,0,3,"Tobin, Mr. Roger",male,,0,0,383121,7.75,F38,Q +777,778,1,3,"Emanuel, Miss. Virginia Ethel",female,5.0,0,0,364516,12.475,,S +778,779,0,3,"Kilgannon, Mr. Thomas J",male,,0,0,36865,7.7375,,Q +779,780,1,1,"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)",female,43.0,0,1,24160,211.3375,B3,S +780,781,1,3,"Ayoub, Miss. Banoura",female,13.0,0,0,2687,7.2292,,C +781,782,1,1,"Dick, Mrs. Albert Adrian (Vera Gillespie)",female,17.0,1,0,17474,57.0,B20,S +782,783,0,1,"Long, Mr. Milton Clyde",male,29.0,0,0,113501,30.0,D6,S +783,784,0,3,"Johnston, Mr. Andrew G",male,,1,2,W./C. 6607,23.45,,S +784,785,0,3,"Ali, Mr. William",male,25.0,0,0,SOTON/O.Q. 3101312,7.05,,S +785,786,0,3,"Harmer, Mr. Abraham (David Lishin)",male,25.0,0,0,374887,7.25,,S +786,787,1,3,"Sjoblom, Miss. Anna Sofia",female,18.0,0,0,3101265,7.4958,,S +787,788,0,3,"Rice, Master. George Hugh",male,8.0,4,1,382652,29.125,,Q +788,789,1,3,"Dean, Master. Bertram Vere",male,1.0,1,2,C.A. 2315,20.575,,S +789,790,0,1,"Guggenheim, Mr. Benjamin",male,46.0,0,0,PC 17593,79.2,B82 B84,C +790,791,0,3,"Keane, Mr. Andrew ""Andy""",male,,0,0,12460,7.75,,Q +791,792,0,2,"Gaskell, Mr. Alfred",male,16.0,0,0,239865,26.0,,S +792,793,0,3,"Sage, Miss. Stella Anna",female,,8,2,CA. 2343,69.55,,S +793,794,0,1,"Hoyt, Mr. William Fisher",male,,0,0,PC 17600,30.6958,,C +794,795,0,3,"Dantcheff, Mr. Ristiu",male,25.0,0,0,349203,7.8958,,S +795,796,0,2,"Otter, Mr. Richard",male,39.0,0,0,28213,13.0,,S +796,797,1,1,"Leader, Dr. Alice (Farnham)",female,49.0,0,0,17465,25.9292,D17,S +797,798,1,3,"Osman, Mrs. Mara",female,31.0,0,0,349244,8.6833,,S +798,799,0,3,"Ibrahim Shawah, Mr. Yousseff",male,30.0,0,0,2685,7.2292,,C +799,800,0,3,"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)",female,30.0,1,1,345773,24.15,,S +800,801,0,2,"Ponesell, Mr. Martin",male,34.0,0,0,250647,13.0,,S +801,802,1,2,"Collyer, Mrs. Harvey (Charlotte Annie Tate)",female,31.0,1,1,C.A. 31921,26.25,,S +802,803,1,1,"Carter, Master. William Thornton II",male,11.0,1,2,113760,120.0,B96 B98,S +803,804,1,3,"Thomas, Master. Assad Alexander",male,0.42,0,1,2625,8.5167,,C +804,805,1,3,"Hedman, Mr. Oskar Arvid",male,27.0,0,0,347089,6.975,,S +805,806,0,3,"Johansson, Mr. Karl Johan",male,31.0,0,0,347063,7.775,,S +806,807,0,1,"Andrews, Mr. Thomas Jr",male,39.0,0,0,112050,0.0,A36,S +807,808,0,3,"Pettersson, Miss. Ellen Natalia",female,18.0,0,0,347087,7.775,,S +808,809,0,2,"Meyer, Mr. August",male,39.0,0,0,248723,13.0,,S +809,810,1,1,"Chambers, Mrs. Norman Campbell (Bertha Griggs)",female,33.0,1,0,113806,53.1,E8,S +810,811,0,3,"Alexander, Mr. William",male,26.0,0,0,3474,7.8875,,S +811,812,0,3,"Lester, Mr. James",male,39.0,0,0,A/4 48871,24.15,,S +812,813,0,2,"Slemen, Mr. Richard James",male,35.0,0,0,28206,10.5,,S +813,814,0,3,"Andersson, Miss. Ebba Iris Alfrida",female,6.0,4,2,347082,31.275,,S +814,815,0,3,"Tomlin, Mr. Ernest Portage",male,30.5,0,0,364499,8.05,,S +815,816,0,1,"Fry, Mr. Richard",male,,0,0,112058,0.0,B102,S +816,817,0,3,"Heininen, Miss. Wendla Maria",female,23.0,0,0,STON/O2. 3101290,7.925,,S +817,818,0,2,"Mallet, Mr. Albert",male,31.0,1,1,S.C./PARIS 2079,37.0042,,C +818,819,0,3,"Holm, Mr. John Fredrik Alexander",male,43.0,0,0,C 7075,6.45,,S +819,820,0,3,"Skoog, Master. Karl Thorsten",male,10.0,3,2,347088,27.9,,S +820,821,1,1,"Hays, Mrs. Charles Melville (Clara Jennings Gregg)",female,52.0,1,1,12749,93.5,B69,S +821,822,1,3,"Lulic, Mr. Nikola",male,27.0,0,0,315098,8.6625,,S +822,823,0,1,"Reuchlin, Jonkheer. John George",male,38.0,0,0,19972,0.0,,S +823,824,1,3,"Moor, Mrs. (Beila)",female,27.0,0,1,392096,12.475,E121,S +824,825,0,3,"Panula, Master. Urho Abraham",male,2.0,4,1,3101295,39.6875,,S +825,826,0,3,"Flynn, Mr. John",male,,0,0,368323,6.95,,Q +826,827,0,3,"Lam, Mr. Len",male,,0,0,1601,56.4958,,S +827,828,1,2,"Mallet, Master. Andre",male,1.0,0,2,S.C./PARIS 2079,37.0042,,C +828,829,1,3,"McCormack, Mr. Thomas Joseph",male,,0,0,367228,7.75,,Q +829,830,1,1,"Stone, Mrs. George Nelson (Martha Evelyn)",female,62.0,0,0,113572,80.0,B28, +830,831,1,3,"Yasbeck, Mrs. Antoni (Selini Alexander)",female,15.0,1,0,2659,14.4542,,C +831,832,1,2,"Richards, Master. George Sibley",male,0.83,1,1,29106,18.75,,S +832,833,0,3,"Saad, Mr. Amin",male,,0,0,2671,7.2292,,C +833,834,0,3,"Augustsson, Mr. Albert",male,23.0,0,0,347468,7.8542,,S +834,835,0,3,"Allum, Mr. Owen George",male,18.0,0,0,2223,8.3,,S +835,836,1,1,"Compton, Miss. Sara Rebecca",female,39.0,1,1,PC 17756,83.1583,E49,C +836,837,0,3,"Pasic, Mr. Jakob",male,21.0,0,0,315097,8.6625,,S +837,838,0,3,"Sirota, Mr. Maurice",male,,0,0,392092,8.05,,S +838,839,1,3,"Chip, Mr. Chang",male,32.0,0,0,1601,56.4958,,S +839,840,1,1,"Marechal, Mr. Pierre",male,,0,0,11774,29.7,C47,C +840,841,0,3,"Alhomaki, Mr. Ilmari Rudolf",male,20.0,0,0,SOTON/O2 3101287,7.925,,S +841,842,0,2,"Mudd, Mr. Thomas Charles",male,16.0,0,0,S.O./P.P. 3,10.5,,S +842,843,1,1,"Serepeca, Miss. Augusta",female,30.0,0,0,113798,31.0,,C +843,844,0,3,"Lemberopolous, Mr. Peter L",male,34.5,0,0,2683,6.4375,,C +844,845,0,3,"Culumovic, Mr. Jeso",male,17.0,0,0,315090,8.6625,,S +845,846,0,3,"Abbing, Mr. Anthony",male,42.0,0,0,C.A. 5547,7.55,,S +846,847,0,3,"Sage, Mr. Douglas Bullen",male,,8,2,CA. 2343,69.55,,S +847,848,0,3,"Markoff, Mr. Marin",male,35.0,0,0,349213,7.8958,,C +848,849,0,2,"Harper, Rev. John",male,28.0,0,1,248727,33.0,,S +849,850,1,1,"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)",female,,1,0,17453,89.1042,C92,C +850,851,0,3,"Andersson, Master. Sigvard Harald Elias",male,4.0,4,2,347082,31.275,,S +851,852,0,3,"Svensson, Mr. Johan",male,74.0,0,0,347060,7.775,,S +852,853,0,3,"Boulos, Miss. Nourelain",female,9.0,1,1,2678,15.2458,,C +853,854,1,1,"Lines, Miss. Mary Conover",female,16.0,0,1,PC 17592,39.4,D28,S +854,855,0,2,"Carter, Mrs. Ernest Courtenay (Lilian Hughes)",female,44.0,1,0,244252,26.0,,S +855,856,1,3,"Aks, Mrs. Sam (Leah Rosen)",female,18.0,0,1,392091,9.35,,S +856,857,1,1,"Wick, Mrs. George Dennick (Mary Hitchcock)",female,45.0,1,1,36928,164.8667,,S +857,858,1,1,"Daly, Mr. Peter Denis ",male,51.0,0,0,113055,26.55,E17,S +858,859,1,3,"Baclini, Mrs. Solomon (Latifa Qurban)",female,24.0,0,3,2666,19.2583,,C +859,860,0,3,"Razi, Mr. Raihed",male,,0,0,2629,7.2292,,C +860,861,0,3,"Hansen, Mr. Claus Peter",male,41.0,2,0,350026,14.1083,,S +861,862,0,2,"Giles, Mr. Frederick Edward",male,21.0,1,0,28134,11.5,,S +862,863,1,1,"Swift, Mrs. Frederick Joel (Margaret Welles Barron)",female,48.0,0,0,17466,25.9292,D17,S +863,864,0,3,"Sage, Miss. Dorothy Edith ""Dolly""",female,,8,2,CA. 2343,69.55,,S +864,865,0,2,"Gill, Mr. John William",male,24.0,0,0,233866,13.0,,S +865,866,1,2,"Bystrom, Mrs. (Karolina)",female,42.0,0,0,236852,13.0,,S +866,867,1,2,"Duran y More, Miss. Asuncion",female,27.0,1,0,SC/PARIS 2149,13.8583,,C +867,868,0,1,"Roebling, Mr. Washington Augustus II",male,31.0,0,0,PC 17590,50.4958,A24,S +868,869,0,3,"van Melkebeke, Mr. Philemon",male,,0,0,345777,9.5,,S +869,870,1,3,"Johnson, Master. Harold Theodor",male,4.0,1,1,347742,11.1333,,S +870,871,0,3,"Balkic, Mr. Cerin",male,26.0,0,0,349248,7.8958,,S +871,872,1,1,"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)",female,47.0,1,1,11751,52.5542,D35,S +872,873,0,1,"Carlsson, Mr. Frans Olof",male,33.0,0,0,695,5.0,B51 B53 B55,S +873,874,0,3,"Vander Cruyssen, Mr. Victor",male,47.0,0,0,345765,9.0,,S +874,875,1,2,"Abelson, Mrs. Samuel (Hannah Wizosky)",female,28.0,1,0,P/PP 3381,24.0,,C +875,876,1,3,"Najib, Miss. Adele Kiamie ""Jane""",female,15.0,0,0,2667,7.225,,C +876,877,0,3,"Gustafsson, Mr. Alfred Ossian",male,20.0,0,0,7534,9.8458,,S +877,878,0,3,"Petroff, Mr. Nedelio",male,19.0,0,0,349212,7.8958,,S +878,879,0,3,"Laleff, Mr. Kristo",male,,0,0,349217,7.8958,,S +879,880,1,1,"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)",female,56.0,0,1,11767,83.1583,C50,C +880,881,1,2,"Shelley, Mrs. William (Imanita Parrish Hall)",female,25.0,0,1,230433,26.0,,S +881,882,0,3,"Markun, Mr. Johann",male,33.0,0,0,349257,7.8958,,S +882,883,0,3,"Dahlberg, Miss. Gerda Ulrika",female,22.0,0,0,7552,10.5167,,S +883,884,0,2,"Banfield, Mr. Frederick James",male,28.0,0,0,C.A./SOTON 34068,10.5,,S +884,885,0,3,"Sutehall, Mr. Henry Jr",male,25.0,0,0,SOTON/OQ 392076,7.05,,S +885,886,0,3,"Rice, Mrs. William (Margaret Norton)",female,39.0,0,5,382652,29.125,,Q +886,887,0,2,"Montvila, Rev. Juozas",male,27.0,0,0,211536,13.0,,S +887,888,1,1,"Graham, Miss. Margaret Edith",female,19.0,0,0,112053,30.0,B42,S +888,889,0,3,"Johnston, Miss. Catherine Helen ""Carrie""",female,,1,2,W./C. 6607,23.45,,S +889,890,1,1,"Behr, Mr. Karl Howell",male,26.0,0,0,111369,30.0,C148,C +890,891,0,3,"Dooley, Mr. Patrick",male,32.0,0,0,370376,7.75,,Q diff --git a/SAA/2_2_Titanic/content/train.csv b/SAA/2_2_Titanic/content/train.csv new file mode 100644 index 0000000..63b68ab --- /dev/null +++ b/SAA/2_2_Titanic/content/train.csv @@ -0,0 +1,892 @@ +PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked +1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S +2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C +3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S +4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S +5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S +6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q +7,0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S +8,0,3,"Palsson, Master. Gosta Leonard",male,2,3,1,349909,21.075,,S +9,1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S +10,1,2,"Nasser, Mrs. Nicholas (Adele Achem)",female,14,1,0,237736,30.0708,,C +11,1,3,"Sandstrom, Miss. Marguerite Rut",female,4,1,1,PP 9549,16.7,G6,S +12,1,1,"Bonnell, Miss. Elizabeth",female,58,0,0,113783,26.55,C103,S +13,0,3,"Saundercock, Mr. William Henry",male,20,0,0,A/5. 2151,8.05,,S +14,0,3,"Andersson, Mr. Anders Johan",male,39,1,5,347082,31.275,,S +15,0,3,"Vestrom, Miss. Hulda Amanda Adolfina",female,14,0,0,350406,7.8542,,S +16,1,2,"Hewlett, Mrs. (Mary D Kingcome) ",female,55,0,0,248706,16,,S +17,0,3,"Rice, Master. Eugene",male,2,4,1,382652,29.125,,Q +18,1,2,"Williams, Mr. Charles Eugene",male,,0,0,244373,13,,S +19,0,3,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)",female,31,1,0,345763,18,,S +20,1,3,"Masselmani, Mrs. Fatima",female,,0,0,2649,7.225,,C +21,0,2,"Fynney, Mr. Joseph J",male,35,0,0,239865,26,,S +22,1,2,"Beesley, Mr. Lawrence",male,34,0,0,248698,13,D56,S +23,1,3,"McGowan, Miss. Anna ""Annie""",female,15,0,0,330923,8.0292,,Q +24,1,1,"Sloper, Mr. William Thompson",male,28,0,0,113788,35.5,A6,S +25,0,3,"Palsson, Miss. Torborg Danira",female,8,3,1,349909,21.075,,S +26,1,3,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)",female,38,1,5,347077,31.3875,,S +27,0,3,"Emir, Mr. Farred Chehab",male,,0,0,2631,7.225,,C +28,0,1,"Fortune, Mr. Charles Alexander",male,19,3,2,19950,263,C23 C25 C27,S +29,1,3,"O'Dwyer, Miss. Ellen ""Nellie""",female,,0,0,330959,7.8792,,Q +30,0,3,"Todoroff, Mr. Lalio",male,,0,0,349216,7.8958,,S +31,0,1,"Uruchurtu, Don. Manuel E",male,40,0,0,PC 17601,27.7208,,C +32,1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)",female,,1,0,PC 17569,146.5208,B78,C +33,1,3,"Glynn, Miss. Mary Agatha",female,,0,0,335677,7.75,,Q +34,0,2,"Wheadon, Mr. Edward H",male,66,0,0,C.A. 24579,10.5,,S +35,0,1,"Meyer, Mr. Edgar Joseph",male,28,1,0,PC 17604,82.1708,,C +36,0,1,"Holverson, Mr. Alexander Oskar",male,42,1,0,113789,52,,S +37,1,3,"Mamee, Mr. Hanna",male,,0,0,2677,7.2292,,C +38,0,3,"Cann, Mr. Ernest Charles",male,21,0,0,A./5. 2152,8.05,,S +39,0,3,"Vander Planke, Miss. Augusta Maria",female,18,2,0,345764,18,,S +40,1,3,"Nicola-Yarred, Miss. Jamila",female,14,1,0,2651,11.2417,,C +41,0,3,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)",female,40,1,0,7546,9.475,,S +42,0,2,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)",female,27,1,0,11668,21,,S +43,0,3,"Kraeff, Mr. Theodor",male,,0,0,349253,7.8958,,C +44,1,2,"Laroche, Miss. Simonne Marie Anne Andree",female,3,1,2,SC/Paris 2123,41.5792,,C +45,1,3,"Devaney, Miss. Margaret Delia",female,19,0,0,330958,7.8792,,Q +46,0,3,"Rogers, Mr. William John",male,,0,0,S.C./A.4. 23567,8.05,,S +47,0,3,"Lennon, Mr. Denis",male,,1,0,370371,15.5,,Q +48,1,3,"O'Driscoll, Miss. Bridget",female,,0,0,14311,7.75,,Q +49,0,3,"Samaan, Mr. Youssef",male,,2,0,2662,21.6792,,C +50,0,3,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)",female,18,1,0,349237,17.8,,S +51,0,3,"Panula, Master. Juha Niilo",male,7,4,1,3101295,39.6875,,S +52,0,3,"Nosworthy, Mr. Richard Cater",male,21,0,0,A/4. 39886,7.8,,S +53,1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)",female,49,1,0,PC 17572,76.7292,D33,C +54,1,2,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)",female,29,1,0,2926,26,,S +55,0,1,"Ostby, Mr. Engelhart Cornelius",male,65,0,1,113509,61.9792,B30,C +56,1,1,"Woolner, Mr. Hugh",male,,0,0,19947,35.5,C52,S +57,1,2,"Rugg, Miss. Emily",female,21,0,0,C.A. 31026,10.5,,S +58,0,3,"Novel, Mr. Mansouer",male,28.5,0,0,2697,7.2292,,C +59,1,2,"West, Miss. Constance Mirium",female,5,1,2,C.A. 34651,27.75,,S +60,0,3,"Goodwin, Master. William Frederick",male,11,5,2,CA 2144,46.9,,S +61,0,3,"Sirayanian, Mr. Orsen",male,22,0,0,2669,7.2292,,C +62,1,1,"Icard, Miss. Amelie",female,38,0,0,113572,80,B28, +63,0,1,"Harris, Mr. Henry Birkhardt",male,45,1,0,36973,83.475,C83,S +64,0,3,"Skoog, Master. Harald",male,4,3,2,347088,27.9,,S +65,0,1,"Stewart, Mr. Albert A",male,,0,0,PC 17605,27.7208,,C +66,1,3,"Moubarek, Master. Gerios",male,,1,1,2661,15.2458,,C +67,1,2,"Nye, Mrs. (Elizabeth Ramell)",female,29,0,0,C.A. 29395,10.5,F33,S +68,0,3,"Crease, Mr. Ernest James",male,19,0,0,S.P. 3464,8.1583,,S +69,1,3,"Andersson, Miss. Erna Alexandra",female,17,4,2,3101281,7.925,,S +70,0,3,"Kink, Mr. Vincenz",male,26,2,0,315151,8.6625,,S +71,0,2,"Jenkin, Mr. Stephen Curnow",male,32,0,0,C.A. 33111,10.5,,S +72,0,3,"Goodwin, Miss. Lillian Amy",female,16,5,2,CA 2144,46.9,,S +73,0,2,"Hood, Mr. Ambrose Jr",male,21,0,0,S.O.C. 14879,73.5,,S +74,0,3,"Chronopoulos, Mr. Apostolos",male,26,1,0,2680,14.4542,,C +75,1,3,"Bing, Mr. Lee",male,32,0,0,1601,56.4958,,S +76,0,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S +77,0,3,"Staneff, Mr. Ivan",male,,0,0,349208,7.8958,,S +78,0,3,"Moutal, Mr. Rahamin Haim",male,,0,0,374746,8.05,,S +79,1,2,"Caldwell, Master. Alden Gates",male,0.83,0,2,248738,29,,S +80,1,3,"Dowdell, Miss. Elizabeth",female,30,0,0,364516,12.475,,S +81,0,3,"Waelens, Mr. Achille",male,22,0,0,345767,9,,S +82,1,3,"Sheerlinck, Mr. Jan Baptist",male,29,0,0,345779,9.5,,S +83,1,3,"McDermott, Miss. Brigdet Delia",female,,0,0,330932,7.7875,,Q +84,0,1,"Carrau, Mr. Francisco M",male,28,0,0,113059,47.1,,S +85,1,2,"Ilett, Miss. Bertha",female,17,0,0,SO/C 14885,10.5,,S +86,1,3,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)",female,33,3,0,3101278,15.85,,S +87,0,3,"Ford, Mr. William Neal",male,16,1,3,W./C. 6608,34.375,,S +88,0,3,"Slocovski, Mr. Selman Francis",male,,0,0,SOTON/OQ 392086,8.05,,S +89,1,1,"Fortune, Miss. Mabel Helen",female,23,3,2,19950,263,C23 C25 C27,S +90,0,3,"Celotti, Mr. Francesco",male,24,0,0,343275,8.05,,S +91,0,3,"Christmann, Mr. Emil",male,29,0,0,343276,8.05,,S +92,0,3,"Andreasson, Mr. Paul Edvin",male,20,0,0,347466,7.8542,,S +93,0,1,"Chaffee, Mr. Herbert Fuller",male,46,1,0,W.E.P. 5734,61.175,E31,S +94,0,3,"Dean, Mr. Bertram Frank",male,26,1,2,C.A. 2315,20.575,,S +95,0,3,"Coxon, Mr. Daniel",male,59,0,0,364500,7.25,,S +96,0,3,"Shorney, Mr. Charles Joseph",male,,0,0,374910,8.05,,S +97,0,1,"Goldschmidt, Mr. George B",male,71,0,0,PC 17754,34.6542,A5,C +98,1,1,"Greenfield, Mr. William Bertram",male,23,0,1,PC 17759,63.3583,D10 D12,C +99,1,2,"Doling, Mrs. John T (Ada Julia Bone)",female,34,0,1,231919,23,,S +100,0,2,"Kantor, Mr. Sinai",male,34,1,0,244367,26,,S +101,0,3,"Petranec, Miss. Matilda",female,28,0,0,349245,7.8958,,S +102,0,3,"Petroff, Mr. Pastcho (""Pentcho"")",male,,0,0,349215,7.8958,,S +103,0,1,"White, Mr. Richard Frasar",male,21,0,1,35281,77.2875,D26,S +104,0,3,"Johansson, Mr. Gustaf Joel",male,33,0,0,7540,8.6542,,S +105,0,3,"Gustafsson, Mr. Anders Vilhelm",male,37,2,0,3101276,7.925,,S +106,0,3,"Mionoff, Mr. Stoytcho",male,28,0,0,349207,7.8958,,S +107,1,3,"Salkjelsvik, Miss. Anna Kristine",female,21,0,0,343120,7.65,,S +108,1,3,"Moss, Mr. Albert Johan",male,,0,0,312991,7.775,,S +109,0,3,"Rekic, Mr. Tido",male,38,0,0,349249,7.8958,,S +110,1,3,"Moran, Miss. Bertha",female,,1,0,371110,24.15,,Q +111,0,1,"Porter, Mr. Walter Chamberlain",male,47,0,0,110465,52,C110,S +112,0,3,"Zabour, Miss. Hileni",female,14.5,1,0,2665,14.4542,,C +113,0,3,"Barton, Mr. David John",male,22,0,0,324669,8.05,,S +114,0,3,"Jussila, Miss. Katriina",female,20,1,0,4136,9.825,,S +115,0,3,"Attalah, Miss. Malake",female,17,0,0,2627,14.4583,,C +116,0,3,"Pekoniemi, Mr. Edvard",male,21,0,0,STON/O 2. 3101294,7.925,,S +117,0,3,"Connors, Mr. Patrick",male,70.5,0,0,370369,7.75,,Q +118,0,2,"Turpin, Mr. William John Robert",male,29,1,0,11668,21,,S +119,0,1,"Baxter, Mr. Quigg Edmond",male,24,0,1,PC 17558,247.5208,B58 B60,C +120,0,3,"Andersson, Miss. Ellis Anna Maria",female,2,4,2,347082,31.275,,S +121,0,2,"Hickman, Mr. Stanley George",male,21,2,0,S.O.C. 14879,73.5,,S +122,0,3,"Moore, Mr. Leonard Charles",male,,0,0,A4. 54510,8.05,,S +123,0,2,"Nasser, Mr. Nicholas",male,32.5,1,0,237736,30.0708,,C +124,1,2,"Webber, Miss. Susan",female,32.5,0,0,27267,13,E101,S +125,0,1,"White, Mr. Percival Wayland",male,54,0,1,35281,77.2875,D26,S +126,1,3,"Nicola-Yarred, Master. Elias",male,12,1,0,2651,11.2417,,C +127,0,3,"McMahon, Mr. Martin",male,,0,0,370372,7.75,,Q +128,1,3,"Madsen, Mr. Fridtjof Arne",male,24,0,0,C 17369,7.1417,,S +129,1,3,"Peter, Miss. Anna",female,,1,1,2668,22.3583,F E69,C +130,0,3,"Ekstrom, Mr. Johan",male,45,0,0,347061,6.975,,S +131,0,3,"Drazenoic, Mr. Jozef",male,33,0,0,349241,7.8958,,C +132,0,3,"Coelho, Mr. Domingos Fernandeo",male,20,0,0,SOTON/O.Q. 3101307,7.05,,S +133,0,3,"Robins, Mrs. Alexander A (Grace Charity Laury)",female,47,1,0,A/5. 3337,14.5,,S +134,1,2,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)",female,29,1,0,228414,26,,S +135,0,2,"Sobey, Mr. Samuel James Hayden",male,25,0,0,C.A. 29178,13,,S +136,0,2,"Richard, Mr. Emile",male,23,0,0,SC/PARIS 2133,15.0458,,C +137,1,1,"Newsom, Miss. Helen Monypeny",female,19,0,2,11752,26.2833,D47,S +138,0,1,"Futrelle, Mr. Jacques Heath",male,37,1,0,113803,53.1,C123,S +139,0,3,"Osen, Mr. Olaf Elon",male,16,0,0,7534,9.2167,,S +140,0,1,"Giglio, Mr. Victor",male,24,0,0,PC 17593,79.2,B86,C +141,0,3,"Boulos, Mrs. Joseph (Sultana)",female,,0,2,2678,15.2458,,C +142,1,3,"Nysten, Miss. Anna Sofia",female,22,0,0,347081,7.75,,S +143,1,3,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)",female,24,1,0,STON/O2. 3101279,15.85,,S +144,0,3,"Burke, Mr. Jeremiah",male,19,0,0,365222,6.75,,Q +145,0,2,"Andrew, Mr. Edgardo Samuel",male,18,0,0,231945,11.5,,S +146,0,2,"Nicholls, Mr. Joseph Charles",male,19,1,1,C.A. 33112,36.75,,S +147,1,3,"Andersson, Mr. August Edvard (""Wennerstrom"")",male,27,0,0,350043,7.7958,,S +148,0,3,"Ford, Miss. Robina Maggie ""Ruby""",female,9,2,2,W./C. 6608,34.375,,S +149,0,2,"Navratil, Mr. Michel (""Louis M Hoffman"")",male,36.5,0,2,230080,26,F2,S +150,0,2,"Byles, Rev. Thomas Roussel Davids",male,42,0,0,244310,13,,S +151,0,2,"Bateman, Rev. Robert James",male,51,0,0,S.O.P. 1166,12.525,,S +152,1,1,"Pears, Mrs. Thomas (Edith Wearne)",female,22,1,0,113776,66.6,C2,S +153,0,3,"Meo, Mr. Alfonzo",male,55.5,0,0,A.5. 11206,8.05,,S +154,0,3,"van Billiard, Mr. Austin Blyler",male,40.5,0,2,A/5. 851,14.5,,S +155,0,3,"Olsen, Mr. Ole Martin",male,,0,0,Fa 265302,7.3125,,S +156,0,1,"Williams, Mr. Charles Duane",male,51,0,1,PC 17597,61.3792,,C +157,1,3,"Gilnagh, Miss. Katherine ""Katie""",female,16,0,0,35851,7.7333,,Q +158,0,3,"Corn, Mr. Harry",male,30,0,0,SOTON/OQ 392090,8.05,,S +159,0,3,"Smiljanic, Mr. Mile",male,,0,0,315037,8.6625,,S +160,0,3,"Sage, Master. Thomas Henry",male,,8,2,CA. 2343,69.55,,S +161,0,3,"Cribb, Mr. John Hatfield",male,44,0,1,371362,16.1,,S +162,1,2,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)",female,40,0,0,C.A. 33595,15.75,,S +163,0,3,"Bengtsson, Mr. John Viktor",male,26,0,0,347068,7.775,,S +164,0,3,"Calic, Mr. Jovo",male,17,0,0,315093,8.6625,,S +165,0,3,"Panula, Master. Eino Viljami",male,1,4,1,3101295,39.6875,,S +166,1,3,"Goldsmith, Master. Frank John William ""Frankie""",male,9,0,2,363291,20.525,,S +167,1,1,"Chibnall, Mrs. (Edith Martha Bowerman)",female,,0,1,113505,55,E33,S +168,0,3,"Skoog, Mrs. William (Anna Bernhardina Karlsson)",female,45,1,4,347088,27.9,,S +169,0,1,"Baumann, Mr. John D",male,,0,0,PC 17318,25.925,,S +170,0,3,"Ling, Mr. Lee",male,28,0,0,1601,56.4958,,S +171,0,1,"Van der hoef, Mr. Wyckoff",male,61,0,0,111240,33.5,B19,S +172,0,3,"Rice, Master. Arthur",male,4,4,1,382652,29.125,,Q +173,1,3,"Johnson, Miss. Eleanor Ileen",female,1,1,1,347742,11.1333,,S +174,0,3,"Sivola, Mr. Antti Wilhelm",male,21,0,0,STON/O 2. 3101280,7.925,,S +175,0,1,"Smith, Mr. James Clinch",male,56,0,0,17764,30.6958,A7,C +176,0,3,"Klasen, Mr. Klas Albin",male,18,1,1,350404,7.8542,,S +177,0,3,"Lefebre, Master. Henry Forbes",male,,3,1,4133,25.4667,,S +178,0,1,"Isham, Miss. Ann Elizabeth",female,50,0,0,PC 17595,28.7125,C49,C +179,0,2,"Hale, Mr. Reginald",male,30,0,0,250653,13,,S +180,0,3,"Leonard, Mr. Lionel",male,36,0,0,LINE,0,,S +181,0,3,"Sage, Miss. Constance Gladys",female,,8,2,CA. 2343,69.55,,S +182,0,2,"Pernot, Mr. Rene",male,,0,0,SC/PARIS 2131,15.05,,C +183,0,3,"Asplund, Master. Clarence Gustaf Hugo",male,9,4,2,347077,31.3875,,S +184,1,2,"Becker, Master. Richard F",male,1,2,1,230136,39,F4,S +185,1,3,"Kink-Heilmann, Miss. Luise Gretchen",female,4,0,2,315153,22.025,,S +186,0,1,"Rood, Mr. Hugh Roscoe",male,,0,0,113767,50,A32,S +187,1,3,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)",female,,1,0,370365,15.5,,Q +188,1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")",male,45,0,0,111428,26.55,,S +189,0,3,"Bourke, Mr. John",male,40,1,1,364849,15.5,,Q +190,0,3,"Turcin, Mr. Stjepan",male,36,0,0,349247,7.8958,,S +191,1,2,"Pinsky, Mrs. (Rosa)",female,32,0,0,234604,13,,S +192,0,2,"Carbines, Mr. William",male,19,0,0,28424,13,,S +193,1,3,"Andersen-Jensen, Miss. Carla Christine Nielsine",female,19,1,0,350046,7.8542,,S +194,1,2,"Navratil, Master. Michel M",male,3,1,1,230080,26,F2,S +195,1,1,"Brown, Mrs. James Joseph (Margaret Tobin)",female,44,0,0,PC 17610,27.7208,B4,C +196,1,1,"Lurette, Miss. Elise",female,58,0,0,PC 17569,146.5208,B80,C +197,0,3,"Mernagh, Mr. Robert",male,,0,0,368703,7.75,,Q +198,0,3,"Olsen, Mr. Karl Siegwart Andreas",male,42,0,1,4579,8.4042,,S +199,1,3,"Madigan, Miss. Margaret ""Maggie""",female,,0,0,370370,7.75,,Q +200,0,2,"Yrois, Miss. Henriette (""Mrs Harbeck"")",female,24,0,0,248747,13,,S +201,0,3,"Vande Walle, Mr. Nestor Cyriel",male,28,0,0,345770,9.5,,S +202,0,3,"Sage, Mr. Frederick",male,,8,2,CA. 2343,69.55,,S +203,0,3,"Johanson, Mr. Jakob Alfred",male,34,0,0,3101264,6.4958,,S +204,0,3,"Youseff, Mr. Gerious",male,45.5,0,0,2628,7.225,,C +205,1,3,"Cohen, Mr. Gurshon ""Gus""",male,18,0,0,A/5 3540,8.05,,S +206,0,3,"Strom, Miss. Telma Matilda",female,2,0,1,347054,10.4625,G6,S +207,0,3,"Backstrom, Mr. Karl Alfred",male,32,1,0,3101278,15.85,,S +208,1,3,"Albimona, Mr. Nassef Cassem",male,26,0,0,2699,18.7875,,C +209,1,3,"Carr, Miss. Helen ""Ellen""",female,16,0,0,367231,7.75,,Q +210,1,1,"Blank, Mr. Henry",male,40,0,0,112277,31,A31,C +211,0,3,"Ali, Mr. Ahmed",male,24,0,0,SOTON/O.Q. 3101311,7.05,,S +212,1,2,"Cameron, Miss. Clear Annie",female,35,0,0,F.C.C. 13528,21,,S +213,0,3,"Perkin, Mr. John Henry",male,22,0,0,A/5 21174,7.25,,S +214,0,2,"Givard, Mr. Hans Kristensen",male,30,0,0,250646,13,,S +215,0,3,"Kiernan, Mr. Philip",male,,1,0,367229,7.75,,Q +216,1,1,"Newell, Miss. Madeleine",female,31,1,0,35273,113.275,D36,C +217,1,3,"Honkanen, Miss. Eliina",female,27,0,0,STON/O2. 3101283,7.925,,S +218,0,2,"Jacobsohn, Mr. Sidney Samuel",male,42,1,0,243847,27,,S +219,1,1,"Bazzani, Miss. Albina",female,32,0,0,11813,76.2917,D15,C +220,0,2,"Harris, Mr. Walter",male,30,0,0,W/C 14208,10.5,,S +221,1,3,"Sunderland, Mr. Victor Francis",male,16,0,0,SOTON/OQ 392089,8.05,,S +222,0,2,"Bracken, Mr. James H",male,27,0,0,220367,13,,S +223,0,3,"Green, Mr. George Henry",male,51,0,0,21440,8.05,,S +224,0,3,"Nenkoff, Mr. Christo",male,,0,0,349234,7.8958,,S +225,1,1,"Hoyt, Mr. Frederick Maxfield",male,38,1,0,19943,90,C93,S +226,0,3,"Berglund, Mr. Karl Ivar Sven",male,22,0,0,PP 4348,9.35,,S +227,1,2,"Mellors, Mr. William John",male,19,0,0,SW/PP 751,10.5,,S +228,0,3,"Lovell, Mr. John Hall (""Henry"")",male,20.5,0,0,A/5 21173,7.25,,S +229,0,2,"Fahlstrom, Mr. Arne Jonas",male,18,0,0,236171,13,,S +230,0,3,"Lefebre, Miss. Mathilde",female,,3,1,4133,25.4667,,S +231,1,1,"Harris, Mrs. Henry Birkhardt (Irene Wallach)",female,35,1,0,36973,83.475,C83,S +232,0,3,"Larsson, Mr. Bengt Edvin",male,29,0,0,347067,7.775,,S +233,0,2,"Sjostedt, Mr. Ernst Adolf",male,59,0,0,237442,13.5,,S +234,1,3,"Asplund, Miss. Lillian Gertrud",female,5,4,2,347077,31.3875,,S +235,0,2,"Leyson, Mr. Robert William Norman",male,24,0,0,C.A. 29566,10.5,,S +236,0,3,"Harknett, Miss. Alice Phoebe",female,,0,0,W./C. 6609,7.55,,S +237,0,2,"Hold, Mr. Stephen",male,44,1,0,26707,26,,S +238,1,2,"Collyer, Miss. Marjorie ""Lottie""",female,8,0,2,C.A. 31921,26.25,,S +239,0,2,"Pengelly, Mr. Frederick William",male,19,0,0,28665,10.5,,S +240,0,2,"Hunt, Mr. George Henry",male,33,0,0,SCO/W 1585,12.275,,S +241,0,3,"Zabour, Miss. Thamine",female,,1,0,2665,14.4542,,C +242,1,3,"Murphy, Miss. Katherine ""Kate""",female,,1,0,367230,15.5,,Q +243,0,2,"Coleridge, Mr. Reginald Charles",male,29,0,0,W./C. 14263,10.5,,S +244,0,3,"Maenpaa, Mr. Matti Alexanteri",male,22,0,0,STON/O 2. 3101275,7.125,,S +245,0,3,"Attalah, Mr. Sleiman",male,30,0,0,2694,7.225,,C +246,0,1,"Minahan, Dr. William Edward",male,44,2,0,19928,90,C78,Q +247,0,3,"Lindahl, Miss. Agda Thorilda Viktoria",female,25,0,0,347071,7.775,,S +248,1,2,"Hamalainen, Mrs. William (Anna)",female,24,0,2,250649,14.5,,S +249,1,1,"Beckwith, Mr. Richard Leonard",male,37,1,1,11751,52.5542,D35,S +250,0,2,"Carter, Rev. Ernest Courtenay",male,54,1,0,244252,26,,S +251,0,3,"Reed, Mr. James George",male,,0,0,362316,7.25,,S +252,0,3,"Strom, Mrs. Wilhelm (Elna Matilda Persson)",female,29,1,1,347054,10.4625,G6,S +253,0,1,"Stead, Mr. William Thomas",male,62,0,0,113514,26.55,C87,S +254,0,3,"Lobb, Mr. William Arthur",male,30,1,0,A/5. 3336,16.1,,S +255,0,3,"Rosblom, Mrs. Viktor (Helena Wilhelmina)",female,41,0,2,370129,20.2125,,S +256,1,3,"Touma, Mrs. Darwis (Hanne Youssef Razi)",female,29,0,2,2650,15.2458,,C +257,1,1,"Thorne, Mrs. Gertrude Maybelle",female,,0,0,PC 17585,79.2,,C +258,1,1,"Cherry, Miss. Gladys",female,30,0,0,110152,86.5,B77,S +259,1,1,"Ward, Miss. Anna",female,35,0,0,PC 17755,512.3292,,C +260,1,2,"Parrish, Mrs. (Lutie Davis)",female,50,0,1,230433,26,,S +261,0,3,"Smith, Mr. Thomas",male,,0,0,384461,7.75,,Q +262,1,3,"Asplund, Master. Edvin Rojj Felix",male,3,4,2,347077,31.3875,,S +263,0,1,"Taussig, Mr. Emil",male,52,1,1,110413,79.65,E67,S +264,0,1,"Harrison, Mr. William",male,40,0,0,112059,0,B94,S +265,0,3,"Henry, Miss. Delia",female,,0,0,382649,7.75,,Q +266,0,2,"Reeves, Mr. David",male,36,0,0,C.A. 17248,10.5,,S +267,0,3,"Panula, Mr. Ernesti Arvid",male,16,4,1,3101295,39.6875,,S +268,1,3,"Persson, Mr. Ernst Ulrik",male,25,1,0,347083,7.775,,S +269,1,1,"Graham, Mrs. William Thompson (Edith Junkins)",female,58,0,1,PC 17582,153.4625,C125,S +270,1,1,"Bissette, Miss. Amelia",female,35,0,0,PC 17760,135.6333,C99,S +271,0,1,"Cairns, Mr. Alexander",male,,0,0,113798,31,,S +272,1,3,"Tornquist, Mr. William Henry",male,25,0,0,LINE,0,,S +273,1,2,"Mellinger, Mrs. (Elizabeth Anne Maidment)",female,41,0,1,250644,19.5,,S +274,0,1,"Natsch, Mr. Charles H",male,37,0,1,PC 17596,29.7,C118,C +275,1,3,"Healy, Miss. Hanora ""Nora""",female,,0,0,370375,7.75,,Q +276,1,1,"Andrews, Miss. Kornelia Theodosia",female,63,1,0,13502,77.9583,D7,S +277,0,3,"Lindblom, Miss. Augusta Charlotta",female,45,0,0,347073,7.75,,S +278,0,2,"Parkes, Mr. Francis ""Frank""",male,,0,0,239853,0,,S +279,0,3,"Rice, Master. Eric",male,7,4,1,382652,29.125,,Q +280,1,3,"Abbott, Mrs. Stanton (Rosa Hunt)",female,35,1,1,C.A. 2673,20.25,,S +281,0,3,"Duane, Mr. Frank",male,65,0,0,336439,7.75,,Q +282,0,3,"Olsson, Mr. Nils Johan Goransson",male,28,0,0,347464,7.8542,,S +283,0,3,"de Pelsmaeker, Mr. Alfons",male,16,0,0,345778,9.5,,S +284,1,3,"Dorking, Mr. Edward Arthur",male,19,0,0,A/5. 10482,8.05,,S +285,0,1,"Smith, Mr. Richard William",male,,0,0,113056,26,A19,S +286,0,3,"Stankovic, Mr. Ivan",male,33,0,0,349239,8.6625,,C +287,1,3,"de Mulder, Mr. Theodore",male,30,0,0,345774,9.5,,S +288,0,3,"Naidenoff, Mr. Penko",male,22,0,0,349206,7.8958,,S +289,1,2,"Hosono, Mr. Masabumi",male,42,0,0,237798,13,,S +290,1,3,"Connolly, Miss. Kate",female,22,0,0,370373,7.75,,Q +291,1,1,"Barber, Miss. Ellen ""Nellie""",female,26,0,0,19877,78.85,,S +292,1,1,"Bishop, Mrs. Dickinson H (Helen Walton)",female,19,1,0,11967,91.0792,B49,C +293,0,2,"Levy, Mr. Rene Jacques",male,36,0,0,SC/Paris 2163,12.875,D,C +294,0,3,"Haas, Miss. Aloisia",female,24,0,0,349236,8.85,,S +295,0,3,"Mineff, Mr. Ivan",male,24,0,0,349233,7.8958,,S +296,0,1,"Lewy, Mr. Ervin G",male,,0,0,PC 17612,27.7208,,C +297,0,3,"Hanna, Mr. Mansour",male,23.5,0,0,2693,7.2292,,C +298,0,1,"Allison, Miss. Helen Loraine",female,2,1,2,113781,151.55,C22 C26,S +299,1,1,"Saalfeld, Mr. Adolphe",male,,0,0,19988,30.5,C106,S +300,1,1,"Baxter, Mrs. James (Helene DeLaudeniere Chaput)",female,50,0,1,PC 17558,247.5208,B58 B60,C +301,1,3,"Kelly, Miss. Anna Katherine ""Annie Kate""",female,,0,0,9234,7.75,,Q +302,1,3,"McCoy, Mr. Bernard",male,,2,0,367226,23.25,,Q +303,0,3,"Johnson, Mr. William Cahoone Jr",male,19,0,0,LINE,0,,S +304,1,2,"Keane, Miss. Nora A",female,,0,0,226593,12.35,E101,Q +305,0,3,"Williams, Mr. Howard Hugh ""Harry""",male,,0,0,A/5 2466,8.05,,S +306,1,1,"Allison, Master. Hudson Trevor",male,0.92,1,2,113781,151.55,C22 C26,S +307,1,1,"Fleming, Miss. Margaret",female,,0,0,17421,110.8833,,C +308,1,1,"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)",female,17,1,0,PC 17758,108.9,C65,C +309,0,2,"Abelson, Mr. Samuel",male,30,1,0,P/PP 3381,24,,C +310,1,1,"Francatelli, Miss. Laura Mabel",female,30,0,0,PC 17485,56.9292,E36,C +311,1,1,"Hays, Miss. Margaret Bechstein",female,24,0,0,11767,83.1583,C54,C +312,1,1,"Ryerson, Miss. Emily Borie",female,18,2,2,PC 17608,262.375,B57 B59 B63 B66,C +313,0,2,"Lahtinen, Mrs. William (Anna Sylfven)",female,26,1,1,250651,26,,S +314,0,3,"Hendekovic, Mr. Ignjac",male,28,0,0,349243,7.8958,,S +315,0,2,"Hart, Mr. Benjamin",male,43,1,1,F.C.C. 13529,26.25,,S +316,1,3,"Nilsson, Miss. Helmina Josefina",female,26,0,0,347470,7.8542,,S +317,1,2,"Kantor, Mrs. Sinai (Miriam Sternin)",female,24,1,0,244367,26,,S +318,0,2,"Moraweck, Dr. Ernest",male,54,0,0,29011,14,,S +319,1,1,"Wick, Miss. Mary Natalie",female,31,0,2,36928,164.8667,C7,S +320,1,1,"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)",female,40,1,1,16966,134.5,E34,C +321,0,3,"Dennis, Mr. Samuel",male,22,0,0,A/5 21172,7.25,,S +322,0,3,"Danoff, Mr. Yoto",male,27,0,0,349219,7.8958,,S +323,1,2,"Slayter, Miss. Hilda Mary",female,30,0,0,234818,12.35,,Q +324,1,2,"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)",female,22,1,1,248738,29,,S +325,0,3,"Sage, Mr. George John Jr",male,,8,2,CA. 2343,69.55,,S +326,1,1,"Young, Miss. Marie Grice",female,36,0,0,PC 17760,135.6333,C32,C +327,0,3,"Nysveen, Mr. Johan Hansen",male,61,0,0,345364,6.2375,,S +328,1,2,"Ball, Mrs. (Ada E Hall)",female,36,0,0,28551,13,D,S +329,1,3,"Goldsmith, Mrs. Frank John (Emily Alice Brown)",female,31,1,1,363291,20.525,,S +330,1,1,"Hippach, Miss. Jean Gertrude",female,16,0,1,111361,57.9792,B18,C +331,1,3,"McCoy, Miss. Agnes",female,,2,0,367226,23.25,,Q +332,0,1,"Partner, Mr. Austen",male,45.5,0,0,113043,28.5,C124,S +333,0,1,"Graham, Mr. George Edward",male,38,0,1,PC 17582,153.4625,C91,S +334,0,3,"Vander Planke, Mr. Leo Edmondus",male,16,2,0,345764,18,,S +335,1,1,"Frauenthal, Mrs. Henry William (Clara Heinsheimer)",female,,1,0,PC 17611,133.65,,S +336,0,3,"Denkoff, Mr. Mitto",male,,0,0,349225,7.8958,,S +337,0,1,"Pears, Mr. Thomas Clinton",male,29,1,0,113776,66.6,C2,S +338,1,1,"Burns, Miss. Elizabeth Margaret",female,41,0,0,16966,134.5,E40,C +339,1,3,"Dahl, Mr. Karl Edwart",male,45,0,0,7598,8.05,,S +340,0,1,"Blackwell, Mr. Stephen Weart",male,45,0,0,113784,35.5,T,S +341,1,2,"Navratil, Master. Edmond Roger",male,2,1,1,230080,26,F2,S +342,1,1,"Fortune, Miss. Alice Elizabeth",female,24,3,2,19950,263,C23 C25 C27,S +343,0,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13,,S +344,0,2,"Sedgwick, Mr. Charles Frederick Waddington",male,25,0,0,244361,13,,S +345,0,2,"Fox, Mr. Stanley Hubert",male,36,0,0,229236,13,,S +346,1,2,"Brown, Miss. Amelia ""Mildred""",female,24,0,0,248733,13,F33,S +347,1,2,"Smith, Miss. Marion Elsie",female,40,0,0,31418,13,,S +348,1,3,"Davison, Mrs. Thomas Henry (Mary E Finck)",female,,1,0,386525,16.1,,S +349,1,3,"Coutts, Master. William Loch ""William""",male,3,1,1,C.A. 37671,15.9,,S +350,0,3,"Dimic, Mr. Jovan",male,42,0,0,315088,8.6625,,S +351,0,3,"Odahl, Mr. Nils Martin",male,23,0,0,7267,9.225,,S +352,0,1,"Williams-Lambert, Mr. Fletcher Fellows",male,,0,0,113510,35,C128,S +353,0,3,"Elias, Mr. Tannous",male,15,1,1,2695,7.2292,,C +354,0,3,"Arnold-Franchi, Mr. Josef",male,25,1,0,349237,17.8,,S +355,0,3,"Yousif, Mr. Wazli",male,,0,0,2647,7.225,,C +356,0,3,"Vanden Steen, Mr. Leo Peter",male,28,0,0,345783,9.5,,S +357,1,1,"Bowerman, Miss. Elsie Edith",female,22,0,1,113505,55,E33,S +358,0,2,"Funk, Miss. Annie Clemmer",female,38,0,0,237671,13,,S +359,1,3,"McGovern, Miss. Mary",female,,0,0,330931,7.8792,,Q +360,1,3,"Mockler, Miss. Helen Mary ""Ellie""",female,,0,0,330980,7.8792,,Q +361,0,3,"Skoog, Mr. Wilhelm",male,40,1,4,347088,27.9,,S +362,0,2,"del Carlo, Mr. Sebastiano",male,29,1,0,SC/PARIS 2167,27.7208,,C +363,0,3,"Barbara, Mrs. (Catherine David)",female,45,0,1,2691,14.4542,,C +364,0,3,"Asim, Mr. Adola",male,35,0,0,SOTON/O.Q. 3101310,7.05,,S +365,0,3,"O'Brien, Mr. Thomas",male,,1,0,370365,15.5,,Q +366,0,3,"Adahl, Mr. Mauritz Nils Martin",male,30,0,0,C 7076,7.25,,S +367,1,1,"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)",female,60,1,0,110813,75.25,D37,C +368,1,3,"Moussa, Mrs. (Mantoura Boulos)",female,,0,0,2626,7.2292,,C +369,1,3,"Jermyn, Miss. Annie",female,,0,0,14313,7.75,,Q +370,1,1,"Aubart, Mme. Leontine Pauline",female,24,0,0,PC 17477,69.3,B35,C +371,1,1,"Harder, Mr. George Achilles",male,25,1,0,11765,55.4417,E50,C +372,0,3,"Wiklund, Mr. Jakob Alfred",male,18,1,0,3101267,6.4958,,S +373,0,3,"Beavan, Mr. William Thomas",male,19,0,0,323951,8.05,,S +374,0,1,"Ringhini, Mr. Sante",male,22,0,0,PC 17760,135.6333,,C +375,0,3,"Palsson, Miss. Stina Viola",female,3,3,1,349909,21.075,,S +376,1,1,"Meyer, Mrs. Edgar Joseph (Leila Saks)",female,,1,0,PC 17604,82.1708,,C +377,1,3,"Landergren, Miss. Aurora Adelia",female,22,0,0,C 7077,7.25,,S +378,0,1,"Widener, Mr. Harry Elkins",male,27,0,2,113503,211.5,C82,C +379,0,3,"Betros, Mr. Tannous",male,20,0,0,2648,4.0125,,C +380,0,3,"Gustafsson, Mr. Karl Gideon",male,19,0,0,347069,7.775,,S +381,1,1,"Bidois, Miss. Rosalie",female,42,0,0,PC 17757,227.525,,C +382,1,3,"Nakid, Miss. Maria (""Mary"")",female,1,0,2,2653,15.7417,,C +383,0,3,"Tikkanen, Mr. Juho",male,32,0,0,STON/O 2. 3101293,7.925,,S +384,1,1,"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)",female,35,1,0,113789,52,,S +385,0,3,"Plotcharsky, Mr. Vasil",male,,0,0,349227,7.8958,,S +386,0,2,"Davies, Mr. Charles Henry",male,18,0,0,S.O.C. 14879,73.5,,S +387,0,3,"Goodwin, Master. Sidney Leonard",male,1,5,2,CA 2144,46.9,,S +388,1,2,"Buss, Miss. Kate",female,36,0,0,27849,13,,S +389,0,3,"Sadlier, Mr. Matthew",male,,0,0,367655,7.7292,,Q +390,1,2,"Lehmann, Miss. Bertha",female,17,0,0,SC 1748,12,,C +391,1,1,"Carter, Mr. William Ernest",male,36,1,2,113760,120,B96 B98,S +392,1,3,"Jansson, Mr. Carl Olof",male,21,0,0,350034,7.7958,,S +393,0,3,"Gustafsson, Mr. Johan Birger",male,28,2,0,3101277,7.925,,S +394,1,1,"Newell, Miss. Marjorie",female,23,1,0,35273,113.275,D36,C +395,1,3,"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)",female,24,0,2,PP 9549,16.7,G6,S +396,0,3,"Johansson, Mr. Erik",male,22,0,0,350052,7.7958,,S +397,0,3,"Olsson, Miss. Elina",female,31,0,0,350407,7.8542,,S +398,0,2,"McKane, Mr. Peter David",male,46,0,0,28403,26,,S +399,0,2,"Pain, Dr. Alfred",male,23,0,0,244278,10.5,,S +400,1,2,"Trout, Mrs. William H (Jessie L)",female,28,0,0,240929,12.65,,S +401,1,3,"Niskanen, Mr. Juha",male,39,0,0,STON/O 2. 3101289,7.925,,S +402,0,3,"Adams, Mr. John",male,26,0,0,341826,8.05,,S +403,0,3,"Jussila, Miss. Mari Aina",female,21,1,0,4137,9.825,,S +404,0,3,"Hakkarainen, Mr. Pekka Pietari",male,28,1,0,STON/O2. 3101279,15.85,,S +405,0,3,"Oreskovic, Miss. Marija",female,20,0,0,315096,8.6625,,S +406,0,2,"Gale, Mr. Shadrach",male,34,1,0,28664,21,,S +407,0,3,"Widegren, Mr. Carl/Charles Peter",male,51,0,0,347064,7.75,,S +408,1,2,"Richards, Master. William Rowe",male,3,1,1,29106,18.75,,S +409,0,3,"Birkeland, Mr. Hans Martin Monsen",male,21,0,0,312992,7.775,,S +410,0,3,"Lefebre, Miss. Ida",female,,3,1,4133,25.4667,,S +411,0,3,"Sdycoff, Mr. Todor",male,,0,0,349222,7.8958,,S +412,0,3,"Hart, Mr. Henry",male,,0,0,394140,6.8583,,Q +413,1,1,"Minahan, Miss. Daisy E",female,33,1,0,19928,90,C78,Q +414,0,2,"Cunningham, Mr. Alfred Fleming",male,,0,0,239853,0,,S +415,1,3,"Sundman, Mr. Johan Julian",male,44,0,0,STON/O 2. 3101269,7.925,,S +416,0,3,"Meek, Mrs. Thomas (Annie Louise Rowley)",female,,0,0,343095,8.05,,S +417,1,2,"Drew, Mrs. James Vivian (Lulu Thorne Christian)",female,34,1,1,28220,32.5,,S +418,1,2,"Silven, Miss. Lyyli Karoliina",female,18,0,2,250652,13,,S +419,0,2,"Matthews, Mr. William John",male,30,0,0,28228,13,,S +420,0,3,"Van Impe, Miss. Catharina",female,10,0,2,345773,24.15,,S +421,0,3,"Gheorgheff, Mr. Stanio",male,,0,0,349254,7.8958,,C +422,0,3,"Charters, Mr. David",male,21,0,0,A/5. 13032,7.7333,,Q +423,0,3,"Zimmerman, Mr. Leo",male,29,0,0,315082,7.875,,S +424,0,3,"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)",female,28,1,1,347080,14.4,,S +425,0,3,"Rosblom, Mr. Viktor Richard",male,18,1,1,370129,20.2125,,S +426,0,3,"Wiseman, Mr. Phillippe",male,,0,0,A/4. 34244,7.25,,S +427,1,2,"Clarke, Mrs. Charles V (Ada Maria Winfield)",female,28,1,0,2003,26,,S +428,1,2,"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")",female,19,0,0,250655,26,,S +429,0,3,"Flynn, Mr. James",male,,0,0,364851,7.75,,Q +430,1,3,"Pickard, Mr. Berk (Berk Trembisky)",male,32,0,0,SOTON/O.Q. 392078,8.05,E10,S +431,1,1,"Bjornstrom-Steffansson, Mr. Mauritz Hakan",male,28,0,0,110564,26.55,C52,S +432,1,3,"Thorneycroft, Mrs. Percival (Florence Kate White)",female,,1,0,376564,16.1,,S +433,1,2,"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)",female,42,1,0,SC/AH 3085,26,,S +434,0,3,"Kallio, Mr. Nikolai Erland",male,17,0,0,STON/O 2. 3101274,7.125,,S +435,0,1,"Silvey, Mr. William Baird",male,50,1,0,13507,55.9,E44,S +436,1,1,"Carter, Miss. Lucile Polk",female,14,1,2,113760,120,B96 B98,S +437,0,3,"Ford, Miss. Doolina Margaret ""Daisy""",female,21,2,2,W./C. 6608,34.375,,S +438,1,2,"Richards, Mrs. Sidney (Emily Hocking)",female,24,2,3,29106,18.75,,S +439,0,1,"Fortune, Mr. Mark",male,64,1,4,19950,263,C23 C25 C27,S +440,0,2,"Kvillner, Mr. Johan Henrik Johannesson",male,31,0,0,C.A. 18723,10.5,,S +441,1,2,"Hart, Mrs. Benjamin (Esther Ada Bloomfield)",female,45,1,1,F.C.C. 13529,26.25,,S +442,0,3,"Hampe, Mr. Leon",male,20,0,0,345769,9.5,,S +443,0,3,"Petterson, Mr. Johan Emil",male,25,1,0,347076,7.775,,S +444,1,2,"Reynaldo, Ms. Encarnacion",female,28,0,0,230434,13,,S +445,1,3,"Johannesen-Bratthammer, Mr. Bernt",male,,0,0,65306,8.1125,,S +446,1,1,"Dodge, Master. Washington",male,4,0,2,33638,81.8583,A34,S +447,1,2,"Mellinger, Miss. Madeleine Violet",female,13,0,1,250644,19.5,,S +448,1,1,"Seward, Mr. Frederic Kimber",male,34,0,0,113794,26.55,,S +449,1,3,"Baclini, Miss. Marie Catherine",female,5,2,1,2666,19.2583,,C +450,1,1,"Peuchen, Major. Arthur Godfrey",male,52,0,0,113786,30.5,C104,S +451,0,2,"West, Mr. Edwy Arthur",male,36,1,2,C.A. 34651,27.75,,S +452,0,3,"Hagland, Mr. Ingvald Olai Olsen",male,,1,0,65303,19.9667,,S +453,0,1,"Foreman, Mr. Benjamin Laventall",male,30,0,0,113051,27.75,C111,C +454,1,1,"Goldenberg, Mr. Samuel L",male,49,1,0,17453,89.1042,C92,C +455,0,3,"Peduzzi, Mr. Joseph",male,,0,0,A/5 2817,8.05,,S +456,1,3,"Jalsevac, Mr. Ivan",male,29,0,0,349240,7.8958,,C +457,0,1,"Millet, Mr. Francis Davis",male,65,0,0,13509,26.55,E38,S +458,1,1,"Kenyon, Mrs. Frederick R (Marion)",female,,1,0,17464,51.8625,D21,S +459,1,2,"Toomey, Miss. Ellen",female,50,0,0,F.C.C. 13531,10.5,,S +460,0,3,"O'Connor, Mr. Maurice",male,,0,0,371060,7.75,,Q +461,1,1,"Anderson, Mr. Harry",male,48,0,0,19952,26.55,E12,S +462,0,3,"Morley, Mr. William",male,34,0,0,364506,8.05,,S +463,0,1,"Gee, Mr. Arthur H",male,47,0,0,111320,38.5,E63,S +464,0,2,"Milling, Mr. Jacob Christian",male,48,0,0,234360,13,,S +465,0,3,"Maisner, Mr. Simon",male,,0,0,A/S 2816,8.05,,S +466,0,3,"Goncalves, Mr. Manuel Estanslas",male,38,0,0,SOTON/O.Q. 3101306,7.05,,S +467,0,2,"Campbell, Mr. William",male,,0,0,239853,0,,S +468,0,1,"Smart, Mr. John Montgomery",male,56,0,0,113792,26.55,,S +469,0,3,"Scanlan, Mr. James",male,,0,0,36209,7.725,,Q +470,1,3,"Baclini, Miss. Helene Barbara",female,0.75,2,1,2666,19.2583,,C +471,0,3,"Keefe, Mr. Arthur",male,,0,0,323592,7.25,,S +472,0,3,"Cacic, Mr. Luka",male,38,0,0,315089,8.6625,,S +473,1,2,"West, Mrs. Edwy Arthur (Ada Mary Worth)",female,33,1,2,C.A. 34651,27.75,,S +474,1,2,"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)",female,23,0,0,SC/AH Basle 541,13.7917,D,C +475,0,3,"Strandberg, Miss. Ida Sofia",female,22,0,0,7553,9.8375,,S +476,0,1,"Clifford, Mr. George Quincy",male,,0,0,110465,52,A14,S +477,0,2,"Renouf, Mr. Peter Henry",male,34,1,0,31027,21,,S +478,0,3,"Braund, Mr. Lewis Richard",male,29,1,0,3460,7.0458,,S +479,0,3,"Karlsson, Mr. Nils August",male,22,0,0,350060,7.5208,,S +480,1,3,"Hirvonen, Miss. Hildur E",female,2,0,1,3101298,12.2875,,S +481,0,3,"Goodwin, Master. Harold Victor",male,9,5,2,CA 2144,46.9,,S +482,0,2,"Frost, Mr. Anthony Wood ""Archie""",male,,0,0,239854,0,,S +483,0,3,"Rouse, Mr. Richard Henry",male,50,0,0,A/5 3594,8.05,,S +484,1,3,"Turkula, Mrs. (Hedwig)",female,63,0,0,4134,9.5875,,S +485,1,1,"Bishop, Mr. Dickinson H",male,25,1,0,11967,91.0792,B49,C +486,0,3,"Lefebre, Miss. Jeannie",female,,3,1,4133,25.4667,,S +487,1,1,"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)",female,35,1,0,19943,90,C93,S +488,0,1,"Kent, Mr. Edward Austin",male,58,0,0,11771,29.7,B37,C +489,0,3,"Somerton, Mr. Francis William",male,30,0,0,A.5. 18509,8.05,,S +490,1,3,"Coutts, Master. Eden Leslie ""Neville""",male,9,1,1,C.A. 37671,15.9,,S +491,0,3,"Hagland, Mr. Konrad Mathias Reiersen",male,,1,0,65304,19.9667,,S +492,0,3,"Windelov, Mr. Einar",male,21,0,0,SOTON/OQ 3101317,7.25,,S +493,0,1,"Molson, Mr. Harry Markland",male,55,0,0,113787,30.5,C30,S +494,0,1,"Artagaveytia, Mr. Ramon",male,71,0,0,PC 17609,49.5042,,C +495,0,3,"Stanley, Mr. Edward Roland",male,21,0,0,A/4 45380,8.05,,S +496,0,3,"Yousseff, Mr. Gerious",male,,0,0,2627,14.4583,,C +497,1,1,"Eustis, Miss. Elizabeth Mussey",female,54,1,0,36947,78.2667,D20,C +498,0,3,"Shellard, Mr. Frederick William",male,,0,0,C.A. 6212,15.1,,S +499,0,1,"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)",female,25,1,2,113781,151.55,C22 C26,S +500,0,3,"Svensson, Mr. Olof",male,24,0,0,350035,7.7958,,S +501,0,3,"Calic, Mr. Petar",male,17,0,0,315086,8.6625,,S +502,0,3,"Canavan, Miss. Mary",female,21,0,0,364846,7.75,,Q +503,0,3,"O'Sullivan, Miss. Bridget Mary",female,,0,0,330909,7.6292,,Q +504,0,3,"Laitinen, Miss. Kristina Sofia",female,37,0,0,4135,9.5875,,S +505,1,1,"Maioni, Miss. Roberta",female,16,0,0,110152,86.5,B79,S +506,0,1,"Penasco y Castellana, Mr. Victor de Satode",male,18,1,0,PC 17758,108.9,C65,C +507,1,2,"Quick, Mrs. Frederick Charles (Jane Richards)",female,33,0,2,26360,26,,S +508,1,1,"Bradley, Mr. George (""George Arthur Brayton"")",male,,0,0,111427,26.55,,S +509,0,3,"Olsen, Mr. Henry Margido",male,28,0,0,C 4001,22.525,,S +510,1,3,"Lang, Mr. Fang",male,26,0,0,1601,56.4958,,S +511,1,3,"Daly, Mr. Eugene Patrick",male,29,0,0,382651,7.75,,Q +512,0,3,"Webber, Mr. James",male,,0,0,SOTON/OQ 3101316,8.05,,S +513,1,1,"McGough, Mr. James Robert",male,36,0,0,PC 17473,26.2875,E25,S +514,1,1,"Rothschild, Mrs. Martin (Elizabeth L. Barrett)",female,54,1,0,PC 17603,59.4,,C +515,0,3,"Coleff, Mr. Satio",male,24,0,0,349209,7.4958,,S +516,0,1,"Walker, Mr. William Anderson",male,47,0,0,36967,34.0208,D46,S +517,1,2,"Lemore, Mrs. (Amelia Milley)",female,34,0,0,C.A. 34260,10.5,F33,S +518,0,3,"Ryan, Mr. Patrick",male,,0,0,371110,24.15,,Q +519,1,2,"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)",female,36,1,0,226875,26,,S +520,0,3,"Pavlovic, Mr. Stefo",male,32,0,0,349242,7.8958,,S +521,1,1,"Perreault, Miss. Anne",female,30,0,0,12749,93.5,B73,S +522,0,3,"Vovk, Mr. Janko",male,22,0,0,349252,7.8958,,S +523,0,3,"Lahoud, Mr. Sarkis",male,,0,0,2624,7.225,,C +524,1,1,"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)",female,44,0,1,111361,57.9792,B18,C +525,0,3,"Kassem, Mr. Fared",male,,0,0,2700,7.2292,,C +526,0,3,"Farrell, Mr. James",male,40.5,0,0,367232,7.75,,Q +527,1,2,"Ridsdale, Miss. Lucy",female,50,0,0,W./C. 14258,10.5,,S +528,0,1,"Farthing, Mr. John",male,,0,0,PC 17483,221.7792,C95,S +529,0,3,"Salonen, Mr. Johan Werner",male,39,0,0,3101296,7.925,,S +530,0,2,"Hocking, Mr. Richard George",male,23,2,1,29104,11.5,,S +531,1,2,"Quick, Miss. Phyllis May",female,2,1,1,26360,26,,S +532,0,3,"Toufik, Mr. Nakli",male,,0,0,2641,7.2292,,C +533,0,3,"Elias, Mr. Joseph Jr",male,17,1,1,2690,7.2292,,C +534,1,3,"Peter, Mrs. Catherine (Catherine Rizk)",female,,0,2,2668,22.3583,,C +535,0,3,"Cacic, Miss. Marija",female,30,0,0,315084,8.6625,,S +536,1,2,"Hart, Miss. Eva Miriam",female,7,0,2,F.C.C. 13529,26.25,,S +537,0,1,"Butt, Major. Archibald Willingham",male,45,0,0,113050,26.55,B38,S +538,1,1,"LeRoy, Miss. Bertha",female,30,0,0,PC 17761,106.425,,C +539,0,3,"Risien, Mr. Samuel Beard",male,,0,0,364498,14.5,,S +540,1,1,"Frolicher, Miss. Hedwig Margaritha",female,22,0,2,13568,49.5,B39,C +541,1,1,"Crosby, Miss. Harriet R",female,36,0,2,WE/P 5735,71,B22,S +542,0,3,"Andersson, Miss. Ingeborg Constanzia",female,9,4,2,347082,31.275,,S +543,0,3,"Andersson, Miss. Sigrid Elisabeth",female,11,4,2,347082,31.275,,S +544,1,2,"Beane, Mr. Edward",male,32,1,0,2908,26,,S +545,0,1,"Douglas, Mr. Walter Donald",male,50,1,0,PC 17761,106.425,C86,C +546,0,1,"Nicholson, Mr. Arthur Ernest",male,64,0,0,693,26,,S +547,1,2,"Beane, Mrs. Edward (Ethel Clarke)",female,19,1,0,2908,26,,S +548,1,2,"Padro y Manent, Mr. Julian",male,,0,0,SC/PARIS 2146,13.8625,,C +549,0,3,"Goldsmith, Mr. Frank John",male,33,1,1,363291,20.525,,S +550,1,2,"Davies, Master. John Morgan Jr",male,8,1,1,C.A. 33112,36.75,,S +551,1,1,"Thayer, Mr. John Borland Jr",male,17,0,2,17421,110.8833,C70,C +552,0,2,"Sharp, Mr. Percival James R",male,27,0,0,244358,26,,S +553,0,3,"O'Brien, Mr. Timothy",male,,0,0,330979,7.8292,,Q +554,1,3,"Leeni, Mr. Fahim (""Philip Zenni"")",male,22,0,0,2620,7.225,,C +555,1,3,"Ohman, Miss. Velin",female,22,0,0,347085,7.775,,S +556,0,1,"Wright, Mr. George",male,62,0,0,113807,26.55,,S +557,1,1,"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")",female,48,1,0,11755,39.6,A16,C +558,0,1,"Robbins, Mr. Victor",male,,0,0,PC 17757,227.525,,C +559,1,1,"Taussig, Mrs. Emil (Tillie Mandelbaum)",female,39,1,1,110413,79.65,E67,S +560,1,3,"de Messemaeker, Mrs. Guillaume Joseph (Emma)",female,36,1,0,345572,17.4,,S +561,0,3,"Morrow, Mr. Thomas Rowan",male,,0,0,372622,7.75,,Q +562,0,3,"Sivic, Mr. Husein",male,40,0,0,349251,7.8958,,S +563,0,2,"Norman, Mr. Robert Douglas",male,28,0,0,218629,13.5,,S +564,0,3,"Simmons, Mr. John",male,,0,0,SOTON/OQ 392082,8.05,,S +565,0,3,"Meanwell, Miss. (Marion Ogden)",female,,0,0,SOTON/O.Q. 392087,8.05,,S +566,0,3,"Davies, Mr. Alfred J",male,24,2,0,A/4 48871,24.15,,S +567,0,3,"Stoytcheff, Mr. Ilia",male,19,0,0,349205,7.8958,,S +568,0,3,"Palsson, Mrs. Nils (Alma Cornelia Berglund)",female,29,0,4,349909,21.075,,S +569,0,3,"Doharr, Mr. Tannous",male,,0,0,2686,7.2292,,C +570,1,3,"Jonsson, Mr. Carl",male,32,0,0,350417,7.8542,,S +571,1,2,"Harris, Mr. George",male,62,0,0,S.W./PP 752,10.5,,S +572,1,1,"Appleton, Mrs. Edward Dale (Charlotte Lamson)",female,53,2,0,11769,51.4792,C101,S +573,1,1,"Flynn, Mr. John Irwin (""Irving"")",male,36,0,0,PC 17474,26.3875,E25,S +574,1,3,"Kelly, Miss. Mary",female,,0,0,14312,7.75,,Q +575,0,3,"Rush, Mr. Alfred George John",male,16,0,0,A/4. 20589,8.05,,S +576,0,3,"Patchett, Mr. George",male,19,0,0,358585,14.5,,S +577,1,2,"Garside, Miss. Ethel",female,34,0,0,243880,13,,S +578,1,1,"Silvey, Mrs. William Baird (Alice Munger)",female,39,1,0,13507,55.9,E44,S +579,0,3,"Caram, Mrs. Joseph (Maria Elias)",female,,1,0,2689,14.4583,,C +580,1,3,"Jussila, Mr. Eiriik",male,32,0,0,STON/O 2. 3101286,7.925,,S +581,1,2,"Christy, Miss. Julie Rachel",female,25,1,1,237789,30,,S +582,1,1,"Thayer, Mrs. John Borland (Marian Longstreth Morris)",female,39,1,1,17421,110.8833,C68,C +583,0,2,"Downton, Mr. William James",male,54,0,0,28403,26,,S +584,0,1,"Ross, Mr. John Hugo",male,36,0,0,13049,40.125,A10,C +585,0,3,"Paulner, Mr. Uscher",male,,0,0,3411,8.7125,,C +586,1,1,"Taussig, Miss. Ruth",female,18,0,2,110413,79.65,E68,S +587,0,2,"Jarvis, Mr. John Denzil",male,47,0,0,237565,15,,S +588,1,1,"Frolicher-Stehli, Mr. Maxmillian",male,60,1,1,13567,79.2,B41,C +589,0,3,"Gilinski, Mr. Eliezer",male,22,0,0,14973,8.05,,S +590,0,3,"Murdlin, Mr. Joseph",male,,0,0,A./5. 3235,8.05,,S +591,0,3,"Rintamaki, Mr. Matti",male,35,0,0,STON/O 2. 3101273,7.125,,S +592,1,1,"Stephenson, Mrs. Walter Bertram (Martha Eustis)",female,52,1,0,36947,78.2667,D20,C +593,0,3,"Elsbury, Mr. William James",male,47,0,0,A/5 3902,7.25,,S +594,0,3,"Bourke, Miss. Mary",female,,0,2,364848,7.75,,Q +595,0,2,"Chapman, Mr. John Henry",male,37,1,0,SC/AH 29037,26,,S +596,0,3,"Van Impe, Mr. Jean Baptiste",male,36,1,1,345773,24.15,,S +597,1,2,"Leitch, Miss. Jessie Wills",female,,0,0,248727,33,,S +598,0,3,"Johnson, Mr. Alfred",male,49,0,0,LINE,0,,S +599,0,3,"Boulos, Mr. Hanna",male,,0,0,2664,7.225,,C +600,1,1,"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")",male,49,1,0,PC 17485,56.9292,A20,C +601,1,2,"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)",female,24,2,1,243847,27,,S +602,0,3,"Slabenoff, Mr. Petco",male,,0,0,349214,7.8958,,S +603,0,1,"Harrington, Mr. Charles H",male,,0,0,113796,42.4,,S +604,0,3,"Torber, Mr. Ernst William",male,44,0,0,364511,8.05,,S +605,1,1,"Homer, Mr. Harry (""Mr E Haven"")",male,35,0,0,111426,26.55,,C +606,0,3,"Lindell, Mr. Edvard Bengtsson",male,36,1,0,349910,15.55,,S +607,0,3,"Karaic, Mr. Milan",male,30,0,0,349246,7.8958,,S +608,1,1,"Daniel, Mr. Robert Williams",male,27,0,0,113804,30.5,,S +609,1,2,"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)",female,22,1,2,SC/Paris 2123,41.5792,,C +610,1,1,"Shutes, Miss. Elizabeth W",female,40,0,0,PC 17582,153.4625,C125,S +611,0,3,"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)",female,39,1,5,347082,31.275,,S +612,0,3,"Jardin, Mr. Jose Neto",male,,0,0,SOTON/O.Q. 3101305,7.05,,S +613,1,3,"Murphy, Miss. Margaret Jane",female,,1,0,367230,15.5,,Q +614,0,3,"Horgan, Mr. John",male,,0,0,370377,7.75,,Q +615,0,3,"Brocklebank, Mr. William Alfred",male,35,0,0,364512,8.05,,S +616,1,2,"Herman, Miss. Alice",female,24,1,2,220845,65,,S +617,0,3,"Danbom, Mr. Ernst Gilbert",male,34,1,1,347080,14.4,,S +618,0,3,"Lobb, Mrs. William Arthur (Cordelia K Stanlick)",female,26,1,0,A/5. 3336,16.1,,S +619,1,2,"Becker, Miss. Marion Louise",female,4,2,1,230136,39,F4,S +620,0,2,"Gavey, Mr. Lawrence",male,26,0,0,31028,10.5,,S +621,0,3,"Yasbeck, Mr. Antoni",male,27,1,0,2659,14.4542,,C +622,1,1,"Kimball, Mr. Edwin Nelson Jr",male,42,1,0,11753,52.5542,D19,S +623,1,3,"Nakid, Mr. Sahid",male,20,1,1,2653,15.7417,,C +624,0,3,"Hansen, Mr. Henry Damsgaard",male,21,0,0,350029,7.8542,,S +625,0,3,"Bowen, Mr. David John ""Dai""",male,21,0,0,54636,16.1,,S +626,0,1,"Sutton, Mr. Frederick",male,61,0,0,36963,32.3208,D50,S +627,0,2,"Kirkland, Rev. Charles Leonard",male,57,0,0,219533,12.35,,Q +628,1,1,"Longley, Miss. Gretchen Fiske",female,21,0,0,13502,77.9583,D9,S +629,0,3,"Bostandyeff, Mr. Guentcho",male,26,0,0,349224,7.8958,,S +630,0,3,"O'Connell, Mr. Patrick D",male,,0,0,334912,7.7333,,Q +631,1,1,"Barkworth, Mr. Algernon Henry Wilson",male,80,0,0,27042,30,A23,S +632,0,3,"Lundahl, Mr. Johan Svensson",male,51,0,0,347743,7.0542,,S +633,1,1,"Stahelin-Maeglin, Dr. Max",male,32,0,0,13214,30.5,B50,C +634,0,1,"Parr, Mr. William Henry Marsh",male,,0,0,112052,0,,S +635,0,3,"Skoog, Miss. Mabel",female,9,3,2,347088,27.9,,S +636,1,2,"Davis, Miss. Mary",female,28,0,0,237668,13,,S +637,0,3,"Leinonen, Mr. Antti Gustaf",male,32,0,0,STON/O 2. 3101292,7.925,,S +638,0,2,"Collyer, Mr. Harvey",male,31,1,1,C.A. 31921,26.25,,S +639,0,3,"Panula, Mrs. Juha (Maria Emilia Ojala)",female,41,0,5,3101295,39.6875,,S +640,0,3,"Thorneycroft, Mr. Percival",male,,1,0,376564,16.1,,S +641,0,3,"Jensen, Mr. Hans Peder",male,20,0,0,350050,7.8542,,S +642,1,1,"Sagesser, Mlle. Emma",female,24,0,0,PC 17477,69.3,B35,C +643,0,3,"Skoog, Miss. Margit Elizabeth",female,2,3,2,347088,27.9,,S +644,1,3,"Foo, Mr. Choong",male,,0,0,1601,56.4958,,S +645,1,3,"Baclini, Miss. Eugenie",female,0.75,2,1,2666,19.2583,,C +646,1,1,"Harper, Mr. Henry Sleeper",male,48,1,0,PC 17572,76.7292,D33,C +647,0,3,"Cor, Mr. Liudevit",male,19,0,0,349231,7.8958,,S +648,1,1,"Simonius-Blumer, Col. Oberst Alfons",male,56,0,0,13213,35.5,A26,C +649,0,3,"Willey, Mr. Edward",male,,0,0,S.O./P.P. 751,7.55,,S +650,1,3,"Stanley, Miss. Amy Zillah Elsie",female,23,0,0,CA. 2314,7.55,,S +651,0,3,"Mitkoff, Mr. Mito",male,,0,0,349221,7.8958,,S +652,1,2,"Doling, Miss. Elsie",female,18,0,1,231919,23,,S +653,0,3,"Kalvik, Mr. Johannes Halvorsen",male,21,0,0,8475,8.4333,,S +654,1,3,"O'Leary, Miss. Hanora ""Norah""",female,,0,0,330919,7.8292,,Q +655,0,3,"Hegarty, Miss. Hanora ""Nora""",female,18,0,0,365226,6.75,,Q +656,0,2,"Hickman, Mr. Leonard Mark",male,24,2,0,S.O.C. 14879,73.5,,S +657,0,3,"Radeff, Mr. Alexander",male,,0,0,349223,7.8958,,S +658,0,3,"Bourke, Mrs. John (Catherine)",female,32,1,1,364849,15.5,,Q +659,0,2,"Eitemiller, Mr. George Floyd",male,23,0,0,29751,13,,S +660,0,1,"Newell, Mr. Arthur Webster",male,58,0,2,35273,113.275,D48,C +661,1,1,"Frauenthal, Dr. Henry William",male,50,2,0,PC 17611,133.65,,S +662,0,3,"Badt, Mr. Mohamed",male,40,0,0,2623,7.225,,C +663,0,1,"Colley, Mr. Edward Pomeroy",male,47,0,0,5727,25.5875,E58,S +664,0,3,"Coleff, Mr. Peju",male,36,0,0,349210,7.4958,,S +665,1,3,"Lindqvist, Mr. Eino William",male,20,1,0,STON/O 2. 3101285,7.925,,S +666,0,2,"Hickman, Mr. Lewis",male,32,2,0,S.O.C. 14879,73.5,,S +667,0,2,"Butler, Mr. Reginald Fenton",male,25,0,0,234686,13,,S +668,0,3,"Rommetvedt, Mr. Knud Paust",male,,0,0,312993,7.775,,S +669,0,3,"Cook, Mr. Jacob",male,43,0,0,A/5 3536,8.05,,S +670,1,1,"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)",female,,1,0,19996,52,C126,S +671,1,2,"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)",female,40,1,1,29750,39,,S +672,0,1,"Davidson, Mr. Thornton",male,31,1,0,F.C. 12750,52,B71,S +673,0,2,"Mitchell, Mr. Henry Michael",male,70,0,0,C.A. 24580,10.5,,S +674,1,2,"Wilhelms, Mr. Charles",male,31,0,0,244270,13,,S +675,0,2,"Watson, Mr. Ennis Hastings",male,,0,0,239856,0,,S +676,0,3,"Edvardsson, Mr. Gustaf Hjalmar",male,18,0,0,349912,7.775,,S +677,0,3,"Sawyer, Mr. Frederick Charles",male,24.5,0,0,342826,8.05,,S +678,1,3,"Turja, Miss. Anna Sofia",female,18,0,0,4138,9.8417,,S +679,0,3,"Goodwin, Mrs. Frederick (Augusta Tyler)",female,43,1,6,CA 2144,46.9,,S +680,1,1,"Cardeza, Mr. Thomas Drake Martinez",male,36,0,1,PC 17755,512.3292,B51 B53 B55,C +681,0,3,"Peters, Miss. Katie",female,,0,0,330935,8.1375,,Q +682,1,1,"Hassab, Mr. Hammad",male,27,0,0,PC 17572,76.7292,D49,C +683,0,3,"Olsvigen, Mr. Thor Anderson",male,20,0,0,6563,9.225,,S +684,0,3,"Goodwin, Mr. Charles Edward",male,14,5,2,CA 2144,46.9,,S +685,0,2,"Brown, Mr. Thomas William Solomon",male,60,1,1,29750,39,,S +686,0,2,"Laroche, Mr. Joseph Philippe Lemercier",male,25,1,2,SC/Paris 2123,41.5792,,C +687,0,3,"Panula, Mr. Jaako Arnold",male,14,4,1,3101295,39.6875,,S +688,0,3,"Dakic, Mr. Branko",male,19,0,0,349228,10.1708,,S +689,0,3,"Fischer, Mr. Eberhard Thelander",male,18,0,0,350036,7.7958,,S +690,1,1,"Madill, Miss. Georgette Alexandra",female,15,0,1,24160,211.3375,B5,S +691,1,1,"Dick, Mr. Albert Adrian",male,31,1,0,17474,57,B20,S +692,1,3,"Karun, Miss. Manca",female,4,0,1,349256,13.4167,,C +693,1,3,"Lam, Mr. Ali",male,,0,0,1601,56.4958,,S +694,0,3,"Saad, Mr. Khalil",male,25,0,0,2672,7.225,,C +695,0,1,"Weir, Col. John",male,60,0,0,113800,26.55,,S +696,0,2,"Chapman, Mr. Charles Henry",male,52,0,0,248731,13.5,,S +697,0,3,"Kelly, Mr. James",male,44,0,0,363592,8.05,,S +698,1,3,"Mullens, Miss. Katherine ""Katie""",female,,0,0,35852,7.7333,,Q +699,0,1,"Thayer, Mr. John Borland",male,49,1,1,17421,110.8833,C68,C +700,0,3,"Humblen, Mr. Adolf Mathias Nicolai Olsen",male,42,0,0,348121,7.65,F G63,S +701,1,1,"Astor, Mrs. John Jacob (Madeleine Talmadge Force)",female,18,1,0,PC 17757,227.525,C62 C64,C +702,1,1,"Silverthorne, Mr. Spencer Victor",male,35,0,0,PC 17475,26.2875,E24,S +703,0,3,"Barbara, Miss. Saiide",female,18,0,1,2691,14.4542,,C +704,0,3,"Gallagher, Mr. Martin",male,25,0,0,36864,7.7417,,Q +705,0,3,"Hansen, Mr. Henrik Juul",male,26,1,0,350025,7.8542,,S +706,0,2,"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")",male,39,0,0,250655,26,,S +707,1,2,"Kelly, Mrs. Florence ""Fannie""",female,45,0,0,223596,13.5,,S +708,1,1,"Calderhead, Mr. Edward Pennington",male,42,0,0,PC 17476,26.2875,E24,S +709,1,1,"Cleaver, Miss. Alice",female,22,0,0,113781,151.55,,S +710,1,3,"Moubarek, Master. Halim Gonios (""William George"")",male,,1,1,2661,15.2458,,C +711,1,1,"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")",female,24,0,0,PC 17482,49.5042,C90,C +712,0,1,"Klaber, Mr. Herman",male,,0,0,113028,26.55,C124,S +713,1,1,"Taylor, Mr. Elmer Zebley",male,48,1,0,19996,52,C126,S +714,0,3,"Larsson, Mr. August Viktor",male,29,0,0,7545,9.4833,,S +715,0,2,"Greenberg, Mr. Samuel",male,52,0,0,250647,13,,S +716,0,3,"Soholt, Mr. Peter Andreas Lauritz Andersen",male,19,0,0,348124,7.65,F G73,S +717,1,1,"Endres, Miss. Caroline Louise",female,38,0,0,PC 17757,227.525,C45,C +718,1,2,"Troutt, Miss. Edwina Celia ""Winnie""",female,27,0,0,34218,10.5,E101,S +719,0,3,"McEvoy, Mr. Michael",male,,0,0,36568,15.5,,Q +720,0,3,"Johnson, Mr. Malkolm Joackim",male,33,0,0,347062,7.775,,S +721,1,2,"Harper, Miss. Annie Jessie ""Nina""",female,6,0,1,248727,33,,S +722,0,3,"Jensen, Mr. Svend Lauritz",male,17,1,0,350048,7.0542,,S +723,0,2,"Gillespie, Mr. William Henry",male,34,0,0,12233,13,,S +724,0,2,"Hodges, Mr. Henry Price",male,50,0,0,250643,13,,S +725,1,1,"Chambers, Mr. Norman Campbell",male,27,1,0,113806,53.1,E8,S +726,0,3,"Oreskovic, Mr. Luka",male,20,0,0,315094,8.6625,,S +727,1,2,"Renouf, Mrs. Peter Henry (Lillian Jefferys)",female,30,3,0,31027,21,,S +728,1,3,"Mannion, Miss. Margareth",female,,0,0,36866,7.7375,,Q +729,0,2,"Bryhl, Mr. Kurt Arnold Gottfrid",male,25,1,0,236853,26,,S +730,0,3,"Ilmakangas, Miss. Pieta Sofia",female,25,1,0,STON/O2. 3101271,7.925,,S +731,1,1,"Allen, Miss. Elisabeth Walton",female,29,0,0,24160,211.3375,B5,S +732,0,3,"Hassan, Mr. Houssein G N",male,11,0,0,2699,18.7875,,C +733,0,2,"Knight, Mr. Robert J",male,,0,0,239855,0,,S +734,0,2,"Berriman, Mr. William John",male,23,0,0,28425,13,,S +735,0,2,"Troupiansky, Mr. Moses Aaron",male,23,0,0,233639,13,,S +736,0,3,"Williams, Mr. Leslie",male,28.5,0,0,54636,16.1,,S +737,0,3,"Ford, Mrs. Edward (Margaret Ann Watson)",female,48,1,3,W./C. 6608,34.375,,S +738,1,1,"Lesurer, Mr. Gustave J",male,35,0,0,PC 17755,512.3292,B101,C +739,0,3,"Ivanoff, Mr. Kanio",male,,0,0,349201,7.8958,,S +740,0,3,"Nankoff, Mr. Minko",male,,0,0,349218,7.8958,,S +741,1,1,"Hawksford, Mr. Walter James",male,,0,0,16988,30,D45,S +742,0,1,"Cavendish, Mr. Tyrell William",male,36,1,0,19877,78.85,C46,S +743,1,1,"Ryerson, Miss. Susan Parker ""Suzette""",female,21,2,2,PC 17608,262.375,B57 B59 B63 B66,C +744,0,3,"McNamee, Mr. Neal",male,24,1,0,376566,16.1,,S +745,1,3,"Stranden, Mr. Juho",male,31,0,0,STON/O 2. 3101288,7.925,,S +746,0,1,"Crosby, Capt. Edward Gifford",male,70,1,1,WE/P 5735,71,B22,S +747,0,3,"Abbott, Mr. Rossmore Edward",male,16,1,1,C.A. 2673,20.25,,S +748,1,2,"Sinkkonen, Miss. Anna",female,30,0,0,250648,13,,S +749,0,1,"Marvin, Mr. Daniel Warner",male,19,1,0,113773,53.1,D30,S +750,0,3,"Connaghton, Mr. Michael",male,31,0,0,335097,7.75,,Q +751,1,2,"Wells, Miss. Joan",female,4,1,1,29103,23,,S +752,1,3,"Moor, Master. Meier",male,6,0,1,392096,12.475,E121,S +753,0,3,"Vande Velde, Mr. Johannes Joseph",male,33,0,0,345780,9.5,,S +754,0,3,"Jonkoff, Mr. Lalio",male,23,0,0,349204,7.8958,,S +755,1,2,"Herman, Mrs. Samuel (Jane Laver)",female,48,1,2,220845,65,,S +756,1,2,"Hamalainen, Master. Viljo",male,0.67,1,1,250649,14.5,,S +757,0,3,"Carlsson, Mr. August Sigfrid",male,28,0,0,350042,7.7958,,S +758,0,2,"Bailey, Mr. Percy Andrew",male,18,0,0,29108,11.5,,S +759,0,3,"Theobald, Mr. Thomas Leonard",male,34,0,0,363294,8.05,,S +760,1,1,"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)",female,33,0,0,110152,86.5,B77,S +761,0,3,"Garfirth, Mr. John",male,,0,0,358585,14.5,,S +762,0,3,"Nirva, Mr. Iisakki Antino Aijo",male,41,0,0,SOTON/O2 3101272,7.125,,S +763,1,3,"Barah, Mr. Hanna Assi",male,20,0,0,2663,7.2292,,C +764,1,1,"Carter, Mrs. William Ernest (Lucile Polk)",female,36,1,2,113760,120,B96 B98,S +765,0,3,"Eklund, Mr. Hans Linus",male,16,0,0,347074,7.775,,S +766,1,1,"Hogeboom, Mrs. John C (Anna Andrews)",female,51,1,0,13502,77.9583,D11,S +767,0,1,"Brewe, Dr. Arthur Jackson",male,,0,0,112379,39.6,,C +768,0,3,"Mangan, Miss. Mary",female,30.5,0,0,364850,7.75,,Q +769,0,3,"Moran, Mr. Daniel J",male,,1,0,371110,24.15,,Q +770,0,3,"Gronnestad, Mr. Daniel Danielsen",male,32,0,0,8471,8.3625,,S +771,0,3,"Lievens, Mr. Rene Aime",male,24,0,0,345781,9.5,,S +772,0,3,"Jensen, Mr. Niels Peder",male,48,0,0,350047,7.8542,,S +773,0,2,"Mack, Mrs. (Mary)",female,57,0,0,S.O./P.P. 3,10.5,E77,S +774,0,3,"Elias, Mr. Dibo",male,,0,0,2674,7.225,,C +775,1,2,"Hocking, Mrs. Elizabeth (Eliza Needs)",female,54,1,3,29105,23,,S +776,0,3,"Myhrman, Mr. Pehr Fabian Oliver Malkolm",male,18,0,0,347078,7.75,,S +777,0,3,"Tobin, Mr. Roger",male,,0,0,383121,7.75,F38,Q +778,1,3,"Emanuel, Miss. Virginia Ethel",female,5,0,0,364516,12.475,,S +779,0,3,"Kilgannon, Mr. Thomas J",male,,0,0,36865,7.7375,,Q +780,1,1,"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)",female,43,0,1,24160,211.3375,B3,S +781,1,3,"Ayoub, Miss. Banoura",female,13,0,0,2687,7.2292,,C +782,1,1,"Dick, Mrs. Albert Adrian (Vera Gillespie)",female,17,1,0,17474,57,B20,S +783,0,1,"Long, Mr. Milton Clyde",male,29,0,0,113501,30,D6,S +784,0,3,"Johnston, Mr. Andrew G",male,,1,2,W./C. 6607,23.45,,S +785,0,3,"Ali, Mr. William",male,25,0,0,SOTON/O.Q. 3101312,7.05,,S +786,0,3,"Harmer, Mr. Abraham (David Lishin)",male,25,0,0,374887,7.25,,S +787,1,3,"Sjoblom, Miss. Anna Sofia",female,18,0,0,3101265,7.4958,,S +788,0,3,"Rice, Master. George Hugh",male,8,4,1,382652,29.125,,Q +789,1,3,"Dean, Master. Bertram Vere",male,1,1,2,C.A. 2315,20.575,,S +790,0,1,"Guggenheim, Mr. Benjamin",male,46,0,0,PC 17593,79.2,B82 B84,C +791,0,3,"Keane, Mr. Andrew ""Andy""",male,,0,0,12460,7.75,,Q +792,0,2,"Gaskell, Mr. Alfred",male,16,0,0,239865,26,,S +793,0,3,"Sage, Miss. Stella Anna",female,,8,2,CA. 2343,69.55,,S +794,0,1,"Hoyt, Mr. William Fisher",male,,0,0,PC 17600,30.6958,,C +795,0,3,"Dantcheff, Mr. Ristiu",male,25,0,0,349203,7.8958,,S +796,0,2,"Otter, Mr. Richard",male,39,0,0,28213,13,,S +797,1,1,"Leader, Dr. Alice (Farnham)",female,49,0,0,17465,25.9292,D17,S +798,1,3,"Osman, Mrs. Mara",female,31,0,0,349244,8.6833,,S +799,0,3,"Ibrahim Shawah, Mr. Yousseff",male,30,0,0,2685,7.2292,,C +800,0,3,"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)",female,30,1,1,345773,24.15,,S +801,0,2,"Ponesell, Mr. Martin",male,34,0,0,250647,13,,S +802,1,2,"Collyer, Mrs. Harvey (Charlotte Annie Tate)",female,31,1,1,C.A. 31921,26.25,,S +803,1,1,"Carter, Master. William Thornton II",male,11,1,2,113760,120,B96 B98,S +804,1,3,"Thomas, Master. Assad Alexander",male,0.42,0,1,2625,8.5167,,C +805,1,3,"Hedman, Mr. Oskar Arvid",male,27,0,0,347089,6.975,,S +806,0,3,"Johansson, Mr. Karl Johan",male,31,0,0,347063,7.775,,S +807,0,1,"Andrews, Mr. Thomas Jr",male,39,0,0,112050,0,A36,S +808,0,3,"Pettersson, Miss. Ellen Natalia",female,18,0,0,347087,7.775,,S +809,0,2,"Meyer, Mr. August",male,39,0,0,248723,13,,S +810,1,1,"Chambers, Mrs. Norman Campbell (Bertha Griggs)",female,33,1,0,113806,53.1,E8,S +811,0,3,"Alexander, Mr. William",male,26,0,0,3474,7.8875,,S +812,0,3,"Lester, Mr. James",male,39,0,0,A/4 48871,24.15,,S +813,0,2,"Slemen, Mr. Richard James",male,35,0,0,28206,10.5,,S +814,0,3,"Andersson, Miss. Ebba Iris Alfrida",female,6,4,2,347082,31.275,,S +815,0,3,"Tomlin, Mr. Ernest Portage",male,30.5,0,0,364499,8.05,,S +816,0,1,"Fry, Mr. Richard",male,,0,0,112058,0,B102,S +817,0,3,"Heininen, Miss. Wendla Maria",female,23,0,0,STON/O2. 3101290,7.925,,S +818,0,2,"Mallet, Mr. Albert",male,31,1,1,S.C./PARIS 2079,37.0042,,C +819,0,3,"Holm, Mr. John Fredrik Alexander",male,43,0,0,C 7075,6.45,,S +820,0,3,"Skoog, Master. Karl Thorsten",male,10,3,2,347088,27.9,,S +821,1,1,"Hays, Mrs. Charles Melville (Clara Jennings Gregg)",female,52,1,1,12749,93.5,B69,S +822,1,3,"Lulic, Mr. Nikola",male,27,0,0,315098,8.6625,,S +823,0,1,"Reuchlin, Jonkheer. John George",male,38,0,0,19972,0,,S +824,1,3,"Moor, Mrs. (Beila)",female,27,0,1,392096,12.475,E121,S +825,0,3,"Panula, Master. Urho Abraham",male,2,4,1,3101295,39.6875,,S +826,0,3,"Flynn, Mr. John",male,,0,0,368323,6.95,,Q +827,0,3,"Lam, Mr. Len",male,,0,0,1601,56.4958,,S +828,1,2,"Mallet, Master. Andre",male,1,0,2,S.C./PARIS 2079,37.0042,,C +829,1,3,"McCormack, Mr. Thomas Joseph",male,,0,0,367228,7.75,,Q +830,1,1,"Stone, Mrs. George Nelson (Martha Evelyn)",female,62,0,0,113572,80,B28, +831,1,3,"Yasbeck, Mrs. Antoni (Selini Alexander)",female,15,1,0,2659,14.4542,,C +832,1,2,"Richards, Master. George Sibley",male,0.83,1,1,29106,18.75,,S +833,0,3,"Saad, Mr. Amin",male,,0,0,2671,7.2292,,C +834,0,3,"Augustsson, Mr. Albert",male,23,0,0,347468,7.8542,,S +835,0,3,"Allum, Mr. Owen George",male,18,0,0,2223,8.3,,S +836,1,1,"Compton, Miss. Sara Rebecca",female,39,1,1,PC 17756,83.1583,E49,C +837,0,3,"Pasic, Mr. Jakob",male,21,0,0,315097,8.6625,,S +838,0,3,"Sirota, Mr. Maurice",male,,0,0,392092,8.05,,S +839,1,3,"Chip, Mr. Chang",male,32,0,0,1601,56.4958,,S +840,1,1,"Marechal, Mr. Pierre",male,,0,0,11774,29.7,C47,C +841,0,3,"Alhomaki, Mr. Ilmari Rudolf",male,20,0,0,SOTON/O2 3101287,7.925,,S +842,0,2,"Mudd, Mr. Thomas Charles",male,16,0,0,S.O./P.P. 3,10.5,,S +843,1,1,"Serepeca, Miss. Augusta",female,30,0,0,113798,31,,C +844,0,3,"Lemberopolous, Mr. Peter L",male,34.5,0,0,2683,6.4375,,C +845,0,3,"Culumovic, Mr. Jeso",male,17,0,0,315090,8.6625,,S +846,0,3,"Abbing, Mr. Anthony",male,42,0,0,C.A. 5547,7.55,,S +847,0,3,"Sage, Mr. Douglas Bullen",male,,8,2,CA. 2343,69.55,,S +848,0,3,"Markoff, Mr. Marin",male,35,0,0,349213,7.8958,,C +849,0,2,"Harper, Rev. John",male,28,0,1,248727,33,,S +850,1,1,"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)",female,,1,0,17453,89.1042,C92,C +851,0,3,"Andersson, Master. Sigvard Harald Elias",male,4,4,2,347082,31.275,,S +852,0,3,"Svensson, Mr. Johan",male,74,0,0,347060,7.775,,S +853,0,3,"Boulos, Miss. Nourelain",female,9,1,1,2678,15.2458,,C +854,1,1,"Lines, Miss. Mary Conover",female,16,0,1,PC 17592,39.4,D28,S +855,0,2,"Carter, Mrs. Ernest Courtenay (Lilian Hughes)",female,44,1,0,244252,26,,S +856,1,3,"Aks, Mrs. Sam (Leah Rosen)",female,18,0,1,392091,9.35,,S +857,1,1,"Wick, Mrs. George Dennick (Mary Hitchcock)",female,45,1,1,36928,164.8667,,S +858,1,1,"Daly, Mr. Peter Denis ",male,51,0,0,113055,26.55,E17,S +859,1,3,"Baclini, Mrs. Solomon (Latifa Qurban)",female,24,0,3,2666,19.2583,,C +860,0,3,"Razi, Mr. Raihed",male,,0,0,2629,7.2292,,C +861,0,3,"Hansen, Mr. Claus Peter",male,41,2,0,350026,14.1083,,S +862,0,2,"Giles, Mr. Frederick Edward",male,21,1,0,28134,11.5,,S +863,1,1,"Swift, Mrs. Frederick Joel (Margaret Welles Barron)",female,48,0,0,17466,25.9292,D17,S +864,0,3,"Sage, Miss. Dorothy Edith ""Dolly""",female,,8,2,CA. 2343,69.55,,S +865,0,2,"Gill, Mr. John William",male,24,0,0,233866,13,,S +866,1,2,"Bystrom, Mrs. (Karolina)",female,42,0,0,236852,13,,S +867,1,2,"Duran y More, Miss. Asuncion",female,27,1,0,SC/PARIS 2149,13.8583,,C +868,0,1,"Roebling, Mr. Washington Augustus II",male,31,0,0,PC 17590,50.4958,A24,S +869,0,3,"van Melkebeke, Mr. Philemon",male,,0,0,345777,9.5,,S +870,1,3,"Johnson, Master. Harold Theodor",male,4,1,1,347742,11.1333,,S +871,0,3,"Balkic, Mr. Cerin",male,26,0,0,349248,7.8958,,S +872,1,1,"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)",female,47,1,1,11751,52.5542,D35,S +873,0,1,"Carlsson, Mr. Frans Olof",male,33,0,0,695,5,B51 B53 B55,S +874,0,3,"Vander Cruyssen, Mr. Victor",male,47,0,0,345765,9,,S +875,1,2,"Abelson, Mrs. Samuel (Hannah Wizosky)",female,28,1,0,P/PP 3381,24,,C +876,1,3,"Najib, Miss. Adele Kiamie ""Jane""",female,15,0,0,2667,7.225,,C +877,0,3,"Gustafsson, Mr. Alfred Ossian",male,20,0,0,7534,9.8458,,S +878,0,3,"Petroff, Mr. Nedelio",male,19,0,0,349212,7.8958,,S +879,0,3,"Laleff, Mr. Kristo",male,,0,0,349217,7.8958,,S +880,1,1,"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)",female,56,0,1,11767,83.1583,C50,C +881,1,2,"Shelley, Mrs. William (Imanita Parrish Hall)",female,25,0,1,230433,26,,S +882,0,3,"Markun, Mr. Johann",male,33,0,0,349257,7.8958,,S +883,0,3,"Dahlberg, Miss. Gerda Ulrika",female,22,0,0,7552,10.5167,,S +884,0,2,"Banfield, Mr. Frederick James",male,28,0,0,C.A./SOTON 34068,10.5,,S +885,0,3,"Sutehall, Mr. Henry Jr",male,25,0,0,SOTON/OQ 392076,7.05,,S +886,0,3,"Rice, Mrs. William (Margaret Norton)",female,39,0,5,382652,29.125,,Q +887,0,2,"Montvila, Rev. Juozas",male,27,0,0,211536,13,,S +888,1,1,"Graham, Miss. Margaret Edith",female,19,0,0,112053,30,B42,S +889,0,3,"Johnston, Miss. Catherine Helen ""Carrie""",female,,1,2,W./C. 6607,23.45,,S +890,1,1,"Behr, Mr. Karl Howell",male,26,0,0,111369,30,C148,C +891,0,3,"Dooley, Mr. Patrick",male,32,0,0,370376,7.75,,Q diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..9d430e4 --- /dev/null +++ b/_config.yml @@ -0,0 +1,2 @@ +theme: jekyll-theme-hacker +