├── .ipynb_checkpoints
└── Clase_1_Curso_Python-checkpoint.ipynb
├── Curso_Analisis_de_Datos_Clases
├── Clase_1_Analisis_de_Datos.ipynb
├── Clase_2_Analisis_de_Datos.ipynb
└── Proyecto_Integrador_Python.ipynb
├── Curso_Analisis_de_Datos_Datos
├── AMZN.csv
├── BTC.csv
├── Datos.csv
├── Datos.xlsx
├── Datos2.xlsx
├── Finanzas.xlsx
├── GOOGLE.csv
├── NotasFinitos.csv
├── PopulationArgentina2019.csv
├── Tabla1.xlsx
├── california_housing_test.xlsx
├── california_housing_train.xlsx
├── datosClientes.xlsx
├── electrocardiograma.xlsx
├── lista1.csv
├── lista2.csv
├── lista_final.csv
├── notas.xlsx
├── noticia.txt
├── recorridos-realizados-2021-sample.csv
├── transferencias.csv
├── usuarios.csv
└── youtube_data.json
├── Curso_Analisis_de_Datos_Solucionarios
├── Solucionario_Clase_1.ipynb
└── Solucionario_Clase_2.ipynb
├── Curso_Introductorio_Clases
├── Clase_1_Introducción_a_la_Programación_con_Python.ipynb
├── Clase_2_Introducción_a_la_Programación_con_Python.ipynb
└── Clase_3_Introducción_a_la_Programación_con_Python.ipynb
├── Curso_Introductorio_Datos
├── ControlCalidadBotellas.csv
├── Datos.xlsx
├── datos.csv
├── mediciones.csv
└── noticia.txt
├── Curso_Introductorio_Solucionarios
├── Solucionario_Clase_1_Curso_Introductorio_de_Python.ipynb
├── Solucionario_Clase_2_Curso_Introductorio_de_Python.ipynb
└── Solucionario_Clase_3_Curso_Introductorio_de_Python.ipynb
├── LICENCIA
├── LICENSE
├── LiveStreams
├── Presentación Clase Práctica 1 Curso de Python.pdf
└── Presentación Clase Práctica 2 Curso de Python.pdf
├── README.md
└── _assets
├── BlackBox.png
├── ColoresLineas.png
├── CruceDiscreto.png
├── CursoPythonTP4.png
├── Data_Type_Word_Art.png
├── Diagrama_Ejemplo_1.PNG
├── Diagrama_cajas.PNG
├── DistribucionEtariaArg.png
├── Elcódigosecreto.jpg
├── Incógnita.jpeg
├── LogosOrganizaciones.jpeg
├── SPONSOR_Flowics.png
├── SPONSOR_JPM.png
├── appdata.png
├── barcode_printer.jpg
├── calendario.png
├── cmdPy.png
├── cmdSearch.jpg
├── cmdSearch.png
├── colab_archivos_2.png
├── colab_archivos_3.png
├── credit_cards.png
├── data_structures.png
├── data_structures_2.png
├── editEnv.png
├── envSearch.png
├── envset.png
├── funcion cuadratica.png
├── guardar_copia_en_drive.png
├── highpass.png
├── logo-oficial.png
├── mail_banner.png
├── marathon.png
├── memoria_diagrama0.png
├── memoria_diagrama1.png
├── memoria_diagrama2.png
├── numbers.jpg
├── osciloscopio.jpg
├── preferentialelection.png
├── pydict.png
├── pysearch.png
├── sugus.jpg
├── termometro.png
├── tictactoe.png
├── todos.png
├── truco_jerarquia.png
├── vacas.jpg
├── vscode.png
├── vscodeFull.png
└── vscodePython.png
/.ipynb_checkpoints/Clase_1_Curso_Python-checkpoint.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "colab_type": "text",
7 | "id": "view-in-github"
8 | },
9 | "source": [
10 | "
"
11 | ]
12 | },
13 | {
14 | "cell_type": "markdown",
15 | "metadata": {
16 | "colab_type": "text",
17 | "id": "zUpAx4mvVgz6"
18 | },
19 | "source": [
20 | "# Clase 1\n",
21 | "\n",
22 | "## Introducción a la programación\n",
23 | "La programación es el proceso que se utiliza para diseñar e implementar un programa de computadora, valiéndose de algún lenguaje que permita comunicar una serie de acciones que se requiere que la computadora realice. ¿Qué es un programa? Es una caja negra que recibe alguna información, la cual es llamada \"input\" (entrada), realiza alguna acción, y devuelve información, la cual es llamada \"output\" (salida).\n",
24 | "\n",
25 | "
Programa -> Output\" title= \"Entra x, sale y\">\n",
26 | "\n",
27 | "## Lenguajes de programación\n",
28 | "Un lenguaje de programación es un [lenguaje formal](https://es.wikipedia.org/wiki/Lenguaje_formal) que proporciona una serie de instrucciones, las cuales permiten a un programador escribir secuencias de órdenes para controlar el comportamiento físico y lógico de una computadora, con el objetivo de que produzca diversas acciones deseadas por el programador (¡y los usuarios!).\n",
29 | "\n",
30 | "Algunos de los lenguajes mas populares en los últimos tiempos (lejos de ser los únicos) son Python, Java, C++, JavaScript, PHP, etc.\n",
31 | "\n",
32 | "
\n",
33 | "## ¿Por qué Python?\n",
34 | "Elegimos Python porque es uno de los lenguajes de programación con reglas más simples e intuitivas que existen; esto explica la creciente popularidad que ha tenido en los ultimos tiempos.\n",
35 | "\n",
36 | "A pesar de su simpleza, es muy utilizado tanto en la industria para servidores y servicios web, así como también en el área academica para redes neuronales, deep learning, simulación, etc.\n",
37 | "\n",
38 | "La comunidad de Python es una de las más grandes. Por lo tanto cualquier duda que tengan, a partir de ahora, Google es su amigo: pueden buscar la duda que tengan y seguramente alguien ya haya tenido ese problema. Una de los sitios web más conocidos para este fin es [StackOverflow](https://stackoverflow.com/)\n",
39 | "\n",
40 | "\n"
41 | ]
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "metadata": {
46 | "colab_type": "text",
47 | "id": "o7iXxeQFsblK"
48 | },
49 | "source": [
50 | "## Variables\n",
51 | "\n",
52 | "En programación, el concepto de variables es un espacio donde el programador o el programa puede almacenar información.\n",
53 | "\n",
54 | "En python esto se logra de la siguiente manera:\n",
55 | "\n",
56 | "\n"
57 | ]
58 | },
59 | {
60 | "cell_type": "code",
61 | "execution_count": 0,
62 | "metadata": {
63 | "colab": {},
64 | "colab_type": "code",
65 | "id": "dFdsoISPuvyX"
66 | },
67 | "outputs": [],
68 | "source": [
69 | "x = 5\n",
70 | "x"
71 | ]
72 | },
73 | {
74 | "cell_type": "markdown",
75 | "metadata": {
76 | "colab_type": "text",
77 | "id": "d3b-updXAmho"
78 | },
79 | "source": [
80 | "En estas variables podemos guardar lo que sea necesario para ejecutar el programa, por ejemplo si necesitamos guardar texto se indica con: \"(texto)\" o '(texto)'."
81 | ]
82 | },
83 | {
84 | "cell_type": "code",
85 | "execution_count": 0,
86 | "metadata": {
87 | "colab": {},
88 | "colab_type": "code",
89 | "id": "ZaesnOreAx4q"
90 | },
91 | "outputs": [],
92 | "source": [
93 | "x = 'Hola'\n",
94 | "y = \"Como\"\n",
95 | "y"
96 | ]
97 | },
98 | {
99 | "cell_type": "markdown",
100 | "metadata": {
101 | "colab_type": "text",
102 | "id": "yZl-KaXPCXru"
103 | },
104 | "source": [
105 | "## Input - Output\n",
106 | "El input de un programa es la manera de recibir información del entorno externo al programa. Esto puede ser un usuario, un archivo, otro programa, un sensor, etc. \n",
107 | "\n",
108 | "El output de un programa es la manera de transmitir información hacia el entorno externo. Por ejemplo, puede escribir en la consola de la computadora, puede generar una imagen, etc. En GoogleColaboratory veremos el output del programa debajo de la celda donde fue ejecutado.\n",
109 | "\n",
110 | "Para poder mostrar el contenido de una variable podemos utilizar **print**(variable):"
111 | ]
112 | },
113 | {
114 | "cell_type": "code",
115 | "execution_count": 0,
116 | "metadata": {
117 | "colab": {},
118 | "colab_type": "code",
119 | "id": "C1c66KXWCwpD"
120 | },
121 | "outputs": [],
122 | "source": [
123 | "print(\"Hola como estas\")"
124 | ]
125 | },
126 | {
127 | "cell_type": "markdown",
128 | "metadata": {
129 | "colab_type": "text",
130 | "id": "LaLS532qC2sr"
131 | },
132 | "source": [
133 | "¿Qué imprimirá el siguiente codigo?"
134 | ]
135 | },
136 | {
137 | "cell_type": "code",
138 | "execution_count": 0,
139 | "metadata": {
140 | "colab": {},
141 | "colab_type": "code",
142 | "id": "JECLPVC2C6XH"
143 | },
144 | "outputs": [],
145 | "source": [
146 | "print(x)"
147 | ]
148 | },
149 | {
150 | "cell_type": "markdown",
151 | "metadata": {
152 | "colab_type": "text",
153 | "id": "pvDfQCPsC8xc"
154 | },
155 | "source": [
156 | "Para ingresar una variable podemos usar **input**(). Corran este código ustedes para que les de una pequeña casilla donde escribir, y luego el programa escribirá lo que ustedes ingresaron."
157 | ]
158 | },
159 | {
160 | "cell_type": "code",
161 | "execution_count": 0,
162 | "metadata": {
163 | "colab": {},
164 | "colab_type": "code",
165 | "id": "Iuzty4svDEDy"
166 | },
167 | "outputs": [],
168 | "source": [
169 | "x = input()\n",
170 | "print(x)"
171 | ]
172 | },
173 | {
174 | "cell_type": "markdown",
175 | "metadata": {
176 | "colab_type": "text",
177 | "id": "uNa0exphDxse"
178 | },
179 | "source": [
180 | "## Operaciones básicas con variables\n",
181 | "\n",
182 | "\n"
183 | ]
184 | },
185 | {
186 | "cell_type": "markdown",
187 | "metadata": {
188 | "colab_type": "text",
189 | "id": "ZM7lIDcRPdtk"
190 | },
191 | "source": [
192 | "### Operaciones de modificación\n",
193 | "No seria muy útil un programa si lo único que podemos hacer es guardar en una variable y mostrarla, por lo que podemos realizar algunas operaciones basicas que nos perimiten modificar el contenido:\n",
194 | "\n",
195 | "\n",
196 | "* **+** : Sumar dos variables $a+b$\n",
197 | "* **-** : Restar dos variables $a-b$\n",
198 | "* ** * ** : Multiplicar dos variables $a\\cdot b$\n",
199 | "* ** / ** : Dividir una variable por la otra $\\frac{a}{b}$\n",
200 | "* ** \\*\\* ** : Una variable elevado a la otra $a^{b}$\n",
201 | "* **=** : Asignarle un valor a una variable $a \\leftarrow b$\n",
202 | "\n",
203 | "¿Cual será la salida del siguiente programa?"
204 | ]
205 | },
206 | {
207 | "cell_type": "code",
208 | "execution_count": 0,
209 | "metadata": {
210 | "colab": {},
211 | "colab_type": "code",
212 | "id": "LrkSFD2zFKo9"
213 | },
214 | "outputs": [],
215 | "source": [
216 | "x = 3\n",
217 | "y = -2\n",
218 | "y = x*y\n",
219 | "x = x**2\n",
220 | "print(y)\n",
221 | "print(x)"
222 | ]
223 | },
224 | {
225 | "cell_type": "markdown",
226 | "metadata": {
227 | "colab_type": "text",
228 | "id": "sHe-S2KcF_hT"
229 | },
230 | "source": [
231 | "Python nos permite ahorrar código combinando el operando **=** con alguno de los anteriormente vistos:\n",
232 | "\n",
233 | "\n",
234 | "* ** *= ** : Multiplica la variable $a \\leftarrow a\\cdot b$ \n",
235 | "* ** /= ** : Divide la variable $a \\leftarrow \\frac{a}{b}$ \n",
236 | "* ** += ** : Suma a la varaible $a \\leftarrow a+ b$ \n",
237 | "* ** -= ** : Resta a la variable $a \\leftarrow a- b$\n",
238 | "\n",
239 | "¿Cual será la salida del siguiente codigo?"
240 | ]
241 | },
242 | {
243 | "cell_type": "code",
244 | "execution_count": 0,
245 | "metadata": {
246 | "colab": {},
247 | "colab_type": "code",
248 | "id": "ndLR4DOcHIOb"
249 | },
250 | "outputs": [],
251 | "source": [
252 | "x/=10\n",
253 | "print(x)"
254 | ]
255 | },
256 | {
257 | "cell_type": "markdown",
258 | "metadata": {
259 | "colab_type": "text",
260 | "id": "78iBTQVNISi7"
261 | },
262 | "source": [
263 | "### Operaciones de comparación\n",
264 | "Existen operaciones donde se comparan las propiedades de una variable.\n",
265 | "* **< ** : Menor que $a < b$\n",
266 | "* **> ** : Mayor que $a > b$\n",
267 | "* **<=** : Menor o igual que $a \\leq b$\n",
268 | "* **>=** : Mayor o igual que $a \\geq b$\n",
269 | "* **==** : Es igual $a = b$\n",
270 | "\n",
271 | "Al comprarar dos números se obtiene True o False según si se cumple la condición:"
272 | ]
273 | },
274 | {
275 | "cell_type": "code",
276 | "execution_count": 0,
277 | "metadata": {
278 | "colab": {},
279 | "colab_type": "code",
280 | "id": "xlYwcqQrOy5I"
281 | },
282 | "outputs": [],
283 | "source": [
284 | "x = 4\n",
285 | "print(x>=4)\n",
286 | "print(x<3)"
287 | ]
288 | },
289 | {
290 | "cell_type": "markdown",
291 | "metadata": {
292 | "colab_type": "text",
293 | "id": "julg_kMLTzCT"
294 | },
295 | "source": [
296 | "También podemos comparar muchas condiciones utilzando:\n",
297 | "* **and**: Si se cumplen las dos condicones $a \\land b$\n",
298 | "* **or**: Si se cumple alguna de las condicions $ a \\lor b$\n",
299 | "* **not**: Si no se cumple esa condición $ \\overline{a} $\n",
300 | "\n",
301 | "Veamos un ejemplo:"
302 | ]
303 | },
304 | {
305 | "cell_type": "code",
306 | "execution_count": 0,
307 | "metadata": {
308 | "colab": {},
309 | "colab_type": "code",
310 | "id": "uGxeHWppUKLP"
311 | },
312 | "outputs": [],
313 | "source": [
314 | "x = 4\n",
315 | "y = x>5 and x < 7\n",
316 | "z = x>5 or x <7\n",
317 | "k = not x>5\n",
318 | "print(y)\n",
319 | "print(z)\n",
320 | "print(k)"
321 | ]
322 | },
323 | {
324 | "cell_type": "markdown",
325 | "metadata": {
326 | "colab_type": "text",
327 | "id": "2cJd7NrKV9dK"
328 | },
329 | "source": [
330 | "Estas condiciones pueden agruparse con ( condicion1 ) **and/or** ( condicion2 ), esto permite chequar condiciones complejas:"
331 | ]
332 | },
333 | {
334 | "cell_type": "code",
335 | "execution_count": 0,
336 | "metadata": {
337 | "colab": {},
338 | "colab_type": "code",
339 | "id": "4LYKsyiXLAWW"
340 | },
341 | "outputs": [],
342 | "source": [
343 | "x = 10\n",
344 | "y = 5\n",
345 | "z = (y > x and 15 > x) or (y < x and 15 > x)\n",
346 | "print(z)"
347 | ]
348 | },
349 | {
350 | "cell_type": "markdown",
351 | "metadata": {
352 | "colab_type": "text",
353 | "id": "KGPMKjbABDrz"
354 | },
355 | "source": [
356 | "## Flujo de Programa\n",
357 | "Los programas siguen un \"flujo\" definido por el programador. Esto le permite realizar operaciones complejas. Notar que todas estas estructuras terminan con un ** : **, y la siguiente línea tiene un tab de indentación.\n",
358 | "\n",
359 | "\n",
360 | "### Estructura if\n",
361 | "Es la estructura básica que le permite al programador ver si se cumple una condición, y realizar distintas acciones según si eso sucede o no.\n",
362 | "\n",
363 | "**if** (condicion):\n",
364 | " \n",
365 | " ... lo que se hace si se cumple la condición\n",
366 | " \n",
367 | "**elif** (condicion2):\n",
368 | "\n",
369 | " ... lo que se hace si se cumple la condicion2\n",
370 | " \n",
371 | "**else**:\n",
372 | "\n",
373 | " ... lo que se hace si no se cumple la condición\n",
374 | " \n",
375 | " \n",
376 | " Siempre se comienza con **if**, después puede haber cualquier cantidad de **elif** (o ninguno). y luego se puede terminar con **else** (o no). Luego del **else** no puede haber más **elif**.\n",
377 | " \n",
378 | "\n",
379 | "\n"
380 | ]
381 | },
382 | {
383 | "cell_type": "markdown",
384 | "metadata": {
385 | "colab_type": "text",
386 | "id": "rqyrcoqnPmi3"
387 | },
388 | "source": [
389 | "¿Cual será la salida del siguiente programa?"
390 | ]
391 | },
392 | {
393 | "cell_type": "code",
394 | "execution_count": 0,
395 | "metadata": {
396 | "colab": {},
397 | "colab_type": "code",
398 | "id": "Y9oaFC5vCFB7"
399 | },
400 | "outputs": [],
401 | "source": [
402 | "x = 5\n",
403 | "y = 6\n",
404 | "if x==y:\n",
405 | " print(x)\n",
406 | "elif y<5 or y>7:\n",
407 | " print(x+y)\n",
408 | "else:\n",
409 | " print(y)"
410 | ]
411 | },
412 | {
413 | "cell_type": "code",
414 | "execution_count": 0,
415 | "metadata": {
416 | "colab": {},
417 | "colab_type": "code",
418 | "id": "ejJfMzOtQL00"
419 | },
420 | "outputs": [],
421 | "source": [
422 | "x = -1\n",
423 | "y = 4\n",
424 | "\n",
425 | "if y == 5:\n",
426 | " print(\"adivinamos el valor de y!\")\n",
427 | " \n",
428 | "if x == 5:\n",
429 | " print(\"adivinamos el valor de x!\")\n",
430 | "else:\n",
431 | " print(\"no adivinamos el valor de x ))):\")\n",
432 | " \n",
433 | "if x > y:\n",
434 | " print(\"x es mayor que y\")\n",
435 | "elif x < y:\n",
436 | " print(\"y es mayor que x\")\n",
437 | "elif x == y:\n",
438 | " print(\"x e y son iguales\")\n",
439 | "else:\n",
440 | " print(\"que?????\")"
441 | ]
442 | },
443 | {
444 | "cell_type": "markdown",
445 | "metadata": {
446 | "colab_type": "text",
447 | "id": "J0shbiwuHYah"
448 | },
449 | "source": [
450 | "\n",
451 | "\n",
452 | "### Estructura while\n",
453 | "Permite ejecutar operaciones mientras se cumpla una condición.\n",
454 | "\n",
455 | "**while** (Condicion):\n",
456 | "\n",
457 | " ... lo que se hace mientras se cumpla la condicion\n",
458 | "\n",
459 | "**else** :\n",
460 | "\n",
461 | " ... Se ejecuta cuando la condicion no se cumple más\n",
462 | " \n",
463 | "Esto introduce otra estructura basica de un programa que son los ciclos (loops o bucles). En código se ve de la siguiente manera:\n",
464 | "\n"
465 | ]
466 | },
467 | {
468 | "cell_type": "code",
469 | "execution_count": 0,
470 | "metadata": {
471 | "colab": {},
472 | "colab_type": "code",
473 | "id": "LLcZ4LH3CMUt"
474 | },
475 | "outputs": [],
476 | "source": [
477 | "x = 1\n",
478 | "while x<10:\n",
479 | " print(x)\n",
480 | " x+=1\n",
481 | "else:\n",
482 | " print(\"Termine el while!\")"
483 | ]
484 | },
485 | {
486 | "cell_type": "markdown",
487 | "metadata": {
488 | "colab_type": "text",
489 | "id": "tzu1YFDNQTQu"
490 | },
491 | "source": [
492 | "Es importante tener en cuenta que la condición se evalúa sólo al principio del loop.\n",
493 | "\n",
494 | "¿Qué imprimirá este programa?"
495 | ]
496 | },
497 | {
498 | "cell_type": "code",
499 | "execution_count": 0,
500 | "metadata": {
501 | "colab": {},
502 | "colab_type": "code",
503 | "id": "GGIT1bOlQlw_"
504 | },
505 | "outputs": [],
506 | "source": [
507 | "x = 1\n",
508 | "while x<=3:\n",
509 | " x += 1\n",
510 | " print(x)"
511 | ]
512 | },
513 | {
514 | "cell_type": "markdown",
515 | "metadata": {
516 | "colab_type": "text",
517 | "id": "KHHwPfH3QZQO"
518 | },
519 | "source": [
520 | "#### Ejercicio If y While\n",
521 | "Implementa un programa que muestre la siguiente secuencia:\n",
522 | "\n",
523 | "1,2,3,4,5,4,3,2,1,0\n",
524 | "\n",
525 | "Pueden utilizar un while y un if\n",
526 | "\n",
527 | "\n"
528 | ]
529 | },
530 | {
531 | "cell_type": "code",
532 | "execution_count": 0,
533 | "metadata": {
534 | "colab": {},
535 | "colab_type": "code",
536 | "id": "ELNQM61IIni8"
537 | },
538 | "outputs": [],
539 | "source": []
540 | },
541 | {
542 | "cell_type": "markdown",
543 | "metadata": {
544 | "colab_type": "text",
545 | "id": "T-KOiUHbLcde"
546 | },
547 | "source": [
548 | "### Estructura for\n",
549 | "La estructura del **for** permite realizar una serie de acciones con una variable, que cambia su valor en cada repetición (iteración). ¿Qué significa esto? Permite realizar la misma \n",
550 | "\n",
551 | "**for** (variable) **in** (conjunto de variables):\n",
552 | "\n",
553 | " ... Lo que quieras hacer con tu variable\n",
554 | "\n",
555 | "Veámoslo en un ejemplo de codigo:\n"
556 | ]
557 | },
558 | {
559 | "cell_type": "code",
560 | "execution_count": 0,
561 | "metadata": {
562 | "colab": {},
563 | "colab_type": "code",
564 | "id": "Cwo3zZy5I3x_"
565 | },
566 | "outputs": [],
567 | "source": [
568 | "for x in range(0,10,1):\n",
569 | " print(x)"
570 | ]
571 | },
572 | {
573 | "cell_type": "markdown",
574 | "metadata": {
575 | "colab_type": "text",
576 | "id": "VujdlKBZMfE3"
577 | },
578 | "source": [
579 | "**range**(a,b,d) nos genera los valores desde a hasta b con incrementos de d, por ejemplo el siguiente codigo generara los numeros pares entre 0 y 10:\n",
580 | "\n"
581 | ]
582 | },
583 | {
584 | "cell_type": "code",
585 | "execution_count": 0,
586 | "metadata": {
587 | "colab": {},
588 | "colab_type": "code",
589 | "id": "XCHNbgvEMdIb"
590 | },
591 | "outputs": [],
592 | "source": [
593 | "for x in range(0,10,2):\n",
594 | " print(x)"
595 | ]
596 | },
597 | {
598 | "cell_type": "markdown",
599 | "metadata": {
600 | "colab_type": "text",
601 | "id": "UoNf8Ce-NAi5"
602 | },
603 | "source": [
604 | "#### Ejercicio for\n",
605 | "Realizar la siguiente secuencia de datos utilizando un for y un if\n",
606 | "\n",
607 | "0,1,4,9,4,5,6"
608 | ]
609 | },
610 | {
611 | "cell_type": "code",
612 | "execution_count": 0,
613 | "metadata": {
614 | "colab": {},
615 | "colab_type": "code",
616 | "id": "E3NctxBaM3kG"
617 | },
618 | "outputs": [],
619 | "source": []
620 | },
621 | {
622 | "cell_type": "markdown",
623 | "metadata": {
624 | "colab_type": "text",
625 | "id": "0oG-SkG7PIcN"
626 | },
627 | "source": [
628 | "## Funciones\n",
629 | "Podemos pensar que una funcion es como un pequeño programa dentro del programa. Las funciones son bloques que nos permiten acortar el código no repitiendo estructuras que necesitamos utilizar mucho. Al igual que los programas las funciones tienen un input y un output: el input son las variables de entrada y su output es el valor o valores que devuelven.\n",
630 | "\n",
631 | "**def** miFunción($a_i,b_i,c_i,...$)**:**\n",
632 | "\n",
633 | " ... Hago lo que necesite con las variables a,b,c\n",
634 | " \n",
635 | " **return** $a_o,b_o,c_o,...$\n",
636 | "\n",
637 | "Veamos un ejemplo:"
638 | ]
639 | },
640 | {
641 | "cell_type": "code",
642 | "execution_count": 0,
643 | "metadata": {
644 | "colab": {},
645 | "colab_type": "code",
646 | "id": "mpsgG39DNcme"
647 | },
648 | "outputs": [],
649 | "source": [
650 | "def suma(a,b):\n",
651 | " s=a+b\n",
652 | " return s\n",
653 | "\n",
654 | "x = 2\n",
655 | "y = 4\n",
656 | "print(suma(x,y))"
657 | ]
658 | },
659 | {
660 | "cell_type": "markdown",
661 | "metadata": {
662 | "colab_type": "text",
663 | "id": "q5WyWK1KQVor"
664 | },
665 | "source": [
666 | "Esto tambien podemos combinarlo con las estructuras que vimos previamente"
667 | ]
668 | },
669 | {
670 | "cell_type": "code",
671 | "execution_count": 0,
672 | "metadata": {
673 | "colab": {},
674 | "colab_type": "code",
675 | "id": "_xMxxM6EQQon"
676 | },
677 | "outputs": [],
678 | "source": [
679 | "def chequarContraseña(c):\n",
680 | " if c == \"Secreto\":\n",
681 | " print(\"Contraseña correcta!\")\n",
682 | " else:\n",
683 | " print(\"Contraseña incorrecta!\")\n",
684 | " \n",
685 | "chequarContraseña(\"hola\")\n",
686 | "chequarContraseña(\"Secreto\")"
687 | ]
688 | },
689 | {
690 | "cell_type": "markdown",
691 | "metadata": {
692 | "colab_type": "text",
693 | "id": "W64FPKi5RaU3"
694 | },
695 | "source": [
696 | "¿Se dieron cuenta que la la forma en la que usamos para imprimir una variable es una función?, **print**( ... ) lo que hace es llamar a una función ya creada que está en el estandar de python y permite que mostremos el contendido que se le pase como parametro a la función."
697 | ]
698 | },
699 | {
700 | "cell_type": "markdown",
701 | "metadata": {
702 | "colab_type": "text",
703 | "id": "sgCdpQfDS5wG"
704 | },
705 | "source": [
706 | "### Ejercicio funciones\n",
707 | "Escribir una función que cheque los siguientes usuarios y contraseñas:\n",
708 | "* Usuario: Juan - Contraseña: 12345_\n",
709 | "* Usuario: Pablo - Contraseña: xDcFvGbHn"
710 | ]
711 | },
712 | {
713 | "cell_type": "code",
714 | "execution_count": 0,
715 | "metadata": {
716 | "colab": {},
717 | "colab_type": "code",
718 | "id": "cqBdQ2P-RPU6"
719 | },
720 | "outputs": [],
721 | "source": []
722 | },
723 | {
724 | "cell_type": "markdown",
725 | "metadata": {
726 | "colab_type": "text",
727 | "id": "13AcDcKZWX0b"
728 | },
729 | "source": [
730 | "## Ejercitación integradora $\\newcommand{\\dif}{\\bigstar}$$\\newcommand{\\facil}{\\color{\\green}{\\dif}}$ $\\newcommand{\\pieceofcake}{\\color{\\cyan}{\\dif}}$$\\newcommand{\\medio}{\\color{\\yellow}{\\dif\\dif}}$$\\newcommand{\\media}{\\medio}$$\\newcommand{\\normal}{\\medio}$ $\\newcommand{\\dificil}{\\color{\\orange}{\\dif\\dif\\dif}}$ $\\newcommand{\\imposible}{\\color{\\red}{\\dif\\dif\\dif\\dif}}$"
731 | ]
732 | },
733 | {
734 | "cell_type": "markdown",
735 | "metadata": {
736 | "colab_type": "text",
737 | "id": "ZJ8oR4DW3z4A"
738 | },
739 | "source": [
740 | "###$\\facil$ Cálculo de promedio \n",
741 | "Cálcular la nota de un alumno es una tarea cotidiana de un profesor. Esta tarea suele realizarse a mano o en excel muchas veces. En esta ocasión la haremos en python. \n",
742 | "- Escribir una función que calcule el promedio de 3 notas. \n",
743 | "- Escribir una función que calcule el promedio de 3 notas con ponderación (asignar de importancia al primer examen 20% al segundo 50% y al tercero 30%)\n",
744 | "- Llamar a la función anterior 3 veces con distintas notas y verificar, mediante la instrucción if, si el alumno aprobó (suponga que 4 es la nota de aprobación). en cada caso.\n",
745 | "\n"
746 | ]
747 | },
748 | {
749 | "cell_type": "code",
750 | "execution_count": 0,
751 | "metadata": {
752 | "colab": {},
753 | "colab_type": "code",
754 | "id": "3DHirONd90wp"
755 | },
756 | "outputs": [],
757 | "source": []
758 | },
759 | {
760 | "cell_type": "markdown",
761 | "metadata": {
762 | "colab_type": "text",
763 | "id": "_QLEV2dP64fo"
764 | },
765 | "source": [
766 | "###$\\facil$ Dominó \n",
767 | "\n",
768 | "El [Dominó](https://es.wikipedia.org/wiki/Domin%C3%B3) es un juego de mesa muy popular. \n",
769 | "En este ejercicio no vamos a programar un juego de Domino, pero sí contar sus fichas.\n",
770 | "\n",
771 | "
\n",
772 | "\n",
773 | "A pesar de que el domino tradicional se juega con fichas hasta el número 6, vamos a considerar un juego de fichas de valor máximo $n$.\n",
774 | "\n",
775 | "- Escribir una función que calcule la cantidad de fichas para un juego de dominó completo con fichas que contienen hasta el número $n$.\n",
776 | "Nota: ¡No hay fichas repetidas! 2-4 es la misma ficha que 4-2. \n",
777 | "\n",
778 | "```\n",
779 | " cantidadFichas(4)\n",
780 | " >>> 6\n",
781 | "```\n",
782 | "\n",
783 | "- Escribir una función que muestre todas las fichas para un juego de dominó como el anterior, en cualquier orden.\n",
784 | "\n",
785 | "```\n",
786 | " mostrarFichas(3)\n",
787 | " >>> 1-1\n",
788 | " >>> 1-2\n",
789 | " >>> 1-3\n",
790 | " >>> 2-2\n",
791 | " >>> 2-3\n",
792 | " >>> 3-3\n",
793 | "```\n",
794 | "\n",
795 | "- Llamar a las funciones anteriores con distintos valores para corroborar su funcionamiento\n",
796 | "\n",
797 | "- Challenge: Escribir una función que, dada una cantidad de fichas, calcule cuál es el $n$ (valor máximo) de las fichas. Si la cantidad no corresponde a ningún juego de dominó completo retornar -1.\n",
798 | "\n",
799 | "```\n",
800 | " valorMaximo(21)\n",
801 | " >>> 7\n",
802 | "```\n"
803 | ]
804 | },
805 | {
806 | "cell_type": "code",
807 | "execution_count": 0,
808 | "metadata": {
809 | "colab": {},
810 | "colab_type": "code",
811 | "id": "Mu1GbWGC-IW9"
812 | },
813 | "outputs": [],
814 | "source": []
815 | },
816 | {
817 | "cell_type": "markdown",
818 | "metadata": {
819 | "colab_type": "text",
820 | "id": "fm_1Ogs_k0Uu"
821 | },
822 | "source": [
823 | "### $\\normal$ La leyenda de Filius Bonacci \n",
824 | "> Indented block\n",
825 | "\n",
826 | "\n",
827 | "\n",
828 | "\n",
829 | "
\n",
830 | "\n",
831 | "Imprima $n$ números de la [sucesion de Fibonacci](https://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci)\n",
832 | "\n",
833 | "\n",
834 | "```\n",
835 | "0, 1, 1, 2, 3, 5, 8, 13, 21 ...\n",
836 | "```"
837 | ]
838 | },
839 | {
840 | "cell_type": "code",
841 | "execution_count": 0,
842 | "metadata": {
843 | "colab": {},
844 | "colab_type": "code",
845 | "id": "Am1NHiy6xeMp"
846 | },
847 | "outputs": [],
848 | "source": []
849 | },
850 | {
851 | "cell_type": "markdown",
852 | "metadata": {
853 | "colab_type": "text",
854 | "id": "tS0MU0yrKfAs"
855 | },
856 | "source": [
857 | "###$\\dificil$ Ejercicio de entrevista en Ingemática \n",
858 | "Escriba un programa que imprima los números del 1 al 100, pero que para cada número que sea múltiplo de 3 imprima `N3`, para los múltiplos de 5 imprima `N5`, y para los múltiplos de los dos, `N3N5`.\n",
859 | "\n",
860 | "**Tips**\n",
861 | "* ¡Si el número es divisible por 3 entonces el resto de la división vale cero!\n",
862 | "```\n",
863 | "numero % 3 == 0\n",
864 | ">> True\n",
865 | "```\n"
866 | ]
867 | },
868 | {
869 | "cell_type": "code",
870 | "execution_count": 0,
871 | "metadata": {
872 | "colab": {},
873 | "colab_type": "code",
874 | "id": "IUtY_MurVkMl"
875 | },
876 | "outputs": [],
877 | "source": []
878 | },
879 | {
880 | "cell_type": "markdown",
881 | "metadata": {
882 | "colab_type": "text",
883 | "id": "QkV_WCR4HUA5"
884 | },
885 | "source": [
886 | "###$\\medio$ Locos por las matemáticas \n",
887 | "En marzo 2019, Emma Haruka Iwao, una empleada de Google, logró calcular 31,4 trillones de dígitos del famoso número pi en 121 dias usando el poder de la nube de Google. ¡Hoy ustedes pueden hacer lo mismo con la ayuda de Python!\n",
888 | "\n",
889 | "Aprovechando el descubrimiento del matemático indio Sriniviasa Ramanujan (1910) podemos emplear nuestro propio aproximador de pi.\n",
890 | "$$ \\frac{1}{\\pi}= \\frac{2\\sqrt{2}}{9801}\\sum_{k=0}^{\\infty} \\frac{(4k)! \\cdot (1103+26390k)}{(k!)^4 396^{4k}}$$\n",
891 | "\n",
892 | "Tengan en cuenta la proxima función para calcular factoriales:\n",
893 | "\n",
894 | "```\n",
895 | "def factorial(n):\n",
896 | " if n<=1:\n",
897 | " return 1\n",
898 | " else:\n",
899 | " return n*factorial(n-1)\n",
900 | "```\n",
901 | "$$\\textrm{factorial(4)}=4!=24 $$\n",
902 | "\n",
903 | "Si no estamos tan locos por la matemáticas podemos usar otras aproximaciones más simples como\n",
904 | "\n",
905 | "$$\\pi \\approx \\frac{22}{7} \\approx \\frac{355}{113} $$\n",
906 | "\n",
907 | "Otros números famosos:\n",
908 | "$$e = \\sum_{k=0}^\\infty \\frac{1}{k!} \\qquad e=\\lim_{x\\rightarrow\\infty} \\left( 1+\\frac{1}{x} \\right)^x \\qquad \\varphi = \\frac{1+\\sqrt{5}}{2} $$"
909 | ]
910 | },
911 | {
912 | "cell_type": "code",
913 | "execution_count": 0,
914 | "metadata": {
915 | "colab": {},
916 | "colab_type": "code",
917 | "id": "F8WOsa0XLAKx"
918 | },
919 | "outputs": [],
920 | "source": []
921 | }
922 | ],
923 | "metadata": {
924 | "colab": {
925 | "collapsed_sections": [],
926 | "include_colab_link": true,
927 | "name": "Clase 1 - Curso Python.ipynb",
928 | "provenance": [],
929 | "toc_visible": true,
930 | "version": "0.3.2"
931 | },
932 | "kernelspec": {
933 | "display_name": "Python 3",
934 | "language": "python",
935 | "name": "python3"
936 | },
937 | "language_info": {
938 | "codemirror_mode": {
939 | "name": "ipython",
940 | "version": 3
941 | },
942 | "file_extension": ".py",
943 | "mimetype": "text/x-python",
944 | "name": "python",
945 | "nbconvert_exporter": "python",
946 | "pygments_lexer": "ipython3",
947 | "version": "3.7.2"
948 | }
949 | },
950 | "nbformat": 4,
951 | "nbformat_minor": 1
952 | }
953 |
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Clases/Proyecto_Integrador_Python.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "Proyecto Integrador Python.ipynb",
7 | "provenance": [],
8 | "collapsed_sections": []
9 | },
10 | "kernelspec": {
11 | "name": "python3",
12 | "display_name": "Python 3"
13 | }
14 | },
15 | "cells": [
16 | {
17 | "cell_type": "markdown",
18 | "metadata": {
19 | "id": "kegH31D9TmYk"
20 | },
21 | "source": [
22 | "# **Curso de Python - Proyecto Integrador**"
23 | ]
24 | },
25 | {
26 | "cell_type": "markdown",
27 | "metadata": {
28 | "id": "DMg0wMnCqXpa"
29 | },
30 | "source": [
31 | "
"
32 | ]
33 | },
34 | {
35 | "cell_type": "markdown",
36 | "metadata": {
37 | "id": "Pxj3Bz92T-SE"
38 | },
39 | "source": [
40 | "En este proyecto final podrán integrar los conocimientos adquiridos a lo largo del curso implementando una aplicación práctica que esperamos sirva como un puntapié inicial para la creación de muchos más proyectos en su futuro de todo tipo de complejidad.\n",
41 | "\n",
42 | "**Objetivos del proyecto**:\n",
43 | "\n",
44 | "* Que el participante domine las bases de la programación en Python.\n",
45 | "* Que el participante tenga conocimientos elementales sobre la lectura de archivos, procesamiento de datos, y visualización de datos.\n",
46 | "* Que el participante pueda encontrar y aplicar conocimientos que vayan más allá de los explicados en el curso.\n",
47 | "* Que el participante tenga una experiencia de aplicación de la programación Python a un ejemplo práctico.\n",
48 | "\n",
49 | "**Recomendaciones:**\n",
50 | "\n",
51 | "* El programa debe ser **robusto**, es decir, con pocas probabilidades de fallar al alterar su entrada. Si el formato de la entrada del usuario no es el esperado **el programa no debe *crashear***, sino manejar la situación acordemente. Una estrategia para detectar posibles fallos es imaginarse que una persona esta empeñada en producir un error en su programa y pensar: **¿Qué intentaría esta persona para romper el código?** Esto involucra, por ejemplo, contemplar casos en que el usuario ingrese texto cuando se esperaba un número, o que ingrese un valor desconocido, una clave que no se encuentra en un diccionario, un índice mayor al tamaño de una lista, etc.\n",
52 | "\n",
53 | "\n"
54 | ]
55 | },
56 | {
57 | "cell_type": "markdown",
58 | "metadata": {
59 | "id": "40C-h2RsTAr-"
60 | },
61 | "source": [
62 | "# **Opción 1: Graficador de casos del COVID-19**\n",
63 | "\n",
64 | "#### *Análisis y visualización de datos sobre los casos de coronavirus en distintos países.*\n",
65 | "\n",
66 | "
\n",
67 | "\n",
68 | "En esta era de la desinformación puede resultar útil poder sacar uno mismo sus propias conclusiones acerca de los datos presentados. El objetivo de este trabajo es obtener datos de casos y muertes por el Coronavirus de un repositorio de datos online y graficar por país.\n",
69 | "\n",
70 | "**Funcionalidad:**\n",
71 | "\n",
72 | "* La aplicación debe recibir del usuario el nombre del país deseado y permitir graficar casos detectados y fallecimientos totales para ese país en función del tiempo.\n",
73 | "\n",
74 | "* El usuario debe poder ingresar 2 países y se permite graficar para dichos países la cantidad de casos y fallecimientos en dos gráficos con labels. El usuario debe poder ingresar el intervalo de tiempo a graficar. Calcular las intersecciónes entre gráficos si las hubiera y marcarlas con un punto de algún tipo.\n",
75 | "\n",
76 | "* El usuario debe poder ingresar *n* países y se permite graficar para dichos países la cantidad de casos en una [escala logaritmica](https://es.wikipedia.org/wiki/Escala_logar%C3%ADtmica). El programa debe pedirle al usuario el intervalo de tiempo deseado.\n",
77 | "\n",
78 | "* Gráficar sobre la misma imagen la cantidad de casos en una [escala logaritmica](https://es.wikipedia.org/wiki/Escala_logar%C3%ADtmica) de Argentina y todos sus países limítrofes (Chile, Bolivia, Paraguay, Brasil y Uruguay) durante los meses de invierno (21 de junio a 21 de septiembre). Debe quedar claro la curva que corresponde a cada país.\n",
79 | "\n",
80 | "**Funcionalidad extra:** *Pueden realizar todos, algunos, o ninguno de los siguientes ítems. También pueden agregar otra funcionalidad que se les ocurra a ustedes.*\n",
81 | "\n",
82 | "* El programa debe permitir almacenar en un archivo excel los países ordenados de mayor cantidad de casos totales acumulados (al día de hoy) a menor cantidad de casos indicando en las distintas columnas el nombre del país, la cantidad de casos y los fallecimientos.\n",
83 | "\n",
84 | "* Almacenar en un archivo excel los países ordenados de mayor cantidad de casos totales acumulados a menor cantidad de casos indicando en las distintas columnas el nombre del país, la cantidad de casos y los fallecimientos colocando en distintas hojas del archivo excel (distintas pestañas) la evolución de este ranking, es decir armar una hoja distinta para cada día transcurrido. Defina los días a utilizar acorde a cuanta información se disponga, podría ser una entrada del usuario.\n",
85 | "\n",
86 | "* Para cada gráfico generado el usuario deberá poder ingresar un nombre de archivo y el programa genera un archivo *.PNG* del gráfico con el nombre indicado.\n",
87 | "\n",
88 | "* Crear una aplicación de consola que se ejecute continuamente recibiendo comandos del usuario, el usuario debe indicar el modo de operación que desea y el programa le pide los datos requeridos. Luego de finalizar la tarea el programa regresa al inicio y le pide al usuario el próximo comando. Incluír un comando de *ayuda* para que el programa indique al usuario cómo utilizarlo. Incluír un comando de *salida* que provoca la finalización del programa.\n",
89 | "\n",
90 | "**Sugerencia:** \n",
91 | "* Se pueden rotar las leyendas usando `plt.xticks(rotation=60)` (rotación de 60 grados). Es útil para leyendas largas, como por ejemplo, fechas. \n",
92 | "\n",
93 | "* En esta [página web](https://nexiandigitalacademy.es/visualizacion-y-procesamiento-de-datos-ante-de-la-pandemia-del-covid-19/) hay un ejemplo de gráficos logaritmicos\n",
94 | "\n",
95 | "\n",
96 | "\n",
97 | "\n"
98 | ]
99 | },
100 | {
101 | "cell_type": "code",
102 | "metadata": {
103 | "id": "ASU5hpqvTY62"
104 | },
105 | "source": [
106 | "!wget 'https://covid.ourworldindata.org/data/ecdc/full_data.csv'"
107 | ],
108 | "execution_count": null,
109 | "outputs": []
110 | },
111 | {
112 | "cell_type": "markdown",
113 | "metadata": {
114 | "id": "s0qKIOh3UzGF"
115 | },
116 | "source": [
117 | "# **Opción 2: El mercado financiero**\n",
118 | "\n",
119 | "#### *Estudio comparativo del desempeño financiero de distintas empresas*.\n",
120 | "\n",
121 | "
\n",
122 | "\n",
123 | "Puede ser muy útil visualizar la información del mercado financiero para sacar conclusiones, en esta opción de proyecto la idea es estudiar comparativamente el desempeño de dos o más empresas en la bolsa.\n",
124 | "\n",
125 | "**Funcionalidad:**\n",
126 | "\n",
127 | "* Armar un programa donde se analize la información de ciertas empresas (entrada del usuario) y se las grafique comparativamente.\n",
128 | "\n",
129 | "* El usuario debe poder seleccionar empresas de una lista de opciones y el programa debe calcular las intersecciones entre los precios de ambas. Se debe permitir graficar esta información de forma gráfica y almacenar en un archivo de excel las fechas donde ocurrieron las intersecciones.\n",
130 | "\n",
131 | "* Se debe permitir graficar la *derivada discreta* de los valores de bolsa de cada empresa, esto es, la diferencia entre el valor actual y el anterior para cada punto en el tiempo.\n",
132 | "\n",
133 | "* El programa debe poder calcular cuál es aquella que creció más y aquella que creció menos en el mes pasado (Octubre), en el mes anterior (Septiembre) y los últimos 12 meses, esta información se debe poder almacenar en un archivo excel.\n",
134 | "\n",
135 | "* Realizar un gráfico del valor de las acciones diarias de las compañias **Amazon** y **Google** utilizando dos tipos de lineas distintos. El intervalo de fechas que se desea gráficar debe ser seleccionado por el usuario. Encontrar los puntos donde se cruzan los dos gráficos y marcarlos con puntos (para este caso elegir un intervalo donde se produzcan cruces).\n",
136 | "\n",
137 | "**Funcionalidad extra:** *Pueden realizar todos, algunos, o ninguno de los siguientes ítems. También pueden agregar otra funcionalidad que se les ocurra a ustedes.*\n",
138 | "\n",
139 | "* El usuario debe poder seleccionar un periodo (1 semana, 1 mes, etc) y fechas de comienzo y de final. El programa debe poder analizar dentro de esas fechas las empresas que crecieron más y menos dentro de cada periodo (1 semana, 1 mes, etc).\n",
140 | "\n",
141 | "* El usuario debe poder ingresar una fecha de inicio y de fin, luego el programa analiza para cada empresa aquella que tenga el mayor coeficiente de correlación lineal (aquella que mejor se aproxime a una recta). Pueden utilizar la función [scipy.stats.pearsonr](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html) de la librería *scipy*.\n",
142 | "\n",
143 | "* Mostrar la pendiente obtenida al aproximar el precio de cada empresa mediante una ecuación lineal, ofrecer la opción de visualizar el precio de cierta empresa superponiendo esta aproximación lineal en el gráfico. Pueden utilizar la función [scipy.stats.linregress](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html) de la librería *scipy*.\n",
144 | " \n",
145 | " **Atención:** La matemática para hacer estos análisis puede resultar avanzada y no es necesario entenderla, alcanza con entender el funcionamiento de las funciones de librería y saber aplicarlas correctamente.\n",
146 | "\n",
147 | "* Para cada gráfico generado el usuario deberá poder ingresar un nombre de archivo y el programa genera un archivo *.PNG* del gráfico con el nombre indicado.\n",
148 | "\n",
149 | "* Crear una aplicación de consola que se ejecute continuamente recibiendo comandos del usuario, el usuario debe indicar el modo de operación que desea y el programa le pide los datos requeridos. Luego de finalizar la tarea el programa regresa al inicio y le pide al usuario el próximo comando. Incluír un comando de *ayuda* para que el programa indique al usuario cómo utilizarlo. Incluír un comando de *salida* que provoca la finalización del programa.\n",
150 | "\n",
151 | "**Sugerencia**: En esta [base de datos](https://github.com/scikit-learn/examples-data/tree/master/financial-data) esta la información de bolsa de muchas empresas, también en algunos sitios como [Yahoo Finance](https://finance.yahoo.com/) o [investing.com](https://www.investing.com/) pueden buscar información del estado de la bolsa de las empresas en formato csv o excel. "
152 | ]
153 | },
154 | {
155 | "cell_type": "markdown",
156 | "metadata": {
157 | "id": "lVowRzeIL3sr"
158 | },
159 | "source": [
160 | "# **Opción 3: Análisis de datos obtenidos por un instrumento de medición**\n",
161 | "\n",
162 | "#### *Analisis de una señal de un electrocardiograma para conseguir información de un paciente.*\n",
163 | "\n",
164 | "
\n",
165 | "\n",
166 | "Un electrocardiograma es una representación gráfica de los pulsos cardíacos. Se tiene un archivo **electrocardiograma.xlsx** con la información del resultado de un electrocardiograma en dos columnas, una tiene los valores de las mediciones en $eV$ (columna *señal*), y la segunda los instantes (medido en segundos transcurridos) en que se toma cada medición (columna *tiempo*) que fueron tomadas con una frecuencia de 360 Hz.\n",
167 | "\n",
168 | "**Funcionalidad:**\n",
169 | "\n",
170 | "* Se debe poder calcular los picos de la señal y marcarlos en un gráfico de la misma.\n",
171 | "\n",
172 | " **Sugerencia**: Usar la función [scipy.signal.find_peaks](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html) de la librería *scipy* (en la documentación hay ejemplos muy útiles).\n",
173 | "\n",
174 | "* Se debe poder calcular la frecuencia cardíaca del paciente medida en latidos por minuto a partir de los picos más altos de cada pulsación.\n",
175 | "\n",
176 | "* Determinar si el electrocardiograma fue tomado mientras el paciente dormía, estaba en reposo o hacia actividad física. Tomar como referencia los [criterios de la frecuencia cardíaca](https://es.wikipedia.org/wiki/Frecuencia_card%C3%ADaca) y pedir como entrada del programa cualquier información adicional necesaria (como la edad o el sexo del paciente).\n",
177 | "\n",
178 | "* Se deben poder almacenar los resultados en un archivo de texto *.txt*\n",
179 | "\n",
180 | "* Graficar la señal del electrocardiograma en función del tiempo señalando el pico más alto de cada pulsación. Indicar la frecuencia cardíaca dentro del gráfico (puede ser mediante *labels*, *título*, *descripción*, etc).\n",
181 | "\n",
182 | "**Funcionalidad extra:** *Pueden realizar todos, algunos, o ninguno de los siguientes ítems. También pueden agregar otra funcionalidad que se les ocurra a ustedes.*\n",
183 | "\n",
184 | "* Identificar la onda P, el complejo QRS y la onda T para cada pulsación. Pueden investigar más en [esta página de Wikipedia](https://es.wikipedia.org/wiki/Electrocardiograma#El_ECG_normal).\n",
185 | "\n",
186 | "* Analizar y graficar la [densidad espectral de potencia](https://es.wikipedia.org/wiki/Densidad_espectral) de la señal, calcular su valor en 60 Hz (la frecuencia de la instalación eléctrica donde se realizaron las mediciones) para averiguar si la instalación eléctrica afecta a la medición. Para esto pueden utilizar la función [scipy.signal.welch](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.welch.html) de la librería *scipy*.\n",
187 | " \n",
188 | " **Atención:** La matemática para hacer este análisis puede resultar avanzada y no es necesario entenderla, alcanza con entender el funcionamiento de las funciones de librería y saber aplicarlas correctamente.\n",
189 | "\n",
190 | "* Para cada gráfico generado el usuario deberá poder ingresar un nombre de archivo y el programa genera un archivo *.PNG* del gráfico con el nombre indicado.\n",
191 | "\n",
192 | "* Crear una aplicación de consola que se ejecute continuamente recibiendo comandos del usuario, el usuario debe indicar el modo de operación que desea y el programa le pide los datos requeridos. Luego de finalizar la tarea el programa regresa al inicio y le pide al usuario el próximo comando. Incluír un comando de *ayuda* para que el programa indique al usuario cómo utilizarlo. Incluír un comando de *salida* que provoca la finalización del programa."
193 | ]
194 | },
195 | {
196 | "cell_type": "code",
197 | "metadata": {
198 | "id": "E_NWYz3HdDZ7"
199 | },
200 | "source": [
201 | "! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/electrocardiograma.xlsx\""
202 | ],
203 | "execution_count": null,
204 | "outputs": []
205 | }
206 | ]
207 | }
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/Datos.csv:
--------------------------------------------------------------------------------
1 | Legajo,Nombre,Apellido,Quimica,Matematica,Fisica
2 | 34567,Juan,Martinez,10,7,9
3 | 34678,Pablo,Gonzales,4,9,4
4 | 34234,Maria,Citanovich,2,4,4
5 | 35679,Sol,Rios,9,8,10
6 | 36789,Paula,Lagos,8,5,8
7 | 32578,Tomas,Reu,1,4,2
8 |
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/Datos.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/Datos.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/Datos2.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/Datos2.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/Finanzas.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/Finanzas.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/NotasFinitos.csv:
--------------------------------------------------------------------------------
1 | 1P,2P,3P,MAX
2 | 60,115,50,100
3 | 5,Ausente,,140
4 | 20,45,65,110
5 | 35,35,45,
6 | 80,0,75,
7 | Ausente,5,,
8 | 73,110,85,
9 | 65,95,85,
10 | 20,Ausente,,
11 | 30,55,75,
12 | 25,Ausente,,
13 | 60,50,90,
14 | 60,65,60,
15 | 60,105,70,
16 | 55,60,35,
17 | 55,10,45,
18 | 15,100,70,
19 | 50,30,20,
20 | 35,30,40,
21 | 70,75,75,
22 | 48,50,55,
23 | 70,85,70,
24 | 30,40,45,
25 | 0,0,50,
26 | 65,60,,
27 | 85,50,80,
28 | 45,75,70,
29 | 40,90,75,
30 | 50,Ausente,,
31 | 30,40,,
32 | 30,Ausente,,
33 | 15,Ausente,,
34 | 70,30,60,
35 | 92,25,50,
36 | 35,80,90,
37 | 15,Ausente,,
38 | 60,50,50,
39 | 80,105,,
40 | 30,Ausente,,
41 | 50,25,30,
42 | 55,Ausente,55,
43 | 5,Ausente,,
44 | 55,10,105,
45 | 80,85,Ausente,
46 | 50,40,70,
47 | 60,135,85,
48 | 70,110,50,
49 | 65,15,30,
50 | 40,60,60,
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/PopulationArgentina2019.csv:
--------------------------------------------------------------------------------
1 | Age,M,F
2 | 0-4,1905961,1835921
3 | 5-9,1878514,1810689
4 | 10-14,1823693,1759246
5 | 15-19,1793158,1734206
6 | 20-24,1767025,1719995
7 | 25-29,1764528,1738182
8 | 30-34,1635387,1640266
9 | 35-39,1546074,1572173
10 | 40-44,1488306,1547031
11 | 45-49,1238636,1322182
12 | 50-54,1085881,1182360
13 | 55-59,991032,1106601
14 | 60-64,865713,993141
15 | 65-69,734161,885281
16 | 70-74,562907,738464
17 | 75-79,373158,559795
18 | 80-84,224276,397297
19 | 85-89,113868,248361
20 | 90-94,39710,113660
21 | 95-99,8773,31211
22 | 100+,654,3198
23 |
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/Tabla1.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/Tabla1.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/california_housing_test.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/california_housing_test.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/california_housing_train.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/california_housing_train.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/datosClientes.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/datosClientes.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/electrocardiograma.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/electrocardiograma.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/lista1.csv:
--------------------------------------------------------------------------------
1 | Mail,Apellido,Nombre,Edad
2 | druschel@msn.com,Druschel,Julieta,31
3 | hstiles@hotmail.com,Stiles,Harry,23
4 | jrifkin@gmail.com,Rifkin,Josefina,27
5 |
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/lista2.csv:
--------------------------------------------------------------------------------
1 | Mail,Nombre,Apellido,DNI
2 | payned@icloud.com,Pedro,Ayned,23569875
3 | johnh@comcast.net,John,Harris,99852365
4 | fairbank@icloud.com,Fernanda,Airbank,99754231
5 | jrifkin@gmail.com,Josefina,Rifkin,40896523
6 |
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/lista_final.csv:
--------------------------------------------------------------------------------
1 | ,Nombre,Apellido,DNI,Edad
2 | druschel@msn.com,Julieta,Druschel,-,31
3 | fairbank@icloud.com,Fernanda,Airbank,99754231,-
4 | hstiles@hotmail.com,Harry,Stiles,-,23
5 | johnh@comcast.net,John,Harris,99852365,-
6 | jrifkin@gmail.com,Josefina,Rifkin,40896523,27
7 | payned@icloud.com,Pedro,Ayned,23569875,-
8 |
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/notas.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Analisis_de_Datos_Datos/notas.xlsx
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/noticia.txt:
--------------------------------------------------------------------------------
1 | WASHINGTON — The White House, blindsided by a pact between California and four automakers to oppose President Trump’s auto emissions rollbacks, has mounted an effort to prevent any more companies from joining the other side.
2 |
3 | Toyota, Fiat Chrysler and General Motors were all summoned by a senior Trump adviser to a White House meeting last month where he pressed them to stand by the president’s own initiative, according to four people familiar with the talks.
4 |
5 | But even as the White House was working to do this, it was losing ground. Yet another company, Mercedes-Benz, is preparing to join the four automakers already in the California agreement — Honda, Ford, Volkswagen and BMW — according to two people familiar with the German company’s plans.
6 |
7 | Mr Trump, described by three people as enraged by California’s deal, has demanded that his staff members step up the pace to complete his plan. His proposal, however, is directly at odds with the wishes of many automakers, which fear that the aggressive rollbacks will spark a legal battle between California and the federal government that could split the United States car market.
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/transferencias.csv:
--------------------------------------------------------------------------------
1 | ,Dinero,Emisor,Receptor
2 | 0,220,Claudia,Uriel
3 | 1,2000,Rocio,Ariel
4 | 2,43434,Agustin,Rocio
5 | 3,12434,Uriel,Joaquin
6 |
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/usuarios.csv:
--------------------------------------------------------------------------------
1 | ,Usuario,Dinero
2 | 0,Claudia,44000
3 | 1,Agustin,20000
4 | 2,Rocio,30000
5 | 3,Ariel,50000
6 | 4,Joaquin,65555
7 | 5,Uriel,-40000
8 |
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Datos/youtube_data.json:
--------------------------------------------------------------------------------
1 | {
2 | "columnHeaders": [
3 | {
4 | "columnType": "DIMENSION",
5 | "dataType": "STRING",
6 | "name": "day"
7 | },
8 | {
9 | "columnType": "METRIC",
10 | "dataType": "INTEGER",
11 | "name": "estimatedMinutesWatched"
12 | },
13 | {
14 | "columnType": "METRIC",
15 | "dataType": "INTEGER",
16 | "name": "views"
17 | },
18 | {
19 | "columnType": "METRIC",
20 | "dataType": "INTEGER",
21 | "name": "likes"
22 | },
23 | {
24 | "columnType": "METRIC",
25 | "dataType": "INTEGER",
26 | "name": "subscribersGained"
27 | }
28 | ],
29 | "kind": "youtubeAnalytics#resultTable",
30 | "rows": [
31 | [
32 | "2020-10-01",
33 | 26,
34 | 19,
35 | 0,
36 | 0
37 | ],
38 | [
39 | "2020-10-02",
40 | 2,
41 | 14,
42 | 0,
43 | 0
44 | ],
45 | [
46 | "2020-10-03",
47 | 120,
48 | 78,
49 | 0,
50 | 1
51 | ],
52 | [
53 | "2020-10-04",
54 | 3280,
55 | 1203,
56 | 75,
57 | 88
58 | ],
59 | [
60 | "2020-10-05",
61 | 2064,
62 | 747,
63 | 22,
64 | 44
65 | ],
66 | [
67 | "2020-10-06",
68 | 2290,
69 | 824,
70 | 28,
71 | 26
72 | ],
73 | [
74 | "2020-10-07",
75 | 2817,
76 | 950,
77 | 13,
78 | 20
79 | ],
80 | [
81 | "2020-10-08",
82 | 4594,
83 | 1491,
84 | 9,
85 | 14
86 | ],
87 | [
88 | "2020-10-09",
89 | 4238,
90 | 1254,
91 | 17,
92 | 19
93 | ],
94 | [
95 | "2020-10-10",
96 | 31783,
97 | 3231,
98 | 126,
99 | 102
100 | ],
101 | [
102 | "2020-10-11",
103 | 6233,
104 | 1529,
105 | 18,
106 | 22
107 | ],
108 | [
109 | "2020-10-12",
110 | 4786,
111 | 1138,
112 | 9,
113 | 7
114 | ],
115 | [
116 | "2020-10-13",
117 | 3977,
118 | 761,
119 | 17,
120 | 13
121 | ]
122 | ]
123 | }
--------------------------------------------------------------------------------
/Curso_Analisis_de_Datos_Solucionarios/Solucionario_Clase_1.ipynb:
--------------------------------------------------------------------------------
1 | {"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":"6wJV_1sXR8JX"},"source":["# Mini desafíos"]},{"cell_type":"markdown","metadata":{"id":"Ve8-YdUyagnD"},"source":["### Mini desafío 1.A\n","Leer el archivo **Tabla1.xlsx** que contiene los puntos de un campeonato. El archivo tiene cuatro columnas:\n","* **Equipo**\n","* **Puntos**\n","* **Goles a favor**\n","* **Goles en contra**\n","\n","Determinar de cada equipo la diferencia de gol (goles a favor - goles en contra), y mostrar todas las diferencias usando **print**."]},{"cell_type":"code","metadata":{"id":"efoMZn5096BH","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1664041003664,"user_tz":180,"elapsed":679,"user":{"displayName":"ALEJO AGUSTIN FIGUEROA","userId":"02597512395653915687"}},"outputId":"cb2979c5-2c31-40de-a6f1-27dbcef59a4e"},"source":[" ! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/Tabla1.xlsx\""],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["--2022-09-24 17:36:42-- https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/Tabla1.xlsx\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 4909 (4.8K) [application/octet-stream]\n","Saving to: ‘Tabla1.xlsx’\n","\n","Tabla1.xlsx 100%[===================>] 4.79K --.-KB/s in 0s \n","\n","2022-09-24 17:36:42 (50.3 MB/s) - ‘Tabla1.xlsx’ saved [4909/4909]\n","\n"]}]},{"cell_type":"markdown","metadata":{"id":"dz5SB4ReSLae"},"source":["**Solución 1** - La primera solución es con el comando **to_dict(\"list\")**"]},{"cell_type":"code","metadata":{"id":"83Rg45ylSL7E","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1664041040573,"user_tz":180,"elapsed":1272,"user":{"displayName":"ALEJO AGUSTIN FIGUEROA","userId":"02597512395653915687"}},"outputId":"42ab30b1-ae51-4bc1-f11b-0de9823dc0a8"},"source":["import pandas as pd\n","\n","archivo = pd.read_excel(\"Tabla1.xlsx\")\n","\n","data = archivo.to_dict(\"list\") # diccionario de listas.\n","#La clave de los diccionarios es el nombre de la columna\n","#El contenido de los diccionarios es una lista con el contenido de la columna\n","\n","filas = len(data[\"Equipo\"])\n","\n","print(\"Diferencias de gol:\")\n","\n","for i in range(len(data[\"Equipo\"])):\n"," print(data[\"Equipo\"][i], \":\", data[\"Goles a favor\"][i] - data[\"Goles en contra\"][i])"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Diferencias de gol:\n","Equipo A : 55.0\n","Equipo B : 30.0\n","Equipo C : 40.0\n","Equipo D : -30.0\n","Equipo E : -5.0\n","Equipo F : 25.0\n"]}]},{"cell_type":"markdown","metadata":{"id":"Kk069MjXSPJ7"},"source":["**Solución 2** - La segunda solución es con el comando **to_dict(\"records\")**"]},{"cell_type":"code","metadata":{"id":"llvohcJSSRau"},"source":["import pandas as pd\n","\n","archivo = pd.read_excel(\"Tabla1.xlsx\")\n","\n","data = archivo.to_dict(\"records\") # lista de diccionarios\n","# cada elemento de la lista es un diccionario que contiene los valores de cada fila\n","\n","print(\"Diferencias de gol:\")\n","\n","for i in range(len(data)):\n"," print(data[i][\"Equipo\"], \":\", data[i][\"Goles a favor\"] - data[i][\"Goles en contra\"])"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"9kt4VjWjSTpM"},"source":["**Solución 3** - La tercera solución es con el comando **to_dict(\"index\")**. Se indexa por el nombre de los equipos que debe ser unico de cada equipo."]},{"cell_type":"code","metadata":{"id":"6CRRMQCXSVDg"},"source":["import pandas as pd\n","\n","archivo = pd.read_excel(\"Tabla1.xlsx\", index_col=\"Equipo\")\n","\n","data = archivo.to_dict(\"index\") # diccionario de diccionarios\n","# la clave de cada campo del diccionario es el nombre del equipo (index_col)\n","# el contenido de cada campo del diccionario es un diccionario con la información del equipo\n","\n","print(\"Diferencias de gol:\")\n","\n","for equipo in data.keys():\n"," print(equipo, \":\", data[equipo][\"Goles a favor\"] - data[equipo][\"Goles en contra\"])"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"XjqvtRgg8LRG"},"source":["### Mini desafío 1.B - Challenge\n","\n","Determinar qué equipo es el campeón (**1ro**) y perdedor (**último**). ¿Qué columnas del archivo hay que analizar en este caso?"]},{"cell_type":"code","metadata":{"id":"GStce2GfSZqa","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1664027269816,"user_tz":180,"elapsed":461,"user":{"displayName":"ALEJO AGUSTIN FIGUEROA","userId":"02597512395653915687"}},"outputId":"ef01fddc-f6ca-458a-eb63-86962ef4de86"},"source":[" ! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/Tabla1.xlsx\""],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["--2022-09-24 13:48:07-- https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/Tabla1.xlsx\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 4909 (4.8K) [application/octet-stream]\n","Saving to: ‘Tabla1.xlsx.1’\n","\n","\rTabla1.xlsx.1 0%[ ] 0 --.-KB/s \rTabla1.xlsx.1 100%[===================>] 4.79K --.-KB/s in 0s \n","\n","2022-09-24 13:48:07 (63.3 MB/s) - ‘Tabla1.xlsx.1’ saved [4909/4909]\n","\n"]}]},{"cell_type":"code","metadata":{"id":"j0wNgRLISbgw","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1664027274263,"user_tz":180,"elapsed":500,"user":{"displayName":"ALEJO AGUSTIN FIGUEROA","userId":"02597512395653915687"}},"outputId":"617fbc8d-e3cf-43f0-b6bc-0aa3b0299927"},"source":["import pandas as pd\n","\n","archivo = pd.read_excel(\"Tabla1.xlsx\", index_col = \"Equipo\")\n","# Indicamos que la columna de indexación será Equipo.\n","data = archivo.to_dict(\"index\")\n","# \"index\" significa que vamos a obtener el contenido como diccionarios\n","# donde la clave es algun campo de cada fila, en este caso la clave de los\n","# diccionarios será la clave \"Equipo\"\n","\n","# print(data)\n","\n","maxpunt = 0\n","minpunt = 1000000\n","maxname = ''\n","minname = ''\n","\n","# Vamos guardando y actualizando los \"récords\" mientras analizamos cada equipo\n","for key in data.keys():\n"," punt = data[key]['Puntos']\n"," if punt > maxpunt:\n"," maxpunt=punt\n"," maxname = key\n"," if punt < minpunt:\n"," minpunt=punt\n"," minname = key\n","\n","print(maxname, 'resultó campeón con', maxpunt, 'puntos.' )\n","print(minname, 'resultó último con', minpunt, 'puntos.' )"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Equipo A resultó campeón con 30.0 puntos.\n","Equipo D resultó último con 17.0 puntos.\n"]}]},{"cell_type":"markdown","metadata":{"id":"DXIq2D1mSd_p"},"source":["**Solución 2** - Esta solución es un poco más práctica y versátil"]},{"cell_type":"code","metadata":{"id":"BwgWBQ4vSflD"},"source":["import pandas as pd\n","\n","archivo = pd.read_excel(\"Tabla1.xlsx\", index_col =\"Equipo\")\n","# Indicamos que la columna de indexación será Equipo.\n","\n","data = archivo.to_dict(\"index\")\n","\n","data_tuple = data.items() # provocamos que los datos esten como una lista de la forma (clave, contenido)\n","\n","def criterioDeOrden(item): # esta función determina el criterio de orden\n"," clave, contenido = item\n"," return contenido[\"Puntos\"] # indicamos que al criterio le importa los puntos\n","\n","data_ordenada = sorted(data_tuple, reverse=True, key=criterioDeOrden)\n","\n","ganador = data_ordenada[0][0] # el primer 0 indica que es el primer elemento (el ganador), el segundo 0 indica que nos interesa la clave (si fuera un 1 sería el contenido)\n","perdedor = data_ordenada[-1][0] # el primer -1 indica que es el utimo elemento (el perdedor), el segundo 0 indica que nos interesa la clave (si fuera un 1 sería el contenido)\n","\n","print(ganador,\"resulto campeón con\",data[ganador][\"Puntos\"],\"puntos\")\n","print(perdedor,\"resulto último con\", data[perdedor][\"Puntos\"],\"puntos\")"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["**Solución 3** - Esta solución requiere una mayor comprensión de DataFrames, pero resulta más fácil de entender para el expectador, ya que no requiere de ciclos dentro del código de uno, sino que utiliza una función propia de pandas"],"metadata":{"id":"ZDlCiHXjxpw4"}},{"cell_type":"code","source":["import pandas as pd\n","\n","tabla_de_puntajes = pd.read_excel(\"Tabla1.xlsx\")\n","\n","# Buscamos al campeón, que es el que mayor puntaje obtuvo de todos los participantes.\n","# Utilizamos la función iloc, debido a que el resultado propio de pandas nos devuelve las filas del DataFrame que cumplen con lo pedido. Nosotros queremos la 1ra, que es la única fila\n","campeon = tabla_de_puntajes[tabla_de_puntajes['Puntos'] == tabla_de_puntajes['Puntos'].max()].iloc[0]\n","\n","#Buscamos al que quedó último, que es el que menor puntaje obtuvo de todos los participantes\n","# Utilizamos la función iloc, debido a que el resultado propio de pandas nos devuelve las filas del DataFrame que cumplen con lo pedido. Nosotros queremos la 1ra, que es la única fila\n","peor = tabla_de_puntajes[tabla_de_puntajes['Puntos'] == tabla_de_puntajes['Puntos'].min()].iloc[0]\n","\n","print(campeon['Equipo'], 'resultó campeón con', campeon['Puntos'])\n","print(peor['Equipo'], 'resultó último con', peor['Puntos'])"],"metadata":{"id":"-0f4GdXKxmIw"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Mini desafio 1.C - Extra Challenge\n","Determinar qué equipos obtuvieron mas de 20 puntos, y mostrar sus diferencias de goles.\n","\n","Plus: ordenar los equipos de mayor a menor en puntaje (de forma descendiente)."],"metadata":{"id":"W10zQTW8raHS"}},{"cell_type":"code","source":["import pandas as pd\n","\n","tabla_de_puntajes = pd.read_excel(\"Tabla1.xlsx\")\n","\n","print('Todos los equipos')\n","for indice, equipo in tabla_de_puntajes.iterrows():\n"," print(equipo['Equipo'], 'obtuvo un puntaje de', equipo['Puntos'], ', y su diferencia de goles es de:', equipo['Goles a favor'] - equipo['Goles en contra'])\n","print()\n","\n","# Nos quedamos solo con los equipos con puntaje mayor que 20\n","# Utilizamos la función iloc, debido a que el resultado propio de pandas nos devuelve las filas del DataFrame que cumplen con lo pedido. Nosotros queremos la 1ra, que es la única fila\n","equipos_top = tabla_de_puntajes[tabla_de_puntajes['Puntos'] > 20]\n","print(\"Equipos top\")\n","for indice, equipo in equipos_top.iterrows():\n"," print(equipo['Equipo'], 'obtuvo un puntaje de', equipo['Puntos'], ', y su diferencia de goles es de:', equipo['Goles a favor'] - equipo['Goles en contra'])\n","print()\n","\n","# Para el plus, tenemos que ordenar los equipos segun el puntaje que sacaron. Por defecto, se ordena de menor a mayor.\n","# Como queremos de mayor a menor, le indicaremos que el ordenamiento no sea en formato\n","equipos_top_ordenados = equipos_top.sort_values(by=['Puntos'], ascending=False)\n","print(\"Equipos top ordenados\")\n","for indice, equipo in equipos_top_ordenados.iterrows():\n"," print(equipo['Equipo'], 'obtuvo un puntaje de', equipo['Puntos'], ', y su diferencia de goles es de', equipo['Goles a favor'] - equipo['Goles en contra'])"],"metadata":{"id":"-FeR5L4urZYo"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"D4EY947g5RSL"},"source":["### Mini desafío 2.A\n","Calcular el promedio de las notas de química de todos los alumnos en el archivo **Datos.xlsx**.\n","\n","- **Tip:** Podemos usar la función **sum**($iterable$) para obtener la suma de todos los campos. Un ejemplo de como funciona:\n","```python\n","mi_lista = [1, 2, 3, 4, 5]\n","total = sum(mi_lista)\n","print(total)\n","```\n"," ¡La función **len()** también sigue siendo válida!"]},{"cell_type":"code","metadata":{"id":"6Oivnx4DSktO","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1664027421776,"user_tz":180,"elapsed":375,"user":{"displayName":"ALEJO AGUSTIN FIGUEROA","userId":"02597512395653915687"}},"outputId":"e02fcb2d-82ed-4357-d59e-ad997d6b1e6c"},"source":["! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/Datos.xlsx\""],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["--2022-09-24 13:50:39-- https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/Datos.xlsx\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.110.133, 185.199.109.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 4054 (4.0K) [application/octet-stream]\n","Saving to: ‘Datos.xlsx’\n","\n","\rDatos.xlsx 0%[ ] 0 --.-KB/s \rDatos.xlsx 100%[===================>] 3.96K --.-KB/s in 0s \n","\n","2022-09-24 13:50:39 (37.4 MB/s) - ‘Datos.xlsx’ saved [4054/4054]\n","\n"]}]},{"cell_type":"markdown","source":["**Solución 1**"],"metadata":{"id":"cEdlu1mf0tH3"}},{"cell_type":"code","metadata":{"id":"K02PVc4fSl-F"},"source":["import pandas as pd\n","\n","datos = pd.read_excel(\"Datos.xlsx\")\n","data = datos['Quimica']\n","\n","print(sum(data) / len(data))"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["**Solución 2** - Se pueden utilizar las funciones de pandas, sum y len"],"metadata":{"id":"LGrec3Nq0smg"}},{"cell_type":"code","source":["import pandas as pd\n","\n","notas = pd.read_excel(\"Datos.xlsx\")\n","\n","print(notas['Quimica'].sum()/len(notas['Quimica']))"],"metadata":{"id":"IyS_IKEM019j"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["**Solución 3** - Se puede utilizar directamente la función mean de pandas"],"metadata":{"id":"Tc76kxvj2fEq"}},{"cell_type":"code","source":["import pandas as pd\n","\n","notas = pd.read_excel(\"Datos.xlsx\")\n","\n","print(notas['Quimica'].mean())"],"metadata":{"id":"5-GBb4jE2gD1"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"oloubsnc6nKD"},"source":["### Mini desafío 2.B\n","\n","Escribir una funcion que reciba como parámetros: una variable de tipo **DataFrame** (la tabla de alumnos) y el índice de un alumno. Luego debe devolver con *return* el promedio de sus notas en las diferentes materias."]},{"cell_type":"markdown","source":["**Solución 1**"],"metadata":{"id":"RkozGTqD4lLQ"}},{"cell_type":"code","metadata":{"id":"LI6XqLdgSqcQ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1664027434393,"user_tz":180,"elapsed":341,"user":{"displayName":"ALEJO AGUSTIN FIGUEROA","userId":"02597512395653915687"}},"outputId":"f74a23ca-0d24-4c89-957a-e54119a6437e"},"source":["import pandas as pd\n","\n","def promedio(df, index):\n"," alumno = df.loc[index]\n"," m = alumno[\"Matematica\"]\n"," f = alumno[\"Fisica\"]\n"," q = alumno[\"Quimica\"]\n"," return (m + f + q)/3\n","\n","datos = pd.read_excel(\"Datos.xlsx\")\n","\n","print(\"El promedio del dato 0 es %0.2f \" % promedio(datos, 0))\n","print(\"El promedio del dato 1 es %0.2f \" % promedio(datos, 1))"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["El promedio del dato 0 es 8.67 \n","El promedio del dato 1 es 5.67 \n"]}]},{"cell_type":"markdown","metadata":{"id":"LpPtaI977eSc"},"source":["### Mini desafío 3\n","\n","Obtener el promedio general sólo para aquellos alumnos que aprobaron Matemática (con nota `>= 6`) en el archivo **Datos.xlsx**."]},{"cell_type":"code","metadata":{"id":"DffpeOF8Su2_","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1664027436611,"user_tz":180,"elapsed":5,"user":{"displayName":"ALEJO AGUSTIN FIGUEROA","userId":"02597512395653915687"}},"outputId":"8f9dc4c8-134d-4c23-c09a-8c30fe72e88c"},"source":["aprobadosMate = datos[(datos['Matematica']>=6)]\n","promedios = (aprobadosMate[\"Quimica\"] + aprobadosMate[\"Matematica\"] + aprobadosMate[\"Fisica\"])/3\n","\n","promedio_general = sum(promedios)/len(promedios)\n","\n","print(\"El promedio general es %0.2f \" % promedio_general)"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["El promedio general es 7.78 \n"]}]},{"cell_type":"markdown","metadata":{"id":"PpKHSTPMR3tr"},"source":["# Ejercitación integradora $\\newcommand{\\dif}{\\bigstar}$$\\newcommand{\\facil}{\\color{\\green}{\\dif}}$ $\\newcommand{\\pieceofcake}{\\color{\\cyan}{\\dif}}$$\\newcommand{\\medio}{\\color{\\yellow}{\\dif\\dif}}$$\\newcommand{\\media}{\\medio}$$\\newcommand{\\normal}{\\medio}$ $\\newcommand{\\dificil}{\\color{\\orange}{\\dif\\dif\\dif}}$ $\\newcommand{\\imposible}{\\color{\\red}{\\dif\\dif\\dif\\dif}}$\n","\n"]},{"cell_type":"markdown","metadata":{"id":"oGZb_d6BGXIv"},"source":["## $\\facil$ Copy\n","Temas:\n","* **Uso de librerías**\n","* **Manejo de archivos**\n","\n","Armar una función que copie un archivo *.xlsx*, y lo guarde como \"Copia 1 - $nombre$\", de ya existir debe guardarlo como Copia 2 -, Copia 3 - , ...\n","\n","Usar la libreria **os** para chequear si existe el archivo. Tips:\n","\n","- os.path.exists($nombre$) devolverá True si ya existe\n","\n","- Se puede importar con: `import os`\n"]},{"cell_type":"markdown","metadata":{"id":"vXq-llQpISeR"},"source":["### **Solución**"]},{"cell_type":"code","metadata":{"id":"ChcJscsB0tbE"},"source":["import os\n","import shutil\n","\n","def func(nombre):\n"," repeticion = 1\n","\n"," while os.path.exists(\"Copia \" + str(repeticion) + \" \"+ nombre):\n"," repeticion += 1\n","\n"," shutil.copyfile(nombre, \"Copia \" + str(repeticion) + \" \"+ nombre)\n","\n","\n","func('Tabla1.xlsx')"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"GE3a2Dx3GhKx"},"source":["## $\\facil$ California Housing\n","\n","Temas:\n","* ***Analísis de información estructurada***\n","* ***Librerías***"]},{"cell_type":"code","metadata":{"id":"qn0nVqJrGhKz","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1696096599640,"user_tz":180,"elapsed":592,"user":{"displayName":"Ignacio Gabriel Sampedro Delgado","userId":"17572814643319847675"}},"outputId":"cc574e3b-b432-4baa-feec-a46f789150df"},"source":["# Importar el archivo california_housing_train.xlsx.\n","! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/california_housing_train.xlsx\""],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["--2023-09-30 17:56:38-- https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/california_housing_train.xlsx\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 988464 (965K) [application/octet-stream]\n","Saving to: ‘california_housing_train.xlsx’\n","\n","\r californi 0%[ ] 0 --.-KB/s \rcalifornia_housing_ 100%[===================>] 965.30K --.-KB/s in 0.02s \n","\n","2023-09-30 17:56:39 (44.3 MB/s) - ‘california_housing_train.xlsx’ saved [988464/988464]\n","\n"]}]},{"cell_type":"markdown","metadata":{"id":"egvmBjEmGhK1"},"source":["Este archivo contiene un conjunto de datos de viviendas de California, el cual fue extraido del censo de nacional estadounidense de 1990. Para mas info sobre el set de datos: https://developers.google.com/machine-learning/crash-course/california-housing-data-description\n","\n","Extraer la siguiente información:\n","\n","* ¿Cuantas casas hay con valor 'median_house_value' mayor a 80000 tomando de la longitud -120 a -118? Rta: 5466\n","* ¿Cual es el promedio de habitaciones por manzana ('total_rooms') de estas casas? Rta: 2466.31\n","\n","* ¿Cual es la casa más cara? ¿Cuántas hay con este valor? Rta: 500001.0 - 814\n","\n","* $\\medio$ Obtener la media y la varianza de la propiedad 'median_house_value'. Rta: 207300.91 - 13451442293.57\n","\n","**Tip:** ¡Pueden investigar funciones de numpy para conseguir la media y la varianza! [numpy.var](https://docs.scipy.org/doc/numpy-1.6.0/reference/generated/numpy.var.html)"]},{"cell_type":"markdown","metadata":{"id":"M60NmSBgITXv"},"source":["### **Soluciones**"]},{"cell_type":"markdown","source":["**Solución 1**"],"metadata":{"id":"2a0kZgaa7Yet"}},{"cell_type":"code","metadata":{"id":"i4eMHo5N1D6S","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1696096633094,"user_tz":180,"elapsed":2384,"user":{"displayName":"Ignacio Gabriel Sampedro Delgado","userId":"17572814643319847675"}},"outputId":"516e3e70-201e-4d67-94c0-a649e2a5b53c"},"source":["import pandas as pd\n","import numpy as np\n","\n","archivo = pd.read_excel(\"california_housing_train.xlsx\")\n","\n","#Pregunta 1 y 2 (utilizando filtrado)\n","ans = 0\n","hab = 0\n","filtro_lon = (-120 <= archivo['longitude']) & (archivo['longitude'] <= -118)\n","filtro_val = archivo['median_house_value'] > 80000\n","ans = len( archivo[filtro_lon & filtro_val] )\n","hab = sum(archivo[filtro_lon & filtro_val]['total_rooms'])\n","print(ans)\n","print(hab/ans)\n","\n","#Pregunta 1 y 2 (sin utilizar filtrado)\n","ans = 0\n","hab = 0\n","for i,lon in enumerate(archivo['longitude']):\n"," if -120 <= lon and lon<=-118 :\n"," if archivo['median_house_value'][i] > 80000:\n"," ans+=1\n"," hab+=archivo['total_rooms'][i]\n","print(ans)\n","print(hab/ans)\n","\n","#Pregunta 3\n","m = max(archivo['median_house_value'])\n","c = sum(archivo['median_house_value'] == m)\n","print(m)\n","print(c)\n","\n","#pregunta 4\n","m = np.mean(archivo['median_house_value'])\n","v = np.var(archivo['median_house_value'])\n","print(m)\n","print(v)"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["5466\n","2466.3122941822176\n","5466\n","2466.3122941822176\n","500001\n","814\n","207300.91235294117\n","13451442293.56867\n"]}]},{"cell_type":"markdown","source":["**Solución 2** - Con funciones propias de la libreria pandas"],"metadata":{"id":"7EYQcmEO7F1e"}},{"cell_type":"code","source":["import pandas as pd\n","\n","viviendas = pd.read_excel(\"california_housing_train.xlsx\")\n","\n","#Pregunta 1 y 2 (utilizando filtrado)\n","filtro_lon = (-120 <= viviendas['longitude']) & (viviendas['longitude'] <= -118)\n","filtro_val = viviendas['median_house_value'] > 80000\n","q_viviendas_en_zona = viviendas[filtro_lon & filtro_val].count().iloc[0]\n","print(q_viviendas_en_zona)\n","q_habitaciones = viviendas[filtro_lon & filtro_val]['total_rooms'].sum()\n","print(q_habitaciones/q_viviendas_en_zona)\n","\n","#Pregunta 1 y 2 (sin utilizar filtrado)\n","ans = 0\n","hab = 0\n","for i,lon in enumerate(viviendas['longitude']):\n"," if -120 <= lon and lon<=-118 :\n"," if viviendas['median_house_value'][i] > 80000:\n"," ans+=1\n"," hab+=viviendas['total_rooms'][i]\n","print(ans)\n","print(hab/ans)\n","\n","#Pregunta 3\n","valor_mas_caro = viviendas['median_house_value'].max()\n","casas_mas_caras = viviendas[viviendas['median_house_value'] == valor_mas_caro]['median_house_value'].count()\n","print(valor_mas_caro)\n","print(casas_mas_caras)\n","\n","#pregunta 4\n","media = viviendas['median_house_value'].mean()\n","varianza = viviendas['median_house_value'].var()\n","print(media)\n","print(varianza)"],"metadata":{"id":"S0NUNIkK7Kqk"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"oN3fQAn0P4xu"},"source":["## $\\medio$ Llévame en tu bicicleta\n","\n","Temas:\n","* ***Analisís de información estructurada***\n","* ***Librerías***\n","\n","El gobierno de la Ciudad de Buenos Aires recolecta datos acerca del uso de los servicios de bicicletas públicas (ecobici) y publica [parte de ello](https://data.buenosaires.gob.ar/dataset/bicicletas-publicas)[s](https://www.youtube.com/watch?v=-UV0QGLmYys&ab_channel=CarlosVivesVEVO).\n","\n","\n","Para este ejemplo usaremos los primeros 10000 viajes de la base de datos del 2021. Están invitados a analizar todos los viajes, pero para ello les recomendamos descargar el archivo y ejecutar su programa en forma local (no en Google Golab).\n","\n","Se quiere conocer más acerca del uso que le dan los usuarios al sistema, por lo cual su tarea será extraer la siguiente información:\n","\n","* ¿Qué porcentaje de los viajes se completaron en estado NORMAL?\n","* ¿Cuál es la duración promedio de cada viaje? (Los datos están en segundos)\n","* ¿A qué hora del día se realizaron más viajes? (por ejemplo: de 16hs a 17hs)\n","* ¿Cuántas estaciones diferentes fueron utilizadas?\n","* Para cada estación utilizada como inicio de un viaje, imprimirlas ordenadas por cantidad de viajes que iniciaron de la misma.\n","\n","**Tip:** Recuerden investigar los métodos que tienen los DataFrames para ver si alguno de ellos les ayuda a resolver un problema particular.\n"]},{"cell_type":"markdown","metadata":{"id":"9RGcIi4eb09D"},"source":["### **Solución**"]},{"cell_type":"code","metadata":{"id":"ee2IQo1iG8ej","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1696099956442,"user_tz":180,"elapsed":681,"user":{"displayName":"Ignacio Gabriel Sampedro Delgado","userId":"17572814643319847675"}},"outputId":"ab75df79-da5b-4ec0-b4a4-716032cd4975"},"source":["# Una vez descargado el archivo se llamará \"recorridos-realizados-2021-sample.csv\"\n","! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/recorridos-realizados-2021-sample.csv\"\n","\n","import pandas as pd\n","import numpy as np\n","\n","archivo = pd.read_csv(\"recorridos-realizados-2021-sample.csv\")"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["--2023-09-30 18:52:35-- https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/recorridos-realizados-2021-sample.csv\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1370907 (1.3M) [text/plain]\n","Saving to: ‘recorridos-realizados-2021-sample.csv’\n","\n","\r recorrido 0%[ ] 0 --.-KB/s \rrecorridos-realizad 100%[===================>] 1.31M --.-KB/s in 0.02s \n","\n","2023-09-30 18:52:35 (57.3 MB/s) - ‘recorridos-realizados-2021-sample.csv’ saved [1370907/1370907]\n","\n"]}]},{"cell_type":"code","metadata":{"id":"7RxR2BEpR2T9","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1696099958835,"user_tz":180,"elapsed":390,"user":{"displayName":"Ignacio Gabriel Sampedro Delgado","userId":"17572814643319847675"}},"outputId":"52771a0d-5240-4192-d700-7a0b2ed14066"},"source":["# Obtenemos el número de filas en el archivo\n","numero_de_filas = len(archivo)\n","\n","# Usamos .value_counts() para obtener una cuenta de cuantas veces ocurre cada valor\n","# Dividimos la cantidad de veces que aparece 'NORMAL' por la cantidad de filas\n","estado_count = archivo['Estado cerrado'].value_counts()\n","porcentaje_normal = 100*(estado_count['NORMAL'] / numero_de_filas)\n","print(f'El {porcentaje_normal:.2f}% de los viajes se completaron en estado NORMAL')\n","# Usamos .mean() para calcular el promedio\n","duracion_promedio = round(archivo['Duración'].mean())\n","print(f'La duración promedio es de {duracion_promedio//60} minutos {duracion_promedio%60} segundos')\n","\n","# Con pd.to_datetime() convertimos strings a objetos datetime\n","# Usamos .dt.hour para obtener únicamente el valor de hora\n","# Con .value_counts() y luego .idxmax() encontramos el índice que más veces aparece\n","horarios_de_inicio = archivo['Fecha de inicio']\n","horarios_de_inicio = pd.to_datetime(horarios_de_inicio)\n","horas_de_inicio = horarios_de_inicio.dt.hour\n","hora_pico = horas_de_inicio.value_counts().idxmax()\n","print(f'La hora más concurrida es de {hora_pico}hs a {hora_pico+1}hs')\n","\n","# Con pd.concat unimos las columnas de estaciones de inicio y fin,\n","# en caso de que una estación aparece sólo en una de ellas\n","# Usando len() y .value_counts() encontramos la cantidad total de estaciones\n","estaciones_inicio = archivo['Nombre de estación de inicio']\n","estaciones_fin = archivo['Nombre de estación de fin de viaje']\n","estaciones_total = pd.concat([estaciones_inicio, estaciones_fin])\n","print(f'Se utilizaron {len(estaciones_total.value_counts())} estaciones en total')"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["El 97.88% de los viajes se completaron en estado NORMAL\n","La duración promedio es de 18 minutos 10 segundos\n","La hora más concurrida es de 15hs a 16hs\n","Se utilizaron 230 estaciones en total\n"]}]},{"cell_type":"code","metadata":{"id":"69rnv5AFbmQC","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1696099962018,"user_tz":180,"elapsed":3,"user":{"displayName":"Ignacio Gabriel Sampedro Delgado","userId":"17572814643319847675"}},"outputId":"ad1469f4-3a9a-48e2-d691-6587dfd44e34"},"source":["# Usando .value_counts().iteritems() podemos recorrer las estaciones ordenadas\n","# por la cantida de veces que aparece cada una\n","\n","print('\\nCantidad de viajes iniciados en cada estación:\\n')\n","for estacion, cantidad in estaciones_inicio.value_counts().iteritems():\n"," print('Cantidad:', cantidad, ' Estación:', estacion)"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Cantidad de viajes iniciados en cada estación:\n","\n","Cantidad: 120 Estación: 005 - Plaza Italia\n","Cantidad: 117 Estación: 147 - Constitución\n","Cantidad: 107 Estación: 113 - Guatemala\n","Cantidad: 106 Estación: 161 - Humahuaca\n","Cantidad: 103 Estación: 009 - Parque Las Heras\n","Cantidad: 101 Estación: 014 - Pacifico\n","Cantidad: 101 Estación: 074 - INSTITUTO LELOIR\n","Cantidad: 100 Estación: 029 - Parque Centenario\n","Cantidad: 100 Estación: 066 - Billinghurst\n","Cantidad: 100 Estación: 017 - Plaza Almagro\n","Cantidad: 98 Estación: 096 - Carlos Gardel\n","Cantidad: 97 Estación: 194 - PERÓN Y ACUÑA DE FIGUEROA\n","Cantidad: 97 Estación: 030 - Peña\n","Cantidad: 95 Estación: 069 - Ecuador\n","Cantidad: 94 Estación: 054 - Acuña de Figueroa\n","Cantidad: 93 Estación: 025 - Plaza Guemes\n","Cantidad: 90 Estación: 200 - AUSTRIA Y FRENCH\n","Cantidad: 89 Estación: 033 - Facultad de Medicina\n","Cantidad: 89 Estación: 144 - PUEYRREDÓN\n","Cantidad: 87 Estación: 130 - RETIRO II\n","Cantidad: 85 Estación: 255 - BARRANCAS DE BELGRANO\n","Cantidad: 84 Estación: 292 - PLAZA BOLIVIA\n","Cantidad: 83 Estación: 059 - Coronel Diaz\n","Cantidad: 82 Estación: 129 - Velasco\n","Cantidad: 82 Estación: 131- HOSPITAL DE CLÍNICAS\n","Cantidad: 81 Estación: 020 - Distrito Audiovisual\n","Cantidad: 81 Estación: 121 - YATAY\n","Cantidad: 81 Estación: 099 - Malabia\n","Cantidad: 81 Estación: 160 - Godoy Cruz y Libertador\n","Cantidad: 80 Estación: 083 - Paraná\n","Cantidad: 80 Estación: 008 - Congreso\n","Cantidad: 79 Estación: 171 - Pasteur\n","Cantidad: 78 Estación: 065 - Julián Álvarez\n","Cantidad: 77 Estación: 135 - MARCELO T. DE ALVEAR\n","Cantidad: 75 Estación: 136 - Acevedo\n","Cantidad: 75 Estación: 159 - Fitz Roy & Gorriti\n","Cantidad: 73 Estación: 125 - F.J.Santamaria de Oro\n","Cantidad: 73 Estación: 075 - Plaza Primero de Mayo\n","Cantidad: 72 Estación: 182 - RAVIGNANI Y GUATEMALA\n","Cantidad: 71 Estación: 085 - AGUERO\n","Cantidad: 70 Estación: 381 - Matienzo Y Arce\n","Cantidad: 69 Estación: 174 - MINISTERIO DE EDUCACION\n","Cantidad: 69 Estación: 167 - Hipólito Yrigoyen\n","Cantidad: 68 Estación: 243 - PLAZOLETA CELEDONIO FLORES\n","Cantidad: 67 Estación: 156 - Plaza Alemania\n","Cantidad: 67 Estación: 158 - VILLARROEL\n","Cantidad: 66 Estación: 199 - ESTADOS UNIDOS Y BOEDO\n","Cantidad: 65 Estación: 391 - Plaza República de Ecuador\n","Cantidad: 65 Estación: 181 - BILLINGHURST Y MANSILLA\n","Cantidad: 65 Estación: 001 - FACULTAD DE DERECHO\n","Cantidad: 65 Estación: 116 - HOSPITAL ALEMÁN\n","Cantidad: 65 Estación: 056 - Plaza Palermo Viejo\n","Cantidad: 65 Estación: 256 - PLAZA NORUEGA\n","Cantidad: 64 Estación: 142 - Armenia y Gorriti\n","Cantidad: 64 Estación: 012 - Plaza Vicente Lopez\n","Cantidad: 63 Estación: 260 - SAN MIGUEL DE GARICOITS\n","Cantidad: 63 Estación: 399 - GARCIA DEL RIO\n","Cantidad: 62 Estación: 124 - UGARTECHE\n","Cantidad: 62 Estación: 163 - ONCE II\n","Cantidad: 61 Estación: 276 - PRIMERA JUNTA\n","Cantidad: 60 Estación: 104 - Federico Lacroze\n","Cantidad: 59 Estación: 183 - VIRREY CEVALLOS\n","Cantidad: 59 Estación: 384 - PLAZA BENITO NAZAR\n","Cantidad: 58 Estación: 076 - Ayacucho\n","Cantidad: 58 Estación: 223 - GAINZA\n","Cantidad: 57 Estación: 227 -Club Ciudad de Buenos Aires\n","Cantidad: 57 Estación: 100 - Plaza Gurruchaga\n","Cantidad: 56 Estación: 093 - CARLOS CALVO\n","Cantidad: 56 Estación: 242 - Plazoleta Rafael del Riego\n","Cantidad: 56 Estación: 082 - HOSPITAL ITALIANO\n","Cantidad: 55 Estación: 094 - GÚZMAN\n","Cantidad: 55 Estación: 352 - San Jose de Flores\n","Cantidad: 54 Estación: 071 - CERRITO\n","Cantidad: 54 Estación: 275 - PLAZA 24 DE SEPTIEMBRE\n","Cantidad: 54 Estación: 070 - ARAOZ\n","Cantidad: 53 Estación: 189 - POSADAS\n","Cantidad: 51 Estación: 150 - RODRIGO BUENO\n","Cantidad: 49 Estación: 187 - Jose Maria Moreno\n","Cantidad: 49 Estación: 095 - ESMERALDA\n","Cantidad: 48 Estación: 190 - JUNCAL\n","Cantidad: 48 Estación: 146 - Hospital Francés\n","Cantidad: 47 Estación: 186 - MANZANA 66\n","Cantidad: 47 Estación: 165 - PLAZA MONSEÑOR MIGUEL DE ANDREA\n","Cantidad: 47 Estación: 162 - LARREA Y BARTOLOMÉ MITRE\n","Cantidad: 46 Estación: 103 - MALBA\n","Cantidad: 46 Estación: 084 - Lavalle\n","Cantidad: 46 Estación: 045 - Uruguay\n","Cantidad: 46 Estación: 350 - Plaza Irlanda\n","Cantidad: 45 Estación: 257 - Plaza Francisco Ramirez\n","Cantidad: 45 Estación: 087 - Guayaquil\n","Cantidad: 45 Estación: 089 - Cabello\n","Cantidad: 45 Estación: 016 - Legislatura\n","Cantidad: 45 Estación: 188 - Aranguren\n","Cantidad: 44 Estación: 022 - Arenales\n","Cantidad: 44 Estación: 038 - Plaza Libertad\n","Cantidad: 43 Estación: 117 - HUMBERTO 1°\n","Cantidad: 43 Estación: 046 - Chile\n","Cantidad: 43 Estación: 331 - CALIFORNIA\n","Cantidad: 43 Estación: 285 - ESPINOSA\n","Cantidad: 42 Estación: 254 - Plaza Rafael Hernandez\n","Cantidad: 42 Estación: 206 - Galicia\n","Cantidad: 41 Estación: 335 - General Urquiza\n","Cantidad: 41 Estación: 086 - SAAVEDRA\n","Cantidad: 41 Estación: 064 - RIOBAMBA\n","Cantidad: 41 Estación: 003 - ADUANA\n","Cantidad: 41 Estación: 050 - Hospital Rivadavia\n","Cantidad: 40 Estación: 128 - PARQUE DEL BAJO\n","Cantidad: 40 Estación: 233 - MONROE\n","Cantidad: 40 Estación: 132 - CORRIENTES\n","Cantidad: 40 Estación: 058 - Ministro Carranza\n","Cantidad: 40 Estación: 272 - Plaza Bruno Giordano\n","Cantidad: 40 Estación: 251 - Solar de la Abadía\n","Cantidad: 40 Estación: 281 - Villa Urquiza\n","Cantidad: 39 Estación: 193 - ARENALES Y AGUERO\n","Cantidad: 39 Estación: 270 - PLAZA DEL ANGEL GRIS\n","Cantidad: 39 Estación: 258 - Plaza J.J. Paso\n","Cantidad: 39 Estación: 152 - JULIETA LANTERI\n","Cantidad: 38 Estación: 178 - José Marmol\n","Cantidad: 38 Estación: 289 - MONTAÑESES\n","Cantidad: 38 Estación: 151 - AIME PAINÉ\n","Cantidad: 38 Estación: 240 - ECHEVERRIA\n","Cantidad: 37 Estación: 336 - La Pampa\n","Cantidad: 37 Estación: 229 - RIGLOS\n","Cantidad: 37 Estación: 101 - Fitz Roy\n","Cantidad: 36 Estación: 282 - Tronador\n","Cantidad: 36 Estación: 023 - Suipacha\n","Cantidad: 36 Estación: 169 - FACULTAD DE PSICOLOGIA\n","Cantidad: 36 Estación: 273 - Plazoleta Colombia\n","Cantidad: 36 Estación: 091 - Pasco\n","Cantidad: 36 Estación: 166 - Cementerio de Recoleta\n","Cantidad: 35 Estación: 249 - Balbín\n","Cantidad: 35 Estación: 027 - Montevideo\n","Cantidad: 35 Estación: 261 - QUINTEROS LIDORO\n","Cantidad: 34 Estación: 013 - ONCE\n","Cantidad: 34 Estación: 250 - Fleni\n","Cantidad: 33 Estación: 112 - 9 de Julio\n","Cantidad: 33 Estación: 092 - Salcedo\n","Cantidad: 33 Estación: 111 - MACACHA GUEMES\n","Cantidad: 33 Estación: 349 - Plaza Saenz Peña\n","Cantidad: 32 Estación: 365 - Venancio Flores\n","Cantidad: 32 Estación: 153 - JUAN MANUEL DE BLANES\n","Cantidad: 32 Estación: 073 - Ruy Díaz de Guzmán\n","Cantidad: 32 Estación: 120 - HOSPITAL RAMOS MEJIA\n","Cantidad: 32 Estación: 264 - Plaza Marcos Sastre\n","Cantidad: 31 Estación: 044 - Ecoparque\n","Cantidad: 31 Estación: 205 - SAN MARTIN\n","Cantidad: 31 Estación: 374 - Puan\n","Cantidad: 31 Estación: 063 - Reconquista\n","Cantidad: 30 Estación: 007 - OBELISCO\n","Cantidad: 30 Estación: 259 - PLAZA CASTELLI\n","Cantidad: 30 Estación: 079 - AZUCENA VILLAFLOR\n","Cantidad: 29 Estación: 006 - Parque Lezama\n","Cantidad: 28 Estación: 278 - Donato Alvarez\n","Cantidad: 28 Estación: 118 - MEXICO\n","Cantidad: 26 Estación: 244 - UADE\n","Cantidad: 26 Estación: 032 - Catedral\n","Cantidad: 26 Estación: 149 - LIMA\n","Cantidad: 25 Estación: 297 - TRONADOR Y GARCÍA DEL RÍO\n","Cantidad: 25 Estación: 037- CLAUDIA PÍA BRAUDACCO\n","Cantidad: 25 Estación: 222 - SIMON BOLIVAR\n","Cantidad: 25 Estación: 004 - Plaza Roma\n","Cantidad: 25 Estación: 396 - PLAZA ALBERTI\n","Cantidad: 25 Estación: 080 - DOBLAS\n","Cantidad: 25 Estación: 346 - Plaza Zapiola\n","Cantidad: 24 Estación: 248 - Husares\n","Cantidad: 24 Estación: 155 - Parque José Evaristo Uriburu\n","Cantidad: 23 Estación: 164 - FACULTAD DE INGENERIA\n","Cantidad: 23 Estación: 024 - ALSINA\n","Cantidad: 22 Estación: 107 - HOSPITAL GARRAHAN\n","Cantidad: 22 Estación: 041 - Urquiza y Rondeau\n","Cantidad: 21 Estación: 137 - AZOPARDO Y CHILE\n","Cantidad: 21 Estación: 061-Ministerio de Economia\n","Cantidad: 21 Estación: 394 - Av. La Plata\n","Cantidad: 21 Estación: 196 - HOSPITAL ARGERICH\n","Cantidad: 20 Estación: 049 - 33 Orientales\n","Cantidad: 20 Estación: 126 - Ministerio de Justicia y Seguridad\n","Cantidad: 20 Estación: 036 - MAIPÚ\n","Cantidad: 20 Estación: 268 - Plaza Aristóbulo Del Valle\n","Cantidad: 20 Estación: 034 - Colonia Express\n","Cantidad: 20 Estación: 002 - Retiro I\n","Cantidad: 20 Estación: 035 - INGENIERO BUTTY\n","Cantidad: 19 Estación: 026 - JUANA MANSO I\n","Cantidad: 19 Estación: 184 - Pedro Echague\n","Cantidad: 19 Estación: 387 - Luna\n","Cantidad: 19 Estación: 138 - Hospital Britanico\n","Cantidad: 19 Estación: 237 - Madero Office\n","Cantidad: 19 Estación: 172 - BRASIL\n","Cantidad: 18 Estación: 140 - Las Casas\n","Cantidad: 18 Estación: 330 - Parque Avellaneda\n","Cantidad: 18 Estación: 218 - Campana\n","Cantidad: 17 Estación: 021 - Parque Patricios\n","Cantidad: 17 Estación: 393 - Barrio 31\n","Cantidad: 16 Estación: 108 - Usina del Arte\n","Cantidad: 16 Estación: 215 - HOSPITAL ALVAREZ\n","Cantidad: 16 Estación: 395 - Agronomia II\n","Cantidad: 16 Estación: 324 - Las Victorias\n","Cantidad: 16 Estación: 168 - Estados Unidos\n","Cantidad: 15 Estación: 280 - JURAMENTO\n","Cantidad: 15 Estación: 334 - CENTRO DE EXPOSICIONES\n","Cantidad: 15 Estación: 060 - 25 De Mayo\n","Cantidad: 14 Estación: 221 - CULPINA\n","Cantidad: 13 Estación: 097 - Avelino Diaz\n","Cantidad: 13 Estación: 252 - Tamborini\n","Cantidad: 13 Estación: 225 - HOSPITAL TORNU\n","Cantidad: 12 Estación: 213 - Hospital Alvear\n","Cantidad: 12 Estación: 322 - MARTÍ Y DIRECTORIO\n","Cantidad: 12 Estación: 313 - De Los Incas\n","Cantidad: 12 Estación: 378 - AGRONOMIA\n","Cantidad: 12 Estación: 179 - CASA SAN\n","Cantidad: 11 Estación: 051 - TUCUMAN\n","Cantidad: 10 Estación: 204 - Biarritz\n","Cantidad: 10 Estación: 340 - PLAZA NUEVA POMPEYA\n","Cantidad: 10 Estación: 316 - Buenos Aires\n","Cantidad: 10 Estación: 018 - Independencia\n","Cantidad: 10 Estación: 197 - PLAZA CIUDAD DE UDINE\n","Cantidad: 10 Estación: 373 - Jorgelina De Simone\n","Cantidad: 9 Estación: 354 - José Martí\n","Cantidad: 9 Estación: 363 - Udaondo\n","Cantidad: 8 Estación: 207 - PLAZA ARENALES\n","Cantidad: 8 Estación: 203 - Beiro\n","Cantidad: 8 Estación: 348 - Villa del Parque\n","Cantidad: 8 Estación: 277 - Coghlan\n","Cantidad: 7 Estación: 305 - Plaza Martin Rodriguez\n","Cantidad: 6 Estación: 370 - Beauchef\n","Cantidad: 6 Estación: 367 - Eva Perón\n","Cantidad: 6 Estación: 361 - Plaza Don Segundo Sombra\n","Cantidad: 6 Estación: 191 - Rivadavia y 9 de Julio\n","Cantidad: 5 Estación: 114 - DELLA PAOLERA\n","Cantidad: 1 Estación: 309 - UTN II\n"]},{"output_type":"stream","name":"stderr","text":[":5: FutureWarning: iteritems is deprecated and will be removed in a future version. Use .items instead.\n"," for estacion, cantidad in estaciones_inicio.value_counts().iteritems():\n"]}]},{"cell_type":"markdown","metadata":{"id":"z1sjCcKvHFrD"},"source":["## $\\medio$ El tiempo es dinero\n","\n","Temas:\n","* ***Analisís de información estructurada***\n","* ***Librerías***\n","\n","La administración del dinero es una tarea que requiere una altísima fiabilidad.\n","En esta ocasión tu objetivo será programar un script que **actualize la cantidad** de dinero de una serie de usuarios a partir de la información de las transferencias que fueron realizadas.\n","Más concretamente recibiras una **base de datos con la cantidad de dinero de una serie de usuarios**, un base de datos con una serie de transferencias que los usuarios se realizan entre si, y deberás generar con eso **una nueva base de datos con el dinero actualizado de cada usuario**.\n","\n","* Importar el archivo **Finanzas.xlsx** que contiene la cantidad de dinero de los usuarios y las transferencias en dos hojas de archivo.\n","* Exportar un archivo **usuarios_actualizados.xlsx** que contiene las cantidades de dinero actualizadas.\n","\n","
\n","\n"]},{"cell_type":"code","metadata":{"id":"LxggKFg1HLLp"},"source":["! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/Finanzas.xlsx\""],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"TCM6UYHPGIdl"},"source":["Debes procesar las transferencias y actualizar el saldo de cada usuario (crear un nuevo archivo excel con los saldos actualizados)."]},{"cell_type":"markdown","metadata":{"id":"zfFURx2aB_ge"},"source":["### **Solución**\n","\n","La solución consiste en leer la información de los usuarios y las transferencias, realizar la actualización de los dineros de los usuarios a partir de las transferencias y luego almacenar el resultado en un archivo de excel.\n","\n","Más en contreto, necesitamos procesar las transferencias una por una, Entonces las leemos en formato de **records** ya que solo necesitamos iterarlas, es decir, no es necesario indexarlas por alguna columna (Aunque se podría)\n","\n","Luego leemos los usuarios en formato de **index** ya que nos interesa indexar los usuarios por su nombre. Como es necesario hacer actualizaciones de los saldos de los usuarios es necesario poder acceder agilmente a los usuarios por su nombre (Que es el identificar utilizado en las transferencias)\n","\n","Entonces procesamos las trasnferencias una por una, actualizamos los campos correspondientes de cada usuario involucrado en cada transferencia (Es decir le sacamos el dinero al usuario que hizó la transferencia, se lo agregamos al que la recibio).\n","\n","El ultimo paso es almacenar los resultados en un nuevo archivo excel."]},{"cell_type":"code","metadata":{"id":"yUbf2gWaAxri"},"source":["#leemos los usuarios en el formato index, para tenerlos indexados por el nombre de usuario\n","#Es decir, para que la clave sea el nombre de los usuarios y sea facil referenciar\n","#a los usuarios\n","usuarios_archivo = pd.read_excel(\"Finanzas.xlsx\", \"Usuarios\",index_col=\"Usuario\")\n","\n","#Mostramos los usuarios recien leidos\n","print(\"Usuarios:\")\n","print(usuarios_archivo)\n","print(\" \")\n","\n","usuarios = usuarios_archivo.to_dict(\"index\")\n","\n","\n","#Leemos las transferencias en el formato records, es decir conseguimos una lista con las transferencias\n","transferencias_archivo = pd.read_excel(\"Finanzas.xlsx\", \"Transferencias\")\n","transferencias = transferencias_archivo.to_dict(\"records\")\n","\n","#Mostramos las transferencias recien realizadas\n","print(\"Transferencias:\")\n","print(transferencias_archivo)\n","print(\" \")\n","\n","for transferencia in transferencias: # iteramos todas las transferncias distintas\n"," # obtenemos la info de la transferencia\n"," emisor = transferencia[\"Emisor\"]\n"," receptor = transferencia[\"Receptor\"]\n"," monto = transferencia[\"Monto\"]\n","\n"," usuarios[emisor][\"Presupuesto\"] -= monto # le retiramos el dinero al emisor\n"," usuarios[receptor][\"Presupuesto\"] += monto #le ortorgamos el dinero al receptor\n","\n","# generamos el nuevo archivo excel, orient=\"index\" provoca que las claves se coloquen en la primera fila,\n","# En este caso los usuarios son las claves y queremos que la primerea fila del archivo\n","# tenga todos los nombres de usuario\n","usuarios_actualizados = pd.DataFrame.from_dict(usuarios, orient=\"index\")\n","\n","#Mostramos los saldos de los usuarios luego de realizar las transferencias\n","print(\"Usuarios luego de realizar las transferencias:\")\n","print(usuarios_actualizados)\n","\n","#Grabamos la información final\n","usuarios_actualizados.to_excel(\"usuarios_actualizados.xlsx\")\n"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## $\\medio $ Gastos y descuentos\n","\n","Utilizando esta información acerca de las ventas registradas por un supermercado a lo largo de un día. \n","\n","Averigüe cuál fue el número vendido de cada uno de los productos.\n","Determine cuáles clientes gastaron más de 50 pesos y ofrézcales un descuento la próxima vez que visiten el local.\n","Calcule cuánto gasta un cliente promedio en un dia en el local.\n","\n","Ejemplo de funcionamiento:\n","\n","Datos:\n","\n","| Nombre | Producto compardo | Numero comprado | Valor del producto |\n","| -------- | ------- | -------- | ------- |\n","| Miguel | Pan | 12 | 5 |\n","| Franco | Pan | 2 | 5 |\n","\n","Salida:\n","\n","'Hay que comprar 14 unidades de Pan para el dia siguiente'\n","\n","'Cliente/a Miguel le queremos ofrecer una promocion para la proxima vez que visite la tienda!!'\n","\n","\n","\n"],"metadata":{"id":"ik8TDtUSkzwc"}},{"cell_type":"code","source":["! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/datosClientes.xlsx\""],"metadata":{"id":"QFRsZBfZk1y-"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["#Usar los datos del archivo para seleccionar cuantos productos comprar de cada uno para el dia siguiente,\n","#dar promociones a los clientes que hayan gastado mas de 50 y averiguar cuanto gasta un cliente en promedio.\n","\n","\n","import pandas as pd\n","datos = pd.read_excel(\"datosClientes2.xlsx\")\n","prodComprados = []\n","numComprados = []\n","total = 0\n","for i in range(len(datos)):\n"," datosNew = datos.loc[i]\n"," if datosNew['Producto comprado'] not in prodComprados:\n"," prodComprados.append(datosNew['Producto comprado'])\n"," numComprados.append(0)\n"," for j in range(len(prodComprados)):\n"," if prodComprados[j] == datosNew['Producto comprado']:\n"," numComprados[j] += int(datosNew['Numero comprado'])\n"," total += int(datosNew['Numero comprado']) * int(datosNew['Valor del producto'])\n","#Para los clientes que hayan gastado mas de 50\n","clientesPromo = datos[datos['Numero comprado'] * datos['Valor del producto'] > 50]\n","for cliente in clientesPromo['Nombre']:\n"," print(f'Cliente/a {cliente} le queremos ofrecer una promocion para la proxima vez que visite la tienda!!')\n","print()\n","#En relacion al numero de productos para el dia siguiente\n","for i in range(len(prodComprados)):\n"," print(f'Hay que comprar {numComprados[i]} unidades de {prodComprados[i]} para el dia siguiente')\n","print()\n","print(f'Un cliente en promedio gasta {int(total/(len(datos)))} pesos')"],"metadata":{"id":"WgO-USGjk5S1"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"8CmN7SuE6ml-"},"source":["## $\\dificil $ Buscando la $\n","\n","\n","Tema:\n","* ***Procesamiento de información estructurada***\n","* ***Librerías***\n","\n","Utilizando el set de datos del archivo **california_housing_train.xlsx**\n","\n","Dividir el area cubierta por el censo en cuadrantes de 0.5 de latitud x 0.5 de longitud, encontrar para qué cuadrante el valor medio de 'median_house_value' es máximo. Asignar el paso como una variable para que pueda cambiarse facilmente. Para filtrar las zonas de muy baja residencia descarten los valores cuando hay menos de 100 casas.\n","\n","Datos utiles:\n","- Minimo de longitud: -124.3\n","- Máximo de longitud: -114.3\n","- Minimo de latitud: 32.5\n","- Máximo de latitud: 42.5\n","\n","**Tips:** El programa va a tardar en correr, no se asusten! Pueden investigar funciones de numpy para ayudarlos a resolver el problema, como [numpy.arange](https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html).\n","\n","**Nota final**: ¡Busquen en el mapa estas coordenadas para ver donde quedan!"]},{"cell_type":"markdown","metadata":{"id":"GBqqwHhpCCWv"},"source":["### **Solución**"]},{"cell_type":"code","metadata":{"id":"p72kPtc3kn19"},"source":["# Importar el archivo california_housing_train.xlsx.\n","! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/california_housing_train.xlsx\""],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"HFNVBCai692J"},"source":["import pandas as pd\n","import numpy as np\n","\n","archivo = pd.read_excel(\"california_housing_train.xlsx\")\n","paso = .5\n","\n","lats = np.arange(32.5,42.5,paso)\n","lons = np.arange(-124.3,113.3,paso)\n","maximoValor = 0\n","maximaLat = 0\n","maximaLon = 0\n","for lat in lats:\n"," for lon in lons:\n"," data = archivo[(archivo['latitude']>=lat) & (archivo['latitude']<=lat+paso)]\n"," data = data[(data['longitude']>=lon) & (data['longitude']<=lon+paso)]\n"," if(len(data)>100):\n"," m = np.mean(data['median_house_value'])\n"," if m > maximoValor:\n"," maximaLat = lat\n"," maximaLon = lon\n"," maximoValor = m\n","\n","print('Latitude:',maximaLat,'Longitude',maximaLon,'Price',maximoValor)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"fLO8x3xOnn5r"},"source":["## $\\imposible $ Unificación de bases de datos\n","\n","El objetivo de este problema es unificar dos bases de datos que contienen mails. Esto quiere decir, tomar dos bases de datos de formato *.csv*: **lista1.csv** y **lista2.csv** y combinarlas en una misma base de datos **listafinal.csv**.\n","El contenido de las bases de datos son listas de mails, que contienen mails y otras informaciones de distintos usuarios. Tener en cuenta que las dos bases de datos pueden tener informaciones distintas de los usuarios.\n","\n","**Recomendamos** descargar los archivos para ver su contenido (Con excel pueden abrirlos, pensar que un csv es prácticamente equivalente a un excel)."]},{"cell_type":"code","metadata":{"id":"Wq40RyOZnr9y"},"source":["! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/lista1.csv\"\n","# primera lista de clientes\n","\n","! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Analisis_de_Datos_Datos/lista2.csv\"\n","# segunda lista de clientes"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"5aVXwvQLJGwo"},"source":["### **Solución**\n","Este es un problema con una solucion que puede parecer tediosa pero resuelve un problema muy común y su lógica luego puede aplicarse a otros casos similares.\n","\n","La solución propuesta consiste en armar una nueva base de datos con los **contenidos combinados** de los usuarios acorde a la información extraida de las dos bases de datos originales.\n","\n","Para esto se debe crear una nueva de base de datos unificada a la que le iremos progresivamente agregando los valores primero de la base de datos 1 **lista1.csv** y en segundo lugar los valores de la base de datos 2 **lista2.csv**.\n","\n","Esta nueva de base de datos unificada tendrá la forma de un diccionario donde las claves serán los mails de los usuarios y el contenido la información de cada usuario (es decir el mismo formato que las bases de datos originales)\n","\n","Hay que tener una consideración que es que en las bases de datos **lista1.csv** y **lista2.csv** la información que se tiene de los usuarios puede ser distinta. Por ejemplo, si en la lista1 tenemos como información la edad de los usuarios en una columna puede pasar que en la lista2 no este.\n","\n","Entonces es importante ir almacenando en un set (todosloscampos) todos los campos (es decir las columnas) que vamos encontrando en un set que va almacenanado progresivamente todos los campos que vamos encontrando en las bases de datos. Tiene que ser un set para evitar la repetición de campos en la base de datos final."]},{"cell_type":"code","metadata":{"id":"r5EmrJu9nolT"},"source":["import pandas as pd\n","\n","# aca almacenamos las bases de datos que vamos a unificar\n","listas = [ \"lista1.csv\", \"lista2.csv\" ]\n","\n","# en este diccionario vamos a ir amlacenando la información de la base de datos unificada\n","# la clave son los mails, el contenido la información de los usuarios\n","\n","clientes = dict()\n","\n","#en este set almacenamos todas las columnas que se van progresivamente encontrando\n","todosloscampos = set() #set=conjunto\n","\n","\n","for lista in listas: # iteramos todas las bases de datos\n","\n"," # leemos el contenido indexando por mail (es decir la clave de los diccionarios será el mail de los usuarios)\n"," archivo = pd.read_csv(lista, index_col =[\"Mail\"])\n"," data = archivo.to_dict(\"index\")\n","\n"," # mostramos en pantalla\n"," print(\"Base de datos\", lista)\n"," print(archivo)\n","\n"," # iteramos los mails de la base de datos\n"," for mail in data:\n"," # si el mail es uno nuevo para nuetra base de datos unificada, lo inicializamos como un diccionario vacio sin información\n"," # la cual se la agregaremos despues\n"," # si el mail ya existe no es necesario, significa que lo vimos en una base de datos anterior\n","\n"," if mail not in clientes:\n"," clientes[mail] = dict()\n","\n"," # leemos todos los campos (las columnas) que tenemos del mail en la base de datos original que estamos procesando\n"," campos = data[mail]\n","\n"," # iteramos todos los campos del mail encontrado, y le asignamos sus valores en la base de datos unificada\n"," for campo in campos:\n"," # le asignamos a \"clientes\" que es la base de datos unificada el campo actual\n"," # que esta en data[mail], que tiene la información de la base de datos que estamos procesando del\n"," # campo correspondiente\n"," clientes[mail][campo] = data[mail][campo]\n","\n"," # le agregamos al set de campos (columas) el campo encontrado\n"," # como es un set los repetidos no van a agregarse\n"," todosloscampos.add(campo)\n","\n"," print(\" \")\n","\n","# Por ultimo escribimos el archivo final, colocando las claves de los elementos de la base unificada (es decir los mails)\n","# En la primera columna (por eso orient=\"index\")\n","\n","df = pd.DataFrame.from_dict(clientes, orient='index')\n","\n","# Mostramos los resultados y los guardamos en un archivo final\n","print(\"Base de datos unificada\")\n","print(df)\n","\n","df.to_csv('listafinal.csv')"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"QRvegpwLICIN"},"source":["# Anexos"]},{"cell_type":"markdown","metadata":{"id":"JmqpWNphG0To"},"source":["## **Opcional**: Mini-desafío json\n","Estás encargado de un servidor con millones de usuarios.\n","\n","Se pide escribir un programa que reciba el email y contraseña del usuario y se fije si existe el usuario y si coincide la contraseña.\n","\n","Se tienen datos encolumnados en formato json que nos llegan del siguiente formato:\n","```json\n","{\n","\t\"usuarios\": [\"mica@mail.co\", \"jerry@gma.com\",\"alber@soup.co\"],\n","\t\"contra\": [\"abc123\",\"caballitos\",\"yoloswag\"]\n","}\n","```\n","La entrada del programa son tres lineas, el programa entonces va tener tres `input()`. La primer linea contiene el `json`, la segunda el `email` a verificar, y la tercera la `contraseña`. Por ende, las primeras lineas de su programa podrían ser:\n","```python\n","import json\n","usuarios = json.loads(input())\n","email = input()\n","password = input()\n","```\n","\n","La salida del programa será `OK` si el usuario **se encuentra en la base de datos** ***y*** **si coincide la contraseña**, imprimimos `DNE` (does not exist) si el usuario no existe y `NO` en cualquier otro caso.\n","\n","#### Caso ejemplo\n","**Entrada**:\n","```plaintext\n","{\"usuarios\": [\"mica@mail.co\",\"jerry@gma.com\",\"alber@soup.co\"],\"contra\": [\"abc123\",\"caballitos\",\"yoloswag\"]}\n","mica@mail.co\n","caballitos\n","```\n","El usuario existe y la contraseña también... pero no le corresponde la contraseña `caballitos` al usuario `mica@mail.co` (la contraseña de `mica@mail.co` sería `abc123`) por ende imprimimos:\n","\n","**Salida**\n","```\n","NO\n","```\n","\n","_Considere que no hay usuarios repetidos_."]},{"cell_type":"markdown","metadata":{"id":"YxTgxk0tIRpw"},"source":["### **Solución**"]},{"cell_type":"code","metadata":{"id":"1EZhTLiCk0BI","colab":{"base_uri":"https://localhost:8080/"},"outputId":"223f9fd4-8135-4222-f567-3c11012b9821"},"source":["import json\n","usuarios = json.loads(input())\n","email = input(\"Mail:\")\n","password = input(\"Contraseña\")\n","\n","if email in usuarios[\"usuarios\"]:\n"," index = usuarios[\"usuarios\"].index(email)\n"," if password == usuarios[\"contra\"][index]:\n"," print(\"OK\")\n"," else:\n"," print(\"NO\")\n","\n","else:\n"," print(\"DNE\")"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["{\"usuarios\": [\"mica@mail.co\",\"jerry@gma.com\",\"alber@soup.co\"],\"contra\": [\"abc123\",\"caballitos\",\"yoloswag\"]}\n","Mail:mica@mail.co\n","Contraseñacaballitos\n","NO\n"]}]}]}
--------------------------------------------------------------------------------
/Curso_Introductorio_Datos/Datos.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/Curso_Introductorio_Datos/Datos.xlsx
--------------------------------------------------------------------------------
/Curso_Introductorio_Datos/datos.csv:
--------------------------------------------------------------------------------
1 | Legajo,Nombre,Apellido,Quimica,Matematica,Fisica
2 | 34567,Juan,Martinez,10,7,9
3 | 34678,Pablo,Gonzales,4,9,4
4 | 34234,Maria,Citanovich,2,4,4
5 | 35679,Sol,Rios,9,8,10
6 | 36789,Paula,Lagos,8,5,8
7 | 32578,Tomas,Reu,1,4,2
8 |
--------------------------------------------------------------------------------
/Curso_Introductorio_Datos/noticia.txt:
--------------------------------------------------------------------------------
1 | La mayor luna de Saturno, Titán, ha intrigado por mucho tiempo a los científicos que buscan vida en nuestro sistema solar. Un nuevo estudio considera posible que el cráter más grande del planeta haya experimentado las condiciones necesarias para el inicio de la vida, según anunciaron esta semana sus autores en la Conferencia de Ciencia Lunar y Planetaria.
2 |
3 | La superficie del satélite natural está cubierta de hidrocarburos orgánicos y se cree que hay un océano a unos 100 kilómetros por debajo de su corteza helada. Los investigadores sugieren que un asteroide o un cometa posiblemente se estrelló contra la luna mezclando estos dos ingredientes, lo que pudo haber producido "una sopa primordial necesaria para desarrollar la vida", explica el geólogo planetario Álvaro Penteado Crósta.
4 |
5 | Para averiguarlo, el equipo modeló el impacto del cráter más grande de la luna, Menrva, formado hace unos 1.000 millones de años. El modelo sugirió que el cráter de 425 kilómetros de ancho, fue el resultado de una roca espacial de 34 kilómetros que golpeó la superficie a unos siete kilómetros por segundo.
6 |
7 | Según los datos, el calor del impacto habría derretido el hielo creando un lago en el cráter, que se mantuvo durante un millón de años antes de volver a congelarse por las bajas temperaturas de Titán. Los expertos consideran que este pudo haber sido tiempo suficiente para que los microbios evolucionaran, aprovechando el agua líquida, las moléculas orgánicas y el calor del impacto. "Eso es bastante bueno para las bacterias", aseguran.
8 |
9 | Aunque la investigación del equipo se centró en Menrva, los científicos creen posible que impactos más pequeños fueron suficientes para romper la capa de hielo en otros cráteres de la luna. Incluso un orificio mucho más joven llamado Selk tiene posibilidades de "tener algún tipo de bacteria fosilizada preservada en el hielo", comenta Penteado Crósta.
10 |
11 | Sin embargo, otros investigadores como Elizabeth Turtle, responsable de la misión Dragonfly en el Laboratorio de Física Aplicada de la Universidad Johns Hopkins, sostiene que todavía "no hay pruebas sólidas" que sugieran este escenario. Aun así, la sonda que volará a Titán podría pronto recopilar información que ayude a apoyar la teoría planteada.
--------------------------------------------------------------------------------
/Curso_Introductorio_Solucionarios/Solucionario_Clase_3_Curso_Introductorio_de_Python.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "(Solucionario) Clase 3 - Curso Introductorio de Python.ipynb",
7 | "provenance": [],
8 | "collapsed_sections": [],
9 | "toc_visible": true
10 | },
11 | "kernelspec": {
12 | "name": "python3",
13 | "display_name": "Python 3"
14 | },
15 | "language_info": {
16 | "name": "python"
17 | }
18 | },
19 | "cells": [
20 | {
21 | "cell_type": "markdown",
22 | "metadata": {
23 | "id": "7CZnS3EA0NVn"
24 | },
25 | "source": [
26 | "# Solucionario de la Clase 3 - Curso Introductorio de Python\n"
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "metadata": {
32 | "id": "1KWE4fsUdjHP"
33 | },
34 | "source": [
35 | "## Mini-desafíos"
36 | ]
37 | },
38 | {
39 | "cell_type": "markdown",
40 | "metadata": {
41 | "id": "eK4Lm4w9WHfk"
42 | },
43 | "source": [
44 | "#### **Mini-desafío:** Diccionarios\n",
45 | "1. Realizar un programa que pida al usuario un número de legajo y el nombre completo, luego lo guarde en un diccionario. En caso de que el número de legajo ya se encuentre en el diccionario, se debe mostrar un mensaje de advertencia.\n",
46 | "\n",
47 | " Usar dos celdas de código, en una crear el diccionario, y en la otra agregar el nombre y legajo y mostrar el contenido total. La idea es que cuando se ejecute varias veces la segunda celda se agrege un nuevo nombre y legajo a lo que ya había sido almacenado en el diccionario."
48 | ]
49 | },
50 | {
51 | "cell_type": "code",
52 | "metadata": {
53 | "id": "2dcL9YmnWfbv"
54 | },
55 | "source": [
56 | "# Celda 1\n",
57 | "# Ejecutar esta celda 1 vez para crear el diccionario vacío\n",
58 | "dic = {}\n",
59 | "print(dic)"
60 | ],
61 | "execution_count": null,
62 | "outputs": []
63 | },
64 | {
65 | "cell_type": "code",
66 | "metadata": {
67 | "id": "6aiGms-8_9T3"
68 | },
69 | "source": [
70 | "# Celda 2\n",
71 | "# Ejecutar esta celda cada vez que se quiera agregar un elemento\n",
72 | "\n",
73 | "legajo = int(input(\"Ingrese el numero de legajo: \"))\n",
74 | "nombre = input(\"Ingrese el nombre completo: \")\n",
75 | "\n",
76 | "if legajo in dic:\n",
77 | " print(\"Ese alumno ya esta registrado.\")\n",
78 | "\n",
79 | "else:\n",
80 | " dic[legajo] = nombre\n",
81 | "\n",
82 | "print(dic)\n"
83 | ],
84 | "execution_count": null,
85 | "outputs": []
86 | },
87 | {
88 | "cell_type": "markdown",
89 | "metadata": {
90 | "id": "Khd7tKm0UKF9"
91 | },
92 | "source": [
93 | "2. Realizar un programa que decodifique [código morse](https://es.wikipedia.org/wiki/C%C3%B3digo_morse). El usuario debe ingresar una palabra en código morse, usando una secuencia de puntos, guiones y espacios como la siguiente:\n",
94 | "\n",
95 | " ```.--. .-. --- --. .-. .- -- .- -.-. .. --- -.```\n",
96 | " \n",
97 | " Luego, separando por espacios, cada letra debe ser convertida de morse a una letra del alfabeto, y por último la traducción se muestra en pantalla como un *string*. Les proponemos definir un *diccionario* que ayude a realizar la traducción. Es importante considerar qué dato será la clave, y cuál el contenido, de forma en que les sea más útil para lograr resolver el desafío.\n",
98 | "\n",
99 | " **Tips:** Revisar los métodos `.split()` y `.join()` para convertir entre strings y listas."
100 | ]
101 | },
102 | {
103 | "cell_type": "code",
104 | "metadata": {
105 | "id": "4PppgdUsstps"
106 | },
107 | "source": [
108 | "# Solución\n",
109 | "\n",
110 | "morse_code = {'.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', \n",
111 | " '..-.': 'F', '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', \n",
112 | " '-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O', \n",
113 | " '.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T', \n",
114 | " '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y', \n",
115 | " '--..': 'Z'}\n",
116 | "\n",
117 | "frase = '.--. .-. --- --. .-. .- -- .- -.-. .. --- -.'\n",
118 | "\n",
119 | "letras = frase.split()\n",
120 | "\n",
121 | "for i in range(len(letras)):\n",
122 | " letras[i] = morse_code[letras[i]]\n",
123 | "\n",
124 | "print( ''.join(letras) )"
125 | ],
126 | "execution_count": null,
127 | "outputs": []
128 | },
129 | {
130 | "cell_type": "markdown",
131 | "metadata": {
132 | "id": "GTYqk43YWl_3"
133 | },
134 | "source": [
135 | "#### **Mini-desafío:** Sets\n",
136 | "1. Se cuentan con varios sets que contienen nombres de personas a las que les gusta un cierto sabor de helado:\n",
137 | "\n",
138 | " ```python\n",
139 | "vainilla = { \"Juan\", \"Marina\", \"Tomas\", \"Paula\" }\n",
140 | "chocolate = { \"Pedro\", \"Paula\", \"Marina\" }\n",
141 | "dulceDeLeche = { \"Juan\", \"Julian\", \"Pedro\", \"Marina\" }\n",
142 | "```\n",
143 | "\n",
144 | " Responder, usando operaciones de sets:\n",
145 | "\n",
146 | " - ¿Hay alguna persona a la que le gusten todos los sabores?\n",
147 | "\n",
148 | " - ¿Hay alguna persona a la que le guste la vainilla y no el dulce de leche?\n",
149 | "\n",
150 | " - ¿Cuántas personas distintas tenemos?"
151 | ]
152 | },
153 | {
154 | "cell_type": "code",
155 | "metadata": {
156 | "id": "WL5tcyol38FZ"
157 | },
158 | "source": [
159 | "# Solución - parte 1\n",
160 | "\n",
161 | "vainilla = {\"Juan\", \"Marina\", \"Tomas\", \"Paula\"}\n",
162 | "chocolate = {\"Pedro\", \"Paula\", \"Marina\"}\n",
163 | "dulceDeLeche = {\"Juan\", \"Julian\", \"Pedro\", \"Marina\"}\n",
164 | "\n",
165 | "print(\"Le gustan todos los sabores a:\", vainilla & chocolate & dulceDeLeche)\n",
166 | "\n",
167 | "print(\"Le gusta la vainilla y no el dulce de leche a:\", vainilla - dulceDeLeche)\n",
168 | "\n",
169 | "print(\"Total de personas:\", len(vainilla | chocolate | dulceDeLeche))"
170 | ],
171 | "execution_count": null,
172 | "outputs": []
173 | },
174 | {
175 | "cell_type": "markdown",
176 | "metadata": {
177 | "id": "PL9TFHl-XYnH"
178 | },
179 | "source": [
180 | "2. Diseñar un programa que analiza si una frase es un [pangrama](https://es.wikipedia.org/wiki/Pangrama) del idioma inglés, es decir, si contiene todas las letras del alfabeto al menos 1 vez. El programa debe ser capaz de ignorar espacios y signos de puntuación. Por ejemplo:\n",
181 | "```python\n",
182 | "frase = \"the quick brown fox jumps over the lazy dog\"\n",
183 | "```\n",
184 | " El siguiente set puede serles de utilidad:\n",
185 | " ```python\n",
186 | " letras = set(\"abcdefghijklmnopqrstuvwxyz\")\n",
187 | " ```"
188 | ]
189 | },
190 | {
191 | "cell_type": "code",
192 | "metadata": {
193 | "id": "o2mfpzBXXamN"
194 | },
195 | "source": [
196 | "# Solución - parte 2\n",
197 | "\n",
198 | "letras = set(\"abcdefghijklmnopqrstuvwxyz\")\n",
199 | "\n",
200 | "frase = input(\"Ingrese una frase: \")\n",
201 | "\n",
202 | "if letras.issubset( set(frase) ):\n",
203 | " print(\"La frase es un pangrama del idioma inglés!\")\n",
204 | "else:\n",
205 | " print(\"La frase no es un pangrama.\")"
206 | ],
207 | "execution_count": null,
208 | "outputs": []
209 | },
210 | {
211 | "cell_type": "markdown",
212 | "metadata": {
213 | "id": "hpW3cNya1ESA"
214 | },
215 | "source": [
216 | "## Ejercitación integradora\n",
217 | "$\\newcommand{\\dif}{\\bigstar}$$\\newcommand{\\facil}{\\color{\\green}{\\dif}}$ $\\newcommand{\\pieceofcake}{\\color{\\cyan}{\\dif}}$$\\newcommand{\\medio}{\\color{\\yellow}{\\dif\\dif}}$$\\newcommand{\\media}{\\medio}$$\\newcommand{\\normal}{\\medio}$ $\\newcommand{\\dificil}{\\color{\\orange}{\\dif\\dif\\dif}}$ $\\newcommand{\\imposible}{\\color{\\red}{\\dif\\dif\\dif\\dif}}$"
218 | ]
219 | },
220 | {
221 | "cell_type": "markdown",
222 | "metadata": {
223 | "id": "Rvlf1T7MNTjo"
224 | },
225 | "source": [
226 | "### $\\facil$ El ABC de Python\n",
227 | "\n",
228 | "*Aclaración: Este desafío es inventado, es posible que haya errores fácticos en cuanto a los alfabetos reales.*\n",
229 | "\n",
230 | "Encontramos una piedra antigua en una plaza de Buenos Aires cuyas inscripciones nos ayudan a decifrar nuevos alfabetos. Gracias a estas inscripciones descubrimos que las letras del [alfabeto latino arcaico](https://es.wikipedia.org/wiki/Alfabeto_latino#Alfabeto_latino_arcaico) tienen una correspondencia con el [alfabeto latino](https://es.wikipedia.org/wiki/Alfabeto_latino) y vamos a crear un programa que nos ayude a traducir palabras de un alfabeto a otro.\n",
231 | "\n",
232 | "Crear una función que recibe un *string*, transforma todos los caracteres del *alfabeto latino arcaico* en caracteres modernos, no modifica el resto de los caracteres (signos de puntuacion, espacios, letras, números, etc.) y devuelve el resultado con *return*.\n",
233 | "\n",
234 | "**Ejemplos:**\n",
235 | "\n",
236 | "`traducir( \"𐌀𐌋𐌅𐌀𐌁𐌄𐌕𐌏\" )` → `\"ALFABETO\"`\n",
237 | "\n",
238 | "`traducir( \"¡𐌐𐌄𐌓𐌃𐌉!\" )` → `\"¡PERDI!\"`\n",
239 | "\n",
240 | "`traducir( \"¿𐌔𐌉 𐌏 𐌍𐌏? 𐌌𐌌𐌌... 𐌔𐌉.\" )` → `\"¿SI O NO? MMM... SI.\"`\n",
241 | "\n",
242 | "**Correspondencia entre alfabetos:**\n",
243 | "```python\n",
244 | "Arcaico : Moderno\n",
245 | "'𐌀' : 'A',\n",
246 | "'𐌁' : 'B',\n",
247 | "'𐌂' : 'C',\n",
248 | "'𐌃' : 'D',\n",
249 | "'𐌄' : 'E',\n",
250 | "'𐌅' : 'F',\n",
251 | "'𐌆' : 'Z',\n",
252 | "'𐌇' : 'H',\n",
253 | "'𐌉' : 'I',\n",
254 | "'𐌊' : 'K',\n",
255 | "'𐌋' : 'L',\n",
256 | "'𐌌' : 'M',\n",
257 | "'𐌍' : 'N',\n",
258 | "'𐌏' : 'O',\n",
259 | "'𐌐' : 'P',\n",
260 | "'𐌒' : 'Q',\n",
261 | "'𐌓' : 'R',\n",
262 | "'𐌔' : 'S',\n",
263 | "'𐌕' : 'T',\n",
264 | "'𐌖' : 'V',\n",
265 | "'𐌗' : 'X'\n",
266 | "```\n",
267 | "\n"
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "metadata": {
273 | "id": "KyqzDnT4e_U2"
274 | },
275 | "source": [
276 | "arcaico = {'𐌀' : 'A', '𐌁' : 'B', '𐌂' : 'C', '𐌃' : 'D', '𐌄' : 'E', '𐌅' : 'F',\n",
277 | " '𐌆' : 'Z', '𐌇' : 'H', '𐌉' : 'I', '𐌊' : 'K', '𐌋' : 'L', '𐌌' : 'M',\n",
278 | " '𐌍' : 'N', '𐌏' : 'O', '𐌐' : 'P', '𐌒' : 'Q', '𐌓' : 'R', '𐌔' : 'S',\n",
279 | " '𐌕' : 'T', '𐌖' : 'V', '𐌗' : 'X' }\n",
280 | "\n",
281 | "def traducir(texto):\n",
282 | " resultado = \"\"\n",
283 | " for letra in texto:\n",
284 | " if letra in arcaico:\n",
285 | " resultado += arcaico[letra]\n",
286 | " else:\n",
287 | " resultado += letra\n",
288 | " return resultado\n",
289 | "\n",
290 | "print(traducir(\"𐌀𐌋𐌅𐌀𐌁𐌄𐌕𐌏\"))\n",
291 | "print(traducir(\"¡𐌐𐌄𐌓𐌃𐌉!\"))\n",
292 | "print(traducir(\"¿𐌔𐌉 𐌏 𐌍𐌏? 𐌌𐌌𐌌... 𐌔𐌉.\"))\n",
293 | "print(traducir(\"𐌀𐌋𐌅𐌀𐌁𐌄𐌕𐌏, ¡𐌐𐌄𐌓𐌃𐌉!, ¿𐌔𐌉 𐌏 𐌍𐌏? 𐌌𐌌𐌌... 𐌔𐌉.\"))"
294 | ],
295 | "execution_count": null,
296 | "outputs": []
297 | },
298 | {
299 | "cell_type": "markdown",
300 | "metadata": {
301 | "id": "0_lEQuB-fIH4"
302 | },
303 | "source": [
304 | "###$\\facil$ Análisis estadístico de fallas en lotes de producción II\n",
305 | "\n",
306 | "Adaptar la solución al ejercicio integrador de la clase pasada para utilizar librerías en lugar de programar todo de forma manual. Pueden usar la librería **csv** para importar el archivo, y las librerías **numpy** o **scipy** para calcular la media, varianza, moda y mediana.\n",
307 | "\n",
308 | "**Tip:** Pueden investigar el uso de estos métodos en la documentación de las librerías:\n",
309 | "\n",
310 | "* Media: [numpy.mean](https://numpy.org/doc/stable/reference/generated/numpy.mean.html)\n",
311 | "* Varianza: [numpy.var](https://numpy.org/doc/stable/reference/generated/numpy.var.html)\n",
312 | "* Moda: [scipy.stats.mode](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mode.html)\n",
313 | "* Mediana: [numpy.median](https://numpy.org/doc/stable/reference/generated/numpy.median.html)\n",
314 | "\n",
315 | "A continuación pueden ver una copia de la consigna:\n",
316 | "\n",
317 | "Una planta de producción de botellas plásticas fabrica 1000 lotes de botellas por día. Debido al proceso de fabricación algunas de las botellas salen falladas. Estos fallos son detectados automáticamente durante el proceso de control de calidad y se cargan en una base de datos que registra la cantidad de productos fallados por cada lote. El departamento de control de calidad sospecha que la cantidad de fallos por lote sigue una distribución de *Poisson*, pero todavía no conocen la media y la varianza.\n",
318 | "\n",
319 | "Se pide importar los datos de los últimos 30 días (en total son 30000 datos) y calcular la *media*, la *varianza*, la *moda* y la *mediana* de la distribución de datos medidos. Los datos se encuentran en el archivo *ControlCalidadBotellas.csv* bajo la columna *Fallas*.\n",
320 | "\n",
321 | "**Definiciones:**\n",
322 | "- **Media:** El valor promedio:\n",
323 | "\n",
324 | " $\\mu=\\frac{X_1+X_2+X_3+\\cdots+X_n}{n}$\n",
325 | "\n",
326 | "- **Varianza:** El promedio de las distancias al cuadrado entre cada valor y la media:\n",
327 | "\n",
328 | " $\\sigma^2=\\frac{(X_1-\\mu)^2+(X_2-\\mu)^2+\\cdots+(X_n-\\mu)^2}{n}$\n",
329 | "\n",
330 | "- **Moda:** El valor que ocurre con mayor frecuencia.\n",
331 | "\n",
332 | "- **Mediana:** El valor que cumple la propiedad que la mitad de las veces el valor medido es menor a la mediana y la otra mitad de las veces es mayor.\n",
333 | "\n",
334 | "Si las sospechas acerca de la distribución fueran correctas, entonces de acuerdo a las propiedades de la distribución de Poisson la media y la varianza deberían ser iguales. Además la moda sería $\\lceil{\\mu}\\rceil-1$. ¿Esta sospecha les parece acertada?"
335 | ]
336 | },
337 | {
338 | "cell_type": "code",
339 | "metadata": {
340 | "id": "H8YZTOZuS8Vg"
341 | },
342 | "source": [
343 | "! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Introductorio_Datos/ControlCalidadBotellas.csv\""
344 | ],
345 | "execution_count": null,
346 | "outputs": []
347 | },
348 | {
349 | "cell_type": "code",
350 | "metadata": {
351 | "id": "Im6dY0MQcV80"
352 | },
353 | "source": [
354 | "# Instalar las librerías en el entorno de Colab\n",
355 | "! pip install numpy\n",
356 | "! pip install scipy"
357 | ],
358 | "execution_count": null,
359 | "outputs": []
360 | },
361 | {
362 | "cell_type": "code",
363 | "metadata": {
364 | "id": "IJ1WFX5zqvHN"
365 | },
366 | "source": [
367 | "import csv\n",
368 | "import numpy\n",
369 | "from scipy import stats\n",
370 | "\n",
371 | "# Lectura del archivo\n",
372 | "csvfile = open(\"ControlCalidadBotellas.csv\")\n",
373 | "lector = csv.reader(csvfile)\n",
374 | "\n",
375 | "# Armo una lista con laa cantidad de fallas por día\n",
376 | "fallas = []\n",
377 | "for fila in lector:\n",
378 | " if fila[1] != \"Fallas\":\n",
379 | " fallas.append( int(fila[1]) )\n",
380 | "\n",
381 | "# Cálculo de las diferentes métricas\n",
382 | "media = numpy.mean(fallas)\n",
383 | "var = numpy.var(fallas)\n",
384 | "moda, count = stats.mode(fallas)\n",
385 | "mediana = numpy.median(fallas)\n",
386 | "\n",
387 | "print(\"La media es:\", media)\n",
388 | "print(\"La varianza es:\", var)\n",
389 | "print(\"La moda es:\", moda[0])\n",
390 | "print(\"La mediana es:\", mediana)"
391 | ],
392 | "execution_count": null,
393 | "outputs": []
394 | },
395 | {
396 | "cell_type": "markdown",
397 | "metadata": {
398 | "id": "VWdCPrBJxITk"
399 | },
400 | "source": [
401 | "### $\\facil$ Diccionario²\n",
402 | "Se recibieron distintos postulantes para un empleo de traductor. Crear un **diccionario** en el cual la *clave* de cada elemento sea el nombre de un candidato y el *contenido* sea un **diccionario** de los idiomas que aprendió. Para armar el diccionario de idiomas de cada candidato, los elementos deben tener como *clave* el nombre del idioma y como *contenido* el valor True o False para los siguientes idiomas: Español, Inglés, Chino, Frances, Italiano.\n",
403 | "\n",
404 | "Ejemplo de **diccionario** de idiomas:\n",
405 | "\n",
406 | "```python\n",
407 | "{\"Español\":True, \"Inglés\":True, \"Chino\":False, \"Frances\":False, \"Italiano\":True}\n",
408 | "```\n",
409 | "\n",
410 | "Inventar valores para 5 candidatos.\n",
411 | "\n",
412 | "El usuario luego debe poder ingresar el nombre de un idioma y el programa deberá mostrar en pantalla el nombre de aquellos candidatos que aprendieron ese idioma."
413 | ]
414 | },
415 | {
416 | "cell_type": "code",
417 | "metadata": {
418 | "id": "XkTbUn75ABOV"
419 | },
420 | "source": [
421 | "postulantes = {\n",
422 | " \"Juan\" : {\"Español\":True, \"Ingles\":True, \"Chino\":False, \n",
423 | " \"Frances\":False, \"Italiano\":True}, \n",
424 | " \"Pablo\" : {\"Español\":False, \"Ingles\":True, \"Chino\":True, \n",
425 | " \"Frances\":False, \"Italiano\":True}, \n",
426 | " \"Carlos\" : {\"Español\":True, \"Ingles\":False, \"Chino\":False, \n",
427 | " \"Frances\":True, \"Italiano\":True},\n",
428 | " \"Ana\" : {\"Español\":True, \"Ingles\":True, \"Chino\":True, \n",
429 | " \"Frances\":False, \"Italiano\":True},\n",
430 | " \"Maria\" : {\"Español\":False, \"Ingles\":True, \"Chino\":False, \n",
431 | " \"Frances\":False, \"Italiano\":True}\n",
432 | "}\n",
433 | "\n",
434 | "idioma = input(\"Ingrese un idioma: \")\n",
435 | "\n",
436 | "for nombre, dicParticular in postulantes.items():\n",
437 | " if idioma in dicParticular and dicParticular[idioma] == True:\n",
438 | " print(nombre, 'habla', idioma)"
439 | ],
440 | "execution_count": null,
441 | "outputs": []
442 | },
443 | {
444 | "cell_type": "markdown",
445 | "metadata": {
446 | "id": "0CqTiYpZG-AO"
447 | },
448 | "source": [
449 | "### $\\normal$ Une y triunfarás (continuación de Diccionario²)\n",
450 | "Se recibieron distintos postulantes para un empleo de traductor. Crear un **diccionario** en el cuál la *key* de cada elemento sea el nombre de un candidato y el *contenido* sea un **set** con los idiomas que aprendió.\n",
451 | "Inventar sets para 5 candidatos.\n",
452 | "\n",
453 | "Ejemplo del **set** de idiomas:\n",
454 | "\n",
455 | "```python\n",
456 | "{\"Español\", \"Inglés\", \"Portugués\", \"Italiano\"}\n",
457 | "```\n",
458 | "\n",
459 | "- Mostrar en pantalla los idiomas que todos los candidatos aprendieron.\n",
460 | "- Mostrar en pantalla todos los candidatos que aprendieron por lo menos Español e Inglés.\n"
461 | ]
462 | },
463 | {
464 | "cell_type": "code",
465 | "metadata": {
466 | "id": "TKyvJXLZBO1O"
467 | },
468 | "source": [
469 | "postulantes = {\n",
470 | " \"Juan\" : {\"Español\", \"Ingles\", \"Italiano\"} , \n",
471 | " \"Pablo\" : {\"Ingles\", \"Chino\", \"Italiano\"}, \n",
472 | " \"Carlos\" : {\"Español\", \"Frances\", \"Italiano\"},\n",
473 | " \"Ana\" : {\"Español\", \"Ingles\", \"Chino\", \"Italiano\"},\n",
474 | " \"Maria\" : {\"Ingles\", \"Italiano\"}\n",
475 | "}\n",
476 | "\n",
477 | "# Creamos un set con todos los idiomas\n",
478 | "todos = {\"Español\", \"Ingles\", \"Chino\", \"Frances\", \"Italiano\"}\n",
479 | "\n",
480 | "for p in postulantes:\n",
481 | " todos &= postulantes[p] # Es lo mismo que: todos = todos & postulantes[p]\n",
482 | "\n",
483 | "print(\"Todos los candidatos aprendieron este(os) idioma(s):\")\n",
484 | "for i in todos:\n",
485 | " print(i)\n",
486 | "\n",
487 | "# Creamos un set vacio\n",
488 | "esp_ing = set() \n",
489 | "for p in postulantes:\n",
490 | " if \"Español\" in postulantes[p] and \"Ingles\" in postulantes[p]: \n",
491 | " # Qué postulantes que saben ingles y español\n",
492 | " esp_ing.add(p)\n",
493 | "\n",
494 | "print(\"Los candidatos que aprendieron al menos Español e Inglés:\")\n",
495 | "for i in esp_ing:\n",
496 | " print(i)"
497 | ],
498 | "execution_count": null,
499 | "outputs": []
500 | },
501 | {
502 | "cell_type": "markdown",
503 | "metadata": {
504 | "id": "Z8gmZrau0b4E"
505 | },
506 | "source": [
507 | "### $\\medio$ Análisis de idiomas\n",
508 | "\n",
509 | "Importar el archivo **noticia.txt**"
510 | ]
511 | },
512 | {
513 | "cell_type": "code",
514 | "metadata": {
515 | "id": "OVOe9jNU6IQO"
516 | },
517 | "source": [
518 | "! wget \"https://raw.githubusercontent.com/IEEESBITBA/Curso-Python/master/Curso_Introductorio_Datos/noticia.txt\""
519 | ],
520 | "execution_count": null,
521 | "outputs": []
522 | },
523 | {
524 | "cell_type": "markdown",
525 | "metadata": {
526 | "id": "QtD86PdpWrpv"
527 | },
528 | "source": [
529 | "Calcular la [frecuencia de aparición de letras](https://es.wikipedia.org/wiki/Frecuencia_de_aparici%C3%B3n_de_letras). Compararla con la frecuencia de letras característica del idioma Español (en el articulo de wikipedia pueden encontrarla). ¿Existe alguna relación?\n",
530 | "\n",
531 | "**Tips:**\n",
532 | "- Pasar todas las letras a mayúsculas o todas a minúsculas.\n",
533 | "- Reemplazar las vocales con tilde por la misma vocal sin tilde antes de realizar el conteo.\n",
534 | "- Descartar los números y caracteres no deseados. El método `.isalpha()` les puede ser de utilidad para este propósito."
535 | ]
536 | },
537 | {
538 | "cell_type": "code",
539 | "metadata": {
540 | "id": "OfggPtvUVmNT"
541 | },
542 | "source": [
543 | "def segundo_valor(x):\n",
544 | " return x[1]\n",
545 | "\n",
546 | "file = open(\"noticia.txt\") # cargamos el archivo a la memoria\n",
547 | "contenido = file.readlines() # calculamos todas las lineas\n",
548 | "\n",
549 | "tildes = {'á':'a', 'é':'e', 'í':'i', 'ó':'o', 'ú':'u'}\n",
550 | "\n",
551 | "total = 0\n",
552 | "ocurrencias = {}\n",
553 | "for renglon in contenido:\n",
554 | " renglon_lower = renglon.lower() # pasamos a minúscula el archivo.\n",
555 | " for letra in renglon_lower:\n",
556 | " # Si la letra tiene tilde, la remplazo por su versión sin tilde.\n",
557 | " if letra in tildes: \n",
558 | " letra = tildes[letra]\n",
559 | " \n",
560 | " if letra.isalpha(): \n",
561 | " # Si la letra es alfanumerica, la agrego a la lista de ocurrencias.\n",
562 | " # Info get(): https://www.w3schools.com/python/ref_dictionary_get.asp\n",
563 | " ocurrencias[letra] = ocurrencias.get(letra, 0) + 1 \n",
564 | " total += 1\n",
565 | "\n",
566 | "items = ocurrencias.items()\n",
567 | "\n",
568 | "# Info Sorted: https://www.programiz.com/python-programming/methods/built-in/sorted\n",
569 | "# Ordenamos las ocurrencias de mayor a menor.\n",
570 | "lista = sorted(items, key = segundo_valor, reverse = True) \n",
571 | "\n",
572 | "for k,v in lista:\n",
573 | " print(\"{} aparece {} veces: {:0.3f} %\".format(k, v, v/total * 100))"
574 | ],
575 | "execution_count": null,
576 | "outputs": []
577 | },
578 | {
579 | "cell_type": "markdown",
580 | "metadata": {
581 | "id": "WQK4B7zHjucS"
582 | },
583 | "source": [
584 | "### $\\dificil$ Menta y Dulce de leche\n",
585 | "\n",
586 | "**Introducción:**\n",
587 | "\n",
588 | "*Una de las muchas ventajas de los sets y los diccionarios es que permiten averiguar si contienen cierto elemento con gran velocidad, sin importar la cantidad de elementos que almacenan (esto se debe a que internamente utilizan una [función hash](https://es.wikipedia.org/wiki/Funci%C3%B3n_hash)). Acceder al valor asociado a cierta clave en un diccionario también es una operación muy veloz.*\n",
589 | "\n",
590 | "*En comparación, verificar si un elemento se encuentra dentro de una lista es lento, ya que el tiempo necesario es proporcional a la cantidad de elementos en la lista y para listas muy grandes con miles, millones o billones de elementos (como puede suceder en una base de datos) esto puede ser un problema importante. Sin embargo, una vez que se conoce el índice del elemento, acceder al elemento es una operación tan rápida como en un diccionario.*\n",
591 | "\n",
592 | "**Problema:**\n",
593 | "\n",
594 | "Volviendo de hacer las compras en el supermercado, pasás cerca de una heladería y decidís comprar helado para tus hermanos, los cuales son amantes de la menta granizada y del dulce de leche con nuez. El negocio ofrece helado en todo tipo de formato, desde mini-cucuruchos hasta potes de 1 kilo, y cada formato cuesta cierta cantidad de dinero. Decidís gastar exactamente todo el dinero que te queda luego de haber ido al supermercado, de forma tal que no sobre ni falte.\n",
595 | "\n",
596 | "Programar una función que recibe una lista con los precios de los distintos formatos en que se vende el helado, y además reciba la cantidad de dinero disponible para gastar. La función debe encontrar la manera de comprar cierto formato de helado sabor menta, y cierto formato sabor dulce de leche, de manera de gastar la totalidad del dinero disponible. En consecuencia, la cantidad de formatos seleccionados debe ser exactamente 2. Está permitido seleccionar el mismo formato para ambos sabores de helado. La función debe devolver con *return* una lista de 2 elementos, los cuales serán los precios de los formatos de helado seleccionados. En caso de no existir una combinación que satisface los requisitos se debe devolver ``[-1, -1]``.\n",
597 | "\n",
598 | "**Tips:**\n",
599 | " - Al usar un set o un diccionario como estructura de datos pueden mejorar la velocidad con la que el programa analiza si cierto elemento se encuentra dentro de los datos. La operación ``mi_set = set( mi_lista )`` puede serles de utilidad para este propósito.\n",
600 | "\n",
601 | "**Ejemplos:**\n",
602 | "\n",
603 | "`buscar_precios( [1, 2, 3, 4, 5] , 8)` → `[3, 5]`\n",
604 | "\n",
605 | "`buscar_precios( [7, 4, 2, 6, 7, 7] , 4)` → `[2, 2]`\n",
606 | "\n",
607 | "`buscar_precios( [4, 3, 7, 5] , 5)` → `[-1, -1]`\n",
608 | "\n",
609 | "\\\n",
610 | "\n",
611 | "$\\dificil$ *Challenge*: Modificar la función para que el resultado sea un sólo número: La cantidad de maneras diferentes de conseguir el objetivo (si dos formatos tienen el mismo precio, igualmente califican como formatos diferentes)."
612 | ]
613 | },
614 | {
615 | "cell_type": "markdown",
616 | "metadata": {
617 | "id": "DD6GAhfxIJKx"
618 | },
619 | "source": [
620 | "#### Solución"
621 | ]
622 | },
623 | {
624 | "cell_type": "code",
625 | "metadata": {
626 | "id": "OtPrN6jRIJ4t"
627 | },
628 | "source": [
629 | "def buscar_precios(lista_precios, dinero):\n",
630 | " # Convertir la lista en un set\n",
631 | " set_precios = set(lista_precios)\n",
632 | "\n",
633 | " # Iterar por todos los precios en el set\n",
634 | " # Analizar si el dinero restante se encuentra en el set\n",
635 | " for p in set_precios:\n",
636 | " restante = dinero - p\n",
637 | " if restante in set_precios:\n",
638 | " return [p, restante]\n",
639 | "\n",
640 | " # En caso de no lograr una combinación, devolver [-1, -1]\n",
641 | " return [-1, -1]\n",
642 | "\n",
643 | "print(buscar_precios( [1, 2, 3, 4, 5] , 8))\n",
644 | "print(buscar_precios( [7, 4, 2, 6, 7, 7] , 4))\n",
645 | "print(buscar_precios( [4, 3, 7, 5] , 5))"
646 | ],
647 | "execution_count": null,
648 | "outputs": []
649 | },
650 | {
651 | "cell_type": "markdown",
652 | "metadata": {
653 | "id": "T-2T4936QvlX"
654 | },
655 | "source": [
656 | "#### Solución: Challenge"
657 | ]
658 | },
659 | {
660 | "cell_type": "code",
661 | "metadata": {
662 | "id": "9qwHYmviQxL5"
663 | },
664 | "source": [
665 | "def buscar_precios(lista_precios, dinero):\n",
666 | " resultado = 0\n",
667 | "\n",
668 | " # Convertir la lista en un diccionario\n",
669 | " # Las claves serán los precios, los valores serán la cantidad de ocurrencias\n",
670 | " dict_precios = dict()\n",
671 | " \n",
672 | " # Iterar por todos los precios en la lista\n",
673 | " for p in lista_precios:\n",
674 | " # Agregar los elementos previos al diccionario\n",
675 | " dict_precios[p] = dict_precios.get(p, 0) + 1\n",
676 | "\n",
677 | " # Analizar si el dinero restante se encuentra en el dict y cuantas veces\n",
678 | " # Para evitar contar dos veces, chequeamos con los elementos anteriores\n",
679 | " restante = dinero - p\n",
680 | " if restante in dict_precios:\n",
681 | " resultado += dict_precios[restante]\n",
682 | "\n",
683 | " return resultado\n",
684 | "\n",
685 | "print(buscar_precios( [1, 2, 3, 4, 5, 4] , 8))\n",
686 | "print(buscar_precios( [7, 4, 2, 6, 7, 7] , 9))\n",
687 | "print(buscar_precios( [4, 3, 7, 5] , 5))"
688 | ],
689 | "execution_count": null,
690 | "outputs": []
691 | },
692 | {
693 | "cell_type": "markdown",
694 | "metadata": {
695 | "id": "58bbfFzqurNj"
696 | },
697 | "source": [
698 | "### $\\dificil$ Dr. Chaos, el malevolo semiótico\n",
699 | "\n",
700 | "\"Chaos es caos en inglés\" te diría Dr. Chaos, charlando con una taza de té Chai en la mano. En verdad no es tán malo como su nombre lo hace aparentar... si es que tenés un buen manejo de los idiomas.\n",
701 | "\n",
702 | "Dr. Chaos esta armando un diccionario. Este diccionario tiene la particularidad de no tener definiciones; el diccionario de Dr. Chaos define *una palabra como otra*. Dr. Chaos quiere comenzar a traducir la literatura de todo el mundo usando el diccionario y ha venido a ti, el *Number One* programador de Python. \n",
703 | "\n",
704 | "**Objetivo:** Cambiar las palabras de una oración usando el diccionario de Dr. Chaos e imprimir la nueva oración en el lenguaje unificado.\n",
705 | "\n",
706 | "**Ejemplos:**\n",
707 | "\n",
708 | " - Input 1:\n",
709 | " ```python \n",
710 | "diccionario = {\"hola\":\"你好\",\"como\":\"how\",\"estás\":\"estáis\"}\n",
711 | "oracion = \"hola, como estás?\"\n",
712 | "```\n",
713 | " Output 1:\n",
714 | "```python \n",
715 | "\"你好, how estáis?\"\n",
716 | "```\n",
717 | "\n",
718 | " - Input 2:\n",
719 | " ```python \n",
720 | "diccionario = {\"ve\":\"regards\",\"bien\":\"bom\",\"se\":\"it\"}\n",
721 | "oracion = \"se ve bien!\"\n",
722 | "```\n",
723 | "\n",
724 | " Output 2:\n",
725 | "```python \n",
726 | "\"it regards bom!\"\n",
727 | "```\n",
728 | "\n",
729 | "\n",
730 | "**Tips:** \n",
731 | "\n",
732 | "* Los símbolos de interrogación, exclamación, los puntos y comas no forman parte de las palabras y no se deben modificar.\n",
733 | " \n",
734 | "* Suponer que las letras son todas minúsculas.\n"
735 | ]
736 | },
737 | {
738 | "cell_type": "markdown",
739 | "metadata": {
740 | "id": "4zEDfhn7QfrW"
741 | },
742 | "source": [
743 | "#### Solución"
744 | ]
745 | },
746 | {
747 | "cell_type": "code",
748 | "metadata": {
749 | "id": "kDvIsxZCxawO"
750 | },
751 | "source": [
752 | "# Solución 1\n",
753 | "\n",
754 | "espanolToChaos = {\"ve\":\"regards\", \"bien\":\"bom\", \"se\":\"it\"}\n",
755 | "oracion = \"se ve bien!\"\n",
756 | "whitespace = [\" \", \".\", \",\", \"!\", \"?\"]\n",
757 | "\n",
758 | "resultado = \"\"\n",
759 | "palabra = \"\"\n",
760 | "for i in range(0, len(oracion)):\n",
761 | " letra = oracion[i]\n",
762 | " if letra in whitespace: # reviso si la letra es una espacio en blanco\n",
763 | " if palabra != \"\":\n",
764 | " # traducir la palabra que tengo hasta ahora y agregarla\n",
765 | " resultado = resultado+espanolToChaos[palabra] \n",
766 | " \n",
767 | " resultado = resultado+letra # agrego el espacio a la palabra nueva\n",
768 | " palabra = \"\"\n",
769 | " else:\n",
770 | " palabra = palabra + letra\n",
771 | " \n",
772 | "print(resultado)"
773 | ],
774 | "execution_count": null,
775 | "outputs": []
776 | },
777 | {
778 | "cell_type": "code",
779 | "metadata": {
780 | "id": "8va1BwGcGuhe"
781 | },
782 | "source": [
783 | "# Solución 2\n",
784 | "\n",
785 | "espanolToChaos = {\"ve\":\"regards\", \"bien\":\"bom\", \"se\":\"it\"}\n",
786 | "oracion = \"se ve bien!\"\n",
787 | "whitespace = [\" \", \".\", \",\", \"!\", \"?\"]\n",
788 | "\n",
789 | "resultado = \"\"\n",
790 | "palabra = \"\"\n",
791 | "for letra in oracion:\n",
792 | " # Si alcance un signo de puntuación, traduzco la palabra actual\n",
793 | " if letra in whitespace:\n",
794 | " resultado += espanolToChaos[palabra] \n",
795 | " resultado += letra # Agrego el signo de puntuación\n",
796 | " palabra = \"\" # reseteo la palabra actual\n",
797 | " # Si la letra no es un signo de puntuación, la guardo en palabra\n",
798 | " else:\n",
799 | " palabra += letra \n",
800 | "\n",
801 | "print(resultado)"
802 | ],
803 | "execution_count": null,
804 | "outputs": []
805 | },
806 | {
807 | "cell_type": "markdown",
808 | "metadata": {
809 | "id": "2a0QjbS3QrlX"
810 | },
811 | "source": [
812 | "###$\\imposible$ Quiero Retruco\n",
813 | "El [Truco](https://es.wikipedia.org/wiki/Truco_argentino) es un juego de cartas muy popular en Argentina. Se suele jugar con naipes españoles de 40 cartas, las cuales tienen 4 palos (basto, oro, espada y copa) y 10 números (1, 2, 3, 4, 5, 6, 7, 10, 11 y 12).\n",
814 | "Si bien en esta ocasión no vamos a programar un juego de truco, sí vamos a resolver uno de los problemas más usuales que surgen cuando jugamos, el cual es definir qué carta gana y qué carta pierde cuando hay un duelo entre dos cartas. \n",
815 | "\n",
816 | "
\n",
817 | "\n",
818 | "En la imagen podemos observar el orden de importancia de las cartas de izquierda a derecha. El 1 de espada es la más importante (y por lo tanto **siempre** gana) mientras que los 4s son las cartas de menor importancia (casi siempre pierden). Las cartas en la misma columna empatan si se enfrentan.\n",
819 | "\n",
820 | "- Programar una función con dos inputs tipo string **carta A** y **carta B** que retorne la carta ganadora (tipo string), o \"empate\" en caso de que lo haya. \n",
821 | "\n",
822 | "**Ejemplos de como debería funcionar:**\n",
823 | "\n",
824 | " ```\n",
825 | " dueloDeCartas(\"1 de espada\", \"1 de basto\")\n",
826 | " >>> 1 de espada\n",
827 | " dueloDeCartas(\"7 de oro\", \"5 de oro\")\n",
828 | " >>> 7 de oro\n",
829 | " dueloDeCartas(\"11 de copa\", \"11 de espada\")\n",
830 | " >>> empate\n",
831 | "```\n",
832 | "\n",
833 | " **Pista:** usar un diccionario donde la **clave** sea el nombre de la carta, y su **contenido** su importancia (un tipo **int**). Aprovechen la instrucción *for* para evitar tener que cargar todas las cartas una por una.\n",
834 | "\n",
835 | "\n",
836 | "**Plus:**\n",
837 | "\n",
838 | "- A veces se suele jugar al truco con más de dos jugadores. Podría ocurrir duelos en los que participan $n$ cartas. Programar una función cuyo input sea una lista de strings con todas las cartas y retorne la ganadora. (En caso de empate que retorne alguna de las ganadoras, o una lista con las ganadoras).\n",
839 | "\n",
840 | "**Ejemplos de cómo podría funcionar:**\n",
841 | "```\n",
842 | " dueloDeCartas([\"7 de basto\",\"7 de espada\",\"12 de espada\", \"4 de espada\"])\n",
843 | " >>> \"7 de espada\"\n",
844 | " dueloDeCartas([\"4 de espada\",\"7 de basto\",\"7 de copa\", \"5 de copa\"]) #también podría haber dado 7 de basto \n",
845 | " >>> \"7 de copa\"\n",
846 | "```\n",
847 | " El texto de la pista es de de color blanco, seleccionalo para verlo. \n",
848 | "\n"
849 | ]
850 | },
851 | {
852 | "cell_type": "markdown",
853 | "metadata": {
854 | "id": "FdsIdtdhQgpn"
855 | },
856 | "source": [
857 | "#### Solución"
858 | ]
859 | },
860 | {
861 | "cell_type": "code",
862 | "metadata": {
863 | "id": "L3jCZ-sc6Nd-"
864 | },
865 | "source": [
866 | "# Solución 1: diccionario\n",
867 | "\n",
868 | "\"\"\" \n",
869 | "Antes de hacer la funcion dueloDeCartas, creamos el diccionario que leerá \n",
870 | "para saber que carta gana \n",
871 | "\"\"\"\n",
872 | "\n",
873 | "valorCarta = dict() \n",
874 | "\n",
875 | "# casos especiales: esto no lo puedo hacer con un for\n",
876 | "valorCarta[\"1 de espada\"] = 14 \n",
877 | "valorCarta[\"1 de basto\"] = 13 \n",
878 | "valorCarta[\"7 de espada\"] = 12\n",
879 | "valorCarta[\"7 de oro\"] = 11\n",
880 | "\n",
881 | "# el resto de los valores son de 10 para abajo\n",
882 | "valor = 10\n",
883 | "for x in [3, 2, 1, 12, 11, 10, 7, 6, 5, 4]: \n",
884 | " # itero por los numeros de las cartas, de la mas a la menos poderosa\n",
885 | " if x == 1: # con este if elijo que palos de este numero guardo\n",
886 | " palos = [\"oro\",\"copa\"] \n",
887 | " elif x == 7:\n",
888 | " palos = [\"basto\", \"copa\"]\n",
889 | " else: \n",
890 | " palos = [\"oro\", \"copa\", \"basto\", \"espada\"]\n",
891 | "\n",
892 | " # para todos los palos que elegí, guardo la carta con el mismo valor\n",
893 | " for palo in palos:\n",
894 | " valorCarta[str(x) + \" de \" + palo] = valor\n",
895 | " \n",
896 | " valor -= 1 # la carta que viene es menos poderosa\n",
897 | "\n",
898 | "def dueloDeCartas(cartaA, cartaB):\n",
899 | " # usamos el diccionario que creamos para saber el valor de las cartas\n",
900 | " # que nos pasan\n",
901 | " if valorCarta[cartaA] > valorCarta[cartaB]:\n",
902 | " return cartaA\n",
903 | " elif valorCarta[cartaA] < valorCarta[cartaB]:\n",
904 | " return cartaB\n",
905 | " else:\n",
906 | " return \"empate\"\n",
907 | " \n",
908 | " \n",
909 | "# verificamos que la funcion ande correctamente\n",
910 | "print(dueloDeCartas(\"7 de basto\",\"1 de basto\"))\n",
911 | "print(dueloDeCartas(\"1 de copa\", \"1 de oro\"))\n",
912 | "print(dueloDeCartas(\"7 de copa\",\"3 de copa\"))"
913 | ],
914 | "execution_count": null,
915 | "outputs": []
916 | },
917 | {
918 | "cell_type": "code",
919 | "metadata": {
920 | "id": "SvEw17LdV6hb"
921 | },
922 | "source": [
923 | "#Solución 2: lista\n",
924 | "\n",
925 | "cartas = [[\"1 de espada\"],\n",
926 | " [\"1 de basto\"],\n",
927 | " [\"7 de espada\"],\n",
928 | " [\"7 de oro\"],\n",
929 | " [\"3 de espada\", \"3 de basto\", \"3 de oro\", \"3 de copa\"],\n",
930 | " [\"2 de espada\", \"2 de basto\", \"2 de oro\", \"2 de copa\"],\n",
931 | " [\"1 de oro\", \"1 de copa\"],\n",
932 | " [\"12 de espada\", \"12 de basto\", \"12 de oro\", \"12 de copa\"],\n",
933 | " [\"11 de espada\", \"11 de basto\", \"11 de oro\", \"11 de copa\"],\n",
934 | " [\"10 de espada\", \"10 de basto\", \"10 de oro\", \"10 de copa\"],\n",
935 | " [\"7 de oro\", \"7 de copa\"], \n",
936 | " [\"6 de espada\", \"6 de basto\", \"6 de oro\", \"6 de copa\"],\n",
937 | " [\"5 de espada\", \"5 de basto\", \"5 de oro\", \"5 de copa\"],\n",
938 | " [\"4 de espada\", \"4 de basto\", \"4 de oro\", \"4 de copa\"]]\n",
939 | "\n",
940 | "def dueloDeCartas(cartaA, cartaB):\n",
941 | " resultado = \"\"\n",
942 | " for c in cartas:\n",
943 | " if cartaA in c and cartaB in c:\n",
944 | " resultado = \"empate\"\n",
945 | " break\n",
946 | " if cartaA in c:\n",
947 | " resultado = cartaA\n",
948 | " break\n",
949 | " if cartaB in c:\n",
950 | " resultado = cartaB\n",
951 | " break\n",
952 | " return resultado\n",
953 | "\n",
954 | "print(dueloDeCartas(\"7 de basto\", \"1 de basto\"))\n",
955 | "print(dueloDeCartas(\"2 de copa\", \"3 de oro\"))\n",
956 | "print(dueloDeCartas(\"7 de copa\", \"3 de copa\"))\n",
957 | "print(dueloDeCartas(\"11 de copa\", \"11 de espada\"))"
958 | ],
959 | "execution_count": null,
960 | "outputs": []
961 | },
962 | {
963 | "cell_type": "markdown",
964 | "metadata": {
965 | "id": "Rk5xjYj9k4Ad"
966 | },
967 | "source": [
968 | "## **Opcional**: Mini-desafío json\n",
969 | "Estás encargado de un servidor con millones de usuarios. \n",
970 | "\n",
971 | "Se pide escribir un programa que reciba el email y contraseña del usuario y se fije si existe el usuario y si coincide la contraseña.\n",
972 | "\n",
973 | "Se tienen datos encolumnados en formato json que nos llegan en el siguiente formato:\n",
974 | "```json\n",
975 | "{\n",
976 | "\t\"usuarios\" : [\"mica@mail.co\", \"jerry@gma.com\",\"alber@soup.co\"],\n",
977 | "\t\"contra\" : [\"abc123\", \"caballitos\", \"yoloswag\"]\n",
978 | "}\n",
979 | "```\n",
980 | "La entrada del programa son tres líneas, el programa entonces va tener tres `input()`. La primer línea contiene el `json`, la segunda el `email` a verificar, y la tercera la `contraseña`. Por ende, las primeras líneas de su programa podrían ser:\n",
981 | "```python\n",
982 | "import json\n",
983 | "usuarios = json.loads(input())\n",
984 | "email = input()\n",
985 | "password = input()\n",
986 | "```\n",
987 | "\n",
988 | "La salida del programa será `OK` si el usuario **se encuentra en la base de datos** ***y*** **si coincide la contraseña**, imprimimos `DNE` (does not exist) si el usuario no existe y `NO` en cualquier otro caso.\n",
989 | "\n",
990 | "#### Caso de ejemplo:\n",
991 | "**Entrada**:\n",
992 | "```json\n",
993 | "{\"usuarios\": [\"mica@mail.co\",\"jerry@gma.com\",\"alber@soup.co\"],\"contra\": [\"abc123\",\"caballitos\",\"yoloswag\"]}\n",
994 | "mica@mail.co\n",
995 | "caballitos\n",
996 | "```\n",
997 | "El usuario existe y la contraseña también... pero no le corresponde la contraseña `caballitos` al usuario `mica@mail.co` (la contraseña de `mica@mail.co` sería `abc123`), por ende imprimimos:\n",
998 | "\n",
999 | "**Salida:**\n",
1000 | "```\n",
1001 | "NO\n",
1002 | "```\n",
1003 | "\n",
1004 | "_Considere que no hay usuarios repetidos_."
1005 | ]
1006 | },
1007 | {
1008 | "cell_type": "markdown",
1009 | "metadata": {
1010 | "id": "0fD2QKoklGjz"
1011 | },
1012 | "source": [
1013 | "####Solución"
1014 | ]
1015 | },
1016 | {
1017 | "cell_type": "code",
1018 | "metadata": {
1019 | "id": "1EZhTLiCk0BI"
1020 | },
1021 | "source": [
1022 | "import json\n",
1023 | "\n",
1024 | "\n",
1025 | "usuarios = json.loads(input())\n",
1026 | "email = input(\"Mail: \")\n",
1027 | "password = input(\"Contraseña: \")\n",
1028 | "\n",
1029 | "if email in usuarios[\"usuarios\"]:\n",
1030 | " index = usuarios[\"usuarios\"].index(email)\n",
1031 | " if password == usuarios[\"contra\"][index]:\n",
1032 | " print(\"OK\")\n",
1033 | " else:\n",
1034 | " print(\"NO\")\n",
1035 | "else:\n",
1036 | " print(\"DNE\")"
1037 | ],
1038 | "execution_count": null,
1039 | "outputs": []
1040 | }
1041 | ]
1042 | }
--------------------------------------------------------------------------------
/LICENCIA:
--------------------------------------------------------------------------------
1 | Creative Commons Atribución/Reconocimiento-NoComercial-CompartirIgual 4.0 Licencia Pública Internacional — CC BY-NC-SA 4.0
2 |
3 | IEEESBITBA 2019 CC BY-NC-SA 4.0
4 |
5 | Al ejercer los Derechos Licenciados (definidos a continuación), Usted acepta y acuerda estar obligado por los términos y condiciones de esta Licencia Internacional Pública de Atribución/Reconocimiento-NoComercial-CompartirIgual 4.0 de Creative Commons ("Licencia Pública"). En la medida en que esta Licencia Pública pueda ser interpretada como un contrato, a Usted se le otorgan los Derechos Licenciados en consideración a su aceptación de estos términos y condiciones, y el Licenciante le concede a Usted tales derechos en consideración a los beneficios que el Licenciante recibe por poner a disposición el Material Licenciado bajo estos términos y condiciones.
6 |
7 | Sección 1 – Definiciones.
8 |
9 | Material Adaptado es aquel material protegido por Derechos de Autor y Derechos Similares que se deriva o se crea en base al Material Licenciado y en el cual el Material Licenciado se traduce, altera, arregla, transforma o modifica de manera tal que dicho resultado sea de aquellos que requieran autorización de acuerdo con los Derechos de Autor y Derechos Similares que ostenta el Licenciante. A los efectos de esta Licencia Pública, cuando el Material Licenciado se trate de una obra musical, una interpretación o una grabación sonora, la sincronización temporal de este material con una imagen en movimiento siempre producirá Material Adaptado.
10 | Licencia de adaptador es aquella licencia que Usted aplica a Sus Derechos de Autor y Derechos Similares en Sus contribuciones consideradas como Material Adaptado de acuerdo con los términos y condiciones de esta Licencia Pública.
11 | Una Licencia Compatible con BY-NC-SA es aquella que aparece en la lista disponible en creativecommons.org/compatiblelicenses, aprobada por Creative Commons, como una licencia esencialmente equivalente a esta Licencia Pública.
12 | Derechos de Autor y Derechos Similares son todos aquellos derechos estrechamente vinculados a los derechos de autor, incluidos, de manera enunciativa y no taxativa, los derechos sobre las interpretaciones, las emisiones, las grabaciones sonoras y los Derechos "Sui Generis" sobre Bases de Datos, sin importar cómo estos derechos se encuentren enunciados o categorizados. A los efectos de esta Licencia Pública, los derechos especificados en las secciones 2(b)(1)-(2) no se consideran Derechos de Autor y Derechos Similares.
13 | Medidas Tecnológicas Efectivas son aquellas medidas que, en ausencia de la debida autorización, no pueden ser eludidas en virtud de las leyes que cumplen las obligaciones del artículo 11 del Tratado de la OMPI sobre Derecho de Autor adoptado el 20 de diciembre de 1996, y/o acuerdos internacionales similares.
14 | Excepciones y Limitaciones son el uso justo (fair use), el trato justo (fair dealing) y/o cualquier otra excepción o limitación a los Derechos de Autor y Derechos Similares que se apliquen al uso el Material Licenciado.
15 | Los Elementos de la Licencia son los atributos que figuran en el nombre de la Licencia Pública de Creative Commons. Los Elementos de la Licencia de esta Licencia Pública son Atribución/Reconocimiento, NoComercial y CompartirIgual.
16 | Material Licenciado es obra artística o literaria, base de datos o cualquier otro material al cual el Licenciante aplicó esta Licencia Pública.
17 | Derechos Licenciados son derechos otorgados a Usted bajo los términos y condiciones de esta Licencia Pública, los cuales se limitan a todos los Derechos de Autor y Derechos Similares que apliquen al uso del Material Licenciado y que el Licenciante tiene potestad legal para licenciar.
18 | Licenciante es el individuo(s) o la entidad(es) que concede derechos bajo esta Licencia Pública.
19 | NoComercial, a los efectos de esta licencia, es que no se encuentre principalmente destinado o dirigido a obtener una ventaja comercial o una compensación monetaria. Para los propósitos de esta Licencia Pública, el intercambio de Material Licenciado por otro material sujeto a Derechos de Autor y Derechos Similares a través de mecanismos de intercambio de archivos digitales o de medios similares, se considerará como NoComercial siempre que no haya pago de una compensación monetaria en relación con el intercambio.
20 | Compartir significa proporcionar material al público por cualquier medio o procedimiento que requiera permiso conforme a los Derechos Licenciados, tales como la reproducción, exhibición pública, presentación pública, distribución, difusión, comunicación o importación, así como también su puesta a disposición, incluyendo formas en que el público pueda acceder al material desde un lugar y momento elegido individualmente por ellos.
21 | Derechos "Sui Generis" sobre Bases de Datos son aquellos derechos diferentes a los derechos de autor, resultantes de la Directiva 96/9/EC del Parlamento Europeo y del Consejo, de 11 de marzo de 1996 sobre la protección jurídica de las bases de datos, en sus versiones modificadas y/o posteriores, así como otros derechos esencialmente equivalentes en cualquier otra parte del mundo.
22 | Usted es el individuo o la entidad que ejerce los Derechos Licenciados en esta Licencia Pública. La palabra Su tiene un significado equivalente.
23 | Sección 2 – Ámbito de Aplicación.
24 |
25 | Otorgamiento de la licencia.
26 | Sujeto a los términos y condiciones de esta Licencia Pública, el Licenciante le otorga a Usted una licencia de carácter global, gratuita, no transferible a terceros, no exclusiva e irrevocable para ejercer los Derechos Licenciados sobre el Material Licenciado para:
27 | reproducir y Compartir el Material Licenciado, en su totalidad o en parte, solamente para fines NoComerciales; y
28 | producir, reproducir y Compartir Material Adaptado solamente para fines NoComerciales.
29 | Excepciones y Limitaciones. Para evitar cualquier duda, donde se apliquen Excepciones y Limitaciones al uso del Material Licenciado, esta Licencia Pública no será aplicable, y Usted no tendrá necesidad de cumplir con sus términos y condiciones.
30 | Vigencia. La vigencia de esta Licencia Pública está especificada en la sección 6(a).
31 | Medios y formatos; modificaciones técnicas permitidas. El Licenciante le autoriza a Usted a ejercer los Derechos Licenciados en todos los medios y formatos, actualmente conocidos o por crearse en el futuro, y a realizar las modificaciones técnicas necesarias para ello. El Licenciante renuncia y/o se compromete a no hacer valer cualquier derecho o potestad para prohibirle a Usted realizar las modificaciones técnicas necesarias para ejercer los Derechos Licenciados, incluyendo las modificaciones técnicas necesarias para eludir las Medidas Tecnológicas Efectivas. A los efectos de esta Licencia Pública, la mera realización de modificaciones autorizadas por esta sección 2(a)(4) nunca produce Material Adaptado.
32 | Receptores posteriores.
33 | Oferta del Licenciante – Material Licenciado. Cada receptor de Material Licenciado recibe automáticamente una oferta del Licenciante para ejercer los Derechos Licenciados bajo los términos y condiciones de esta Licencia Pública.
34 | Oferta adicional por parte del Licenciante – Material Adaptado. Cada receptor del Material Adaptado por Usted recibe automáticamente una oferta del Licenciante para ejercer los Derechos Licenciados en el Material Adaptado bajo las condiciones de la Licencia del Adaptador que Usted aplique.
35 | Sin restricciones a receptores posteriores. Usted no puede ofrecer o imponer ningún término ni condición diferente o adicional, ni puede aplicar ninguna Medida Tecnológica Efectiva al Material Licenciado si haciéndolo restringe el ejercicio de los Derechos Licenciados a cualquier receptor del Material Licenciado.
36 | Sin endoso. Nada de lo contenido en esta Licencia Pública constituye o puede interpretarse como un permiso para afirmar o implicar que Usted, o que Su uso del Material Licenciado, está conectado, patrocinado, respaldado o reconocido con estatus oficial por el Licenciante u otros designados para recibir la Atribución/Reconocimiento según lo dispuesto en la sección 3(a)(1)(A)(i).
37 | Otros derechos.
38 |
39 | Los derechos morales, tales como el derecho a la integridad, no están comprendidos bajo esta Licencia Pública ni tampoco los derechos de publicidad y privacidad ni otros derechos personales similares. Sin embargo, en la medida de lo posible, el Licenciante renuncia y/o se compromete a no hacer valer ninguno de estos derechos que ostenta como Licenciante, limitándose a lo necesario para que Usted pueda ejercer los Derechos Licenciados, pero no de otra manera.
40 | Los derechos de patentes y marcas no son objeto de esta Licencia Pública.
41 | En la medida de lo posible, el Licenciante renuncia al derecho de cobrarle regalías a Usted por el ejercicio de los Derechos Licenciados, ya sea directamente o a través de una entidad de gestión colectiva bajo cualquier esquema de licenciamiento voluntario, renunciable o no renunciable. En todos los demás casos, el Licenciante se reserva expresamente cualquier derecho de cobrar esas regalías, incluidos aquellos casos en los que el Material Licenciado sea utilizado para fines distintos a los NoComerciales.
42 | Sección 3 – Condiciones de la Licencia.
43 |
44 | Su ejercicio de los Derechos Licenciados está expresamente sujeto a las condiciones siguientes.
45 |
46 | Atribución/Reconocimiento.
47 |
48 | Si Usted comparte el Material Licenciado (incluyendo en forma modificada), Usted debe:
49 |
50 | Conservar lo siguiente si es facilitado por el Licenciante con el Material Licenciado:
51 | identificación del creador o los creadores del Material Licenciado y de cualquier otra persona designada para recibir Atribución/Reconocimiento, de cualquier manera razonable solicitada por el Licenciante (incluyendo por seudónimo si este ha sido designado);
52 | un aviso sobre derecho de autor;
53 | un aviso que se refiera a esta Licencia Pública;
54 | un aviso que se refiera a la limitación de garantías;
55 | un URI o un hipervínculo al Material Licenciado en la medida razonablemente posible;
56 | Indicar si Usted modificó el Material Licenciado y conservar una indicación de las modificaciones anteriores; e
57 | Indicar que el Material Licenciado está bajo esta Licencia Pública e incluir el texto, el URI o el hipervínculo a esta Licencia Pública.
58 | Usted puede satisfacer las condiciones de la sección 3(a)(1) de cualquier forma razonable según el medio, las maneras y el contexto en los cuales Usted Comparta el Material Licenciado. Por ejemplo, puede ser razonable satisfacer las condiciones facilitando un URI o un hipervínculo a un recurso que incluya la información requerida.
59 | Bajo requerimiento del Licenciante, Usted debe eliminar cualquier información requerida por la sección 3(a)(1)(A) en la medida razonablemente posible.
60 | CompartirIgual.
61 | Además de las condiciones de la sección 3(a), si Usted Comparte Material Adaptado producido por Usted, también aplican las condiciones siguientes.
62 |
63 | La Licencia del Adaptador que Usted aplique debe ser una licencia de Creative Commons con los mismos Elementos de la Licencia, ya sea de esta versión o una posterior, o una Licencia Compatible con la BY-NC-SA.
64 | Usted debe incluir el texto, el URI o el hipervínculo a la Licencia del Adaptador que aplique. Usted puede satisfacer esta condición de cualquier forma razonable según el medio, las maneras y el contexto en los cuales Usted Comparta el Material Adaptado.
65 | Usted no puede ofrecer o imponer ningún término o condición adicional o diferente, o aplicar ninguna Medida Tecnológica Efectiva al Material Adaptado que restrinja el ejercicio de los derechos concedidos en virtud de la Licencia de Adaptador que Usted aplique.
66 | Sección 4 – Derechos "Sui Generis" sobre Bases de Datos.
67 |
68 | Cuando los Derechos Licenciados incluyan Derechos "Sui Generis" sobre Bases de Datos que apliquen a Su uso del Material Licenciado:
69 |
70 | para evitar cualquier duda, la sección 2(a)(1) le concede a Usted el derecho a extraer, reutilizar, reproducir y Compartir todo o una parte sustancial de los contenidos de la base de datos solamente para fines NoComerciales;
71 | si Usted incluye la totalidad o una parte sustancial del contenido de una base de datos en otra sobre la cual Usted ostenta Derecho "Sui Generis" sobre Bases de Datos, entonces ella (pero no sus contenidos individuales) se entenderá como Material Adaptado para efectos de la sección 3(b); y
72 | Usted debe cumplir con las condiciones de la sección 3(a) si Usted Comparte la totalidad o una parte sustancial de los contenidos de la base de datos.
73 | Para evitar dudas, esta sección 4 complementa y no sustituye Sus obligaciones bajo esta Licencia Pública cuando los Derechos Licenciados incluyen otros Derechos de Autor y Derechos Similares.
74 | Sección 5 – Exención de Garantías y Limitación de Responsabilidad.
75 |
76 | Salvo que el Licenciante se haya comprometido mediante un acuerdo por separado, en la medida de lo posible el Licenciante ofrece el Material Licenciado tal como es y tal como está disponible y no se hace responsable ni ofrece garantías de ningún tipo respecto al Material Licenciado, ya sea de manera expresa, implícita, legal u otra. Esto incluye, de manera no taxativa, las garantías de título, comerciabilidad, idoneidad para un propósito en particular, no infracción, ausencia de vicios ocultos u otros defectos, la exactitud, la presencia o la ausencia de errores, sean o no conocidos o detectables. Cuando no se permita, totalmente o en parte, la declaración de ausencia de garantías, a Usted puede no aplicársele esta exclusión.
77 | En la medida de lo posible, en ningún caso el Licenciante será responsable ante Usted por ninguna teoría legal (incluyendo, de manera no taxativa, la negligencia) o de otra manera por cualquier pérdida, coste, gasto o daño directo, especial, indirecto, incidental, consecuente, punitivo, ejemplar u otro que surja de esta Licencia Pública o del uso del Material Licenciado, incluso cuando el Licenciante haya sido advertido de la posibilidad de tales pérdidas, costes, gastos o daños. Cuando no se permita la limitación de responsabilidad, ya sea totalmente o en parte, a Usted puede no aplicársele esta limitación.
78 | La renuncia de garantías y la limitación de responsabilidad descritas anteriormente deberán ser interpretadas, en la medida de lo posible, como lo más próximo a una exención y renuncia absoluta a todo tipo de responsabilidad.
79 | Sección 6 – Vigencia y Terminación.
80 |
81 | Esta Licencia Pública tiene una vigencia de aplicación igual al plazo de protección de los Derechos de Autor y Derechos Similares licenciados aquí. Sin embargo, si Usted incumple las condiciones de esta Licencia Pública, los derechos que se le conceden mediante esta Licencia Pública terminan automáticamente.
82 | En aquellos casos en que Su derecho a utilizar el Material Licenciado se haya terminado conforme a la sección 6(a), este será restablecido:
83 |
84 | automáticamente a partir de la fecha en que la violación sea subsanada, siempre y cuando esta se subsane dentro de los 30 días siguientes a partir de Su descubrimiento de la violación; o
85 | tras el restablecimiento expreso por parte del Licenciante.
86 | Para evitar dudas, esta sección 6(b) no afecta ningún derecho que pueda tener el Licenciante a buscar resarcimiento por Sus violaciones de esta Licencia Pública.
87 | Para evitar dudas, el Licenciante también puede ofrecer el Material Licenciado bajo términos o condiciones diferentes, o dejar de distribuir el Material Licenciado en cualquier momento; sin embargo, hacer esto no pondrá fin a esta Licencia Pública.
88 | Las secciones 1, 5, 6, 7, y 8 permanecerán vigentes a la terminación de esta Licencia Pública.
89 | Sección 7 – Otros Términos y Condiciones.
90 |
91 | El Licenciante no estará obligado por ningún término o condición adicional o diferente que Usted le comunique a menos que se acuerde expresamente.
92 | Cualquier arreglo, convenio o acuerdo en relación con el Material Licenciado que no se indique en este documento se considera separado e independiente de los términos y condiciones de esta Licencia Pública.
93 | Sección 8 – Interpretación.
94 |
95 | Para evitar dudas, esta Licencia Pública no es ni deberá interpretarse como una reducción, limitación, restricción, o una imposición de condiciones al uso de Material Licenciado que legalmente pueda realizarse sin permiso del titular, más allá de lo contemplado en esta Licencia Pública.
96 | En la medida de lo posible, si alguna disposición de esta Licencia Pública se considera inaplicable, esta será automáticamente modificada en la medida mínima necesaria para hacerla aplicable. Si la disposición no puede ser reformada, deberá ser eliminada de esta Licencia Pública sin afectar la exigibilidad de los términos y condiciones restantes.
97 | No se podrá renunciar a ningún término o condición de esta Licencia Pública, ni se consentirá ningún incumplimiento, a menos que se acuerde expresamente con el Licenciante.
98 | Nada en esta Licencia Pública constituye ni puede ser interpretado como una limitación o una renuncia a los privilegios e inmunidades que aplican al Licenciante o a Usted, incluyendo aquellos surgidos a partir de procesos legales de cualquier jurisdicción o autoridad.
99 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License
2 |
3 | IEEESBITBA 2019 CC BY-NC-SA 4.0
4 |
5 | By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
6 |
7 | Section 1 – Definitions.
8 |
9 | Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
10 | Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
11 | BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.
12 | Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
13 | Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
14 | Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
15 | License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.
16 | Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
17 | Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
18 | Licensor means the individual(s) or entity(ies) granting rights under this Public License.
19 | NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.
20 | Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
21 | Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
22 | You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
23 | Section 2 – Scope.
24 |
25 | License grant.
26 | Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
27 | reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and
28 | produce, reproduce, and Share Adapted Material for NonCommercial purposes only.
29 | Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
30 | Term. The term of this Public License is specified in Section 6(a).
31 | Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
32 | Downstream recipients.
33 | Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
34 | Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.
35 | No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
36 | No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
37 | Other rights.
38 |
39 | Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
40 | Patent and trademark rights are not licensed under this Public License.
41 | To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.
42 | Section 3 – License Conditions.
43 |
44 | Your exercise of the Licensed Rights is expressly made subject to the following conditions.
45 |
46 | Attribution.
47 |
48 | If You Share the Licensed Material (including in modified form), You must:
49 |
50 | retain the following if it is supplied by the Licensor with the Licensed Material:
51 | identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
52 | a copyright notice;
53 | a notice that refers to this Public License;
54 | a notice that refers to the disclaimer of warranties;
55 | a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
56 | indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
57 | indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
58 | You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
59 | If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
60 | ShareAlike.
61 | In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.
62 |
63 | The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.
64 | You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.
65 | You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.
66 | Section 4 – Sui Generis Database Rights.
67 |
68 | Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
69 |
70 | for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;
71 | if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and
72 | You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
73 | For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
74 | Section 5 – Disclaimer of Warranties and Limitation of Liability.
75 |
76 | Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
77 | To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
78 | The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
79 | Section 6 – Term and Termination.
80 |
81 | This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
82 | Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
83 |
84 | automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
85 | upon express reinstatement by the Licensor.
86 | For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
87 | For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
88 | Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
89 | Section 7 – Other Terms and Conditions.
90 |
91 | The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
92 | Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
93 | Section 8 – Interpretation.
94 |
95 | For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
96 | To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
97 | No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
98 | Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
99 |
--------------------------------------------------------------------------------
/LiveStreams/Presentación Clase Práctica 1 Curso de Python.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/LiveStreams/Presentación Clase Práctica 1 Curso de Python.pdf
--------------------------------------------------------------------------------
/LiveStreams/Presentación Clase Práctica 2 Curso de Python.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/LiveStreams/Presentación Clase Práctica 2 Curso de Python.pdf
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Curso introductorio de Python
2 | Hola! Somos la rama estudiantil de la IEEE en el Instituto Tecnológico de Buenos Aires y organizamos este curso de Python gratuito y abierto al público general.
3 |
4 |
5 |
6 | Material de libre distribución bajo la licencia CC-BY-NC-SA.
7 |
8 |
9 |
--------------------------------------------------------------------------------
/_assets/BlackBox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/BlackBox.png
--------------------------------------------------------------------------------
/_assets/ColoresLineas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/ColoresLineas.png
--------------------------------------------------------------------------------
/_assets/CruceDiscreto.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/CruceDiscreto.png
--------------------------------------------------------------------------------
/_assets/CursoPythonTP4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/CursoPythonTP4.png
--------------------------------------------------------------------------------
/_assets/Data_Type_Word_Art.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/Data_Type_Word_Art.png
--------------------------------------------------------------------------------
/_assets/Diagrama_Ejemplo_1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/Diagrama_Ejemplo_1.PNG
--------------------------------------------------------------------------------
/_assets/Diagrama_cajas.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/Diagrama_cajas.PNG
--------------------------------------------------------------------------------
/_assets/DistribucionEtariaArg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/DistribucionEtariaArg.png
--------------------------------------------------------------------------------
/_assets/Elcódigosecreto.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/Elcódigosecreto.jpg
--------------------------------------------------------------------------------
/_assets/Incógnita.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/Incógnita.jpeg
--------------------------------------------------------------------------------
/_assets/LogosOrganizaciones.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/LogosOrganizaciones.jpeg
--------------------------------------------------------------------------------
/_assets/SPONSOR_Flowics.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/SPONSOR_Flowics.png
--------------------------------------------------------------------------------
/_assets/SPONSOR_JPM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/SPONSOR_JPM.png
--------------------------------------------------------------------------------
/_assets/appdata.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/appdata.png
--------------------------------------------------------------------------------
/_assets/barcode_printer.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/barcode_printer.jpg
--------------------------------------------------------------------------------
/_assets/calendario.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/calendario.png
--------------------------------------------------------------------------------
/_assets/cmdPy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/cmdPy.png
--------------------------------------------------------------------------------
/_assets/cmdSearch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/cmdSearch.jpg
--------------------------------------------------------------------------------
/_assets/cmdSearch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/cmdSearch.png
--------------------------------------------------------------------------------
/_assets/colab_archivos_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/colab_archivos_2.png
--------------------------------------------------------------------------------
/_assets/colab_archivos_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/colab_archivos_3.png
--------------------------------------------------------------------------------
/_assets/credit_cards.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/credit_cards.png
--------------------------------------------------------------------------------
/_assets/data_structures.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/data_structures.png
--------------------------------------------------------------------------------
/_assets/data_structures_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/data_structures_2.png
--------------------------------------------------------------------------------
/_assets/editEnv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/editEnv.png
--------------------------------------------------------------------------------
/_assets/envSearch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/envSearch.png
--------------------------------------------------------------------------------
/_assets/envset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/envset.png
--------------------------------------------------------------------------------
/_assets/funcion cuadratica.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/funcion cuadratica.png
--------------------------------------------------------------------------------
/_assets/guardar_copia_en_drive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/guardar_copia_en_drive.png
--------------------------------------------------------------------------------
/_assets/highpass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/highpass.png
--------------------------------------------------------------------------------
/_assets/logo-oficial.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/logo-oficial.png
--------------------------------------------------------------------------------
/_assets/mail_banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/mail_banner.png
--------------------------------------------------------------------------------
/_assets/marathon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/marathon.png
--------------------------------------------------------------------------------
/_assets/memoria_diagrama0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/memoria_diagrama0.png
--------------------------------------------------------------------------------
/_assets/memoria_diagrama1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/memoria_diagrama1.png
--------------------------------------------------------------------------------
/_assets/memoria_diagrama2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/memoria_diagrama2.png
--------------------------------------------------------------------------------
/_assets/numbers.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/numbers.jpg
--------------------------------------------------------------------------------
/_assets/osciloscopio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/osciloscopio.jpg
--------------------------------------------------------------------------------
/_assets/preferentialelection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/preferentialelection.png
--------------------------------------------------------------------------------
/_assets/pydict.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/pydict.png
--------------------------------------------------------------------------------
/_assets/pysearch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/pysearch.png
--------------------------------------------------------------------------------
/_assets/sugus.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/sugus.jpg
--------------------------------------------------------------------------------
/_assets/termometro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/termometro.png
--------------------------------------------------------------------------------
/_assets/tictactoe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/tictactoe.png
--------------------------------------------------------------------------------
/_assets/todos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/todos.png
--------------------------------------------------------------------------------
/_assets/truco_jerarquia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/truco_jerarquia.png
--------------------------------------------------------------------------------
/_assets/vacas.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/vacas.jpg
--------------------------------------------------------------------------------
/_assets/vscode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/vscode.png
--------------------------------------------------------------------------------
/_assets/vscodeFull.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/vscodeFull.png
--------------------------------------------------------------------------------
/_assets/vscodePython.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IEEESBITBA/Curso-python/5a392379e39446420ee18576f3722867cfddd9ba/_assets/vscodePython.png
--------------------------------------------------------------------------------