{"id":1160,"date":"2024-05-09T22:39:51","date_gmt":"2024-05-09T22:39:51","guid":{"rendered":"https:\/\/javierladino.com\/es\/?post_type=rara-portfolio&#038;p=1160"},"modified":"2024-06-17T19:21:12","modified_gmt":"2024-06-17T19:21:12","slug":"descubriendo-el-mundo-de-league-of-legends-a-traves-de-los-datos","status":"publish","type":"rara-portfolio","link":"https:\/\/javierladino.com\/es\/portfolio\/descubriendo-el-mundo-de-league-of-legends-a-traves-de-los-datos\/","title":{"rendered":"Descubriendo el mundo de League of Legends a trav\u00e9s de los Datos"},"content":{"rendered":"\n<p>Hola! Comparto con ustedes este viaje personal, como admirador de un gran jugador de League of Legends (LoL) llamado <strong>IM ONI<\/strong>, y c\u00f3mo a trav\u00e9s de los datos que ofrece el juego he logrado poco a poco avanzar en mi reconversi\u00f3n profesional hacia la Ciencia y la Ingenier\u00eda de Datos. En esta publicaci\u00f3n, te llevar\u00e9 a trav\u00e9s de mi experiencia y destacar\u00e9 c\u00f3mo utilic\u00e9 mis habilidades para analizar y visualizar datos del mundo de LoL.<\/p>\n\n\n\n<p>Como muchos, me convert\u00ed en un gran admirador de <strong>IM ONI<\/strong> gracias a su habilidad en el mundo de LoL. Sin embargo, mi inter\u00e9s no se limitaba solo a ver sus partidas; tambi\u00e9n quer\u00eda entender los datos detr\u00e1s de su juego y descubrir patrones y tendencias que pudieran explicar su modo de juego. Este deseo de explorar y analizar datos me llev\u00f3 a embarcarme en un viaje que conecta la extracci\u00f3n, transformaci\u00f3n y carga &#8211; ETL- de datos de LOL, visualizaci\u00f3n y un primer an\u00e1lisis.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"367\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/immoni-1024x367.jpg\" alt=\"Im ONI\" class=\"wp-image-1162\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/immoni-1024x367.jpg 1024w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/immoni-300x108.jpg 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/immoni-768x275.jpg 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/immoni-167x60.jpg 167w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/immoni.jpg 1275w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.twitch.tv\/im__oni\" target=\"_blank\" rel=\"noreferrer noopener\">Twitch &#8211; Im ONI &#8211; LoL<\/a><\/figcaption><\/figure>\n\n\n\n<p><strong>League of Legends (LoL):<\/strong> es un popular videojuego en l\u00ednea de g\u00e9nero MOBA (Multiplayer Online Battle Arena) desarrollado y publicado por Riot Games. En LoL, los jugadores controlan un personaje, conocido como \u00abcampe\u00f3n\u00bb, con habilidades \u00fanicas, y trabajan en equipo para destruir la base enemiga mientras defienden la suya propia. El juego se destaca por su enfoque en la estrategia, la cooperaci\u00f3n en equipo y la habilidad individual.<\/p>\n\n\n\n<p>Seg\u00fan el portal <a href=\"https:\/\/activeplayer.io\/league-of-legends\/\" target=\"_blank\" rel=\"noreferrer noopener\">Active Player<\/a>: en el momento de escribir esta publicaci\u00f3n est\u00e1n jugando <strong>1.050.863<\/strong> personas online, en los \u00faltimos 30 d\u00edas se han conectado m\u00e1s de <strong>133.466.282<\/strong> jugadores y m\u00e1s de <strong>97.975.355<\/strong> horas son vistas en Twitch con un pico de <strong>712.950<\/strong> espectadores simultaneos.<\/p>\n\n\n\n<p><kbd><strong>Es importante resaltar la ayuda del contenido de dos Youtubers <a href=\"https:\/\/www.youtube.com\/@CodinEric\" target=\"_blank\" rel=\"noreferrer noopener\">CodinEric<\/a> y <a href=\"https:\/\/www.youtube.com\/@itero_gaming\" target=\"_blank\" rel=\"noreferrer noopener\">Jack J de iTero Gaming<\/a> que me han servido de referencia con sus videos y explicaciones. No se trataba solamente de seguir su c\u00f3digo, sino entender el proceso y l\u00f3gica de programaci\u00f3n que usan para el tratamiento de los datos. <\/strong><\/kbd><\/p>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color has-large-font-size wp-elements-30acab2934c01355afc1bfe6593e39cb\"><strong>Configurando el entorno de desarrollo<\/strong><\/p>\n\n\n\n<p>Mi primer paso fue configurar mi entorno de desarrollo, instalando las bibliotecas necesarias de Python y obteniendo una clave de API de Riot Games para acceder a las APIs de LoL. Esta configuraci\u00f3n inicial fue crucial para poder acceder a los datos del juego y comenzar mi an\u00e1lisis.<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Entorno de desarrollo<\/mark><\/strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\"><strong>:<\/strong><\/mark> utilic\u00e9 JupyterLab para redactar el Notebook con Python de manera local. Siempre utilizo Conda para generar un ambiente e instalar las librerias seg\u00fan los requerimientos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Libraries\nimport requests\nfrom time import sleep\nimport pandas as pd\nfrom datetime import datetime\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport plotly.graph_objs as go\nimport plotly.express as px<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Clave de API de Riot Games:<\/mark><\/strong> Ingresa a <a href=\"https:\/\/developer.riotgames.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/developer.riotgames.com\/<\/a>, despu\u00e9s crea o inicia sesi\u00f3n con tu cuenta de Riot y acepta las condiciones del servicio. En la parte inferior, haz clic en \u00abNo soy un robot\u00bb y regenera tu clave API. Por pol\u00edticas de seguridad de Riot Games, esta clave se desactiva cada 24 horas o menos seg\u00fan sus indicaciones, luego deber\u00e1s repetir el procedimiento las veces necesarias durante el proyecto. Para fines pr\u00e1cticos, har\u00e9 visible la \u00abapi_key\u00bb en el notebook, pero dejo claro que es una mala pr\u00e1ctica.<br>A continuaci\u00f3n copia la clave API y p\u00e9gala en tu notebook bajo la variable \u00abapi_key\u00bb, ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>api_key<\/strong> = 'RGAPI-0f2ead54-465c-2323-8bd6-c123456789'<\/code><\/pre>\n\n\n\n<p><kbd><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-orange-color\">Es muy importante entender que NO DEBES compartir tus claves de acceso en p\u00fablico<\/mark><\/strong>, normalmente puedes utilizar variables de entorno que envuelvan tu clave y al momento de publicar tu c\u00f3digo no sean visibles (yo lo entend\u00ed como un GitIgnore, para no subir o hacer visible lo que no quieres). <\/kbd><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Insert an environment variable:\n\"\"\"\n1 - Create an .env file in the root of the project.\n2 - $ export api_key = RGAPI-1234567-1234567890\n3 - $ source -env\n\"\"\"\n# api_key = os.environ&#91;'api_key'] => To call the environment variable.<\/code><\/pre>\n\n\n\n<p><strong>Utilidad de Consumir la API de League of Legends<\/strong><br>Consumir la API de League of Legends proporciona acceso a una gran cantidad de datos sobre el juego, los jugadores y las partidas. Estos datos pueden ser utilizados para una variedad de prop\u00f3sitos, incluyendo:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>An\u00e1lisis de Rendimiento de Jugadores:<\/strong> Los datos de las partidas pueden utilizarse para analizar el rendimiento de los jugadores, identificar \u00e1reas de mejora y comparar estad\u00edsticas con otros jugadores.<\/li>\n\n\n\n<li><strong>Estudio de Estrategias y Tendencias:<\/strong> Analizar los datos de las partidas permite identificar tendencias en la selecci\u00f3n de campeones, estrategias de juego y resultados de las partidas, lo que puede ayudar a los jugadores a mejorar su estrategia y adaptarse al meta actual.<\/li>\n\n\n\n<li><strong>Visualizaci\u00f3n de Datos:<\/strong> Los datos del juego pueden ser visualizados de diversas formas, como gr\u00e1ficos y tablas interactivas, para comprender mejor las din\u00e1micas del juego, compartir hallazgos y realizar informes detallados.<\/li>\n\n\n\n<li><strong>Investigaci\u00f3n Acad\u00e9mica:<\/strong> Los datos de League of Legends tambi\u00e9n pueden ser utilizados para fines acad\u00e9micos, como estudios sobre comportamiento de los jugadores, an\u00e1lisis de redes sociales y modelado de sistemas complejos.<\/li>\n<\/ol>\n\n\n\n<p>En resumen, consumir la API de League of Legends proporciona una valiosa fuente de datos para el an\u00e1lisis y comprensi\u00f3n del juego, as\u00ed como para la mejora del rendimiento individual y colectivo de los jugadores.<\/p>\n\n\n\n<p>Puedes acceder a toda la documentaci\u00f3n del modo de consumo de APIs de LOL en <a href=\"https:\/\/developer.riotgames.com\/docs\/lol\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/developer.riotgames.com\/docs\/lol<\/a><\/p>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color has-large-font-size wp-elements-66b1bea74b545980a8ab5d8488354e79\"><strong>Consulta de datos de jugadores<\/strong> <\/p>\n\n\n\n<p>Utilizando las APIs de LoL, pude obtener informaci\u00f3n detallada sobre los jugadores, incluyendo su nombre de invocador, nivel, historial de partidas y m\u00e1s. Esto me permiti\u00f3 estudiar el rendimiento de diferentes jugadores, incluido <strong>IM ONI<\/strong>.<\/p>\n\n\n\n<p>En un inicio, solamente conocemos el nombre del jugador \u00abinvocador\u00bb y la regi\u00f3n (servidor) donde juega, para nuestro caso: <strong>IM ONI y euw (servidor en Europa)<\/strong>.<\/p>\n\n\n\n<p>Hasta noviembre de 2023 se pod\u00eda utilizar la API \u00ab<strong>Summoner-V4<\/strong>\u00bb en su endpoint <kbd>\"\/lol\/summoner\/v4\/summoners\/by-name\/{summonerName}\"<\/kbd> para obtener la identificaci\u00f3n del jugador. Riot Games utiliza tres (3) diferentes Ids para seguirlo: El <kbd><strong>PUUID<\/strong><\/kbd>, el <kbd><strong>SummonerId<\/strong><\/kbd> y el <kbd><strong>AccountId<\/strong><\/kbd>. En realidad, los dos primeros est\u00e1n vigentes y son necesarios para hacer consultas seg\u00fan el endpoint (Ubicaci\u00f3n de la\u00a0<em>API<\/em>\u00a0en la que un sistema interact\u00faa con una\u00a0<em>API<\/em>\u00a0web.).<\/p>\n\n\n\n<p>Actualmente,  <a href=\"https:\/\/www.riotgames.com\/en\/DevRel\/summoner-names-to-riot-id\" target=\"_blank\" rel=\"noreferrer noopener\">Riot Games sugiere utilizar la API \u00abAccount-v1\u00bb para obtener el PUUID<\/a> (Identificadores \u00fanicos universales de jugador), es de tipo <kbd>string<\/kbd> (hasta 78 caracteres) para rastrear el jugador en todo el mundo, incluso si cambia de region (servidor).<\/p>\n\n\n\n<p>Para obtenerlo vamos al endpoint <kbd>\"\/riot\/account\/v1\/accounts\/by-riot-id\/{gameName}\/{tagLine}\"<\/kbd> en la API <kbd>\"Account-V1\"<\/kbd> que puedes encontrar al hacer login con tu cuenta en <a href=\"http:\/\/developer.riotgames.com\/apis\">developer.riotgames.com\/apis<\/a>. En la secci\u00f3n \u00abPath parameters\u00bb inserta en \u00abtagLine\u00bb = <strong>euw1<\/strong> (regi\u00f3n del jugador) y en \u00abgameName\u00bb = <strong>IIM ONI<\/strong> (nombre del jugador), selecciona <strong>EUROPE<\/strong> (o la regi\u00f3n del jugador) y ejecuta la consulta. Esto generar\u00e1 una URL con los datos de vuelta.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"492\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/api_1.jpg\" alt=\"\" class=\"wp-image-1167\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/api_1.jpg 800w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/api_1-300x185.jpg 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/api_1-768x472.jpg 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/api_1-98x60.jpg 98w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>Copias la URL que genera y la pegas en tu notebook como una nueva variable \u00ab<strong>api_url<\/strong>\u00ab<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>api_url =  https:\/\/europe.api.riotgames.com\/riot\/account\/v1\/accounts\/by-riot-id\/IIM%20ONI\/EUW?api_key=RGAPI-0f2ead89-905c-4393-8bd6-c123456789\"<\/code><\/pre>\n\n\n\n<p>Luego, con la librer\u00eda \u00ab<strong>requests<\/strong>\u00bb ya instalada validamos la conexi\u00f3n as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>requests.get(api_url)\n&lt;Response &#91;200]&gt;<\/code><\/pre>\n\n\n\n<p>Deber\u00edas tener una respuesta [200] como conexi\u00f3n exitosa. Si tienes una respuesta de error en conexi\u00f3n tipo \u00ab400, 401, etc.\u00bb valida en la lista de errores de respuesta de cada endpoint. (Usualmente te marcar\u00e1 error porque la api key expir\u00f3 y tendr\u00e1s que crear una nueva)<\/p>\n\n\n\n<p>Despu\u00e9s podr\u00e1s acceder a la informaci\u00f3n en formato <strong>Json<\/strong> y guardarlo en una variable.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>resp = requests.get(api_url)\nplayer_info = resp.json()\n<strong>player_info<\/strong>\n$ {<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">'puuid': '3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ'<\/mark>,\n 'gameName': 'IIM ONI',\n 'tagLine': 'EUW'}<\/code><\/pre>\n\n\n\n<p>Ahora con el <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">PUUID<\/mark><\/strong>, obtenemos el <strong>SUMMONER ID<\/strong> con el endpoint <kbd>\"\/lol\/summoner\/v4\/summoners\/by-puuid\/{encryptedPUUID}\"<\/kbd><\/p>\n\n\n\n<p>Hacemos el mismo procedimiento en la API \u00ab<strong>Summoner-V4<\/strong>\u00bb y obtenemos una nueva URL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>api_url = 'https:\/\/euw1.api.riotgames.com\/lol\/summoner\/v4\/summoners\/by-puuid\/3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ?api_key=RGAPI-0f2ead12-123c-1234-1bd2-c0123456789'\n\nresp = requests.get(api_url)\nsummoner = resp.json()\n<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">summoner<\/mark><\/strong>\n$ {<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">'id': 'GKLboy4jZh2vTZDsax2s9lX3hfceyCbHzAdc0j5nPkpbgy4F'<\/mark>,\n 'accountId': 'w6J4cvKF2LD5XyIDo9kxTAEymbFe0dil8UwtJ3EaMs_ylwrloap3YO62',\n 'puuid': '3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ',\n 'profileIconId': 6503,\n 'revisionDate': 1713898945000,\n 'summonerLevel': 329}<\/code><\/pre>\n\n\n\n<p>Ya con el \u00ab<strong>Puuid<\/strong>\u00bb y el \u00ab<strong>SummonerId<\/strong>\u00bb podremos hacer consultas a otras APIS como \u00ab<strong>League-V4<\/strong>\u00bb o \u00ab<strong>Champion-mastery<\/strong>\u00ab<\/p>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color has-large-font-size wp-elements-3ed51ad093a0303e851e1098d6bb3a2e\"><strong>Obtenci\u00f3n de Datos de Partidas<\/strong> <\/p>\n\n\n\n<p>Explorar los datos de las partidas recientes fue especialmente emocionante. Pude acceder a informaci\u00f3n detallada sobre las partidas, como los campeones seleccionados, los resultados de la partida y las estad\u00edsticas de juego. Esto me permiti\u00f3 identificar tendencias y estrategias comunes entre los jugadores de las partidas. Recordemos que LOL es un juego de cinco contra cinco, pero un jugador puede competir<em> <\/em>solo y subir su nivel.<\/p>\n\n\n\n<p>Lo que primero te preguntan cuando juegas LOL es c\u00faal es tu nivel de clasificaci\u00f3n, entonces para encontrar el ranking de tu jugador vamos a consultar la API \u00abLeague-v4\u00bb en el endpoint <kbd>\"\/lol\/league\/v4\/entries\/by-summoner\/{encryptedSummonerId}\"<\/kbd> esta informaci\u00f3n ser\u00e1 el <strong>Ranking Mastery<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>summ_id = summoner&#91;'id']\nendpoint = f'https:\/\/euw1.api.riotgames.com\/lol\/league\/v4\/entries\/by-summoner\/{summ_id}?api_key={api_key}'\n\nres = requests.get(endpoint).json()\ndf_rank = pd.DataFrame(&#91;res&#91;0]]) # crear dataframe con Ranking Mastery\n<strong>df_rank<\/strong> # Ver el dataframe.<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"76\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/ranking_mastery.jpg\" alt=\"\" class=\"wp-image-1173\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/ranking_mastery.jpg 1000w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/ranking_mastery-300x23.jpg 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/ranking_mastery-768x58.jpg 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/ranking_mastery-600x46.jpg 600w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>Ahora es el turno de los datos de partidas, para eso utilizaremos la API \u00abMatch-v5\u00bb con el PUUID que obtuvimos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>api_url = \"https:\/\/europe.api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ\/ids?start=0&amp;count=20&amp;api_key=RGAPI-0f2ead89-905c-4393-8bd6-12345678\"\n\n<strong># First we bring the Ids for the last 20 games\n<\/strong>resp = requests.get(api_url)\nmatch_ids = resp.json()\n\n<strong>match_ids<\/strong>\n\n&#91;<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">'EUW1_6832340332'<\/mark>,\n 'EUW1_6832299147',\n 'EUW1_6829175370',\n 'EUW1_6829148496',\n 'EUW1_6829025866',\n 'EUW1_6828945398',\n 'EUW1_6828887595',\n 'EUW1_6828867611',\n 'EUW1_6828812533',\n 'EUW1_6824214120',\n 'EUW1_6824173176',\n 'EUW1_6824124368',\n 'EUW1_6823607057',\n 'EUW1_6823569193',\n 'EUW1_6816330441',\n 'EUW1_6816300579',\n 'EUW1_6814475777',\n 'EUW1_6814449666',\n 'EUW1_6811931211',\n 'EUW1_6811890150']<\/code><\/pre>\n\n\n\n<p>Filtramos la partida m\u00e1s reciente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>recent_match = match_ids&#91;0]\n<strong>recent_match<\/strong>\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">'EUW1_6832340332'<\/mark><\/code><\/pre>\n\n\n\n<p>Utilizamos la API \u00ab\/lol\/match\/v5\/matches\/{matchId}\u00bb para extraer la data del juego con su id.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>api_url<\/strong> = \"https:\/\/europe.api.riotgames.com\/lol\/match\/v5\/matches\/EUW1_6832340332?api_key=RGAPI-0f2ead89-905c-4393-8bd6-1234567\"<\/code><\/pre>\n\n\n\n<p>resp = requests.get(api_url)<br>match_data = resp.json()<br><strong>match_data<\/strong><\/p>\n\n\n\n<p>Esto nos devuelve un archivo Json de <strong>2823 l\u00edneas de c\u00f3digo<\/strong>. Aqu\u00ed las primeras 20:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{'metadata': {'dataVersion': '2',\n  'matchId': 'EUW1_6832340332',\n  'participants': &#91;'q0gtmms-y3amkJoRws5bFeAmP6a9XmfuwXFOVshyby8dNHkiGlFq0ao-Uxe21RfBKosrEbiR7CT-5w',\n   'pSH5lRUAcE0Cqk-bKTlH0IYFZa8pfpXT6rQf8ybaRmnSJv0LNiCaXUeYqy6wJ36duvYDIl6u8lmzaA',\n   '3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ',\n   '81pnwBf13NcO4q0k2EdH-nE3NsjJnlrYXdiR1xnKmff2qs_cLz-D540Q-RjgrSa-dA4sbmsAq-JTjQ',\n   'XjEV9TRmLaQoRx4tBl99oztaP8rCOJxCTghiJBeoqGGi0Wcv7O2c-utaW_-t797QFW-xZg1iRMSamg',\n   '23prBqAyWrlkEK89A29ACLZ9pDKNxcIe5cR4SOdhmyyvtxwsU0O0k2SUnx2xzPcWgqh1IK8ltpk1qQ',\n   'UteRJTU3g1NP_67ENlqRpX8QhTO8OooBHF4S32bvEFutfaMeQQipmfmi1ExMTJCHos4glinM7ZJEWw',\n   'G-Lj_m6A3K4pvid9h6b-M9h17D5_-uhPA6HD4ujt78EIq1bx4Dga-Tyb4RujvvGk5cdZtvygp96vFA',\n   'M0j0ja9BC0OjyUg-MCF3YpdU3U-_SMpvTUq7Kxzh9GSvwil3RiBs6O50qGARFYnoiyr4zzsXtpsKIg',\n   'G5R1mdsETPnJNKub3tmpI7LqWchEp2dOao_coGZerFMjybtRwKk7ShHposUGWMk53y_F1b0WjCbPjA']},\n 'info': {'endOfGameResult': 'GameComplete',\n  'gameCreation': 1708906756855,\n  'gameDuration': 1829,\n  'gameEndTimestamp': 1708908667752,\n  'gameId': 6832340332,\n  'gameMode': 'CLASSIC',\n  'gameName': 'teambuilder-match-6832340332',\n  'gameStartTimestamp': 1708906838802,\n...<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Match_data<\/strong> has two sections\nmatch_data.keys()\ndict_keys(&#91;'<strong>metadata<\/strong>', '<strong>info<\/strong>'])\n\n# \"<strong>Metadata<\/strong>\" contains the puuid of each player in list '<strong>participants<\/strong>'.\nmatch_data&#91;'metadata'] # This returns the PUUID of all 10 players in the game.\n\n{'dataVersion': '2',\n 'matchId': 'EUW1_6832340332',\n 'participants': &#91;'q0gtmms-y3amkJoRws5bFeAmP6a9XmfuwXFOVshyby8dNHkiGlFq0ao-Uxe21RfBKosrEbiR7CT-5w',\n  'pSH5lRUAcE0Cqk-bKTlH0IYFZa8pfpXT6rQf8ybaRmnSJv0LNiCaXUeYqy6wJ36duvYDIl6u8lmzaA',\n  '3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ',\n  '81pnwBf13NcO4q0k2EdH-nE3NsjJnlrYXdiR1xnKmff2qs_cLz-D540Q-RjgrSa-dA4sbmsAq-JTjQ',\n  'XjEV9TRmLaQoRx4tBl99oztaP8rCOJxCTghiJBeoqGGi0Wcv7O2c-utaW_-t797QFW-xZg1iRMSamg',\n  '23prBqAyWrlkEK89A29ACLZ9pDKNxcIe5cR4SOdhmyyvtxwsU0O0k2SUnx2xzPcWgqh1IK8ltpk1qQ',\n  'UteRJTU3g1NP_67ENlqRpX8QhTO8OooBHF4S32bvEFutfaMeQQipmfmi1ExMTJCHos4glinM7ZJEWw',\n  'G-Lj_m6A3K4pvid9h6b-M9h17D5_-uhPA6HD4ujt78EIq1bx4Dga-Tyb4RujvvGk5cdZtvygp96vFA',\n  'M0j0ja9BC0OjyUg-MCF3YpdU3U-_SMpvTUq7Kxzh9GSvwil3RiBs6O50qGARFYnoiyr4zzsXtpsKIg',\n  'G5R1mdsETPnJNKub3tmpI7LqWchEp2dOao_coGZerFMjybtRwKk7ShHposUGWMk53y_F1b0WjCbPjA']}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>info<\/strong>\" contains a lot of information about the game, such as when it was created, how long it lasted, etc.\nmatch_data&#91;'<strong>info<\/strong>'].keys()\ndict_keys(&#91;'endOfGameResult', 'gameCreation', 'gameDuration', 'gameEndTimestamp', 'gameId', 'gameMode', 'gameName', 'gameStartTimestamp', 'gameType', 'gameVersion', 'mapId', 'participants', 'platformId', 'queueId', 'teams', 'tournamentCode'])\n\n# We can see the duration of the game with \"<strong>gameDuration<\/strong>\":\nmatch_data&#91;'info']&#91;'gameDuration'] \/ 60 # \/ 60 to get it into minutes.\n<strong>30.483333333333334 # Minutes duration.<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Inside info, participants contains a list of length 10, each with more information about the player\nlen(match_data&#91;'info']&#91;'<strong>participants<\/strong>'])\n10 # <strong>participants<\/strong><\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Obteniendo la data de Im ONI:<\/mark><\/strong><\/p>\n\n\n\n<p>Tomamos la lista de puuids de todos los participantes y usamos \u00abindex\u00bb para averiguar d\u00f3nde est\u00e1 nuestro jugador <strong>Im ONI<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># A list of all the participants puuids\nparticipants = match_data&#91;'metadata']&#91;'participants']\n# Now, find where in the data our players puuid is found\nplayer_index = participants.index(puuid)\nplayer_index\n<strong>2<\/strong><\/code><\/pre>\n\n\n\n<p>Esto deber\u00eda coincidir con el puuid que usamos para buscar los IDs coincidentes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>participants&#91;player_index]\n'3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ'<\/code><\/pre>\n\n\n\n<p>Comprobemos que funciona utilizando este \u00edndice para obtener el nombre de los jugadores a partir de los datos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># We verify the Summoner name we used in the first API ACCOUNT-V1\nmatch_data&#91;'info']&#91;'participants']&#91;player_index]&#91;'summonerName']\n'<strong>IIM ONI<\/strong>'\n\n# Now that we know where our player is, we can get his data\nplayer_data = match_data&#91;'info']&#91;'info']&#91;'participants']&#91;player_index]\n\nplayer_data&#91;'championName'] # Which Champion is playing with\n'<strong>Hwei<\/strong>'\n\n# We get his <strong>KDA<\/strong>\nk = player_data&#91;'kills']\nd = player_data&#91;'deaths']\na = player_data&#91;'assists']\nwin = player_data&#91;'win']\nprint(\"Kills:\", k)\nprint(\"Deaths:\", d)\nprint(\"Assists:\", a)\nprint(\"KDA:\", (k + a) \/ d)\nprint(\"Win:\", win)\n\n<strong>Kills: 10\nDeaths: 10\nAssists: 8\nKDA: 1.8\nWin: False<\/strong>\n\n# Let's get your role or position\nplayer_data&#91;'teamPosition']]\n'<strong>MIDDLE<\/strong>'<strong>\n<\/strong><\/code><\/pre>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color has-large-font-size wp-elements-09ae4118ae19b43a2796916a0e4d5988\"><strong>Exploraci\u00f3n de Datos de Campeones<\/strong><\/p>\n\n\n\n<p>Otro aspecto interesante fue la exploraci\u00f3n de datos sobre los campeones disponibles en LoL. Consult\u00e9 informaci\u00f3n sobre estad\u00edsticas base, habilidades y m\u00e1s, lo que me ayud\u00f3 a comprender mejor las fortalezas y debilidades de cada campe\u00f3n y su impacto en el juego.<\/p>\n\n\n\n<p>Utilizamos la API <strong>Champion Mastery<\/strong> <kbd>\"\/lol\/champion-mastery\/v4\/champion-masteries\/by-puuid\/{encryptedPUUID}\"<\/kbd> que nos devuelve el siguiente endpoint:<\/p>\n\n\n\n<p>endpoint = \u00abhttps:\/\/euw1.api.riotgames.com\/lol\/champion-mastery\/v4\/champion-masteries\/by-puuid\/3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ?api_key=RGAPI-6ee36def-3911-48e7-84e8-1234567890\u00bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>res = requests.get(endpoint).json()\ndf_champs = pd.DataFrame(res)\ndf_champs<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"251\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/df_champ_oni.jpg\" alt=\"\" class=\"wp-image-1176\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/df_champ_oni.jpg 1000w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/df_champ_oni-300x75.jpg 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/df_champ_oni-768x193.jpg 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/df_champ_oni-239x60.jpg 239w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption class=\"wp-element-caption\">Dataframe Champion Mastery<\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># We change the type of date with the Pandas datatime method and export the CSV with the production date.\ndf_champs&#91;'lastPlayTime'] = pd.to_datetime(df_champs&#91;'lastPlayTime'], unit = 'ms')\ndf_champs.to_csv(f'champs_mastery_{datetime.today().strftime(\"%Y_%m_%d\")}.csv', index = False)<\/code><\/pre>\n\n\n\n<p>Ahora podremos analizar m\u00e1s adelante este dataframe con series de tiempo en Pandas.<\/p>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color has-large-font-size wp-elements-245c4073276f4eff1b64dca175b31d32\"><strong>Recopilaci\u00f3n de datos<\/strong><\/p>\n\n\n\n<p>Aprender a conectarse con las APIs, hacer las consultas y obtener los datos es un proceso que a\u00fan me cuesta entender en varios puntos. Al final, nuestro objetivo es recopilar la mayor cantidad de datos de nuestro jugador <strong>IM ONI<\/strong>, y aunque la curva de aprendizaje es fuerte, la forma m\u00e1s r\u00e1pida y ordenada es creando <strong>funciones<\/strong>. Para entender la estructura y utilidad de cada <strong>Funci\u00f3n<\/strong> utilic\u00e9 los canales citados de Youtube, webs de referencia sobre contenidos de LOL, la documentaci\u00f3n oficial del juego y algunos ejercicios realizados dentro de la ruta de aprendizaje en Ingenier\u00eda de Datos con Platzi.<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Funci\u00f3n #1 &#8211; Obtener el PUUID de un jugador<\/mark><\/strong><\/p>\n\n\n\n<p>La primera funci\u00f3n simplemente obtiene el puuid, dado un nombre de invocador y una regi\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def <strong>get_puuid<\/strong>(summoner_name, region, api_key, mass_region):\n    api_url = (\n        \"https:\/\/\" + \n        mass_region +\n        \".api.riotgames.com\/riot\/account\/v1\/accounts\/by-riot-id\/\" +\n        summoner_name +\"\/\"+\n        region +\n        \"?api_key=\" +\n        api_key\n    )\n    \n    print(api_url)\n    resp = requests.get(api_url)\n    puuid = player_info&#91;'puuid']\n    return puuid<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>summoner_name = 'IIM%20ONI'\nmass_region = 'europe'\nregion = 'euw1'\n\npuuid_oni = get_puuid(summoner_name, region, api_key, mass_region)\npuuid_oni<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;europe.api.riotgames.com\/riot\/account\/v1\/accounts\/by-riot-id\/IIM%20ONI\/euw1?api_key=RGAPI-0f2ead89-123c-1234-1bd2-c123456789\n'<strong>3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ<\/strong>'<\/code><\/pre>\n\n\n\n<p>Lo que hicimos fue construir la url de la API, hacemos la consulta y obtenemos el PUUID. Es lo mismo que nuestro primer paso, solo que ahora est\u00e1 modularizado y optimizado.<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Function #2 &#8211; Lista de Ids de los \u00faltimos 20 partidos<\/mark><\/strong><\/p>\n\n\n\n<p>La funci\u00f3n para obtener una lista de todos los ID de partido (2\u00ba ejemplo anterior) dado un <strong>puuid<\/strong> de jugador y el <strong>mass_region<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def <strong>get_match_ids<\/strong>(puuid, mass_region, api_key):\n    api_url = (\n        \"https:\/\/\" +\n        mass_region +\n        \".api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/\" +\n        puuid + \n        \"\/ids?start=0&amp;count=20\" + \n        \"&amp;api_key=\" + \n        api_key\n    )\n    \n    print(api_url)\n    \n    resp = requests.get(api_url)\n    match_ids = resp.json()\n    return match_ids  <\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># NOTE: region and mass_region are different.\n# for example, NA1 is the region of North America\n# which is part of the mass region AMERICAS\n# EUW1 is the Western Europe region, which is part of the mass region EUROPE\nmass_region = 'EUROPE\n\nmatch_ids = get_match_ids(puuid, mass_region, api_key)\nmatch_ids<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\"><a href=\"https:\/\/europe.api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ\/ids?start=0&amp;count=20&amp;api_key=RGAPI-0f2ead89-905c-4393-8bd6-c0112c330526\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/EUROPE.api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ\/ids?start=0&amp;count=20&amp;api_key=RGAPI-0f2ead89-905c-4393-8bd6-c0112c330526<\/a><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">['EUW1_6832340332',\n 'EUW1_6832299147',\n 'EUW1_6829175370',\n 'EUW1_6829148496',\n 'EUW1_6829025866',\n 'EUW1_6828945398',\n 'EUW1_6828887595',\n 'EUW1_6828867611',\n 'EUW1_6828812533',\n 'EUW1_6824214120',\n 'EUW1_6824173176',\n 'EUW1_6824124368',\n 'EUW1_6823607057',\n 'EUW1_6823569193',\n 'EUW1_6816330441',\n 'EUW1_6816300579',\n 'EUW1_6814475777',\n 'EUW1_6814449666',\n 'EUW1_6811931211',\n 'EUW1_6811890150']<\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Funci\u00f3n # 3 &#8211; Datos de una partida<\/mark><\/strong><\/p>\n\n\n\n<p>A partir de un ID de partido y una regi\u00f3n de masa dados, obtener los datos sobre el partido.<\/p>\n\n\n\n<p>def <strong>get_match_data<\/strong>(match_id, mass_region, api_key):<br>api_url = (<br>\u00abhttps:\/\/\u00bb +<br>mass_region +<br>\u00ab.api.riotgames.com\/lol\/match\/v5\/matches\/\u00bb +<br>match_id +<br>\u00ab?api_key=\u00bb +<br>api_key<br>)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>resp = requests.get(api_url)\nmatch_data = resp.json()\nreturn match_data   <\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>match_id = match_ids&#91;0]\nmatch_data = get_match_data(match_id, mass_region, api_key)\nmatch_data<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Recall that it returns 2823 lines of code, here are the first 20.\n<\/strong>{'metadata': {'dataVersion': '2',\n  'matchId': 'EUW1_6832340332',\n  'participants': &#91;'q0gtmms-y3amkJoRws5bFeAmP6a9XmfuwXFOVshyby8dNHkiGlFq0ao-Uxe21RfBKosrEbiR7CT-5w',\n   'pSH5lRUAcE0Cqk-bKTlH0IYFZa8pfpXT6rQf8ybaRmnSJv0LNiCaXUeYqy6wJ36duvYDIl6u8lmzaA',\n   '3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ',\n   '81pnwBf13NcO4q0k2EdH-nE3NsjJnlrYXdiR1xnKmff2qs_cLz-D540Q-RjgrSa-dA4sbmsAq-JTjQ',\n   'XjEV9TRmLaQoRx4tBl99oztaP8rCOJxCTghiJBeoqGGi0Wcv7O2c-utaW_-t797QFW-xZg1iRMSamg',\n   '23prBqAyWrlkEK89A29ACLZ9pDKNxcIe5cR4SOdhmyyvtxwsU0O0k2SUnx2xzPcWgqh1IK8ltpk1qQ',\n   'UteRJTU3g1NP_67ENlqRpX8QhTO8OooBHF4S32bvEFutfaMeQQipmfmi1ExMTJCHos4glinM7ZJEWw',\n   'G-Lj_m6A3K4pvid9h6b-M9h17D5_-uhPA6HD4ujt78EIq1bx4Dga-Tyb4RujvvGk5cdZtvygp96vFA',\n   'M0j0ja9BC0OjyUg-MCF3YpdU3U-_SMpvTUq7Kxzh9GSvwil3RiBs6O50qGARFYnoiyr4zzsXtpsKIg',\n   'G5R1mdsETPnJNKub3tmpI7LqWchEp2dOao_coGZerFMjybtRwKk7ShHposUGWMk53y_F1b0WjCbPjA']},\n 'info': {'endOfGameResult': 'GameComplete',\n  'gameCreation': 1708906756855,\n  'gameDuration': 1829,\n  'gameEndTimestamp': 1708908667752,\n  'gameId': 6832340332,\n  'gameMode': 'CLASSIC',\n  'gameName': 'teambuilder-match-6832340332',\n  'gameStartTimestamp': 1708906838802,\n  ....<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Funci\u00f3n # 4 &#8211; Datos de un jugador espec\u00edfico de la partida<\/mark><\/strong><\/p>\n\n\n\n<p>Dados los datos del partido y un puuid de jugador, devuelve \u00fanicamente los datos del elegido.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def <strong>find_player_data<\/strong>(match_data, puuid):\n    participants = match_data&#91;'metadata']&#91;'participants']\n    player_index = participants.index(puuid)\n    player_data = match_data&#91;'info']&#91;'participants']&#91;player_index]\n    return player_data<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>find_player_data(match_data, puuid)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">{'allInPings': 0,<br> 'assistMePings': 3,<br> 'assists': 8,<br> 'baronKills': 0,<br> 'basicPings': 0,<br> 'bountyLevel': 0,<br> 'challenges': {'12AssistStreakCount': 0,<br>  'abilityUses': 214,<br>  'acesBefore15Minutes': 0,<br>  'alliedJungleMonsterKills': 0,<br>  'baronTakedowns': 0,<br>  'blastConeOppositeOpponentCount': 0,<br>  'bountyGold': 825,<br>  'buffsStolen': 0,<br>  'completeSupportQuestInTime': 0,<br>  'controlWardTimeCoverageInRiverOrEnemyHalf': 0.1783287471126854,<br>  'controlWardsPlaced': 2,<br>  'damagePerMinute': 1012.4624544822548,<br>.....<\/pre>\n\n\n\n<p>No hemos hecho nada nuevo, s\u00f3lo hemos puesto todo en funciones para que sea m\u00e1s f\u00e1cil llamarlas m\u00e1s tarde.<\/p>\n\n\n\n<p>Ahora, digamos que queremos mirar nuestros \u00faltimos 20 partidos y extraer los datos. Para ello, simplemente hacemos un bucle a trav\u00e9s de la lista de ids de partidos y ejecutamos las funciones. Para mi ejemplo, cada vez guardaremos informaci\u00f3n sobre el Campe\u00f3n, KDA y Resultados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># We initialise an empty dictionary to store data for each game\ndata = {\n    'champion': &#91;],\n    'kills': &#91;],\n    'deaths': &#91;],\n    'assists': &#91;],\n    'win': &#91;]\n}\n\nfor match_id in match_ids:\n    print(match_id)\n    \n    # run the two functions to get the player data from the match ID\n    match_data = get_match_data(match_id, mass_region, api_key)\n    player_data = find_player_data(match_data, puuid)\n    \n    # assign the variables we're interested in\n    champion = player_data&#91;'championName']\n    k = player_data&#91;'kills']\n    d = player_data&#91;'deaths']\n    a = player_data&#91;'assists']\n    win = player_data&#91;'win']\n     \n    # add them to our dataset\n    data&#91;'champion'].append(champion)\n    data&#91;'kills'].append(k)\n    data&#91;'deaths'].append(d)\n    data&#91;'assists'].append(a)\n    data&#91;'win'].append(win)  <\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>EUW1_6832340332\nEUW1_6832299147\nEUW1_6829175370\nEUW1_6829148496\nEUW1_6829025866\nEUW1_6828945398\nEUW1_6828887595\nEUW1_6828867611\nEUW1_6828812533\nEUW1_6824214120\nEUW1_6824173176\nEUW1_6824124368\nEUW1_6823607057\nEUW1_6823569193\nEUW1_6816330441\nEUW1_6816300579\nEUW1_6814475777\nEUW1_6814449666\nEUW1_6811931211\nEUW1_6811890150<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Data on the last 20 games of the account in question\n<strong>data<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>{'champion': &#91;'Hwei',\n  'LeeSin',\n  'Swain',\n  'Gnar',\n  'Lux',\n  'Pyke',\n  'Kindred',\n  'Lucian',\n  'Ezreal',\n  'Yasuo',\n  'Talon',\n  'Qiyana',\n  'TwistedFate',\n  'Sylas',\n  'Talon',\n  'TwistedFate',\n  'Briar',\n  'Hwei',\n  'Zed',\n  'Rengar'],\n 'kills': &#91;10, 13, 12, 14, 6, 9, 5, 0, 8, 5, 7, 7, 3, 9, 11, 7, 6, 6, 10, 10],\n 'deaths': &#91;10,\n  11,\n  7,\n  4,\n  14,\n  10,\n  8,\n  0,\n  0,\n  9,\n  2,\n  13,\n  7,\n  9,\n  4,\n  9,\n  17,\n  11,\n  13,\n  10],\n 'assists': &#91;8,\n  11,\n  13,\n  13,\n  12,\n  4,\n  5,\n  0,\n  8,\n  10,\n  4,\n  9,\n  8,\n  9,\n  3,\n  6,\n  14,\n  13,\n  10,\n  10],\n 'win': &#91;False,\n  False,\n  True,\n  True,\n  False,\n  False,\n  False,\n  True,\n  True,\n  False,\n  True,\n  False,\n  True,\n  True,\n  True,\n  False,\n  False,\n  False,\n  True,\n  False]}<\/code><\/pre>\n\n\n\n<p>Para leer esto mejor, convertiremos nuestro diccionario de datos en un DataFrame.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df = pd.DataFrame(data)\ndf<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"558\" height=\"1024\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches-558x1024.jpg\" alt=\"\" class=\"wp-image-1180\" style=\"width:263px;height:auto\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches-558x1024.jpg 558w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches-163x300.jpg 163w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches-33x60.jpg 33w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches.jpg 648w\" sizes=\"auto, (max-width: 558px) 100vw, 558px\" \/><\/figure>\n\n\n\n<p>Tambi\u00e9n convertiremos el c\u00f3digo anterior en una funci\u00f3n para su uso posterior.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def <strong>gather_all_data<\/strong>(puuid, match_ids, mass_region, api_key):\n    # We initialise an empty dictionary to store data for each game\n    data = {\n        'champion': &#91;],\n        'kills': &#91;],\n        'deaths': &#91;],\n        'assists': &#91;],\n        'win': &#91;]\n    }\n\n    for match_id in match_ids:\n        print(match_id)\n\n        # run the two functions to get the player data from the match ID\n        match_data = get_match_data(match_id, mass_region, api_key)\n        player_data = find_player_data(match_data, puuid)\n\n        # assign the variables we're interested in\n        champion = player_data&#91;'championName']\n        k = player_data&#91;'kills']\n        d = player_data&#91;'deaths']\n        a = player_data&#91;'assists']\n        win = player_data&#91;'win']\n\n        # add them to our dataset\n        data&#91;'champion'].append(champion)\n        data&#91;'kills'].append(k)\n        data&#91;'deaths'].append(d)\n        data&#91;'assists'].append(a)\n        data&#91;'win'].append(win)    \n    \n    df = pd.DataFrame(data)\n    \n    return df<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>df = <strong>gather_all_data<\/strong>(puuid, match_ids, mass_region, api_key)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>EUW1_6832340332\nEUW1_6832299147\nEUW1_6829175370\nEUW1_6829148496\nEUW1_6829025866\nEUW1_6828945398\nEUW1_6828887595\nEUW1_6828867611\nEUW1_6828812533\nEUW1_6824214120\nEUW1_6824173176\nEUW1_6824124368\nEUW1_6823607057\nEUW1_6823569193\nEUW1_6816330441\nEUW1_6816300579\nEUW1_6814475777\nEUW1_6814449666\nEUW1_6811931211\nEUW1_6811890150<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>df<\/strong><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"558\" height=\"1024\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches-558x1024.jpg\" alt=\"\" class=\"wp-image-1180\" style=\"width:263px;height:auto\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches-558x1024.jpg 558w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches-163x300.jpg 163w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches-33x60.jpg 33w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches.jpg 648w\" sizes=\"auto, (max-width: 558px) 100vw, 558px\" \/><\/figure>\n\n\n\n<p>Como puede ver, la columna \u00abwin\u00bb es un booleano (verdadero o falso).<br>Para facilitar su uso, lo convertiremos en un int (1 o 0)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df&#91;'win'] = df&#91;'win'].astype(int)\n<strong>df<\/strong><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"544\" height=\"1024\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches_cast-544x1024.jpg\" alt=\"\" class=\"wp-image-1181\" style=\"width:251px;height:auto\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches_cast-544x1024.jpg 544w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches_cast-159x300.jpg 159w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches_cast-32x60.jpg 32w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/20_matches_cast.jpg 632w\" sizes=\"auto, (max-width: 544px) 100vw, 544px\" \/><\/figure>\n\n\n\n<p>Ahora que lo tenemos como un DataFrame, es mucho m\u00e1s f\u00e1cil hacer lo que queremos, por ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Searching for averages\n<\/strong>df.mean(numeric_only=True) # numeric_only prevents it from trying to calculate the average of the \"champion\" column.<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kills      7.90\ndeaths     8.40\nassists    8.50\nwin        0.45\ndtype: float64<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Get averages per champion\n<\/strong>df.groupby('champion').mean()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"588\" height=\"1024\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/mean_champions-588x1024.jpg\" alt=\"\" class=\"wp-image-1182\" style=\"width:266px;height:auto\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/mean_champions-588x1024.jpg 588w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/mean_champions-172x300.jpg 172w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/mean_champions-34x60.jpg 34w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/mean_champions.jpg 614w\" sizes=\"auto, (max-width: 588px) 100vw, 588px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># sort your games by number of kills\n<\/strong>df.sort_values('kills')<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"561\" height=\"1024\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/sortvalues_kills-561x1024.jpg\" alt=\"\" class=\"wp-image-1183\" style=\"width:257px;height:auto\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/sortvalues_kills-561x1024.jpg 561w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/sortvalues_kills-164x300.jpg 164w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/sortvalues_kills-33x60.jpg 33w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/sortvalues_kills.jpg 654w\" sizes=\"auto, (max-width: 561px) 100vw, 561px\" \/><\/figure>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">A\u00f1adir argumentos a las llamadas a la API<\/mark><\/strong><\/p>\n\n\n\n<p>20 juegos realmente no es suficiente para evaluar una cuenta, as\u00ed que volvamos a una de nuestras funciones y a\u00f1adamos algunos argumentos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># The original function\ndef <strong>get_match_ids<\/strong>(puuid, mass_region, api_key):\n    api_url = (\n        \"https:\/\/\" +\n        mass_region +\n        \".api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/\" +\n        puuid + \n        \"\/ids?start=0&amp;count=20\" + \n        \"&amp;api_key=\" + \n        api_key\n    )\n    \n    print(api_url)\n    \n    resp = requests.get(api_url)\n    match_ids = resp.json()\n    return match_ids <\/code><\/pre>\n\n\n\n<p>Como puedes ver en la funci\u00f3n original ya hay un argumento para \u00abcount=20\u00bb, as\u00ed que todo lo que tenemos que hacer es sustituirla por una variable de nuestra elecci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Updated function<\/strong> where you can set how many games you want to play\ndef <strong>get_match_ids<\/strong>(puuid, mass_region, no_games, api_key):\n    api_url = (\n        \"https:\/\/\" +\n        mass_region +\n        \".api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/\" +\n        puuid + \n        \"\/ids?start=0\" + \n        \"&amp;count=\" +\n        str(no_games) + \n        \"&amp;api_key=\" + \n        api_key\n    )\n    \n    print(api_url)\n    \n    resp = requests.get(api_url)\n    match_ids = resp.json()\n    return match_ids<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>no_games = 25 # Leave it at 25 for now\n\nmatch_ids = get_match_ids(puuid, mass_region, no_games, api_key)\n\nprint(len(match_ids))<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;EUROPE.api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ\/ids?start=0&amp;count=25&amp;api_key=RGAPI-0f2ead89-905c-4393-8bd6-c0123456789\n<strong>25<\/strong><\/code><\/pre>\n\n\n\n<p>Pero digamos que s\u00f3lo queremos datos de un determinado tipo de cola (usar\u00e9 Solos Clasificados) \u00bfC\u00f3mo sabemos qu\u00e9 argumento utilizar?<\/p>\n\n\n\n<p>Vuelve al portal, regresa a MATCH-V5 (a la izquierda) y abre de nuevo \u00ab\/lol\/match\/v5\/matches\/by-puuid\/{puuid}\/ids\u00bb \\<\/p>\n\n\n\n<p>Despl\u00e1zate hasta la parte inferior y vuelve a rellenar el formulario con el mismo puuid, regi\u00f3n y app Excepto esta vez, tambi\u00e9n a\u00f1adir \u00ab420\u00bb a la \u00abcola\u00bb de entrada a continuaci\u00f3n, EJECUTAR SOLICITUD<\/p>\n\n\n\n<p>Copia y pegua la URL de la SOLICITUD:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'https:\/\/europe.api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ\/ids?queue=420&amp;start=0&amp;count=20&amp;api_key=RGAPI-552af7d9-284b-42d1-bec4-123456789'<\/code><\/pre>\n\n\n\n<p>Como puedes ver, hay un nuevo argumento: \u00abqueue=420\u00bb<\/p>\n\n\n\n<p>Si te preguntas d\u00f3nde encontrar todos los tipos de cola, puedes ir aqu\u00ed:\u00a0<a href=\"https:\/\/static.developer.riotgames.com\/docs\/lol\/queues.json\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/static.developer.riotgames.com\/docs\/lol\/queues.json<\/a><\/p>\n\n\n\n<p>Simplemente busca el tipo de cola que quieras en la descripci\u00f3n y sustituye \u00abqueue\u00bb por el queueId.<\/p>\n\n\n\n<p>A\u00f1adamos esto a nuestra funci\u00f3n<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Updated function<\/strong> in which you can set from which queue to take the data.\ndef get_match_ids(puuid, mass_region, no_games, queue_id, api_key):\n    api_url = (\n        \"https:\/\/\" +\n        mass_region +\n        \".api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/\" +\n        puuid + \n        \"\/ids?start=0\" + \n        \"&amp;count=\" +\n        str(no_games) + \n        \"&amp;queue=\" + \n        str(queue_id) + \n        \"&amp;api_key=\" + \n        api_key\n    )\n    \n    print(api_url)\n    \n    resp = requests.get(api_url)\n    match_ids = resp.json()\n    return match_ids  <\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>queue_id = 420\n\nmatch_ids = get_match_ids(puuid, mass_region, no_games, queue_id, api_key)\n<strong>match_ids<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;EUROPE.api.riotgames.com\/lol\/match\/v5\/matches\/by-puuid\/3U7K7AmFQldQCNlJ9m5OwFRhrIrJ6ZsVMpdhS9HDoTj7BlUsjYDTcVeZnYdU8dMudHzxT5yspRkNkQ\/ids?start=0&amp;count=25&amp;queue=420&amp;api_key=RGAPI-0f2ead89-905c-4393-8bd6-c0123456789\n&#91;'EUW1_6832340332',\n 'EUW1_6832299147',\n 'EUW1_6829025866',\n 'EUW1_6828945398',\n 'EUW1_6828887595',\n 'EUW1_6828867611',\n 'EUW1_6828812533',\n 'EUW1_6824214120',\n 'EUW1_6824173176',\n 'EUW1_6824124368',\n 'EUW1_6823607057',\n 'EUW1_6823569193',\n 'EUW1_6816330441',\n 'EUW1_6816300579',\n 'EUW1_6811931211',\n 'EUW1_6811890150',\n 'EUW1_6811856975',\n 'EUW1_6811833682',\n 'EUW1_6811806415',\n 'EUW1_6811800693',\n 'EUW1_6811586364',\n 'EUW1_6811555500',\n 'EUW1_6811498704',\n 'EUW1_6809947413',\n 'EUW1_6809911341']<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Actualicemos la \u00faltima funci\u00f3n para que se ajuste al l\u00edmite de velocidad<\/mark><\/strong><\/p>\n\n\n\n<p>Existe un l\u00edmite para realizar solicitudes a una API en Riot Games, actualmente se establece en 20 solicitudes por segundo y 100 por 2 minutos. Luego la cantidad m\u00e1xima de juegos recientes que se pueden solicitar es 100. Y qu\u00e9 pasa si solicitamos m\u00e1s ? Simplemente nos devuelve un error 429 (Rate limit exceded), lo que significa es que hemos superado nuestro l\u00edmite de peticiones.<\/p>\n\n\n\n<p>As\u00ed que vamos a ampliar la solicitud a 100 partidas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Original function to obtain the party ID\ndef get_match_data(match_id, mass_region, api_key):\n    api_url = (\n        \"https:\/\/\" + \n        mass_region + \n        \".api.riotgames.com\/lol\/match\/v5\/matches\/\" +\n        match_id + \n        \"?api_key=\" + \n        api_key\n    )\n    \n    resp = requests.get(api_url)\n    print(\"Status Code:\", resp.status_code) # We can read the status code directly from the object \"resp\".\n    match_data = resp.json()\n    return match_data     <\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Hagamos una sola funci\u00f3n principal para envolver todo <\/mark><\/strong><\/p>\n\n\n\n<p>Podemos agrupar todas nuestras funciones en una sola:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def <strong>master_function<\/strong>(summoner_name, region, mass_region, no_games, queue_id, api_key):\n    puuid = get_puuid(summoner_name, region, api_key, mass_region)\n    match_ids = get_match_ids(puuid, mass_region, no_games, queue_id, api_key)\n    df = gather_all_data(puuid, match_ids, mass_region, api_key)\n    return df<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>summoner_name = \"IIM ONI\"\nregion = \"euw1\"\nmass_region = \"EUROPE\"\nno_games = 100\nqueue_id = 420<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>df = master_function(summoner_name, region, mass_region, no_games, queue_id, api_key)<\/code><\/pre>\n\n\n\n<p>Ahora que tenemos una funci\u00f3n que nos devuelve los datos de 100 juegos, podemos automatizar un poco imprimiendo alguna informaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># prints some introductory stuff\nprint(\"Hello\", summoner_name, \"of\", region.upper()) # upper just capitalizes the region\nprint(\"Here are some interesting statistics about your last 100 solo ranked games\")\n\n# create a count column\ndf&#91;'count'] = 1 \n\n# the \"agg\" allows us to get the average of each column but adding up the count # see?\nchamp_df = df.groupby('champion').agg({'kills': 'mean', 'deaths': 'mean', 'assists': 'mean', 'win': 'mean', 'count': 'sum'})\n\n# reset in the index to be able to continue using the \"champ\" column\nchamp_df.reset_index(inplace=True)\n\n# we limit it only to champions in which you have played 2 or more matches\nchamp_df = champ_df&#91;champ_df&#91;'count'] >= 2]\n\n# create a kda column\nchamp_df&#91;'kda'] = (champ_df&#91;'kills'] + champ_df&#91;'assists']) \/ champ_df&#91;'deaths']\n\n# sort the table by KDA, starting with the highest one\nchamp_df = champ_df.sort_values('kda', ascending=False) # ascendente determina si es de mayor a menor o viceversa\n\n# assign the first row and the last row to a variable in order to print information about it\nbest_row = champ_df.iloc&#91;0] # .iloc&#91;0] simply takes the first row of the data frame\nworst_row = champ_df.iloc&#91;-1] # .iloc&#91;-1] takes the last row of a data frame\n\nprint(\"Your best KDA is on\", best_row&#91;'champion'], \"with a KDA of\", best_row&#91;'kda'], \"over\", best_row&#91;'count'], \"game\/s\")\nprint(\"Your worst KDA is on\", worst_row&#91;'champion'], \"with a KDA of\", worst_row&#91;'kda'], \"over\", worst_row&#91;'count'], \"game\/s\")\n\n# sort by count\nchamp_df = champ_df.sort_values('count', ascending=False)\n\n# get your most played champ\nrow = champ_df.iloc&#91;0]\n\n# assign and format the win rate\nwin_rate = row&#91;'win']]\nwin_rate = str(round(round(win_rate * 100, 1)) + \"%\"\n\nprint(\"Your highest played Champion is\", row&#91;'champion'], \"with\", row&#91;'count'], 'game\/s', \n     \"and an average Win Rate of\", win_rate)\n\n# finally, sort by the highest number of kills in a game (note, not using the champ_df groupby anymore, but the raw data)\nhighest_kills = df.sort_values('kills', ascending=False)\nrow = highest_kills.iloc&#91;0]\nprint(\"Your highest kill game was with\", row&#91;'champion'], \"where you had\", row&#91;'kills'], \"kills\")<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>Hello IIM ONI of EUW1\nHere are some interesting statistics about your last 100 solo ranked games\nYour best KDA is on Renata with a KDA of 5.833333333333333 over 2 game\/s\nYour worst KDA is on Pyke with a KDA of 1.5 over 2 game\/s\nYour highest played Champion is Yasuo with 11 game\/s and an average Win Rate of 72.7%\nYour highest kill game was with Caitlyn where you had 19 kills<\/strong><\/code><\/pre>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color has-large-font-size wp-elements-5db0ef4405f768cef76025e6b8d38981\"><strong>Visualizaci\u00f3n de Datos con Python<\/strong> <\/p>\n\n\n\n<p>Utilizando herramientas como Pandas, Matplotlib y Seaborn, cre\u00e9 visualizaciones que mostraban tendencias, estad\u00edsticas y patrones interesantes en los datos del juego. Estas visualizaciones me permitieron compartir mis hallazgos de manera efectiva y comprender mejor el mundo de LoL.<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">N\u00famero de partidas jugadas por Campe\u00f3n<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"841\" height=\"600\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/1.png\" alt=\"\" class=\"wp-image-1188\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/1.png 841w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/1-300x214.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/1-768x548.png 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/1-84x60.png 84w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Bar plot to show the number of games played with each champion\nplt.figure(figsize=(10, 6))\nsns.barplot(data=champ_df, x='champion', y='count', estimator=sum, palette='viridis')\nplt.title('Number of Games Played per Champion')\nplt.xlabel('Champion')\nplt.ylabel('Number of Games')\nplt.xticks(rotation=45)\nplt.show()<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Relaci\u00f3n entre asesinatos (kills) y muertes (deaths)<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"693\" height=\"547\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/2.png\" alt=\"\" class=\"wp-image-1189\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/2.png 693w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/2-300x237.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/2-76x60.png 76w\" sizes=\"auto, (max-width: 693px) 100vw, 693px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Scatter plot to show the relationship between kills and deaths\nplt.figure(figsize=(8, 6))\nsns.scatterplot(data=champ_df, x='kills', y='deaths', color='red', alpha=0.5)\nplt.title('Relationship between Kills and Deaths')\nplt.xlabel('Kills')\nplt.ylabel('Deaths')\nplt.show()<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Promedios de asistencias (assists) por campe\u00f3n<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"841\" height=\"600\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/3.png\" alt=\"\" class=\"wp-image-1190\" style=\"width:840px;height:auto\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/3.png 841w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/3-300x214.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/3-768x548.png 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/3-84x60.png 84w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Bar plot to show the average assists per champion\nplt.figure(figsize=(10, 6))\nsns.barplot(data=champ_df, x='champion', y='assists', estimator='mean', palette='magma')\nplt.title('Average Assists per Champion')\nplt.xlabel('Champion')\nplt.ylabel('Average Assists')\nplt.xticks(rotation=45)\nplt.show()\n<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Distribuci\u00f3n del KDA (Asesinatos + Asistencias \/ Muertes)<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"547\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/4.png\" alt=\"\" class=\"wp-image-1191\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/4.png 678w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/4-300x242.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/4-74x60.png 74w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Histogram to show the distribution of KDA (Kills + Assists \/ Deaths)\nplt.figure(figsize=(8, 6))\nsns.histplot(data=champ_df, x='kda', bins=20, color='purple', kde=True)\nplt.title('Distribution of KDA')\nplt.xlabel('KDA')\nplt.ylabel('Number of Games')\nplt.show()<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">N\u00famero de asesinatos (kills) por campe\u00f3n<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"841\" height=\"600\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/5.png\" alt=\"\" class=\"wp-image-1192\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/5.png 841w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/5-300x214.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/5-768x548.png 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/5-84x60.png 84w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Bar plot to show the total number of kills per champion\nplt.figure(figsize=(10, 6))\nsns.barplot(data=champ_df, x='champion', y='kills', estimator=sum, palette='cool')\nplt.title('Total Number of Kills per Champion')\nplt.xlabel('Champion')\nplt.ylabel('Number of Kills')\nplt.xticks(rotation=45)\nplt.show()<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">N\u00famero de muertes (deaths) por campe\u00f3n<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"841\" height=\"600\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/6.png\" alt=\"\" class=\"wp-image-1193\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/6.png 841w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/6-300x214.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/6-768x548.png 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/6-84x60.png 84w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Bar plot to show the total number of deaths per champion\nplt.figure(figsize=(10, 6))\nsns.barplot(data=champ_df, x='champion', y='deaths', estimator=sum, palette='flare')\nplt.title('Total Number of Deaths per Champion')\nplt.xlabel('Champion')\nplt.ylabel('Number of Deaths')\nplt.xticks(rotation=45)\nplt.show()\n<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">N\u00famero de asistencias (assists) por campe\u00f3n<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"841\" height=\"600\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/7.png\" alt=\"\" class=\"wp-image-1194\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/7.png 841w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/7-300x214.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/7-768x548.png 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/7-84x60.png 84w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Bar plot to show the total number of assists per champion\nplt.figure(figsize=(10, 6))\nsns.barplot(data=champ_df, x='champion', y='assists', estimator=sum, palette='rocket')\nplt.title('Total Number of Assists per Champion')\nplt.xlabel('Champion')\nplt.ylabel('Number of Assists')\nplt.xticks(rotation=45)\nplt.show()<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">N\u00famero de partidas ganadas y perdidas por campe\u00f3n<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"841\" height=\"600\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/8.png\" alt=\"\" class=\"wp-image-1195\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/8.png 841w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/8-300x214.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/8-768x548.png 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/8-84x60.png 84w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Bar plot to show the number of games won and lost per champion\nplt.figure(figsize=(10, 6))\nsns.barplot(data=champ_df, x='champion', y='count', hue='win', estimator=sum, palette='husl')\nplt.title('Number of Games Won and Lost per Champion')\nplt.xlabel('Champion')\nplt.ylabel('Number of Games')\nplt.xticks(rotation=45)\nplt.legend(title='Outcome')\nplt.show()<\/code><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Distribuci\u00f3n de KDA por campe\u00f3n<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"833\" height=\"600\" src=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/9.png\" alt=\"\" class=\"wp-image-1196\" srcset=\"https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/9.png 833w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/9-300x216.png 300w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/9-768x553.png 768w, https:\/\/javierladino.com\/es\/wp-content\/uploads\/2024\/05\/9-83x60.png 83w\" sizes=\"auto, (max-width: 833px) 100vw, 833px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Box plot to show the distribution of KDA per champion\nplt.figure(figsize=(10, 6))\nsns.boxplot(data=champ_df, x='champion', y='kda', palette='pastel')\nplt.title('Distribution of KDA per Champion')\nplt.xlabel('Champion')\nplt.ylabel('KDA')\nplt.xticks(rotation=45)\nplt.show()<\/code><\/pre>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color has-large-font-size wp-elements-f728de524442f93445e6943889e34fa8\"><strong>Conclusi\u00f3n<\/strong><\/p>\n\n\n\n<p>Mi viaje desde ser un admirador de <strong>IM ONI<\/strong> hasta convertirme en un profesional en <strong>Ciencia e Ingenier\u00eda de Datos<\/strong> hasta ahora comienza, pero dia a dia ha sido emocionante y gratificante. A trav\u00e9s del an\u00e1lisis y la visualizaci\u00f3n de datos de League of Legends, he podido combinar mi pasi\u00f3n por los videojuegos con mis habilidades t\u00e9cnicas reci\u00e9n adquiridas. Este viaje no solo ha ampliado mi comprensi\u00f3n del juego, sino que tambi\u00e9n ha demostrado el poder y la versatilidad de la Ciencia de Datos en diversos campos de inter\u00e9s. Estoy emocionado de continuar explorando y aprendiendo en este apasionante campo, y espero compartir m\u00e1s de mis hallazgos con ustedes en el futuro. \u00a1Gracias por acompa\u00f1arme en este viaje!<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Fuentes y recursos<\/mark><\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/www.youtube.com\/@CodinEric\" target=\"_blank\" rel=\"noreferrer noopener\">CodinEric &#8211; Youtube<\/a><kbd><strong> <\/strong><\/kbd><\/p>\n\n\n\n<p><a href=\"https:\/\/www.youtube.com\/@itero_gaming\" target=\"_blank\" rel=\"noreferrer noopener\">Jack J &#8211; iTero Gaming &#8211; Youtube<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.riotgames.com\/en\/DevRel\/summoner-names-to-riot-id\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.riotgames.com\/en\/DevRel\/summoner-names-to-riot-id<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/developer.riotgames.com\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/developer.riotgames.com<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/support-leagueoflegends.riotgames.com\/hc\/es-419\/articles\/4406004330643-Niveles-de-clasificatoria-divisiones-y-colas\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/support-leagueoflegends.riotgames.com\/hc\/es-419\/articles\/4406004330643-Niveles-de-clasificatoria-divisiones-y-colas<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/darkintaqt.com\/blog\/ids\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/darkintaqt.com\/blog\/ids<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hola! Comparto con ustedes este viaje personal, como admirador de un gran jugador de League of Legends (LoL) llamado IM ONI, y c\u00f3mo a trav\u00e9s de los datos que ofrece el juego he logrado poco a poco avanzar en mi reconversi\u00f3n profesional hacia la Ciencia y la Ingenier\u00eda de Datos. En esta publicaci\u00f3n, te llevar\u00e9 &hellip; <\/p>\n","protected":false},"author":1,"featured_media":1161,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ngg_post_thumbnail":0},"rara_portfolio_categories":[27],"class_list":["post-1160","rara-portfolio","type-rara-portfolio","status-publish","has-post-thumbnail","hentry","rara_portfolio_categories-dataviz"],"_links":{"self":[{"href":"https:\/\/javierladino.com\/es\/wp-json\/wp\/v2\/rara-portfolio\/1160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/javierladino.com\/es\/wp-json\/wp\/v2\/rara-portfolio"}],"about":[{"href":"https:\/\/javierladino.com\/es\/wp-json\/wp\/v2\/types\/rara-portfolio"}],"author":[{"embeddable":true,"href":"https:\/\/javierladino.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/javierladino.com\/es\/wp-json\/wp\/v2\/comments?post=1160"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/javierladino.com\/es\/wp-json\/wp\/v2\/media\/1161"}],"wp:attachment":[{"href":"https:\/\/javierladino.com\/es\/wp-json\/wp\/v2\/media?parent=1160"}],"wp:term":[{"taxonomy":"rara_portfolio_categories","embeddable":true,"href":"https:\/\/javierladino.com\/es\/wp-json\/wp\/v2\/rara_portfolio_categories?post=1160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}