diff --git a/.gitignore b/.gitignore index c03f0d0..7b0bfc6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,8 @@ __pycache__/ *.py[cod] *$py.class -.DS_Store/ -**/.DS_Store/ +.DS_Store +**/.DS_Store .env/ **/.env/ diff --git "a/python-for-engineering/1 Manejo de Archivos en Python/1 Introducci\303\263n.ipynb" "b/python-for-engineering/1 Manejo de Archivos en Python/1 Introducci\303\263n.ipynb" deleted file mode 100644 index 42c9cfa..0000000 --- "a/python-for-engineering/1 Manejo de Archivos en Python/1 Introducci\303\263n.ipynb" +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Introducción al manejo de archivos en Python\n", - "\n", - "Python es una poderosa herramiento que nos puede ayudar a realizar distintos tipos de tareas, como automatización, cálculos ciéntificos, aprendizaje automático, análisis de datos y más. \n", - "\n", - "Imaginemos que queremos hacer un análisis sobre las notas de los alumnos de alguna universidad con respecto a algunos parámetros como la cantidad de sus horas de sueño, la cantidad de horas diarias dedicadas a estudiar, porcentaje de asistencias a clases. Para este análisis, entonces, vamos a recoger datos de los alumnos mediante entrevistas o formularios. Posteriormente, estos datos se encontrarán almacenados en algún archivo, y el tipo de este archivo puede ser TXT, CSV, Excel, JSON, o algun otro tipo más. Dentro de esta carpeta, encontraremos un archivo llamado `notas.txt`, donde encontraremos el reporte de 1000 alumnos (son datos generados artificialmente). Los primeros diez reportes son:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Notas\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Cada reporte consiste en la cantidad de horas de sueño, cantidad de horas de estudio diarias, porcentaje de asistencia a clases, nota obtenida.\n", - "\n", - "Para que Python pueda realizar cálculos sobre este conjuntos de datos, necesitamos *cargar* los datos a Python y almacenarlos en alguna estructura de datos. Podríamos intentar añadir cada reporte manualmente en una lista:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = []\n", - "\n", - "grades.append((5, 8, 51, 14))\n", - "grades.append((8, 5, 99, 18))\n", - "grades.append((5, 10, 67, 14))\n", - "# 997 líneas más\n", - "# ...\n", - "# ..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Añadir manualmente los 1000 reportes es ineficiente y nos tardaríamos mucho. Por suerte, Python cuenta con librerías y métodos que nos va a permitir leer datos de distintos tipos de archivos como los ya mencionados. \n", - "\n", - "Ejecutemos el siguiente código, que lee el archivo `notas.txt` y carga los 1000 reportes en una lista:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades_file = open('notas.txt', 'r')\n", - "\n", - "grades = grades_file.read().splitlines()\n", - "\n", - "for i, line in enumerate(grades):\n", - " line = line.split(' ')\n", - " grades[i] = tuple(line)\n", - "\n", - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# La lista 'grades' contiene los 1000 reportes de los alumnos\n", - "\n", - "len(grades)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ahora que tenemos cargados los datos, podemos empezar a realizar análisis sobre estos datos. Y además, Python también nos permite guardar los resultados obtenidos en algún archivo, por ejemplo `results.txt`. \n", - "\n", - "Es importante saber leer y escribir en distintos tipos de archivo con Python, y es lo que aprenderemos en este primer capítulo del curso." - ] - } - ], - "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.9.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/python-for-engineering/1 Manejo de Archivos en Python/1 Introduction.ipynb b/python-for-engineering/1 Manejo de Archivos en Python/1 Introduction.ipynb new file mode 100644 index 0000000..d083bc4 --- /dev/null +++ b/python-for-engineering/1 Manejo de Archivos en Python/1 Introduction.ipynb @@ -0,0 +1,1203 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introducción al manejo de archivos en Python\n", + "\n", + "Python es una poderosa herramiento que nos puede ayudar a realizar distintos tipos de tareas, como automatización, cálculos ciéntificos, aprendizaje automático, análisis de datos y más. \n", + "\n", + "Imaginemos que queremos hacer un análisis sobre las notas de los alumnos de alguna universidad con respecto a algunos parámetros como la cantidad de sus horas de sueño, la cantidad de horas diarias dedicadas a estudiar, porcentaje de asistencias a clases. Para este análisis, entonces, vamos a recoger datos de los alumnos mediante entrevistas o formularios. Posteriormente, estos datos se encontrarán almacenados en algún archivo, y el tipo de este archivo puede ser TXT, CSV, Excel, JSON, o algun otro tipo más. Dentro de esta carpeta, encontraremos un archivo llamado `notas.txt`, donde encontraremos el reporte de 1000 alumnos (son datos generados artificialmente). Los primeros diez reportes son:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Notas\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cada reporte consiste en la cantidad de horas de sueño, cantidad de horas de estudio diarias, porcentaje de asistencia a clases, nota obtenida.\n", + "\n", + "Para que Python pueda realizar cálculos sobre este conjuntos de datos, necesitamos *cargar* los datos a Python y almacenarlos en alguna estructura de datos. Podríamos intentar añadir cada reporte manualmente en una lista:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(5, 8, 51, 14), (8, 5, 99, 18), (5, 10, 67, 14)]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grades = []\n", + "\n", + "grades.append((5, 8, 51, 14))\n", + "grades.append((8, 5, 99, 18))\n", + "grades.append((5, 10, 67, 14))\n", + "# 997 líneas más\n", + "# ...\n", + "# ...\n", + "grades" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Añadir manualmente los 1000 reportes es ineficiente y nos tardaríamos mucho. Por suerte, Python cuenta con librerías y métodos que nos va a permitir leer datos de distintos tipos de archivos como los ya mencionados. \n", + "\n", + "Ejecutemos el siguiente código, que lee el archivo `notas.txt` y carga los 1000 reportes en una lista:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# reserved word\n", + "for if in and or\n", + "# signals\n", + "== = + - % \n", + "# funciones\n", + "input() print() enumerate() len() type() dir() ejecutar()\n", + "# variables\n", + "name = \"jean pierre\" size = 10" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "name = \"Hola mundo!\"\n", + "dir(name)\n", + "name = name.upper()\n", + "#name.size\n", + "print(type(name))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Hola mundo cruel!', 'Hola mundo lindo!']" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var = \"Hola mundo cruel!\\nHola mundo lindo!\".splitlines()\n", + "var" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "[('5', '8', '51', '14'),\n", + " ('8', '5', '99', '18'),\n", + " ('5', '10', '67', '14'),\n", + " ('7', '7', '65', '14'),\n", + " ('9', '9', '100', '14'),\n", + " ('7', '7', '62', '13'),\n", + " ('5', '6', '81', '14'),\n", + " ('10', '7', '53', '20'),\n", + " ('10', '9', '88', '17'),\n", + " ('5', '9', '54', '17'),\n", + " ('4', '8', '46', '16'),\n", + " ('7', '9', '78', '15'),\n", + " ('6', '7', '58', '20'),\n", + " ('4', '8', '45', '15'),\n", + " ('8', '9', '70', '18'),\n", + " ('8', '4', '95', '14'),\n", + " ('5', '8', '78', '19'),\n", + " ('6', '5', '54', '14'),\n", + " ('5', '6', '76', '13'),\n", + " ('8', '8', '96', '20'),\n", + " ('10', '6', '85', '18'),\n", + " ('4', '10', '70', '13'),\n", + " ('6', '7', '73', '20'),\n", + " ('4', '9', '92', '14'),\n", + " ('8', '5', '80', '17'),\n", + " ('6', '9', '46', '15'),\n", + " ('10', '6', '87', '13'),\n", + " ('5', '9', '55', '17'),\n", + " ('8', '9', '54', '16'),\n", + " ('9', '10', '96', '20'),\n", + " ('4', '7', '44', '13'),\n", + " ('10', '10', '51', '15'),\n", + " ('8', '6', '54', '19'),\n", + " ('6', '7', '55', '17'),\n", + " ('9', '8', '57', '13'),\n", + " ('4', '5', '47', '19'),\n", + " ('8', '9', '42', '13'),\n", + " ('7', '8', '93', '20'),\n", + " ('6', '4', '53', '15'),\n", + " ('6', '10', '51', '13'),\n", + " ('10', '5', '92', '18'),\n", + " ('4', '5', '71', '14'),\n", + " ('8', '8', '87', '20'),\n", + " ('4', '8', '66', '18'),\n", + " ('6', '4', '75', '14'),\n", + " ('8', '9', '97', '16'),\n", + " ('5', '5', '62', '19'),\n", + " ('6', '9', '85', '18'),\n", + " ('8', '4', '66', '14'),\n", + " ('8', '5', '84', '16'),\n", + " ('8', '6', '71', '17'),\n", + " ('10', '10', '93', '14'),\n", + " ('5', '8', '94', '19'),\n", + " ('4', '9', '99', '14'),\n", + " ('5', '7', '85', '15'),\n", + " ('8', '8', '46', '14'),\n", + " ('8', '4', '53', '20'),\n", + " ('6', '6', '63', '13'),\n", + " ('5', '4', '56', '20'),\n", + " ('8', '6', '61', '15'),\n", + " ('9', '8', '94', '17'),\n", + " ('4', '5', '78', '14'),\n", + " ('9', '8', '93', '13'),\n", + " ('10', '10', '55', '13'),\n", + " ('5', '10', '91', '17'),\n", + " ('5', '8', '93', '17'),\n", + " ('10', '5', '61', '19'),\n", + " ('10', '8', '93', '14'),\n", + " ('4', '10', '41', '19'),\n", + " ('9', '10', '93', '13'),\n", + " ('4', '6', '41', '15'),\n", + " ('7', '4', '73', '17'),\n", + " ('6', '7', '82', '13'),\n", + " ('6', '5', '41', '19'),\n", + " ('10', '4', '40', '18'),\n", + " ('10', '9', '77', '20'),\n", + " ('5', '5', '66', '20'),\n", + " ('10', '5', '93', '18'),\n", + " ('8', '9', '85', '13'),\n", + " ('5', '4', '92', '14'),\n", + " ('5', '7', '53', '20'),\n", + " ('8', '5', '69', '19'),\n", + " ('8', '5', '59', '20'),\n", + " ('7', '8', '70', '20'),\n", + " ('6', '10', '98', '17'),\n", + " ('6', '5', '44', '16'),\n", + " ('10', '7', '58', '19'),\n", + " ('7', '4', '72', '16'),\n", + " ('8', '4', '82', '15'),\n", + " ('8', '8', '53', '14'),\n", + " ('8', '10', '58', '16'),\n", + " ('7', '10', '53', '18'),\n", + " ('4', '4', '90', '19'),\n", + " ('6', '8', '50', '18'),\n", + " ('6', '9', '48', '20'),\n", + " ('8', '7', '90', '15'),\n", + " ('4', '10', '60', '17'),\n", + " ('7', '9', '96', '20'),\n", + " ('4', '4', '45', '18'),\n", + " ('4', '5', '62', '20'),\n", + " ('8', '8', '99', '15'),\n", + " ('7', '4', '51', '17'),\n", + " ('7', '8', '41', '17'),\n", + " ('6', '6', '70', '18'),\n", + " ('6', '6', '82', '20'),\n", + " ('9', '9', '59', '13'),\n", + " ('10', '4', '42', '19'),\n", + " ('10', '4', '41', '16'),\n", + " ('4', '8', '71', '16'),\n", + " ('6', '10', '87', '14'),\n", + " ('6', '4', '78', '14'),\n", + " ('4', '9', '46', '15'),\n", + " ('8', '7', '73', '18'),\n", + " ('10', '6', '53', '18'),\n", + " ('8', '6', '71', '17'),\n", + " ('9', '6', '52', '20'),\n", + " ('5', '8', '48', '19'),\n", + " ('5', '6', '90', '13'),\n", + " ('8', '5', '66', '16'),\n", + " ('6', '5', '41', '13'),\n", + " ('4', '6', '51', '19'),\n", + " ('5', '5', '84', '17'),\n", + " ('10', '4', '71', '16'),\n", + " ('9', '8', '80', '20'),\n", + " ('8', '4', '81', '13'),\n", + " ('9', '6', '44', '19'),\n", + " ('10', '9', '70', '18'),\n", + " ('10', '4', '77', '19'),\n", + " ('9', '5', '73', '15'),\n", + " ('9', '4', '76', '20'),\n", + " ('6', '4', '56', '16'),\n", + " ('7', '4', '95', '16'),\n", + " ('4', '9', '100', '16'),\n", + " ('6', '8', '50', '19'),\n", + " ('10', '10', '78', '16'),\n", + " ('5', '7', '61', '15'),\n", + " ('5', '8', '45', '20'),\n", + " ('6', '4', '94', '16'),\n", + " ('9', '7', '72', '17'),\n", + " ('7', '6', '49', '16'),\n", + " ('9', '8', '80', '16'),\n", + " ('8', '7', '83', '17'),\n", + " ('6', '6', '100', '17'),\n", + " ('4', '4', '76', '17'),\n", + " ('8', '7', '85', '13'),\n", + " ('9', '7', '46', '17'),\n", + " ('8', '4', '99', '16'),\n", + " ('6', '10', '89', '18'),\n", + " ('5', '9', '94', '14'),\n", + " ('10', '7', '50', '16'),\n", + " ('10', '9', '42', '20'),\n", + " ('9', '9', '40', '16'),\n", + " ('8', '6', '92', '20'),\n", + " ('9', '4', '80', '17'),\n", + " ('7', '4', '63', '17'),\n", + " ('8', '6', '47', '13'),\n", + " ('7', '7', '43', '14'),\n", + " ('9', '4', '98', '20'),\n", + " ('7', '4', '74', '13'),\n", + " ('6', '7', '50', '17'),\n", + " ('4', '10', '68', '19'),\n", + " ('6', '9', '83', '15'),\n", + " ('7', '7', '89', '16'),\n", + " ('7', '7', '63', '15'),\n", + " ('8', '9', '64', '14'),\n", + " ('5', '4', '99', '17'),\n", + " ('6', '5', '51', '20'),\n", + " ('9', '9', '79', '20'),\n", + " ('9', '5', '95', '16'),\n", + " ('5', '10', '88', '15'),\n", + " ('10', '9', '59', '20'),\n", + " ('5', '9', '58', '17'),\n", + " ('9', '6', '68', '15'),\n", + " ('7', '10', '70', '13'),\n", + " ('8', '6', '100', '20'),\n", + " ('8', '4', '81', '18'),\n", + " ('8', '5', '73', '17'),\n", + " ('8', '8', '68', '15'),\n", + " ('5', '10', '50', '15'),\n", + " ('10', '4', '54', '17'),\n", + " ('5', '6', '80', '19'),\n", + " ('8', '10', '59', '20'),\n", + " ('6', '5', '58', '14'),\n", + " ('6', '6', '83', '19'),\n", + " ('7', '10', '64', '14'),\n", + " ('10', '5', '79', '13'),\n", + " ('8', '7', '92', '20'),\n", + " ('9', '10', '40', '19'),\n", + " ('4', '5', '60', '20'),\n", + " ('5', '6', '71', '15'),\n", + " ('4', '4', '66', '17'),\n", + " ('4', '9', '43', '13'),\n", + " ('9', '8', '50', '15'),\n", + " ('8', '7', '50', '20'),\n", + " ('5', '10', '78', '18'),\n", + " ('8', '8', '78', '14'),\n", + " ('8', '10', '50', '14'),\n", + " ('7', '6', '41', '14'),\n", + " ('6', '8', '86', '16'),\n", + " ('6', '5', '98', '16'),\n", + " ('4', '8', '96', '19'),\n", + " ('4', '5', '52', '13'),\n", + " ('7', '4', '72', '19'),\n", + " ('10', '8', '61', '19'),\n", + " ('6', '7', '94', '17'),\n", + " ('5', '7', '74', '17'),\n", + " ('9', '4', '47', '14'),\n", + " ('7', '7', '93', '16'),\n", + " ('5', '6', '58', '14'),\n", + " ('7', '6', '65', '13'),\n", + " ('9', '4', '45', '16'),\n", + " ('7', '10', '58', '17'),\n", + " ('9', '9', '49', '15'),\n", + " ('6', '5', '54', '18'),\n", + " ('5', '6', '55', '15'),\n", + " ('5', '10', '79', '18'),\n", + " ('9', '5', '88', '20'),\n", + " ('6', '8', '75', '14'),\n", + " ('4', '5', '56', '18'),\n", + " ('6', '9', '68', '16'),\n", + " ('10', '4', '52', '16'),\n", + " ('9', '4', '64', '14'),\n", + " ('7', '6', '75', '18'),\n", + " ('5', '8', '64', '15'),\n", + " ('8', '9', '100', '17'),\n", + " ('5', '5', '42', '18'),\n", + " ('10', '8', '100', '16'),\n", + " ('4', '7', '89', '14'),\n", + " ('4', '5', '50', '20'),\n", + " ('6', '6', '55', '16'),\n", + " ('10', '8', '49', '20'),\n", + " ('9', '6', '50', '13'),\n", + " ('8', '9', '82', '17'),\n", + " ('5', '5', '92', '18'),\n", + " ('10', '6', '48', '19'),\n", + " ('5', '5', '96', '13'),\n", + " ('4', '8', '72', '16'),\n", + " ('8', '9', '77', '19'),\n", + " ('7', '5', '40', '13'),\n", + " ('7', '8', '98', '18'),\n", + " ('6', '10', '94', '14'),\n", + " ('8', '5', '99', '17'),\n", + " ('5', '9', '49', '16'),\n", + " ('10', '7', '56', '14'),\n", + " ('5', '6', '88', '17'),\n", + " ('6', '9', '41', '14'),\n", + " ('8', '9', '43', '13'),\n", + " ('5', '9', '73', '16'),\n", + " ('8', '7', '86', '18'),\n", + " ('10', '5', '76', '13'),\n", + " ('7', '7', '68', '13'),\n", + " ('8', '8', '94', '16'),\n", + " ('7', '5', '89', '14'),\n", + " ('6', '10', '43', '19'),\n", + " ('9', '4', '74', '18'),\n", + " ('7', '5', '77', '20'),\n", + " ('7', '8', '62', '18'),\n", + " ('5', '4', '53', '14'),\n", + " ('10', '5', '55', '18'),\n", + " ('7', '10', '49', '20'),\n", + " ('5', '4', '74', '17'),\n", + " ('8', '8', '95', '13'),\n", + " ('8', '6', '71', '17'),\n", + " ('7', '10', '73', '20'),\n", + " ('6', '4', '87', '18'),\n", + " ('7', '8', '72', '16'),\n", + " ('8', '10', '87', '19'),\n", + " ('5', '7', '92', '17'),\n", + " ('10', '4', '76', '16'),\n", + " ('9', '7', '60', '15'),\n", + " ('6', '6', '100', '16'),\n", + " ('10', '4', '41', '15'),\n", + " ('9', '6', '55', '15'),\n", + " ('10', '9', '88', '16'),\n", + " ('9', '5', '91', '17'),\n", + " ('7', '10', '95', '17'),\n", + " ('8', '10', '69', '20'),\n", + " ('5', '5', '40', '19'),\n", + " ('7', '6', '81', '16'),\n", + " ('7', '6', '98', '17'),\n", + " ('6', '8', '52', '17'),\n", + " ('6', '6', '70', '19'),\n", + " ('10', '8', '52', '15'),\n", + " ('9', '4', '48', '15'),\n", + " ('4', '9', '73', '15'),\n", + " ('4', '5', '93', '14'),\n", + " ('5', '6', '49', '13'),\n", + " ('10', '7', '71', '17'),\n", + " ('4', '10', '76', '18'),\n", + " ('9', '5', '87', '19'),\n", + " ('10', '5', '52', '19'),\n", + " ('7', '5', '92', '15'),\n", + " ('8', '4', '86', '16'),\n", + " ('6', '5', '45', '19'),\n", + " ('4', '9', '45', '19'),\n", + " ('10', '7', '53', '14'),\n", + " ('4', '10', '95', '14'),\n", + " ('9', '8', '88', '20'),\n", + " ('9', '4', '98', '19'),\n", + " ('7', '6', '42', '16'),\n", + " ('10', '9', '40', '14'),\n", + " ('4', '10', '89', '19'),\n", + " ('10', '7', '90', '19'),\n", + " ('10', '10', '65', '18'),\n", + " ('7', '9', '64', '16'),\n", + " ('7', '4', '78', '13'),\n", + " ('6', '7', '79', '17'),\n", + " ('4', '10', '65', '20'),\n", + " ('7', '5', '70', '13'),\n", + " ('7', '9', '75', '16'),\n", + " ('9', '9', '70', '19'),\n", + " ('6', '9', '66', '17'),\n", + " ('10', '4', '85', '20'),\n", + " ('7', '9', '49', '15'),\n", + " ('6', '5', '92', '17'),\n", + " ('4', '10', '76', '13'),\n", + " ('5', '10', '91', '13'),\n", + " ('6', '6', '68', '17'),\n", + " ('6', '8', '48', '13'),\n", + " ('4', '4', '45', '18'),\n", + " ('10', '4', '94', '19'),\n", + " ('6', '7', '46', '14'),\n", + " ('5', '8', '50', '18'),\n", + " ('4', '10', '74', '14'),\n", + " ('6', '6', '76', '20'),\n", + " ('9', '8', '55', '19'),\n", + " ('9', '10', '71', '15'),\n", + " ('9', '10', '44', '20'),\n", + " ('9', '7', '52', '18'),\n", + " ('8', '7', '100', '13'),\n", + " ('5', '8', '76', '15'),\n", + " ('10', '6', '74', '15'),\n", + " ('10', '8', '64', '15'),\n", + " ('7', '10', '69', '13'),\n", + " ('6', '8', '79', '15'),\n", + " ('10', '7', '44', '17'),\n", + " ('10', '6', '64', '18'),\n", + " ('9', '6', '54', '18'),\n", + " ('5', '6', '50', '16'),\n", + " ('4', '5', '77', '18'),\n", + " ('4', '10', '80', '13'),\n", + " ('8', '4', '86', '17'),\n", + " ('8', '9', '48', '13'),\n", + " ('7', '4', '91', '15'),\n", + " ('8', '6', '74', '14'),\n", + " ('10', '6', '64', '15'),\n", + " ('5', '6', '69', '16'),\n", + " ('7', '8', '95', '20'),\n", + " ('7', '4', '99', '13'),\n", + " ('10', '10', '83', '13'),\n", + " ('4', '8', '64', '18'),\n", + " ('10', '7', '87', '13'),\n", + " ('4', '9', '87', '17'),\n", + " ('7', '9', '86', '14'),\n", + " ('8', '10', '60', '19'),\n", + " ('4', '9', '51', '14'),\n", + " ('8', '4', '45', '16'),\n", + " ('10', '4', '100', '19'),\n", + " ('4', '6', '81', '16'),\n", + " ('6', '9', '78', '18'),\n", + " ('9', '9', '62', '15'),\n", + " ('8', '5', '61', '15'),\n", + " ('8', '10', '50', '15'),\n", + " ('10', '6', '49', '14'),\n", + " ('9', '9', '72', '18'),\n", + " ('8', '8', '93', '13'),\n", + " ('8', '4', '64', '17'),\n", + " ('7', '5', '60', '19'),\n", + " ('5', '4', '98', '20'),\n", + " ('6', '7', '48', '20'),\n", + " ('5', '8', '43', '16'),\n", + " ('5', '9', '69', '17'),\n", + " ('8', '6', '59', '18'),\n", + " ('9', '8', '100', '16'),\n", + " ('4', '5', '51', '20'),\n", + " ('7', '8', '49', '16'),\n", + " ('6', '8', '84', '16'),\n", + " ('5', '9', '40', '13'),\n", + " ('4', '10', '95', '20'),\n", + " ('10', '7', '64', '13'),\n", + " ('10', '10', '53', '14'),\n", + " ('9', '7', '61', '17'),\n", + " ('7', '10', '44', '14'),\n", + " ('9', '5', '54', '13'),\n", + " ('7', '8', '41', '14'),\n", + " ('9', '5', '83', '15'),\n", + " ('8', '8', '71', '13'),\n", + " ('6', '7', '54', '14'),\n", + " ('8', '9', '61', '18'),\n", + " ('5', '7', '49', '15'),\n", + " ('4', '4', '95', '13'),\n", + " ('9', '8', '80', '19'),\n", + " ('5', '5', '49', '19'),\n", + " ('5', '4', '53', '19'),\n", + " ('6', '9', '41', '14'),\n", + " ('9', '7', '60', '14'),\n", + " ('4', '6', '93', '19'),\n", + " ('6', '10', '70', '14'),\n", + " ('10', '7', '89', '14'),\n", + " ('6', '6', '84', '13'),\n", + " ('5', '4', '40', '14'),\n", + " ('7', '9', '51', '20'),\n", + " ('8', '9', '88', '18'),\n", + " ('6', '10', '66', '20'),\n", + " ('5', '8', '78', '17'),\n", + " ('4', '5', '57', '16'),\n", + " ('9', '9', '65', '19'),\n", + " ('10', '10', '98', '14'),\n", + " ('5', '9', '96', '13'),\n", + " ('4', '6', '81', '19'),\n", + " ('9', '7', '51', '17'),\n", + " ('9', '7', '94', '20'),\n", + " ('7', '10', '54', '14'),\n", + " ('10', '8', '78', '15'),\n", + " ('9', '8', '79', '14'),\n", + " ('10', '6', '92', '17'),\n", + " ('9', '4', '94', '20'),\n", + " ('9', '8', '64', '15'),\n", + " ('5', '6', '43', '18'),\n", + " ('7', '5', '89', '20'),\n", + " ('4', '10', '95', '16'),\n", + " ('6', '4', '89', '14'),\n", + " ('6', '8', '75', '14'),\n", + " ('5', '7', '69', '17'),\n", + " ('7', '8', '97', '13'),\n", + " ('4', '5', '87', '17'),\n", + " ('7', '10', '44', '20'),\n", + " ('10', '5', '96', '20'),\n", + " ('8', '5', '57', '18'),\n", + " ('8', '9', '56', '19'),\n", + " ('8', '7', '63', '15'),\n", + " ('4', '10', '90', '20'),\n", + " ('9', '10', '48', '13'),\n", + " ('4', '7', '45', '15'),\n", + " ('8', '6', '94', '17'),\n", + " ('6', '6', '68', '20'),\n", + " ('8', '9', '49', '13'),\n", + " ('9', '10', '81', '18'),\n", + " ('10', '6', '86', '18'),\n", + " ('7', '10', '63', '17'),\n", + " ('10', '9', '90', '20'),\n", + " ('5', '9', '98', '18'),\n", + " ('9', '4', '66', '19'),\n", + " ('10', '4', '92', '15'),\n", + " ('9', '4', '54', '13'),\n", + " ('7', '7', '78', '13'),\n", + " ('8', '6', '92', '20'),\n", + " ('4', '9', '61', '20'),\n", + " ('6', '6', '75', '13'),\n", + " ('4', '7', '71', '16'),\n", + " ('9', '7', '77', '19'),\n", + " ('9', '8', '86', '14'),\n", + " ('7', '10', '59', '20'),\n", + " ('6', '5', '94', '14'),\n", + " ('4', '9', '60', '18'),\n", + " ('6', '6', '77', '20'),\n", + " ('10', '10', '70', '20'),\n", + " ('6', '4', '67', '16'),\n", + " ('8', '7', '85', '13'),\n", + " ('7', '9', '84', '20'),\n", + " ('6', '9', '98', '17'),\n", + " ('10', '4', '45', '17'),\n", + " ('4', '5', '56', '19'),\n", + " ('6', '6', '51', '16'),\n", + " ('4', '7', '73', '15'),\n", + " ('7', '10', '67', '18'),\n", + " ('5', '7', '87', '19'),\n", + " ('6', '6', '80', '16'),\n", + " ('6', '8', '57', '18'),\n", + " ('9', '4', '70', '19'),\n", + " ('7', '6', '90', '17'),\n", + " ('8', '7', '66', '17'),\n", + " ('10', '6', '99', '17'),\n", + " ('10', '5', '94', '19'),\n", + " ('7', '5', '58', '20'),\n", + " ('7', '5', '53', '13'),\n", + " ('4', '9', '62', '19'),\n", + " ('9', '10', '75', '18'),\n", + " ('9', '6', '72', '19'),\n", + " ('8', '8', '58', '15'),\n", + " ('7', '9', '67', '14'),\n", + " ('4', '10', '58', '16'),\n", + " ('8', '7', '61', '19'),\n", + " ('10', '9', '54', '19'),\n", + " ('9', '5', '79', '16'),\n", + " ('9', '5', '91', '18'),\n", + " ('10', '4', '87', '17'),\n", + " ('6', '10', '53', '13'),\n", + " ('4', '10', '94', '16'),\n", + " ('4', '10', '63', '16'),\n", + " ('4', '4', '84', '19'),\n", + " ('9', '10', '96', '18'),\n", + " ('8', '4', '92', '18'),\n", + " ('7', '9', '51', '14'),\n", + " ('7', '6', '78', '18'),\n", + " ('5', '7', '47', '17'),\n", + " ('4', '5', '83', '15'),\n", + " ('5', '10', '64', '14'),\n", + " ('7', '6', '100', '13'),\n", + " ('10', '4', '47', '19'),\n", + " ('6', '8', '94', '18'),\n", + " ('5', '9', '65', '15'),\n", + " ('9', '10', '78', '20'),\n", + " ('4', '7', '86', '15'),\n", + " ('6', '10', '75', '19'),\n", + " ('4', '6', '48', '13'),\n", + " ('10', '5', '91', '17'),\n", + " ('9', '6', '70', '13'),\n", + " ('9', '8', '41', '14'),\n", + " ('6', '8', '54', '15'),\n", + " ('7', '10', '64', '20'),\n", + " ('7', '7', '72', '15'),\n", + " ('6', '5', '90', '15'),\n", + " ('8', '6', '66', '17'),\n", + " ('6', '10', '97', '20'),\n", + " ('5', '8', '64', '13'),\n", + " ('4', '10', '53', '20'),\n", + " ('5', '5', '71', '19'),\n", + " ('6', '5', '51', '20'),\n", + " ('6', '5', '91', '18'),\n", + " ('4', '6', '54', '17'),\n", + " ('6', '10', '43', '17'),\n", + " ('10', '8', '81', '18'),\n", + " ('5', '5', '42', '13'),\n", + " ('4', '9', '63', '13'),\n", + " ('8', '4', '46', '17'),\n", + " ('8', '7', '95', '20'),\n", + " ('8', '10', '84', '13'),\n", + " ('4', '6', '97', '20'),\n", + " ('6', '6', '88', '17'),\n", + " ('7', '7', '86', '15'),\n", + " ('9', '4', '73', '19'),\n", + " ('4', '6', '75', '20'),\n", + " ('4', '4', '43', '13'),\n", + " ('10', '8', '56', '14'),\n", + " ('7', '4', '69', '13'),\n", + " ('6', '10', '84', '19'),\n", + " ('9', '10', '94', '13'),\n", + " ('8', '5', '52', '20'),\n", + " ('9', '7', '95', '20'),\n", + " ('8', '9', '98', '15'),\n", + " ('5', '8', '67', '16'),\n", + " ('9', '4', '49', '18'),\n", + " ('10', '9', '43', '17'),\n", + " ('8', '5', '66', '19'),\n", + " ('7', '4', '51', '20'),\n", + " ('10', '4', '59', '16'),\n", + " ('5', '7', '56', '15'),\n", + " ('4', '10', '93', '18'),\n", + " ('5', '5', '52', '13'),\n", + " ('7', '6', '47', '19'),\n", + " ('7', '4', '72', '14'),\n", + " ('5', '6', '56', '15'),\n", + " ('5', '4', '47', '13'),\n", + " ('8', '8', '73', '17'),\n", + " ('10', '9', '43', '19'),\n", + " ('9', '7', '53', '17'),\n", + " ('9', '5', '64', '16'),\n", + " ('7', '4', '54', '18'),\n", + " ('6', '10', '43', '14'),\n", + " ('8', '10', '84', '15'),\n", + " ('5', '5', '78', '17'),\n", + " ('7', '8', '73', '20'),\n", + " ('5', '7', '43', '20'),\n", + " ('5', '4', '79', '18'),\n", + " ('7', '8', '78', '16'),\n", + " ('5', '8', '85', '14'),\n", + " ('5', '10', '94', '20'),\n", + " ('8', '10', '41', '17'),\n", + " ('10', '5', '53', '16'),\n", + " ('8', '5', '66', '17'),\n", + " ('9', '5', '84', '18'),\n", + " ('10', '4', '46', '14'),\n", + " ('10', '6', '74', '13'),\n", + " ('9', '10', '53', '16'),\n", + " ('5', '8', '95', '15'),\n", + " ('4', '6', '52', '18'),\n", + " ('5', '4', '88', '19'),\n", + " ('6', '4', '99', '20'),\n", + " ('6', '9', '43', '13'),\n", + " ('6', '9', '99', '13'),\n", + " ('8', '4', '52', '15'),\n", + " ('10', '10', '57', '14'),\n", + " ('7', '4', '58', '15'),\n", + " ('9', '8', '42', '14'),\n", + " ('7', '8', '44', '19'),\n", + " ('8', '10', '91', '20'),\n", + " ('10', '4', '40', '18'),\n", + " ('6', '4', '84', '19'),\n", + " ('7', '6', '65', '19'),\n", + " ('7', '5', '42', '18'),\n", + " ('4', '8', '75', '15'),\n", + " ('8', '9', '40', '19'),\n", + " ('9', '8', '47', '17'),\n", + " ('9', '6', '50', '20'),\n", + " ('5', '9', '89', '16'),\n", + " ('9', '6', '84', '18'),\n", + " ('5', '7', '44', '18'),\n", + " ('7', '8', '73', '17'),\n", + " ('4', '4', '98', '20'),\n", + " ('7', '4', '81', '20'),\n", + " ('6', '6', '43', '19'),\n", + " ('5', '8', '44', '14'),\n", + " ('8', '5', '89', '17'),\n", + " ('4', '7', '47', '20'),\n", + " ('7', '10', '52', '17'),\n", + " ('9', '4', '90', '16'),\n", + " ('8', '10', '97', '13'),\n", + " ('8', '6', '80', '16'),\n", + " ('8', '5', '95', '13'),\n", + " ('7', '8', '46', '13'),\n", + " ('6', '7', '76', '16'),\n", + " ('8', '9', '95', '13'),\n", + " ('6', '10', '83', '15'),\n", + " ('5', '10', '46', '17'),\n", + " ('7', '7', '50', '15'),\n", + " ('8', '6', '78', '16'),\n", + " ('9', '6', '96', '19'),\n", + " ('4', '10', '76', '20'),\n", + " ('8', '4', '71', '20'),\n", + " ('5', '7', '69', '18'),\n", + " ('8', '10', '44', '16'),\n", + " ('9', '7', '59', '20'),\n", + " ('6', '5', '42', '18'),\n", + " ('4', '8', '77', '16'),\n", + " ('8', '5', '46', '17'),\n", + " ('4', '10', '47', '17'),\n", + " ('9', '10', '71', '16'),\n", + " ('5', '9', '54', '18'),\n", + " ('7', '5', '99', '20'),\n", + " ('6', '6', '66', '20'),\n", + " ('9', '8', '93', '14'),\n", + " ('9', '4', '79', '18'),\n", + " ('9', '8', '98', '14'),\n", + " ('9', '8', '67', '19'),\n", + " ('7', '4', '79', '19'),\n", + " ('5', '7', '68', '16'),\n", + " ('8', '10', '63', '18'),\n", + " ('9', '8', '54', '18'),\n", + " ('6', '7', '95', '19'),\n", + " ('7', '9', '67', '16'),\n", + " ('5', '10', '75', '19'),\n", + " ('4', '7', '56', '14'),\n", + " ('5', '10', '47', '17'),\n", + " ('4', '7', '80', '14'),\n", + " ('6', '8', '82', '16'),\n", + " ('5', '7', '57', '14'),\n", + " ('7', '10', '41', '13'),\n", + " ('8', '7', '71', '19'),\n", + " ('9', '4', '72', '18'),\n", + " ('4', '4', '53', '15'),\n", + " ('6', '7', '40', '20'),\n", + " ('4', '8', '60', '14'),\n", + " ('8', '4', '59', '19'),\n", + " ('9', '5', '78', '17'),\n", + " ('5', '4', '42', '13'),\n", + " ('9', '8', '96', '14'),\n", + " ('4', '10', '83', '15'),\n", + " ('7', '4', '66', '19'),\n", + " ('7', '4', '91', '13'),\n", + " ('6', '5', '96', '17'),\n", + " ('6', '9', '50', '13'),\n", + " ('6', '9', '58', '13'),\n", + " ('10', '7', '99', '20'),\n", + " ('7', '4', '52', '20'),\n", + " ('5', '10', '75', '14'),\n", + " ('4', '5', '93', '18'),\n", + " ('5', '6', '70', '17'),\n", + " ('10', '9', '74', '20'),\n", + " ('5', '10', '50', '13'),\n", + " ('4', '9', '65', '15'),\n", + " ('4', '7', '43', '13'),\n", + " ('9', '4', '53', '20'),\n", + " ('4', '9', '40', '18'),\n", + " ('8', '10', '62', '18'),\n", + " ('8', '10', '83', '20'),\n", + " ('9', '4', '40', '18'),\n", + " ('5', '7', '74', '14'),\n", + " ('10', '9', '44', '18'),\n", + " ('10', '6', '80', '17'),\n", + " ('7', '4', '43', '15'),\n", + " ('5', '10', '52', '15'),\n", + " ('9', '8', '97', '15'),\n", + " ('7', '4', '73', '16'),\n", + " ('8', '5', '92', '14'),\n", + " ('9', '6', '55', '14'),\n", + " ('8', '5', '88', '15'),\n", + " ('5', '8', '82', '14'),\n", + " ('5', '8', '66', '19'),\n", + " ('6', '9', '81', '17'),\n", + " ('9', '10', '75', '15'),\n", + " ('5', '4', '58', '18'),\n", + " ('9', '10', '66', '20'),\n", + " ('9', '8', '60', '16'),\n", + " ('5', '6', '75', '20'),\n", + " ('10', '6', '63', '15'),\n", + " ('9', '7', '57', '14'),\n", + " ('8', '5', '42', '15'),\n", + " ('6', '10', '56', '16'),\n", + " ('6', '5', '84', '19'),\n", + " ('5', '6', '54', '18'),\n", + " ('9', '5', '86', '17'),\n", + " ('4', '8', '56', '19'),\n", + " ('5', '4', '42', '16'),\n", + " ('5', '6', '95', '19'),\n", + " ('7', '10', '55', '20'),\n", + " ('6', '7', '54', '19'),\n", + " ('9', '10', '66', '17'),\n", + " ('10', '5', '87', '16'),\n", + " ('7', '7', '89', '17'),\n", + " ('6', '10', '77', '19'),\n", + " ('9', '9', '97', '13'),\n", + " ('7', '6', '56', '18'),\n", + " ('9', '9', '84', '16'),\n", + " ('7', '8', '79', '20'),\n", + " ('7', '10', '64', '14'),\n", + " ('8', '6', '70', '18'),\n", + " ('10', '7', '48', '19'),\n", + " ('5', '6', '90', '19'),\n", + " ('4', '10', '50', '15'),\n", + " ('6', '6', '41', '16'),\n", + " ('4', '6', '74', '15'),\n", + " ('7', '7', '58', '18'),\n", + " ('8', '8', '62', '16'),\n", + " ('6', '9', '100', '17'),\n", + " ('5', '7', '90', '15'),\n", + " ('4', '6', '47', '19'),\n", + " ('5', '4', '85', '18'),\n", + " ('5', '7', '64', '19'),\n", + " ('6', '7', '84', '18'),\n", + " ('4', '8', '48', '19'),\n", + " ('8', '6', '47', '15'),\n", + " ('8', '7', '41', '13'),\n", + " ('10', '4', '97', '18'),\n", + " ('9', '8', '70', '14'),\n", + " ('7', '7', '50', '20'),\n", + " ('4', '4', '100', '16'),\n", + " ('9', '6', '66', '13'),\n", + " ('8', '4', '42', '18'),\n", + " ('9', '7', '43', '17'),\n", + " ('7', '4', '43', '17'),\n", + " ('7', '6', '68', '19'),\n", + " ('6', '7', '95', '15'),\n", + " ('8', '5', '91', '19'),\n", + " ('9', '5', '74', '20'),\n", + " ('5', '8', '62', '20'),\n", + " ('4', '5', '53', '17'),\n", + " ('10', '9', '96', '19'),\n", + " ('5', '10', '69', '13'),\n", + " ('9', '6', '70', '14'),\n", + " ('4', '4', '65', '14'),\n", + " ('5', '6', '99', '15'),\n", + " ('5', '8', '55', '17'),\n", + " ('4', '10', '88', '13'),\n", + " ('5', '7', '45', '16'),\n", + " ('8', '9', '45', '14'),\n", + " ('4', '10', '73', '17'),\n", + " ('9', '4', '98', '15'),\n", + " ('10', '10', '49', '16'),\n", + " ('7', '4', '69', '20'),\n", + " ('8', '5', '49', '15'),\n", + " ('8', '6', '52', '13'),\n", + " ('6', '10', '99', '20'),\n", + " ('7', '9', '49', '18'),\n", + " ('5', '8', '83', '18'),\n", + " ('7', '8', '66', '20'),\n", + " ('8', '4', '99', '16'),\n", + " ('7', '8', '48', '16'),\n", + " ('8', '7', '92', '19'),\n", + " ('5', '10', '55', '15'),\n", + " ('8', '10', '75', '15'),\n", + " ('4', '7', '46', '17'),\n", + " ('10', '10', '73', '15'),\n", + " ('10', '5', '57', '14'),\n", + " ('9', '5', '57', '16'),\n", + " ('10', '5', '62', '14'),\n", + " ('9', '9', '94', '20'),\n", + " ('8', '8', '61', '20'),\n", + " ('4', '5', '57', '20'),\n", + " ('7', '8', '73', '17'),\n", + " ('10', '10', '53', '18'),\n", + " ('5', '6', '76', '15'),\n", + " ('5', '8', '58', '19'),\n", + " ('5', '4', '100', '13'),\n", + " ('9', '7', '61', '14'),\n", + " ('8', '9', '90', '15'),\n", + " ('5', '5', '60', '14'),\n", + " ('4', '8', '43', '20'),\n", + " ('4', '9', '94', '15'),\n", + " ('4', '8', '41', '13'),\n", + " ('6', '6', '53', '20'),\n", + " ('5', '6', '97', '16'),\n", + " ('6', '10', '50', '16'),\n", + " ('4', '4', '64', '16'),\n", + " ('6', '7', '43', '20'),\n", + " ('7', '4', '44', '13'),\n", + " ('4', '6', '50', '15'),\n", + " ('6', '10', '47', '17'),\n", + " ('8', '7', '96', '14'),\n", + " ('7', '9', '92', '13'),\n", + " ('5', '7', '72', '14'),\n", + " ('6', '4', '56', '19'),\n", + " ('5', '9', '76', '15'),\n", + " ('8', '10', '62', '16'),\n", + " ('5', '8', '76', '19'),\n", + " ('5', '7', '69', '13'),\n", + " ('8', '5', '100', '18'),\n", + " ('7', '6', '65', '15'),\n", + " ('9', '9', '58', '14'),\n", + " ('9', '7', '44', '18'),\n", + " ('8', '10', '98', '20'),\n", + " ('8', '9', '80', '15'),\n", + " ('7', '5', '84', '18'),\n", + " ('8', '8', '91', '13'),\n", + " ('6', '5', '49', '17'),\n", + " ('8', '6', '99', '18'),\n", + " ('6', '10', '74', '16'),\n", + " ('7', '7', '69', '20'),\n", + " ('5', '9', '77', '16'),\n", + " ('8', '5', '49', '19'),\n", + " ('4', '10', '77', '17'),\n", + " ('7', '7', '67', '16'),\n", + " ('6', '9', '69', '14'),\n", + " ('7', '10', '69', '15'),\n", + " ('8', '4', '94', '20'),\n", + " ('9', '8', '69', '20'),\n", + " ('4', '10', '90', '15'),\n", + " ('8', '4', '87', '18'),\n", + " ('4', '10', '41', '15'),\n", + " ('8', '6', '61', '17'),\n", + " ('9', '5', '61', '14'),\n", + " ('8', '10', '63', '19'),\n", + " ('4', '6', '100', '15'),\n", + " ('10', '7', '40', '15'),\n", + " ('4', '5', '47', '16'),\n", + " ('4', '6', '96', '13'),\n", + " ('7', '6', '64', '15'),\n", + " ('7', '4', '66', '14'),\n", + " ('7', '10', '49', '18'),\n", + " ('7', '6', '52', '17'),\n", + " ('6', '6', '44', '15'),\n", + " ('5', '6', '79', '13'),\n", + " ('6', '9', '52', '20'),\n", + " ('9', '5', '52', '14'),\n", + " ('10', '9', '49', '16'),\n", + " ('4', '7', '67', '16'),\n", + " ('4', '9', '68', '19'),\n", + " ('8', '5', '99', '19'),\n", + " ('10', '5', '78', '15'),\n", + " ('7', '4', '76', '20'),\n", + " ('7', '7', '57', '13'),\n", + " ('8', '6', '65', '19'),\n", + " ('7', '7', '90', '14'),\n", + " ('10', '4', '50', '19'),\n", + " ('6', '6', '100', '18'),\n", + " ('5', '7', '83', '17'),\n", + " ('8', '6', '95', '17'),\n", + " ('9', '9', '84', '14'),\n", + " ('5', '6', '40', '15'),\n", + " ('5', '6', '60', '16'),\n", + " ('4', '9', '92', '17'),\n", + " ('7', '7', '96', '18'),\n", + " ('10', '6', '80', '20'),\n", + " ('4', '8', '90', '15'),\n", + " ('8', '4', '71', '17'),\n", + " ('7', '8', '87', '20'),\n", + " ('7', '4', '69', '14'),\n", + " ('5', '6', '50', '20'),\n", + " ('4', '7', '82', '17'),\n", + " ('9', '10', '55', '17'),\n", + " ('8', '6', '83', '13'),\n", + " ('7', '7', '51', '13'),\n", + " ('7', '5', '43', '13'),\n", + " ('7', '5', '82', '14'),\n", + " ('5', '6', '86', '15'),\n", + " ('7', '8', '67', '16'),\n", + " ('10', '6', '80', '16'),\n", + " ('7', '9', '78', '20'),\n", + " ('7', '8', '73', '19'),\n", + " ('4', '6', '80', '16'),\n", + " ('6', '4', '50', '20'),\n", + " ('6', '4', '87', '18'),\n", + " ('5', '8', '64', '20'),\n", + " ('5', '9', '60', '19'),\n", + " ('8', '10', '89', '20'),\n", + " ('8', '7', '56', '14'),\n", + " ('8', '4', '82', '17'),\n", + " ('9', '9', '42', '15'),\n", + " ('9', '5', '71', '15'),\n", + " ('4', '5', '88', '20'),\n", + " ('8', '4', '74', '19'),\n", + " ('10', '5', '74', '13'),\n", + " ('9', '7', '46', '14'),\n", + " ('6', '10', '62', '15'),\n", + " ('4', '7', '61', '16'),\n", + " ('6', '10', '75', '13'),\n", + " ('6', '9', '84', '18'),\n", + " ('9', '5', '54', '15'),\n", + " ('9', '7', '45', '19'),\n", + " ('7', '10', '81', '18'),\n", + " ('5', '8', '52', '16'),\n", + " ('10', '4', '84', '18'),\n", + " ('7', '7', '69', '19'),\n", + " ('8', '10', '46', '14'),\n", + " ('4', '4', '48', '15'),\n", + " ('10', '4', '51', '13'),\n", + " ('8', '5', '100', '18'),\n", + " ('10', '6', '74', '17'),\n", + " ('10', '4', '69', '20'),\n", + " ('4', '8', '77', '17'),\n", + " ('6', '7', '72', '13'),\n", + " ('7', '7', '48', '18'),\n", + " ('8', '10', '42', '19'),\n", + " ('10', '9', '85', '14'),\n", + " ('5', '9', '89', '14'),\n", + " ('4', '4', '45', '20'),\n", + " ('9', '5', '70', '18'),\n", + " ('7', '6', '100', '18'),\n", + " ('8', '8', '60', '14'),\n", + " ('5', '4', '61', '18'),\n", + " ('6', '6', '82', '18'),\n", + " ('4', '5', '56', '19'),\n", + " ('6', '4', '72', '17'),\n", + " ('9', '5', '55', '19'),\n", + " ('8', '4', '92', '14'),\n", + " ('7', '4', '61', '18'),\n", + " ('8', '8', '48', '18'),\n", + " ('4', '4', '85', '16'),\n", + " ('9', '9', '64', '18'),\n", + " ('9', '5', '82', '13'),\n", + " ('4', '4', '67', '13'),\n", + " ('7', '10', '49', '14'),\n", + " ('9', '4', '77', '17'),\n", + " ('9', '6', '49', '17'),\n", + " ('10', '6', '63', '13'),\n", + " ('6', '6', '82', '15'),\n", + " ('10', '7', '53', '20'),\n", + " ('10', '5', '53', '20'),\n", + " ('10', '6', '43', '14'),\n", + " ('7', '8', '80', '20'),\n", + " ('6', '9', '84', '20'),\n", + " ('9', '6', '47', '15'),\n", + " ('4', '7', '70', '19'),\n", + " ('8', '10', '100', '13'),\n", + " ('8', '10', '93', '20'),\n", + " ('9', '6', '41', '20'),\n", + " ('7', '8', '96', '14'),\n", + " ('8', '7', '74', '14'),\n", + " ('10', '4', '61', '18'),\n", + " ('4', '10', '71', '16'),\n", + " ('5', '4', '77', '13'),\n", + " ('9', '5', '51', '17'),\n", + " ('5', '6', '81', '14'),\n", + " ('7', '10', '61', '15'),\n", + " ('5', '9', '81', '17'),\n", + " ('9', '8', '71', '13'),\n", + " ('7', '6', '88', '17'),\n", + " ('6', '6', '67', '13'),\n", + " ('6', '6', '43', '18'),\n", + " ('4', '7', '79', '16'),\n", + " ('7', '10', '41', '19'),\n", + " ('4', '7', '44', '16'),\n", + " ('7', '8', '45', '13'),\n", + " ('9', '4', '82', '19'),\n", + " ('10', '10', '58', '13'),\n", + " ('9', '9', '42', '20'),\n", + " ('10', '6', '58', '17'),\n", + " ('10', '10', '57', '16'),\n", + " ('6', '9', '96', '18'),\n", + " ('5', '6', '65', '20'),\n", + " ('7', '7', '69', '14'),\n", + " ('8', '9', '78', '17'),\n", + " ('9', '9', '94', '13'),\n", + " ('6', '9', '75', '20'),\n", + " ('4', '7', '60', '18'),\n", + " ('10', '4', '51', '15'),\n", + " ('5', '8', '93', '16'),\n", + " ('10', '8', '86', '15'),\n", + " ('9', '9', '71', '15'),\n", + " ('4', '8', '98', '14'),\n", + " ('10', '4', '50', '14'),\n", + " ('9', '6', '95', '20'),\n", + " ('9', '9', '41', '18'),\n", + " ('10', '5', '69', '17'),\n", + " ('6', '6', '73', '15'),\n", + " ('10', '10', '72', '16'),\n", + " ('7', '7', '82', '16'),\n", + " ('5', '5', '82', '19'),\n", + " ('8', '8', '49', '13'),\n", + " ('9', '7', '89', '15'),\n", + " ('5', '5', '95', '13'),\n", + " ('6', '4', '78', '16'),\n", + " ('5', '6', '55', '16'),\n", + " ('8', '10', '44', '15'),\n", + " ('10', '9', '43', '15'),\n", + " ('8', '7', '43', '16'),\n", + " ('8', '4', '93', '14'),\n", + " ('5', '8', '64', '18'),\n", + " ('6', '8', '64', '19'),\n", + " ('8', '5', '48', '19')]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grades_file = open('notas.txt', 'r')\n", + "\n", + "grades = grades_file.read().splitlines()\n", + "\n", + "for i, line in enumerate(grades):\n", + " numbers = line.split()\n", + " grades[i] = tuple(numbers)\n", + "\n", + "grades" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# La lista 'grades' contiene los 1000 reportes de los alumnos\n", + "\n", + "len(grades)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ahora que tenemos cargados los datos, podemos empezar a realizar análisis sobre estos datos. Y además, Python también nos permite guardar los resultados obtenidos en algún archivo, por ejemplo `results.txt`. \n", + "\n", + "Es importante saber leer y escribir en distintos tipos de archivo con Python, y es lo que aprenderemos en este primer capítulo del curso." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/python-for-engineering/1 Manejo de Archivos en Python/2 Lectura de archivos.ipynb b/python-for-engineering/1 Manejo de Archivos en Python/2 Lectura de archivos.ipynb index 951a7a0..2256d83 100644 --- a/python-for-engineering/1 Manejo de Archivos en Python/2 Lectura de archivos.ipynb +++ b/python-for-engineering/1 Manejo de Archivos en Python/2 Lectura de archivos.ipynb @@ -351,9 +351,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.12.3" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/python-for-engineering/1 Manejo de Archivos en Python/3 Escritura de archivos.ipynb b/python-for-engineering/1 Manejo de Archivos en Python/3 Escritura de archivos.ipynb index f6a6a7b..4c7c976 100644 --- a/python-for-engineering/1 Manejo de Archivos en Python/3 Escritura de archivos.ipynb +++ b/python-for-engineering/1 Manejo de Archivos en Python/3 Escritura de archivos.ipynb @@ -168,7 +168,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -182,9 +182,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.12.3" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/python-for-engineering/1 Manejo de Archivos en Python/4 Manejo de archivos CSV.ipynb b/python-for-engineering/1 Manejo de Archivos en Python/4 Manejo de archivos CSV.ipynb index 28f730d..b98d70d 100644 --- a/python-for-engineering/1 Manejo de Archivos en Python/4 Manejo de archivos CSV.ipynb +++ b/python-for-engineering/1 Manejo de Archivos en Python/4 Manejo de archivos CSV.ipynb @@ -38,7 +38,34 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Nombre,Apellido,Edad,Nota1,Nota2\n", + "\n", + "Albert,Einstein,22,19,20\n", + "\n", + "['Albert', 'Einstein', '22', '19', '20\\n']\n" + ] + } + ], + "source": [ + "with open('data.csv', 'r') as csv_file:\n", + " header = csv_file.readline()\n", + " line = csv_file.readline()\n", + " print(header)\n", + " print(line)\n", + " row = line.split(',')\n", + " print(row)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -64,12 +91,11 @@ } ], "source": [ - "with open('data.csv', 'r', newline='') as csv_file: # Abrimos el archivo CSV con el nombre csv_file\n", + "with open('data.csv', 'r') as csv_file: # Abrimos el archivo CSV con el nombre csv_file\n", " # Usaremos el método 'reader' de la librería csv para la lectura del archivo\n", " # Pasamos como parámetro el archivo\n", - " # Definimos el delimitador (para este caso, una coma)\n", + " # Definimos el delimitador (para este caso, una coma) \n", " csv_reader = csv.reader(csv_file, delimiter=',', quotechar='|')\n", - "\n", " # csv_reader es un objeto iterable donde cada elemento es una fila\n", " for row in csv_reader:\n", " print(row)" @@ -86,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -126,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -166,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -194,7 +220,7 @@ " 'Nota2': '19'}]" ] }, - "execution_count": 7, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -297,7 +323,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -311,9 +337,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.12.3" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/python-for-engineering/1 Manejo de Archivos en Python/5 Introduccion a Pandas y DataFrames.ipynb b/python-for-engineering/1 Manejo de Archivos en Python/5 Introduccion a Pandas y DataFrames.ipynb index 56ddf4b..2b02c1d 100644 --- a/python-for-engineering/1 Manejo de Archivos en Python/5 Introduccion a Pandas y DataFrames.ipynb +++ b/python-for-engineering/1 Manejo de Archivos en Python/5 Introduccion a Pandas y DataFrames.ipynb @@ -15,6 +15,15 @@ "Vamos a cargar datos de un archivo CSV a un DataFrame:" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pip install pandas" + ] + }, { "cell_type": "code", "execution_count": null, @@ -22,7 +31,6 @@ "outputs": [], "source": [ "# Importamos la librería pandas, es usual ponerle el alias 'pd'\n", - "\n", "import pandas as pd" ] }, @@ -40,9 +48,19 @@ "outputs": [], "source": [ "grades_df = pd.read_csv('df_example.csv')\n", + "print(type(grades_df))\n", "grades_df" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "grades_df.shape" + ] + }, { "cell_type": "code", "execution_count": null, @@ -78,7 +96,11 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "jupyter": { + "source_hidden": true + } + }, "source": [ "Vemos que cada fila tiene un índice desde el 0 hasta el 19. Podemos hacer que una columna se convierta el índice de cada fila:" ] @@ -124,7 +146,7 @@ "outputs": [], "source": [ "grades_df = pd.read_csv('df_example.csv')\n", - "\n", + "#print(type(grades_df[\"Nota\"]))\n", "grades_df[\"Nota\"]" ] }, @@ -276,7 +298,7 @@ ], "metadata": { "kernelspec": { - "display_name": ".env", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -290,9 +312,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.12.3" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/python-for-engineering/1 Manejo de Archivos en Python/output.csv b/python-for-engineering/1 Manejo de Archivos en Python/output.csv new file mode 100644 index 0000000..b4e9ca4 --- /dev/null +++ b/python-for-engineering/1 Manejo de Archivos en Python/output.csv @@ -0,0 +1,4 @@ +Español,Inglés +Manzana,Apple +Naranja,Orange +Plátano,Banana