{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "#!/usr/bin/env python3\n", "from traitlets.config.manager import BaseJSONConfigManager\n", "from pathlib import Path\n", "path = Path.home() / \".jupyter\" / \"nbconfig\"\n", "cm = BaseJSONConfigManager(config_dir=str(path))\n", "cm.update(\n", " \"rise\",\n", " {\n", " \"theme\": \"sky\",\n", " \"transition\": \"none\",\n", " }\n", ")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Presentaciones y encuestas interactivas con jupyter notebooks y RISE\n", "### pycon Colombia 2020\n", "### Sebastian Flores\n", "#### 07 Febrero 2020" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "**Observaciones:**\n", "* sebastiandres en twitter y github.\n", "* Presentación en [github.com/sebastiandres/charlas](github.com/sebastiandres/charlas)\n", "* Opiniones y críticas a título personal.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Hola. Mi nombre es Sebastián Flores, y quiero compartir algunos experimentos que realicé para realizar encuestas en vivo mientras se presenta en jupyter notebook con la extensión RISE. No es necesario que tomen apuntes, la presentación y todos los enlaces están en mi github: sebastiandres (el repo se llama charlas, es el primero)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Introducción\n", "\n", "¿Porqué esta presentación?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "\n", "¿Se pueden hacer encuestas interactivas en presentaciones con jupyter notebooks?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "La necesidad nació hace algunos meses cuando la noche anterior a realizar una charla a unos estudiantes, quise realizar una encuesta en vivo, pero me di cuenta que no sabía como hacerlo sin salir de RISE y jupyter notebook. Mi talento googleador tampoco me ayudó, así que supongo que si alguien ya lo ha hecho, no lo ha documentado. Así que al menos esto sirve para auto-contestarme. Esto va para ti, Sebastian del lejano pasado." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Agenda\n", "\n", "0. Sobre hacer presentaciones con RISE.\n", "1. Solución 1: Quick & dirty.\n", "2. Solución 2: ¡Pero quiero los datos!\n", "3. Solución 3: No confío en nadie." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "La presentación está estructurada de lo más general a lo más específico, y de lo más mainstream a lo más geek/hipster. Así que un poco de paciencia si hay cosas que parecen muy evidentes." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.1 Sobre hacer presentaciones con jupyter y RISE\n", "\n", "¿Consejos sobre hacer presentaciones en general?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Contenido pensado en tu audiencia. \n", "* Ensayar, ensayar, ensayar.\n", "* Incrementar el desafío." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: ¿Cómo hacer una buena presentación? Este es un tema en sí mismo. No soy para nada un experto, pero he aprendido algunas cosas.\n", "Relato: Aunque parezca un consejotrivial, hay 2 elementos a considerar: saber quién es la audiencia y preparar el contenido necesario. Y haber ensayado varias veces la presentación y ser familiar con el contenido es la mejor forma de que el relato sea fluido. Al final, toda habilidad es como un músculo. Cuando lo ejercitas, se vuelve más fuerte y resulta más fácil usarlo. Esta misma presentación ya la he ensayado unas 10 veces. Sí, toma tiempo." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.2 Sobre hacer presentaciones con jupyter y RISE\n", "\n", "Si forma parte importante de tu día a día, investiga y aprende a hacer mejores presentaciones." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Libro que considero muy bueno: Confessions of a public speaker - Scott Berkum.\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Por supuesto, hay varios libros que se pueden leer al respecto. A mi me gustó este. Confessions of a public Speaker - Scott Berkum. Consejos prácticos y con un tono de humor." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.3 Sobre hacer presentaciones con jupyter y RISE\n", "\n", "¿jupyter notebook? ¿RISE?\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.3 Sobre hacer presentaciones con jupyter y RISE\n", "\n", "¿Qué es la extensión RISE?\n", "\n", "Una celda de jupyter notebook se puede clasificar (adicionalmente al code/markdown) como:\n", "* *Slide*: Diapositiva normal.\n", "* *Fragment*: Fragmento de diapositiva.\n", "* *Sub-slide*: Opcional.\n", "* *Skip*: No mostrar.\n", "* *Notes*: Notas." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Toda la info en https://rise.readthedocs.io/" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.3 Sobre hacer presentaciones con jupyter y RISE\n", "\n", "¿Qué es la extensión RISE?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Si les interesa pueden buscar un tutorial más completo sobre hacer presentaciones en RISE. Pero en resumen, es lo que muestra esta animación (gif). Basta marcar una celda de jupyter notebook con la propiedad “slide”, “sub-slide”, “fragment”, o “” para que esta adquiera la propiedad. Y luego se pone en modo presentación. ¡Voilá!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.4 Sobre hacer presentaciones con jupyter y RISE\n", "\n", "Ok, pero... ¿porqué? ¿Porqué? ¿PORQUÉ?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Tener una presentación autocontenida: los ejemplos (código) queda en jupyter notebook.\n", "* Corregir directamente cuando sea necesario.\n", "* Hacer participar a la audiencia." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.4 Sobre hacer presentaciones con jupyter y RISE\n", "\n", "Sí, incluso ejecutar código en python" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 200\n", "y = 200\n", "x is y" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 300\n", "b = 300\n", "a is b" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['bread', 'meat', 'cheese', 'meat', 'cheese', 'meat', 'cheese', 'bread']" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def cheeseburger(n):\n", " return [\"bread\"] + [\"meat\", \"cheese\"]*n + [\"bread\"]\n", "\n", "cheeseburger(3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.5 Sobre hacer presentaciones con jupyter y RISE\n", "\n", "¿Que he aprendido?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Usa \"Ctrl +\" y \"Ctrl -\" para controlar aspecto." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Entrega parte del control de contenido al público. Usa un teclado+mouse inalámbrico." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Plantea desafíos de código incompleto pero entrega propuestas de solución." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* `git` es tu amigo." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Improvisa. Nunca será como planificaste." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: ¿Qué cosas he aprendido en estos años haciendo presentaciones con RISE? \n", "(0) Más que jugar con los fonts, regular con Ctrl+ y Ctr- como se ve en pantalla.\n", "(1) No tener temor en pedir ideas a la audiencia sobre que valores probar o alternativas de código a implementar. (2) Usar un teclado y mouse inalámbrico, para clases de computación.\n", "(3) Poner soluciones pre-definidas a los problemas, en lugar de escribirlos en directo (por tiempo).\n", "(4) Saber que textos mostrar y cuales ocultar.\n", "(5) Usar un repo para volver a versiones anteriores.\n", "Usar un diagrama de celdas y mostrar lo que hace “con algunas cajitas”." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.6 Descripción del Problema" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**¿Qué queremos?** \n", "\n", "Realizar encuesta interactiva sin salir del modo presentación (en RISE).\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**¿Porqué?** \n", "\n", "Hacer encuestas para obtener retroalimentación de la audiencia cuando importa, sin cambiar pantalla o sistema.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Bueno, llevamos 5 minutos y todavía no hablamos siquiera del problema ¡ni código!. ¿Qué es lo que intentamos resolver? Cuando uno realiza presentación a una audiencia desafiante - estudiantes de primer año de universidad, que no resisten 45 minutos sin mirar su celular - resulta interesante proporcionar un medio para obtener retroalimentación de manera sencilla y directa. Pero ¿Podemos hacer eso en presentaciones con jupyter notebook? " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 1.7 Descripción del Problema" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**¿Se puede?**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Sí, y de varias maneras distintas." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**¿Cómo?**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "IFrames." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Pensaba que era algo muy dificil. Pero finalmente encontré varias formas distintas." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.9 Descripción del Problema\n", "\n", "Nuestro héroe se llama IFrame." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import IFrame\n", "IFrame(\"https://es.wikipedia.org/wiki/Iframe\", width=1000, height=500) #https://es.wikipedia.org/wiki/Iframe" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Otros:\n", "* https://www.pycon.co/\n", "* https://rise.readthedocs.io/" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Las funciones HTML y Iframe son nuestras héroes. Todo esfuerzo de lo que haremos recae en sus hombros. Diferencias de html y iframe. DEFINICION DE IFRAME. Mostrar " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 0.10 Descripción del Problema\n", "\n", "Más ejemplos ..." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import IFrame\n", "IFrame(\"https://www.python.org/\", width=800, height=300)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "No siempre funciona:\n", "* https://www.python.org/\n", "* google, facebook, twitter, ..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "En general a los sitios (sobre todo los que requieren autentificación y desean hacer tracking de usuarios) bloquean los IFrames." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "##### 0.11 Descripción del Problema: EXTRA\n", "\n", "Más ejemplos ...\n", "¡IFrame nos permite incluso embeber un jupyter notebook dentro de otro!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from IPython.display import IFrame\n", "link=\"http://localhost:8888/notebooks/2020_02_XX_pycon_rise_and_poll/2020_pycon_RISE_and_poll.ipynb\"\n", "#IFrame(link, width=800, height=300) #google, facebook, twitter" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Un aprendizaje interesante que pueden llevarse hoy, es que existen sitios que no permiten ser embebidos en un iframe. Por ejemplo, si tratamos de hacer un iframe de google, nos da el siguiente error. ¿Porqué? Porque XYZ.\n", "\n", "Sin embargo, podemos usar un acortador de dirección para evitar ese problema. Por ejemplo, el mismo acordador de dirección de google nos permite bypasear su propia seguridad. Hermoso." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 1.1 Problema: Realizar encuestas interactivas.\n", "\n", "\n", "**Solucion nivel 1:**\n", "\n", "KISS: Keep IT Simple, Stupid." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Podemos usar IFrame con los servicios de alguna compañía especializada en encuestas interactivas:\n", "* Polleverywhere\n", "* Mentimeter\n", "* Muchos, muchos otros..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Solución nivel 1. Meme de “cerebro”. Hay un principio elemental en programación: KISS. Keep it Simple, Stupid. No hay para que reinventar la rueda cuando podemos aprovechar lo que otras personas ya han hecho.\n", "\n", "Relato: Hay varias empresas que proporcionan servicios para realizar encuestas en vivo, que funciona a través de páginas web. Algunas de las empresas que pueden revisar para esto son: Mentimeter, Survey, Polleverywhere, por ejemplo. Spoiler Alert: Son todas bastante parecidas." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 1.2 Solución nivel 1: Encuesta\n", "\n", "Probemos este método con una encuesta simple:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import IFrame\n", "IFrame(\"https://pollev.com/sebastianflo711\", width=800, height=600)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Hagamos un primer experimento. Yo ya cree una encuesta que deberán responder. ¿Listos? En sus celulares, busquen la página web que se encuentra en pantalla y voten. \n", "Mostrar con un iframe y leer." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 1.3 Solución nivel 1: \n", "\n", "Link encuesta: \n", "
\n", "
\n", "
https://pollev.com/sebastianflo711
\n", "\n", "**¿Qué debe cumplir un sitio de encuestas interactivas?**\n", "\n", "* Encuesta acccesible por url pública, incrustable por iframe.\n", "* Gráfico dinámico accesible por url pública, incrustable por iframe." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: ¿Qué necesitamos de esta encuesta? Que tenga las siguientes características:\n", "Encuesta accesible con una url pública, para poder compartir el enlace durante la presentación.\n", "Gráficos disponibles a partir de una url pública o privada, para incrustarla el grafico en la ppt." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 1.3 Solución nivel 1:\n", "\n", "Veamos los resultados de la encuesta anterior." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import IFrame\n", "IFrame(\"https://www.polleverywhere.com/multiple_choice_polls/7Xwy472JbCrk3fITm12XM\", width=800, height=600)\n", "# Observación: ¡requiere estar autentificado como dueño de la encuesta!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: Mientras ustedes votan, podemos ya comenzar a ver los resultados. Ejecutar el iframe varias veces." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 1.4 Solución nivel 1: Resumen\n", "¿Cómo se debe usar?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "1. Seleccionar algún proveedor.\n", "1. Crear y configurar la encuesta previamente.\n", "1. Obtener el enlace de las preguntas, e incrustarla con un iframe.\n", "1. Obtener el gráfico de las respuestas, e incrustarla con un iframe.\n", "1. Probar que funcione correctamente. Borrar respuestas de prueba. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: En general, la versión “gratis” permite hacer preguntas y ver los resultados, pero requiere haberla preparado antes para tener el enlace, y no permite descargar los resultados para explorarlos más “cientificamente”. Es necesario haber creado la presentación de antemano y es más difícil cambiarla a último momento. Dependiendo de la empresa, funciona más o menos fácil y “auto-refresh”." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 1.5 Pausa\n", "¿Que viene antes, el huevo o la gallina?" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['🐔', '🥚']" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Solución al problema\n", "# python3 permite usar unicode\n", "sorted(['\\N{EGG}', '\\N{CHICKEN}'])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.1 Problema: Realizar encuestas interactivas.\n", "\n", "**Solución Nivel 2**\n", "\n", "Una segunda opción que requiere un poco más de configuración pero entrega más control, es usar un servicio de encuestas tradicional:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Microsoft Forms\n", "* Google Forms\n", "* Survey Monkey\n", "* Typeform\n", "* Muchas otras...\n", "\n", "Se diferencia que nosotros podemos hacer los gráficos porque podemos descargar los datos." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Relato: El siguiente nivel es enviar una encuesta de un servicio más estándar, como Google Survey, Microsoft Forms, Survey Monkey o Typeform." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.2 Solución Nivel 2: Encuesta + Datos\n", "\n", "Probemos este método con otra encuesta simple:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "long_url = \"https://forms.office.com/Pages/ResponsePage.aspx?id=zu7OdUTRPU-clJ5rQCX8_4qs5cX1Y7dFhVdiCz848sBUNFU3UzU3OTNHVDhWNURSMEs2WDBUMDdCTi4u\"\n", "short_url = \"https://bit.ly/2uYDdhm\"\n", "iframe_options = {\"width\":800, \"height\":600}\n", "IFrame(short_url, **iframe_options)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: Por ejemplo, accedan a la encuesta que se encuentra en la siguiente dirección: " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.3 Solución Nivel 2: \n", "\n", "Link encuesta: \n", "
\n", "
\n", "
https://bit.ly/2uYDdhm
\n", "\n", "
\n", "¿Qué debe cumplir un sitio de encuestas nivel 2?\n", "\n", "* Encuesta accesible al público mediante un enlace abierto. Puede que no sea incrustable con un iframe.\n", "* Opcionalmente, que cuente con gráficos en línea.\n", "* Datos disponibles y puedan descargarse.\n", "* Crear una función (en Python) para descargar e interpretar los datos.\n", "* Probar que la encuesta funcione. Borrar las respuestas de prueba." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: ¿Que fue lo que hicimos acá? Veamos un poco más de detalle. La página web que accesaron tuvo que ser creada antes, y el link para compartir incrustado en la presentación. La tabla con los resultados se interpreta con alguna función apropiada, por ejemplo, en este caso, usé pandas y matplotlib porque porqué no." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.4 Solución Nivel 2: Respuestas" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "long_url = \"https://forms.office.com/Pages/AnalysisPage.aspx?id=zu7OdUTRPU-clJ5rQCX8_4qs5cX1Y7dFhVdiCz848sBUNFU3UzU3OTNHVDhWNURSMEs2WDBUMDdCTi4u&AnalyzerToken=ND54U8Erls95gHxjbyWus4LzH6FPyZ35\"\n", "short_url = \"https://bit.ly/37We2dE\"\n", "iframe_options = {\"width\":800, \"height\":600}\n", "IFrame(short_url, **iframe_options)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.4 Solución Nivel 2: Respuestas (versión 2)\n", "\n", "* Descargamos la planilla de datos con el resultado desde algún [enlace](https://uplanner-my.sharepoint.com/:x:/r/personal/sebastian_flores_u-planner_com/_layouts/15/Doc.aspx?sourcedoc=%7B7D9BF52E-2931-4702-86ED-00792E617ECF%7D&file=2020_02_09_encuesta2_pycon.xlsx&action=default&mobileredirect=true) " ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['data/2020_02_08_encuesta2_pycon.xlsx']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Alternative to ls data/*.xlsx\n", "import glob\n", "glob.glob(\"data/*.xlsx\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "odict_keys(['Hoja1', '_56F9DC9755BA473782653E2940F9', 'Form1'])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "df_dict = pd.read_excel(\"data/2020_02_08_encuesta2_pycon.xlsx\", sheet_name=None)\n", "df_dict.keys()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Which one is the best pet?\n" ] } ], "source": [ "df = df_dict[\"Form1\"]\n", "question = df.columns[-1]\n", "print(question)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IDStart timeCompletion timeEmailNameWhich one is the best pet?
092020-02-03 14:28:152020-02-03 14:28:27anonymousNaNPython
1102020-02-08 00:32:222020-02-08 00:32:27anonymousNaNPython
2112020-02-08 18:00:032020-02-08 18:00:08anonymousNaNCat
3122020-02-08 18:00:042020-02-08 18:00:09anonymousNaNCat
4132020-02-08 18:00:072020-02-08 18:00:12anonymousNaNCat
\n", "
" ], "text/plain": [ " ID Start time Completion time Email Name \\\n", "0 9 2020-02-03 14:28:15 2020-02-03 14:28:27 anonymous NaN \n", "1 10 2020-02-08 00:32:22 2020-02-08 00:32:27 anonymous NaN \n", "2 11 2020-02-08 18:00:03 2020-02-08 18:00:08 anonymous NaN \n", "3 12 2020-02-08 18:00:04 2020-02-08 18:00:09 anonymous NaN \n", "4 13 2020-02-08 18:00:07 2020-02-08 18:00:12 anonymous NaN \n", "\n", " Which one is the best pet? \n", "0 Python \n", "1 Python \n", "2 Cat \n", "3 Cat \n", "4 Cat " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ " La tabla con los resultados se interpreta con alguna función apropiada, por ejemplo, en este caso, usé pandas y matplotlib porque porqué no." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.5 Solución Nivel 2: Respuestas" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Cat 9\n", "Python 7\n", "Dog 3\n", "León 1\n", "Pandas 1\n", "RISE 1\n", "Name: Which one is the best pet?, dtype: int64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "question_df = df[question]\n", "answer_counts = question_df.value_counts()\n", "answer_counts" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "answer_counts.plot.barh(figsize=(16,6))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.6 Solución Nivel 2: Respuestas\n", "\n", "Hagamos un gráfico un poco mejor." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "answer_counts.plot.barh(figsize=(16,6), fontsize=16, alpha=0.60)\n", "plt.suptitle(question, fontsize=16)\n", "plt.xlabel(\"Número de respuestas\", fontsize=16)\n", "plt.ylabel(\"\");" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.7 Solución nivel 2: Resumen\n", "\n", "1. Elegir algún proveedor.\n", "1. Crear la encuesta.\n", "1. Obtener la url pública de las preguntas, e incrustarla en un iframe.\n", "1. Obtener la url de los datos de las respuestas.\n", "1. Usar una api o descargar los datos.\n", "1. Graficar desde python para interpretar los datos." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Leer." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2.1 Problema: Realizar encuestas interactivas.\n", "\n", "**Solución Nivel 3**\n", "\n", "La solución más compleja es por supuesto hacer el sistema completo:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* **Base de datos**: donde almacenar la encuesta y las respuestas. \n", "* **Frontend**: para realizar la encuesta (mostrar preguntas, recolectar respuestas, mostrar gráficos).\n", "* **Backend**: interactuar con la base de datos. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "En este caso: mysql, flask, flask-mysql y pandas, con algo de html y css, y una librería de javascript para graficar." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: Por supuesto, la versión que nos da más control de todo es hacerlo a lo macgiver. Par los millenials de la sala, macgiver es un programa de televisión donde el protagonista podía hacer una bomba con un moco. En fin, la idea es hacer todo desde cero: la página web con su base de datos y gráficos." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Solución Nivel 3\n", "\n", "¿Porqué alguien voluntariamente se sometería a este tormento?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Filosofía xkcd**: \n", "\n", "¿Porqué hacer algo simple cuando podrías hacer algo extremadamente complejo *de la manera más simple posible*, aprendiendo mucho en el camino?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Solución Nivel 3\n", "\n", "¿xkcd en python?" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "import antigravity" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Solución Nivel 3" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import IFrame\n", "IFrame(\"http://localhost:5000/\", width=1200, height=800)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: Sí, es bastante trabajo. Este es un diagrama reducido de cómo funcionaría." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Solución Nivel 3\n", "\n", "El código de polite se encuentra en https://github.com/sebastiandres/surveys_with_flask_and_xkcd_charts.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Hace uso de muchos recursos públicamente disponibles (además de mysql y python+librerías):\n", "* Font xkcd.ttf de ipython, https://github.com/ipython/xkcd-font\n", "* Librería xkcd_chart en javascript: https://timqian.com/chart.xkcd/\n", "* Una cantidad vergonzosamente grande de búsquedas en internet y stackoverflow. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: Pero tiene la ventaja que es posible dejarlo tal y cual lo queremos. Por ejemplo, si quiero cambiar la pregunta y sus opciones durante la presentación. Para lograr esto le di la funcionalidad de que genere automáticamente una encuesta a partir de un texto con formato markdown.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Solución Nivel 3\n", "\n", "Una de las cosas que más me llamó la atención fue cómo hacer una función que pudiese transformar un texto markdown en la serie de preguntas y opciones de respuesta. \n", "\n", "Requería definir convenciones:\n", "* La pregunta es todo lo que va antes de `:`\n", "* Las preguntas de respuesta única se definen por `*` \n", "* Las preguntas de respuesta única se definen por `^`\n", "\n", "Otra opción podría haber sido `-` y `+`. \n", "\n", "Es una mala opción usar `o` y `m`. \n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Solución Nivel 3" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def markdown_parser(my_text):\n", " if my_text.count(\":\")!=1:\n", " print(\"Cannot parse, there's an error in the format\")\n", " return {\"is_format_ok\":False, \"markdown_str\":my_text}\n", " single_option = 0\n", " multiple_option = 0\n", " if (\"* \" in my_text):\n", " single_option = 1\n", " split_char = \"*\"\n", " if (\"^ \" in my_text):\n", " multiple_option = 1\n", " split_char = \"^\"\n", " # If both False or both True, simultaneoulsy, there's an error\n", " if single_option==multiple_option:\n", " print(\"Cannot parse, there's an error in the format\")\n", " return {\"is_format_ok\":False, \"markdown_str\":my_text}\n", " question_str, answer_str = my_text.split(\":\")\n", " question = question_str.strip()\n", " answer_list = [_.strip() for _ in answer_str.split(split_char)[1:6]] # Skip the empty string, reach to the fifth existing one\n", " answer_list = answer_list + [\"\" for _ in range(5-len(answer_list))] # Fill with empty ones if needed\n", " question_type = single_option*\"radio\"+multiple_option*\"checkbox\" # This is the html convention\n", " # Create the dict\n", " md_dict = {}\n", " md_dict[\"is_format_ok\"] = True\n", " md_dict[\"markdown_str\"] = my_text\n", " md_dict[\"type_str\"] = question_type\n", " md_dict[\"question_str\"] = question\n", " md_dict[\"option_1_str\"] = answer_list[0]\n", " md_dict[\"option_2_str\"] = answer_list[1]\n", " md_dict[\"option_3_str\"] = answer_list[2]\n", " md_dict[\"option_4_str\"] = answer_list[3]\n", " md_dict[\"option_5_str\"] = answer_list[4]\n", " return md_dict" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Solución Nivel 3\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cannot parse, there's an error in the format\n" ] }, { "data": { "text/plain": [ "{'is_format_ok': False, 'markdown_str': 'Q: ^ A * B * C * D * E * F * G '}" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "markdown_parser(\"Q: ^ A * B * C * D * E * F * G \")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "markdown_parser(\"\"\"Q: ^ A ^ B ^ C ^ D ^ E ^ F ^ G ^ H\"\"\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "##### Solución Nivel 3\n", "\n", "Hagamos la prueba:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from IPython.display import IFrame\n", "IFrame(\"http://localhost:5000/survey\", width=1000, height=1000)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "##### Solución Nivel 3\n", "\n", "Veamos los resultados:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from IPython.display import IFrame\n", "IFrame(\"http://localhost:5000/bar_chart\", width=1000, height=1000)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: Para eso, tuve que yo mismo definir ciertas convenciones. Una pregunta de alternativas únicas tipo button, se genera con opciones dadas con *. Una pregunta de alternativas multiples, se genera con alternativas encabezadas por ^." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: Hagamos un último experimento. Respondan a la siguiente encuesta. \n", "Ejecutar funcionalidad que permite compilar y mostrar una pregunta.\n", "DEBE: Generar una url + decir tipo de pregunta + mostrar html compilado con preguntas a responder." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: Y ahora veamos los resultados. \n", "Ejecutar función específica para ver los resultados de la encuesta. \n", "Los gráficos, en caso que se pregunten, están hechos con la librería xkcdcharts de javascript que emulan los clásicos dibujos del webcomic xkcd.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Conclusión: Encuestas nivel 1\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
VentajaDesventaja
ComplejidadTrivial-
PrecioVersión limitada gratisVersión pagada con más funcionalidades
GráficosGráficos predefinidosGráficos predefinidos
Datos-Sin accceso a datos
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: Para concluir, veamos los pros y contras de estas 3 opciones. \n", "La opción “iframe de empresa de encuestas interactiva” tiene como ventaja el ser extremadamente sencillo, pero con limitaciones en la representación gráfica y en la descarga de resultados, y hay que preparar preguntas de antemano. Pero en relación al tiempo-calidad, es muy conveniente.\n", "Imagen: Nobody aint time 4 that" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Conclusión: Encuestas nivel 2\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
VentajaDesventaja
ComplejidadSimple
PrecioVersión gratis es suficiente
GráficosConfigurablesRequieren código
DatosCon accceso a datos
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: La opción “encuesta tradicional” tiene la ventaja de permitir almacenar y revisar los resultados, pero requiere haber creado previamente funciones para descargar y graficar los resultados. Sigue siendo conveniente, pero a veces tiene un delay que hace que los resultados no sean “realmente en vivo”. Hay que preparar preguntas de antemano, y las funciones para graficar.\n", "(¿Alguna imagen donde el lag sea divertido?)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Conclusión: Encuestas nivel 3\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
VentajaDesventaja
ComplejidadBastante complejo. Toma tiempo. Deployment puede ser complejo.
PrecioHosting gratis es suficienteTime=Money?
GráficosConfigurablesHay que configurarlos completamente.
DatosCon accceso completo a datosHay que almacenar los datos.
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notas: La opción “lo haré yo mismo” (imagen de bender con su meme de blackjack y putas) tiene la ventaja de tener todo lo imaginable: control de los datos, control de los gráficos, incluso generación “dinámica” a partir de un markdown. Pero tiene la desventaja de haber necesitado crear todo eso. Pero es un aprendizaje altamente educativo, aunque costoso en tiempo. Si les interesa, pueden ver el repo en mi github: sebastiandres + little_survey_website." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### Conclusión\n", "\n", "## ¿Preguntas?\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Encuesta sobre la charla: \n", "
\n", "
\n", "
https://bit.ly/2UzrYGU
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Slide: ¿Preguntas?\n", "Notas: Y bueno, así llegamos a la sección final de preguntas en la cual pasaremos 5 minutos incómodos en silencio, a menos que alguien quiera hacer alguna pregunta y observación. Mientras tanto, pueden responder a una última encuesta: \n", "PONER LINK PERO NO MOSTRAR CONTENIDO." ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }