**Participación y trabajo sobre pokemones usando JSON**
En esta narrativa de datos veremos un problema real, que tiene que ver con capturar información de los repositorios de código para las distintas asignaturas y a partir del mismo, introduciremo un problema alterno, que usa el mismo formato de datos JSON, pero permite más consultas: tomar la información de distintos pokemones a partir del PokeAPI.
# Siguiendo la participación desde los repositorios de código En las sesiones bimodales es importante la participación proactiva de los aprendices y el docente, que puede ocurrir de maneras síncronas y asíncronas. En nuestro caso, dicha participación proactiva se ve a partir de la publicación continua en el repositorio propio y el repositorio compartido del LabCI, de las distintas actividades. Cuando hablamos de participación proactiva, intentamos contrastarla con otras formas de baja o nula participación, como las que se evidenciaron durante la pandemia, entre otras: - Conectarse de avatar presente en la sesiones síncronas, pero nunca prender el microfono, formular dudas, o intervenir. - No estar presente en las sesiones síncronas y tampoco hacer uso de las mediaciones asíncronas, en particular, no hacer commits a los repositorios y/o comentarios en los sistemas de lectura anotada.
Dado que estas actividades dejan huella computacional, podemos usar el computador mismo para hacer seguimiento de dichos cambios continuos. Este será el problema con el que introduciremos la aplicación del control de lectura.
![ Colección de los HedgeDocs que siguen un patrón de dirección común y secuencia. ](https://i.imgur.com/m3T2KoT.png)
Dado que la sesión 13 tiene el listado los repositorios del primer corte, usemos este documento para revisar la participación reciente
Con esa información revisemos aquellas líneas que contienen repositorios en ChiselApp
Separemos ahora el texto de cada enlace de la dirección como tal a la que apuntan
![ Diccionario con cada estudiante y su respectivo repositorio. ](https://i.imgur.com/Z74XVnL.png)
Si nos fijamos en la respuesta anterior, hemos introducido informalmente algunos elementos que revisaremos en mayor detalle luego: colecciones, iteradores, variables y diccionarios. Por lo pronto, enfoquémonos en el diccionario que contiene la respuesta. Este tiene dos partes, que se muestran en la figura anterior: las llaves, ubicadas a la izquierda, y los valores, ubicados a la derecha.
Si queremos seleccionar un repositorio aleatoriamente, para ver su evolución, apelamos a sus llaves, que equivalen a los nombres de les estudiantes:
`>>> #('Eduar Daza' 'Nestor Cristancho' 'Maxi López-Gómez' 'Valentina Vanegas' 'Rubén Torres' 'Thomas Martínez' 'Lizeth Colorado' 'Dario Montenegro' 'Juan Pablo Arias Romero' 'Valentina Penagos Ariza')`
Podemos aplicar aleatoriedas a esas llaves con el siguiente código.
Lo cual quiere decir que es posible seleccionar un repositorio también aleatoriamente para revisar su evolución (sin detrimento de quienes quieran socializar sus repositorios de modo voluntario)
`>>> 'https://chiselapp.com/user/Valentina.P/repository/Valentina-P/timeline'`
Si vemos la línea de tiempo desde la interfaz web, veremos algo de este estilo:
![ Vista web de la linea de tiempo del repositorio seleccionado aleatoriamente. ](https://i.imgur.com/nutwR5C.png)
Nos interesa ver los datos en el repositorio y para ello apelaremos a su interfaz [JSON](https://es.wikipedia.org/wiki/JSON), que es un formato ampliamente utilizado en el intercambio de datos en la web y que está habilitado para los repositorios publicados en ChiselApp.
# Pokemones e información a partir de datos en JSON
La información previa es información estructurada. Sin embargo su resultado está en HTML. Que es difícil de consumir. Podemos pasar de una línea de tiempo a información estructurada en JSON de la siguiente manera: * https://chiselapp.com/user/MaxiL/repository/RepositorioMaxiLopez/timeline
Grafoscopio tiene soporte para líneas de tiempo en Fossil. Sin embargo no lo usaremos en nuestro caso no lo usaremos, debido a un error, usaremos como ejemplo el PokeAPI.
Definamos el enlace como una cadena de texto:
Convirtamos la cadena de texto en un enlace y recuperemos sus contenidos:
Usando bloques podemos pensar en algo como:
Si quisieramos hacerlo explícitamente con dos variables sería algo como:
Sin embargo, la aproximación original puede ser más sencilla.
Usar colecciones en Pharo/Smalltalk para coleccionar los pesos de todos los Pokemones.
![ Recopilando los diccionario de datos a partir del nombre de cada Pokemon. ](https://i.imgur.com/HcVJGwU.png)
Supongamos que queremos comparar alturas de los pokemones. Para ello usamos el selector #at:, de los diccionarios, de manera que podamos ubicarnos en su nombre y su peso.
![ Selección de altura y nombre de un Pokemon. ](https://i.imgur.com/d2fsf9T.png)
Esto nos da una “tabla” rudimentaria de un algunos pokemones y algún atributo que nos interesa (en el ejemplo anterior, su altura). Sin embargo, si abstraemos más la manera en que creamos Pokemones y coleccionamos su información en una nueva estructura de datos, llamada Data Frame, estaremos en condiciones de modelar asuntos un poco más complejos. En nuestro caso, una batalla Pokemon, rudimentaria, pero interesante. A eso nos dedicaremos en la siguiente sección.
# Batalla Pokemon
Lo que hemos hecho con los bloques, vamos a abstraerlo usando la clase Pokemon, que viene incluida en el paquete MiniDocs. Supongamos que queremos modelar una batalla entre Pokemones. Definamos nuestros contrincantes:
Esto nos permite preguntar datos particulares a cada peleador:
![ Datos de un Pokemon como un diccionario anidado. ](https://i.imgur.com/liLNouj.png)
Podemos seleccionar un movimiento al azar, y conocer su nombre. Para ello usamos llaves de diccionarios anidadas, en las que una vez seleccionado un movimiento al azar, queremos adentrarnos en ese movimiento, usando el mensaje at: 'move' y una vez adentro seleccionamos su nombre, usando el mensaje at: 'name', lo que es lo mismo que anidar ambos mensajes en uno sólo, at: 'move' at: 'name'. El equivalente en código de lo anterior sería:
Lo que gráficamente puede ser representado como recorrer una jerarquía el en diccionario de datos de los movimientos de un pokemon, hasta llegar al nombre de uno de ellos, como se muestra en la siguiente figura:
![ Seleccionando un movimiento al azar, y dentro del mismo seleccionar un movimiento (move) y, dentro de éste, un nombre (name). ](https://i.imgur.com/2tjYbeb.png)
De este modo, podemos modelar una ronda de lucha como la selección aleatoria de un movimiento de ataque:
E incluso podemos definir un ganador al azar:
Supongamos que queremos colocar toda la información en una tabla. Para ello usaremos los llamados Data Frames, particularmente, adaptando, el ejemplo de la página 21, haciendo que las columnas guarden la información sobre los contrincantes, sus movimientos y el ganador y las filas guarden información sobre cómo se llevó a cabo cada ronda de combate.
Creemos una primera ronda de combate:
Como nos damos cuenta, la ronda anterior sólo depende de los valores de los dos peleadores, que empleamos repetidamente en el código anterior, así que podemos convertir esto en un bloque:
Con lo cual podemos invocar este para diferentes peleadores, o para los mismos con resultados distintos. Por ejemplo, cada vez que invoquemos el siguiente código, debería darnos algo distinto:
![ Vista de impresión de la pelea entre dos Pokemones. ](https://i.imgur.com/6vCdSvX.png)
Y agreguémosla a nuestro torneo:
Y veamos lo que tenemos hasta el momento:
![ Primera file/ronda del combate Pokemon. ](https://i.imgur.com/jMxiadl.png)
Importante Obsérvese que, para ver los elementos del Data Frame es necesario cliquear en la solapa “Tree”, pues la vista de la solapa “Data” nos da el error de la siguiente gráfica:
![ Vista errorea del Data Frame para guardar el torneo Pokemon. Si que quiere ver la vista correcta hay que cliquera la soalapa “Tree”, en lugar de la solapa “Data”, en la parte superior. ](https://i.imgur.com/gvG5zb9.png)
Hasta acá hemos visto unos rudimentos de cómo traer la información de un API, en este caso la de los Pokemones para manipularla y organizarla de manera que nos permita modelar un aspecto real o ficticio, en nuestro caso la primera batalla de un torneo Pokemon entre dos contrincantes fijos. Con estos insumos y lo visto de introducción al pensamiento computacional durante el semestre, ya estamos en condiciones de aplicar lo visto en un último entregable.
# Proyecto final
![ ](https://i.imgur.com/9rsiq7d.png)
Para el proyecto final se extenderá esta narrativa de datos, usando la narrativa misma y los recursos vistos hasta el momento. La intensión es ver hasta qué punto cada estudiante maduró su pensamiento computacional y está en condiciones de usarlo, junto con las estrategias metacognitivas propias, para abordar un problema, incluyendo la búsqueda de información y su lectura crítica, de manera que pueda concebir estrategias para resolver un problema, modificar una narrativa de datos, crear nuevos elementos e indicar claramente dónde tiene dudas e inquietudes frente a una narrativa de datos o recursos y literactura técnica.
Se espera que cada estudiante:
1. Haga una lectura anotada en Hypothesis de la narrativa de datos inicial, formulando preguntas, sugerencias o aclaraciones al texto, como hicimos con representando y procesando datos en Pharo y con Challenge Yourself. Importante: Las anotaciones las haremos todæs a un mismo documento ubicado en esta dirección. 2. Importe esta narrativa a su propio GToolkit/Grafoscopio y exportarla en su propio portafolio, indexándolo desde la portada, de manera similar a como hizo cada cual con su ejercicio de Challenge Yourself. 3. Extender esta narrativa, dentro del repositorio de cada cual, de manera que se pueda: * Agregar 2 rondas más de combates a la tabla pokemenTournament, para un total de 3 rondas, incluyendo la primera ronda agregada en el código previo. * Usar las utilidades de Data Frame para determinar quién es el Pokemon ganador, es decir, quien haya gando dos de los tres combates. Para esto es necesario leer apartados de [libro de Data Frame](https://mutabit.com/repos.fossil/labci/uv/wiki/herramientas/25A-DataFrame-wip.pdf), encontrando cómo se utiliza para contar las ocurrencias de un valor. En caso de dudas, anotarlas con Hypothesis en el libro mismo y compartirlas por correo electrónico. 4. Si sabemos que el código Pokemon atRandom , permite seleccionar un Pokemon al azar, ¿cómo debería modificarse el código anterior para que el Data Frame pokemonTournament guarde la batalla de dos Pokemones elegidos al azar en lugar de dos Pokemones predefinidos? * Describir las modificaciones solicitadas, como un conjunto de pasos finitos en frases, en español. * Si se alcanza, intentar traducir esas frases anteriores en español a su equivalente en código.
# Desarrollo del proyecto final - Batalla de pokemones
* En este punto de la narrativa, intentaré colocar las dos nuevas rondas de combate de los pokemones
En esta parte del docuemneto colocare los datos de la ronda 2 para modelar el torneo de pokemones entre Mewtwo y Squirtle. Pero antes, veremos graficámente quienes son estos luchadores:
*_Peleador 1: Mewtwo_*
![ Mewtwo ](https://img10.hotstar.com/image/upload/f_auto/sources/r1/cms/prod/3439/1734248513439-i)
Contrincante
*_Peleador 2: Squirtle_*
![ Squirtle ](https://i.pinimg.com/736x/3a/92/60/3a92602db76f873001d5dcbb56a31ea2.jpg)
* Ahora se escribe el trozo de código que define los dos contrincantes para el torneo piokemon:
Posteriormente, le podemos preguntar algunos datos particulares a cada uno de los peleadores seleccionados para los difrrentes rounds
Luego, ya con los datos arrojados, podemos seleccionar un movimiento al azar, de cada uno de los pokemones contenidos en la pokeapi, como se muestra en la sigueinet ilustración:
![ Diccionario de movimientos ](https://i.imgur.com/y4afUm9.png)
Selecionando el movimiento al azar, con el código 'randomMove' entre los peleadores.
Ahora, en esta sección se modelará la ronda en la cual se enfrentaran los peleadores con base en unos movimientos de ataque seleccionados al azar.
Definiendo así un ganador, al enfrentarlos en un torneo pokemon entre los dos peleadores 'Mewtwo' y 'Squirtle'.
Pero, para saber cuál de ellos es el ganador, se realizará un DataFrame, que permita visualizar la infoformación en una tabla; que indique el ganador 1, el ganador 2, el ganador 3 y el vencedor, osea quien haya ganado dos de los tres rounds.
Luego se adiciona el código que nos permite conocer cuál es el ganador del round 1, el round 2 y el round 3, donde se esta enfrentando Mewtwo y Squirtle.
![ Ejecución de los tres rounds del tornelo pokwemon. ](https://i.imgur.com/520HeLh.png)
En este caso, como ya conozco cuál es el ganador del round 1, del round2 y del round 3, ahora debemos intentar colocar en una línea de código, una estructura que permita organizar la información y poder conocer el ganador de la ronda.
Usando la formula anterior, coloque de forma manual los valores, que serían los peleadores, pero no sé, qué se coloca en las columnas, porque al modificar la posición de las mediciones de tiempo, me genera error y si coloco 1, 2 y 3, me queda como si fueran horas.
![ Valores del dataFrame ](https://i.imgur.com/JTmQkXw.png)
Tomando la literatura del [DataFrame](https://mutabit.com/repos.fossil/labci/uv/wiki/herramientas/25A-DataFrame-wip.pdf) de la página 15 acerca de las series de datos trabajadas en categorias, intente modificar la parted el código destinado a las mediciones meteorológicas, para ver si se puede definir el ganador de los tres rounds.
![ Parte del código para definir los gannadores del torneo pokemon. ](https://i.imgur.com/uyQGRbH.png)
Al ejecutar el comando siguiente, podemos observar cual de los dos peleadores gano dos de tres rounds.
![ Ganador del torneo pokemon. ](https://i.imgur.com/rWTpUeC.png)
*OTROS EJERCICIOS*
## - *ronda 2*
## - *Ronda 3*
Una vez intente agregar la parte dos y tres, no comprendo, porque cuando agrego el dataFrame, para que la información salga en las fulas y las columnas, me indica que los datos estan vacios:
## Ganador ronda 2
![ Datos vacios en las filas de la tabla ](https://i.imgur.com/71KjetD.png)
Cuando intento correr los trozos de código, creo y si no estoy mal, me sale cada uno de los combates y quien gana entre los dos pokemones: Por ejemplo, entre el combate entre Mewtwo y Squirtle el primer round creo que quedo asi: ganando Squirtle:
![ Ganador del primer round Squirtle ](https://i.imgur.com/BD0Hw0X.png)
![ Ganador del segundo round Mewtwo ](https://i.imgur.com/q3HXL06.png)
![ Ganador del tercer round fue Squirtle. ](https://i.imgur.com/KtCOLcd.png)
En este orden de ideas, para el tornedo entre Mewtwo y Squirtle, el ganador sería Squirtle.
## Ganador ronda 3
![ Ganador del primer round: Espeon ](https://i.imgur.com/zxfwMem.png)
![ Ganador del segundo round: Pikachu ](https://i.imgur.com/MzjuUMJ.png)
![ Ganador del tercer round:Pikachu ](https://i.imgur.com/N5St39P.png)
Asi pues, para el torneo entre Pikachu y Espeon, el ganador sería Pikachu.
La duda que me queda es ¿cómo organizo esos datos en la tabla? porque al correr el código, me salen los datos vacios y en rojo.
# Anexo - Dudas e inquietudes sobre los DataFrame
1. *Creación de un dataFrame*
Inicialización de un DaraFrame con una matriz de filas de la información anterior:
![ En este apartado, si se puede crear la tabla con los datos del libro ](https://i.imgur.com/LXDm2jS.png)
En este punto, ya tengo la tabla construida, ahora intentare alimentarla con los datos que van en cada comumna:
Ahora se puede agregar el nombre de las filas y las columnas:
![ En este apartado si me trael los datos en la posición indicada, pero no me los organiza en la tabla. ](https://i.imgur.com/eszcgdQ.png)
Una vez agregado el trozo de códifgo, y verificando la parte de la visualización 'Items' se visualiza la información del DataFrame, pero no se puede ver organizada como en una tabla.
2. *Métodos compactos para inicializar los DaraFrame*
En este punto, cuando adiciono el trozo de código contenido en el PDF del DataFrame, me genera error. me queda la duda es si en esta parte, se debe ejecutar el código en GT o se debe adicionar a Grafoscopio.
![ error al ejecutar el código siguiente ](https://i.imgur.com/DvxYurN.png)
3. *Creando un dataframe*
Para crear una tabla, sería necesario adjuntar la siguiente parte de código:
Si queremos que la tabla contenga tres filas y cinco columnas, se debería escribir de la siguiente manera:
Para ello debemos colocar las diferentes partes de la tabla, en relación con los nombres de las filas y las comunas: DataFrame class >> withRowNames: DataFrame class >> withColumnNames: DataFrame class >> withRowNames: columnNames:
Por ejemplo, podemos inicializar un marco de datos meteorológicos vacío:
* En este punto intentaré reescribir el ejercicio del PDG de DataFrame, para encontrar los elementos clave que me pudieran servir para crear la tabla de las rondas del torneo Pokemon:
![ Cuando se ejecuta el codigo en la tabla 'Items' aparecen los datos vacios. ](https://i.imgur.com/Oq2iGi7.png)
En este caso, se indica que como los DataFrame no estan optimizados, es necesario agregar las filas y las columnas antes de incializar el DataFrame.
4. *Ahora vamos a inspeccionar el DataFrame* Para ello usaremos un ejemplo que nos da el PDF del Libro de DataFrame:
![ Ejecutando ejemplo del libro de DataFrame ](https://i.imgur.com/dq0zk76.png)
![ Generación de error al ejecutar el código ](https://i.imgur.com/qFlbW4n.png)
También es posible obtener información de forma textual llamando #info del DataFrame:
En este sentido, al intentar ejecutar los trozos de código como estan en el libro de los DataFrame, se generan errores de ejecución, pero no se si sera por componentes del código, como puntos, comas, patentesis; o sera por componentes pendientes dentro del Software lo que ocasiona que no se pueda realizar el ejercicio.
5. *Tipo de datos desde el DataFrame*
6. *Parametrización y dimenciones del DataFrame*
* Dimensiones
* Nombres de filas y columnas
* Trasposición del DataFrame
* Composición de las filas y columnas
* Utilizamos los métodos 'row' y 'column' para modificar los valores almacenados en una fila o columna:
![ Ejecución del código para la cfreación de la tabla de datos. Ejemplo de la página 24 del libro de DataFrame ](https://i.imgur.com/0X5MwD0.png)
Considero que en este punto, me esta generando los mismos errores que en el ejercicio del torneo pokemon.
# Preguntas e inquietudes síncronas y asíncronas
A continuación un listado de las preguntas que se dieron durante las clases (síncronas) y entre ellas (asíncronas) con motivo de la presente narrativa de datos.
## ¿Podemos trabajar con sustición de cadenas?
Para reemplazar un Pokemon por otro podemos usar sustición de cadenas. Si quisieramos hacerlo explícitamente con dos variables sería algo como:
Sin embargo, esto sólo funciona para esos dos pokemones en particular. Para abstraerlo en un bloque de manera que podamos usar pokemones arbitrarios, escribiríamos:
## ¿Cómo obtener los nombres de todos los pokemones?
A partir de esta respuest a [How can I call the PokeAPI to get all the Pokémon at once?](https://salesforce.stackexchange.com/questions/421367/how-can-i-call-the-pokeapi-to-get-all-the-pok%C3%A9mon-at-once), podemos encontrar un código en Pharo que rápidamente nos entregue los nombres como un diccionario de datos:
![ 1302 nombres de los pokemones, con sus enlaces end point en el PokeAPI. ](https://i.imgur.com/fYydpnw.png)
Con la formula anterior, se pueden encontrar los diferentes pokémones. Nunca fue mi fuerte y no me gustaban los pokemones, por esta razón, desconozco sus nombres y lo que ellos hacian. Pero si se que fueron y son muy populares en juegos, peliculas y ahora en videojuegos.
Entre todos los pokémones, hay un top de los diez más populares. esta información, la podemos encontrar en diferentes recusos de información como este https://lafrikileria.com/blog/mapa-pokemon-mas-famoso-cada-pais-mundo/ El cual, presenta una información muy detallada de los pokemones a nivel mundial. Subidividido por paises y por continentes, segun su nivel de popularidad. **Tambien encontramos que en Colombia, el pokemon más popiular (según el recurso) fue Squirtle**
![ Squirtle ](https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/007.png)
**Este es el Top 10 de Pokémon más famosos de todos los tiempos desde la aparciciónd e la franquicia japonesa en el año 1996.**
![ 1. Pikachu ](https://static.wikia.nocookie.net/espokemon/images/6/66/Pikachu_de_Ash_en_Alola.png/revision/latest/scale-to-width-down/1000?cb=20190911100849)
![ 2. Charizard ](https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/006_f2.png)
![ 3. Onix ](https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/095.png)
![ 4. Mewtwo ](https://db.pokemongohub.net/_next/image?url=%2Fimages%2Fofficial%2Ffull%2F150.webp&w=640&q=75)
![ 5. Eevee ](https://images.wikidexcdn.net/mwuploads/wikidex/thumb/f/f2/latest/20150621181400/Eevee.png/800px-Eevee.png)
![ 6. Gengar ](https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/094.png)
![ 7. Mew ](https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/151.png)
![ 8. Snorlax ](https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/143.png)
![ 9. Lapras ](https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/131.png)
![ 10. Gyarados ](https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/130.png )
##Batalla de pokemones
## #En esta parte, se define un combate entre dos pokémones
Esto nos permite preguntar datos específicos a cada peleador
En este punto, podemos seleccionar un movimiento al azar con la siguiente parted e código:
De este modo, cada combatiente, puede seleccionar su movimiento de ataque:
Y con lo anterior podemos definir un ganador: