<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Clean Shot: Tutoriales Python]]></title><description><![CDATA[Los tutoriales de las gráficas con Python en un solo sitio]]></description><link>https://www.thecleanshot.com/s/tutoriales-python</link><image><url>https://substackcdn.com/image/fetch/$s_!ZzxN!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd776cf92-6749-4994-94a6-efb20994dae4_499x499.png</url><title>The Clean Shot: Tutoriales Python</title><link>https://www.thecleanshot.com/s/tutoriales-python</link></image><generator>Substack</generator><lastBuildDate>Tue, 26 May 2026 09:01:03 GMT</lastBuildDate><atom:link href="https://www.thecleanshot.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[The Clean Shot]]></copyright><language><![CDATA[es]]></language><webMaster><![CDATA[thecleanshot@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[thecleanshot@substack.com]]></itunes:email><itunes:name><![CDATA[Ivo Villanueva]]></itunes:name></itunes:owner><itunes:author><![CDATA[Ivo Villanueva]]></itunes:author><googleplay:owner><![CDATA[thecleanshot@substack.com]]></googleplay:owner><googleplay:email><![CDATA[thecleanshot@substack.com]]></googleplay:email><googleplay:author><![CDATA[Ivo Villanueva]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Cómo se extraen las estadísticas de Euroliga en R y en Python]]></title><description><![CDATA[Tabla general de las estadisticas de los jugadores de Euroliga + bonus]]></description><link>https://www.thecleanshot.com/p/como-se-extraen-las-estadisticas</link><guid isPermaLink="false">https://www.thecleanshot.com/p/como-se-extraen-las-estadisticas</guid><dc:creator><![CDATA[Ivo Villanueva]]></dc:creator><pubDate>Fri, 17 Oct 2025 05:59:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!R98B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;4ad1c250-de67-42ae-a72f-e6cedbe5e5d5&quot;,&quot;duration&quot;:null}"></div><p>Hoy uno r&#225;pido, pero creo que bastante &#250;til. El otro d&#237;a tuve la necesidad de buscar las <strong>estad&#237;sticas</strong> <strong>de Euroliga</strong> para uno de los mil proyectos que empiezo (la mayor&#237;a se quedan a la mitad). Y me pareci&#243; que podr&#237;a ser <strong>interesante</strong> dar a conocer el <strong>m&#233;todo</strong>.</p><p>Ya dije <strong><a href="https://open.substack.com/pub/thecleanshot/p/como-se-hace-extraer-play-by-play?r=5jw295&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcomeOnShare=false">en uno de los primeros post </a></strong>que iba a ense&#241;ar la manera dificil de extraer datos de la Euroliga, pero ahora que lo veo, esta forma es mas f&#225;cil que la <strong>api.</strong></p><p>Para asegurarnos de cu&#225;l enlace tiene la tabla, bot&#243;n derecho y le damos a inspeccionar.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;d2b32d7c-da90-4e9a-bb42-05cebb81e1b3&quot;,&quot;duration&quot;:null}"></div><h3>C&#243;digo en R</h3><p>Una vez que tenemos el enlace copiado, cargamos las librer&#237;as, que esta vez son pocas.</p><pre><code>library(tidyverse)
library(httr)</code></pre><p>El c&#243;digo completo en R es este:</p><pre><code>url&lt;- &#8220;https://feeds.incrowdsports.com/provider/euroleague-feeds/v3/competitions/E/statistics/players/traditional?seasonMode=Single&amp;limit=1000&amp;sortDirection=descending&amp;seasonCode=E2025&amp;statisticMode=perGame&amp;statisticSortMode=perGame&#8221;

raw_players &lt;- GET(url) %&gt;% content()

players &lt;- pluck(raw_players, &#8220;players&#8221;) %&gt;%
  tibble(value = .) %&gt;%
  unnest_wider(value) %&gt;% 
  unnest_wider(player) %&gt;% 
  unnest_wider(team, names_sep = &#8220;_&#8221;)</code></pre><p>Y nos devuelve esto</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R98B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R98B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png 424w, https://substackcdn.com/image/fetch/$s_!R98B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png 848w, https://substackcdn.com/image/fetch/$s_!R98B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png 1272w, https://substackcdn.com/image/fetch/$s_!R98B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R98B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png" width="1456" height="410" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:410,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:216557,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/176301077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!R98B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png 424w, https://substackcdn.com/image/fetch/$s_!R98B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png 848w, https://substackcdn.com/image/fetch/$s_!R98B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png 1272w, https://substackcdn.com/image/fetch/$s_!R98B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf7873-0d68-44d3-ad61-41b70ae173c9_2086x588.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.thecleanshot.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#191;Te parece interesante este contenido? Considera, por favor, ayudarme mejorando tu suscripci&#243;n.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>
      <p>
          <a href="https://www.thecleanshot.com/p/como-se-extraen-las-estadisticas">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Cómo extraer tabla pretemporada El Rincón del SuperManager]]></title><description><![CDATA[En &#128013; Pythoon y en R]]></description><link>https://www.thecleanshot.com/p/como-extraer-tabla-pretemporada-el</link><guid isPermaLink="false">https://www.thecleanshot.com/p/como-extraer-tabla-pretemporada-el</guid><dc:creator><![CDATA[Ivo Villanueva]]></dc:creator><pubDate>Fri, 19 Sep 2025 08:30:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fUFJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Todo el m&#233;rito y el cr&#233;dito para <strong>El Rinc&#243;n</strong>: <a href="https://www.rincondelmanager.com/smgr/pretemporada.php">esta tabla</a> se la curra a mano, metiendo uno a uno los datos a partir de las fotos de las actas de los partidos. Es una informaci&#243;n muy importante e imprescindible. Pero, la extracci&#243;n tiene cierta dificultad que me sirve estupendamente para mis fines pedag&#243;gicos.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fUFJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fUFJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png 424w, https://substackcdn.com/image/fetch/$s_!fUFJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png 848w, https://substackcdn.com/image/fetch/$s_!fUFJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png 1272w, https://substackcdn.com/image/fetch/$s_!fUFJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fUFJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png" width="2442" height="1656" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1656,&quot;width&quot;:2442,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:632465,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/173969828?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a927b7-9af4-488f-8fef-f4a0907a56c5_2658x1680.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fUFJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png 424w, https://substackcdn.com/image/fetch/$s_!fUFJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png 848w, https://substackcdn.com/image/fetch/$s_!fUFJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png 1272w, https://substackcdn.com/image/fetch/$s_!fUFJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4ce916-9fe0-492f-a661-c66b5deee1d9_2442x1656.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Este tutorial va a explicar como hacerlo en &#128013; y y en R &#128187;.</p><h3>&#128013; C&#243;digo en Python</h3><p>No me voy a entretener mucho explicando cada l&#237;nea. Vamos a lo pr&#225;ctico, que es lo que interesa.</p><h4>Cargamos las librer&#237;as</h4><p>Las t&#237;picas para scraping, limpieza y manipulaci&#243;n de datos:</p><pre><code>import pandas as pd
import polars as pl, requests
import janitor.polars
from bs4 import BeautifulSoup</code></pre><h4>Creamos un elemento con la URL</h4><p>Vamos a trabajar con la web de pretemporada del Rinc&#243;n. Aqu&#237; est&#225; el enlace:</p><pre><code>url = "https://www.rincondelmanager.com/smgr/pretemporada.php"</code></pre><h4>Extraemos los nombres de los jugadores y su bandera</h4><p>Las filas no siempre coinciden, as&#237; que a&#241;adimos una condici&#243;n para evitar errores cuando el <code>div</code> con la bandera est&#225; vac&#237;o. Si no hay bandera, devuelve <code>NULL</code></p><pre><code>headers = {"User-Agent": "Mozilla/5.0"}
res = requests.get(url, headers = headers)
soup = BeautifulSoup(res.text, "html.parser")

jugador = soup.select(".jugador a[href]")

dfbanderas = pl.DataFrame({
     "jugador": [a.get_text(strip=True) for a in jugador],
     "bandera": [
    " ".join(j.find("div").get("class"))
    if (j.find("div") is not None and j.find("div").get("class"))
    else None
    for j in jugador
]

})
dfbanderas</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_1x0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_1x0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png 424w, https://substackcdn.com/image/fetch/$s_!_1x0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png 848w, https://substackcdn.com/image/fetch/$s_!_1x0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png 1272w, https://substackcdn.com/image/fetch/$s_!_1x0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_1x0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png" width="224" height="323.55555555555554" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:360,&quot;resizeWidth&quot;:224,&quot;bytes&quot;:46223,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/173969828?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_1x0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png 424w, https://substackcdn.com/image/fetch/$s_!_1x0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png 848w, https://substackcdn.com/image/fetch/$s_!_1x0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png 1272w, https://substackcdn.com/image/fetch/$s_!_1x0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e1e38e7-1c5b-4de8-8f1b-9ee3132b1e0a_360x520.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Extraemos la tabla principal</h4><p>Usamos <code>read_html</code> desde pandas y luego convertimos a <code>polars</code>, limpiando los nombres para que no haya l&#237;os con espacios, tildes, etc.</p><pre><code>url = "https://www.rincondelmanager.com/smgr/pretemporada.php"
df = pl.from_pandas(
    pd.read_html(
        url, thousands=".", decimal=",", storage_options={"User-Agent": "Mozilla/5.0"}
    )[0]
).clean_names(remove_special=True, strip_underscores=True)
df</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ClGS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ClGS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png 424w, https://substackcdn.com/image/fetch/$s_!ClGS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png 848w, https://substackcdn.com/image/fetch/$s_!ClGS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png 1272w, https://substackcdn.com/image/fetch/$s_!ClGS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ClGS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png" width="1076" height="498" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:498,&quot;width&quot;:1076,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:107590,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/173969828?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ClGS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png 424w, https://substackcdn.com/image/fetch/$s_!ClGS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png 848w, https://substackcdn.com/image/fetch/$s_!ClGS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png 1272w, https://substackcdn.com/image/fetch/$s_!ClGS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ecfa6aa-5425-483b-b23e-c44a7d47414f_1076x498.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Juntamos las dos tablas</h4><p>Hacemos un <code>join</code> por el nombre del jugador y seleccionamos solo las columnas clave, ya ordenadas:</p><pre><code>tabla = (df.join(dfbanderas, on="jugador", how="left")
        .select(["jug", "jugador", "bandera", "eq", "pos", "broker", "jug_1", "pts", "val", "val_est", "rent"]))
tabla</code></pre><p>Y ya estar&#237;a. Una tabla limpia, con nombres, banderas y todas las estad&#237;sticas ordenadas. Sin tocar nada a mano y lista para usar en lo que necesites.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Hr-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Hr-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png 424w, https://substackcdn.com/image/fetch/$s_!4Hr-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png 848w, https://substackcdn.com/image/fetch/$s_!4Hr-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png 1272w, https://substackcdn.com/image/fetch/$s_!4Hr-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Hr-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png" width="1184" height="508" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:508,&quot;width&quot;:1184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:115883,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/173969828?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4Hr-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png 424w, https://substackcdn.com/image/fetch/$s_!4Hr-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png 848w, https://substackcdn.com/image/fetch/$s_!4Hr-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png 1272w, https://substackcdn.com/image/fetch/$s_!4Hr-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96212d0d-c356-4507-b3bd-5a91ffd85c94_1184x508.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>&#128190; Guardamos el archivo en CSV</h4><p>Para terminar, guardamos la tabla final en un <code>.csv</code>, que siempre viene bien tenerlo listo para reutilizar:</p><pre><code>tabla.write_csv("tabla_pretemporada.csv")</code></pre><p></p><div><hr></div><h3>&#129514; C&#243;digo en R</h3><p>Ahora s&#237;, vamos con R. Aqu&#237; no hay complicaci&#243;n ni magia negra, pero s&#237; algunas cosas que conviene explicar para que todo funcione bien.</p><h4>Cargamos las librer&#237;as</h4><p>Necesitamos las de siempre para scraping y manipulaci&#243;n b&#225;sica:</p><pre><code>library(tidyverse)
library(rvest)
library(janitor)
library(xml2)</code></pre><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.thecleanshot.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Te gusta este contenido? Dame por favor un <em>empujonsito</em> con una <strong>suscripci&#243;n de pago</strong>.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>
      <p>
          <a href="https://www.thecleanshot.com/p/como-extraer-tabla-pretemporada-el">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Cómo hacer Great Tables en Python y R]]></title><description><![CDATA[Incluyo el c&#243;digo completo en ambos lenguajes.]]></description><link>https://www.thecleanshot.com/p/como-hacer-great-tables-en-python</link><guid isPermaLink="false">https://www.thecleanshot.com/p/como-hacer-great-tables-en-python</guid><dc:creator><![CDATA[Ivo Villanueva]]></dc:creator><pubDate>Fri, 05 Sep 2025 03:00:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/11268278-3596-4a45-aedb-d55f66bfa0ce_2292x3234.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hola a todos,</p><p>El tutorial de hoy muestra c&#243;mo cree esta tabla en <strong>Python</strong> y en <strong>R. </strong>De la p&#225;gina de <a href="https://www.proballers.com/basketball/player/65439/dzanan-musa/totals">Proballers.com</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YbdN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YbdN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png 424w, https://substackcdn.com/image/fetch/$s_!YbdN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png 848w, https://substackcdn.com/image/fetch/$s_!YbdN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png 1272w, https://substackcdn.com/image/fetch/$s_!YbdN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YbdN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png" width="1456" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:631252,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172748780?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YbdN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png 424w, https://substackcdn.com/image/fetch/$s_!YbdN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png 848w, https://substackcdn.com/image/fetch/$s_!YbdN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png 1272w, https://substackcdn.com/image/fetch/$s_!YbdN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc314d491-8b19-482b-bdc0-9b59e2e786c1_3042x1316.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0I5S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0I5S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png 424w, https://substackcdn.com/image/fetch/$s_!0I5S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png 848w, https://substackcdn.com/image/fetch/$s_!0I5S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png 1272w, https://substackcdn.com/image/fetch/$s_!0I5S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0I5S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png" width="1456" height="2181" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2181,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:775205,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172748780?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0I5S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png 424w, https://substackcdn.com/image/fetch/$s_!0I5S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png 848w, https://substackcdn.com/image/fetch/$s_!0I5S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png 1272w, https://substackcdn.com/image/fetch/$s_!0I5S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5236b0ba-8a6f-412c-8df9-a22526ba81e6_1892x2834.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> Mi lenguaje principal es <strong>R</strong> y es con el que hago los &#225;nalisis porque lo tengo mas automatizado y porque hasta ahora la calidad de las visualizaciones estaban, a mi parecer, a a&#241;os luz (de mejores) de las de <strong>Python</strong>. Pero con la implementaci&#243;n de la librer&#237;as<code> gt() y gtExtras()</code> (<code>great_tables gt_extras</code> en <strong>Python</strong>) ahora ya el lenguaje que elijas es igual, reconozco que Python es mucho m&#225;s popular y es el que conoce y piden en todos lados, y aunque todav&#237;a no est&#225; igual al 100%, por ejemplo no est&#225; intregrado poner superindices, que es la diferenc&#237;a fundamental con la tabla hecha con <strong>R,</strong> si que el 98% es pr&#225;cticamente igual.</p><p>Comenzaremos en <strong>Python</strong> y luego paseremos a <strong>R</strong></p><div><hr></div><h2>C&#243;digo en Python &#128013;</h2><p>Empezamos cargando las librer&#237;as</p><pre><code>import polars as pl, pandas as pd, requests #extraer, transformar, cargar, descargar Json
from bs4 import BeautifulSoup # parsear HTML
from urllib.parse import urljoin # rutas absolutas
from great_tables import GT, md, loc, style # tabla GT / formatos
import gt_extras as gte # extras GT (resaltados)
import polars.selectors as cs # seleccionar num&#233;ricas
from selenium import webdriver # exportar PNG (GT)
from PIL import Image, ImageOps  # margen PNG (post)</code></pre><p>Aprovecho para recordar que uso Jupiter NoteBooks, por lo que cada bloque de c&#243;digo es un chunk en el archivo original mi escritorio se ve as&#237;:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ynW1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ynW1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png 424w, https://substackcdn.com/image/fetch/$s_!ynW1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png 848w, https://substackcdn.com/image/fetch/$s_!ynW1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png 1272w, https://substackcdn.com/image/fetch/$s_!ynW1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ynW1!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png" width="1200" height="750" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:1119865,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172748780?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ynW1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png 424w, https://substackcdn.com/image/fetch/$s_!ynW1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png 848w, https://substackcdn.com/image/fetch/$s_!ynW1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png 1272w, https://substackcdn.com/image/fetch/$s_!ynW1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcae951a8-0d15-42bd-a75a-ad0910eabf39_3360x2100.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p>Comentar que escribo el c&#243;digo Python como si estuviera escribiendolo en R, por lo que a lo mejor es diferente a lo que se ve en otros lados.</p></blockquote><p>Cargamos la url, y mediante pandas y polars extraemos la primera tabla por eso el <strong>[0],</strong> limpiamos y corregimos los nombres de las columnas, las seleccionamos, cambiamos el nombre de <strong>eff</strong> por el de <strong>val</strong>. Como la tabla son totales, dividimos todo por los partidos jugados y redondeamos, solo a minutos (sin segundos) la columna min, y las dem&#225;s con 1 decimal</p><pre><code>url = "https://www.proballers.com/basketball/player/65439/dzanan-musa/totals"
df = (
    pl.from_pandas(pd.read_html(url, storage_options={"User-Agent": "Mozilla/5.0"})[0])
    .clean_names(remove_special=True, strip_underscores=True)
    .select(
        "season",
        "team",
        "league",
        "gp",
        "min",
        "pts",
        "reb",
        "ast",
        "stl",
        "to",
        "blk",
        pl.col("eff").alias("val"),
    )
).with_columns(
    ((cs.numeric().exclude("gp", "min")) / pl.col("gp")).round(1),  # todas las num&#233;ricas &#8800; gp,min
    ((pl.col("min") / pl.col("gp")).round().cast(pl.Int8)),          # min: 0 decimales
)
df </code></pre><p>El resultado de este bloque se ve en la foto de arriba</p><p>Ahora necesitamos una serie de datos en forma de tablas para enriquecer los datos y poder conseguir una visualizaci&#243;n que den ganas de verla.</p><p>Tenemos que  extraer a parte, los logos, los nombres de los equipos y hacer una tabla con el fin de unirla a la de los datos. Esto ya lo expliqu&#233; en otros tutoriales: bot&#243;n derecho y buscamos los elementos. </p><blockquote><p>Un detalle al final ver&#225;s que hay una linea (.unique) que es para quitar de la tabla  los nombres que se repiten, debido a los a&#241;os que juega en cada equipo. Si los dejaramos, nos duplicar&#237;a al unir la tabla tantas veces como se repitiera el nombre.</p></blockquote><pre><code># Dataframe con los nombres de equipo y sus logos

headers = {"User-Agent": "Mozilla/5.0"}
res = requests.get(url, headers = headers)
soup = BeautifulSoup(res.text, "html.parser")

links = soup.select(".show .second__left img[src]") #logos
links2 = soup.select(".show .second__left a[title]") # nombres de equipo

#Tabla con ambas cosas

dfLogos = pl.DataFrame({
     "team": [a.get_text(strip=True) for a in links2],
    "url_logo":   [img["src"] for img in links]
}).unique(subset=["team"], keep="first", maintain_order=True)
</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tA1V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tA1V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png 424w, https://substackcdn.com/image/fetch/$s_!tA1V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png 848w, https://substackcdn.com/image/fetch/$s_!tA1V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png 1272w, https://substackcdn.com/image/fetch/$s_!tA1V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tA1V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png" width="672" height="370" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65fbeff4-222c-4cdf-a856-85f720374800_672x370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:370,&quot;width&quot;:672,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55810,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172748780?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tA1V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png 424w, https://substackcdn.com/image/fetch/$s_!tA1V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png 848w, https://substackcdn.com/image/fetch/$s_!tA1V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png 1272w, https://substackcdn.com/image/fetch/$s_!tA1V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fbeff4-222c-4cdf-a856-85f720374800_672x370.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p><strong>Disclaimer:</strong><br>Estas tareas tan minuciosas y tediosas &#8212;como hacer tablas de equivalencias entre los nombres de liga en Proballers y sus nombres reales, o buscar los colores oficiales de los equipos&#8212; me llevar&#237;an unos cuantos minutos si tuviera que hacerlas a mano.</p><p>Pero se resuelven con algo tan simple como pedirle a ChatGPT que busque esas equivalencias por m&#237;&#8230; y que me monte una tabla con lo que necesito.</p></blockquote><p>Hacemos una con las de las ligas (GPT)</p><pre><code>ligas = pl.DataFrame(
    {
        "league": ["ABA-1", "CRO-1 Up", "CRO-1", "USA-1", "USA-2", "TUR-1", "SPA-1"],
        "liga":   ["ABA League", "Premijer Liga (Fase por el t&#237;tulo)", "Premijer Liga (Croacia)",
                   "NBA", "G League", "BSL (T&#252;rkiye)", "ACB"],
    },
    ) # categoriza 'league'
ligas</code></pre><blockquote><p>A partir de aqu&#237;, me har&#237;as muy feliz si me ayudas a sacar este proyecto adelante mejorando tu suscripci&#243;n.</p><p>Gracias por adelantado.</p></blockquote>
      <p>
          <a href="https://www.thecleanshot.com/p/como-hacer-great-tables-en-python">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Cómo se hace: Gráfica de lineas y puntos Euroliga]]></title><description><![CDATA[En Python &#128013; y en R]]></description><link>https://www.thecleanshot.com/p/como-se-hace-grafica-de-lineas-y</link><guid isPermaLink="false">https://www.thecleanshot.com/p/como-se-hace-grafica-de-lineas-y</guid><dc:creator><![CDATA[Ivo Villanueva]]></dc:creator><pubDate>Fri, 29 Aug 2025 03:00:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/81c80721-d1a8-463a-963c-f00fc70dbe2f_992x558.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qIqh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qIqh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png 424w, https://substackcdn.com/image/fetch/$s_!qIqh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png 848w, https://substackcdn.com/image/fetch/$s_!qIqh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png 1272w, https://substackcdn.com/image/fetch/$s_!qIqh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qIqh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png" width="4854" height="2778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2778,&quot;width&quot;:4854,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1154461,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172149020?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f3cecee-8f56-4806-adf3-28892f5eda21_4854x3000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qIqh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png 424w, https://substackcdn.com/image/fetch/$s_!qIqh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png 848w, https://substackcdn.com/image/fetch/$s_!qIqh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png 1272w, https://substackcdn.com/image/fetch/$s_!qIqh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8747dbf5-1529-4d03-84a7-519878ae5463_4854x2778.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Con R</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Syna!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Syna!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png 424w, https://substackcdn.com/image/fetch/$s_!Syna!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png 848w, https://substackcdn.com/image/fetch/$s_!Syna!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png 1272w, https://substackcdn.com/image/fetch/$s_!Syna!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Syna!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png" width="10113" height="5819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:5819,&quot;width&quot;:10113,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3054111,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172149020?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8a9b56-17af-4b98-9b21-483911b9f33b_10113x6405.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Syna!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png 424w, https://substackcdn.com/image/fetch/$s_!Syna!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png 848w, https://substackcdn.com/image/fetch/$s_!Syna!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png 1272w, https://substackcdn.com/image/fetch/$s_!Syna!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd04c2789-36e0-4703-ae2b-38e4f8588ccf_10113x5819.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Con Python</figcaption></figure></div><p>&#191;Qu&#233; tal todo?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LKyR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LKyR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif 424w, https://substackcdn.com/image/fetch/$s_!LKyR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif 848w, https://substackcdn.com/image/fetch/$s_!LKyR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif 1272w, https://substackcdn.com/image/fetch/$s_!LKyR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LKyR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif" width="992" height="558" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:558,&quot;width&quot;:992,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136084,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/avif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172149020?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LKyR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif 424w, https://substackcdn.com/image/fetch/$s_!LKyR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif 848w, https://substackcdn.com/image/fetch/$s_!LKyR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif 1272w, https://substackcdn.com/image/fetch/$s_!LKyR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f52fe26-ea0f-4466-bde3-f1187063d0e4_992x558.avif 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Mientras pueda, tenga tiempo y sepa c&#243;mo hacerlo, compartir&#233; con los suscriptores premium el c&#243;digo R y el c&#243;digo Python, como si una piedra de Rosseta se tratara, la verdad es que ambos lenguajes son muy similares; creo que R es posterior y por eso muchas funciones y maneras de escribir c&#243;digo son mas cortas y eficientes y posee una mayor y mejor capacidad gr&#225;fica. Al final todo se puede hacer con todo, pero mientras en uno, son dos palabras, en otro pueden ser 10 lineas.</p><p>No se si se percibe, pero a mi me gusta resumir mucho al escribir c&#243;digo y prefiero la eficiencia, quiz&#225;s porque al ser autodidacta no he aprendido bajo la disciplina de ning&#250;n profesor, ni de ning&#250;n curso. Es algo que recomiendo.</p><p>Yo aprend&#237; a base de imponerme proyectos. Cuando encontraba lo que quer&#237;a hacer preguntaba y pregunto a todo el mundo, buscaba y busco turoriales por todas partes. Una cosa que quiero agradecer es la facilidad y la buena disposici&#243;n de verdaderos cracks como <a href="https://thef5.substack.com/">Owen </a><strong><a href="https://thef5.substack.com/">Philips</a> , <a href="https://x.com/issa_madjid">Abdoul Madjid</a> o <a href="https://gradientdescending.com/">Dan Oehm</a></strong> y muchos otros que  han tenido tanta paciencia conmigo. Lo cierto es que <em><strong>breaba y breo</strong></em> a mucha gente &#128514;, porque: ya s&#233; que no... pero y si s&#237;.</p><div><hr></div><h2>Codigo R</h2><p>C&#243;mo siempre las librerias. Tengo que confesar que me he cambiado de portatil y hasta que vuelva a cargar todo tal y como lo ten&#237;a en el antiguo pues&#8230; Bueno, ponemos las lbrerias, las fuentes y mi tema ( tambi&#233;n podeis simplemente poner <code>theme_minimal() </code>en el plot)</p><pre><code>library(tidyverse)
library(rvest)
library(janitor)
library(shadowtext)
library(ggtext)
library(extrafont)
library(sysfonts)
library(showtext)

font_add(family = "oswald", regular = "Oswald-VariableFont_wght.ttf")
font_add(family = "oswaldbold", regular = "Oswald-Bold.ttf")
font_add(family = "Font Awesome 6 Brands", regular = "fa-brands-400.ttf")

showtext_auto()
showtext_opts(dpi = 320)

#mi tema
theme_ivo &lt;- function () {
  theme_minimal(base_size=9, base_family="oswald") %+replace%
    theme(
      panel.grid.minor = element_blank(),
      plot.background = element_rect(fill = 'white', color = "white")
    )
}</code></pre><p>Si quereis saber c&#243;mo se llama y donde teneis alguna fuente en vuestro sistema teclead</p><pre><code>font_files() %&gt;% tibble() %&gt;% filter(str_detect(family,"Oswald"))</code></pre><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w1Lq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w1Lq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png 424w, https://substackcdn.com/image/fetch/$s_!w1Lq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png 848w, https://substackcdn.com/image/fetch/$s_!w1Lq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png 1272w, https://substackcdn.com/image/fetch/$s_!w1Lq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w1Lq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png" width="1456" height="164" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:164,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59159,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172149020?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w1Lq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png 424w, https://substackcdn.com/image/fetch/$s_!w1Lq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png 848w, https://substackcdn.com/image/fetch/$s_!w1Lq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png 1272w, https://substackcdn.com/image/fetch/$s_!w1Lq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af7bfb3-bb2b-4bed-8dbb-b4ecc7109768_1528x172.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Luego el nombre que hay poner es el que est&#225; debajo de la columna <strong>family</strong>, como vere&#237;s en el primer rectangulo, yo he cambiado el nombre para diferenciar el <em>face bold del Regular</em></p><h3>Scraping Data</h3><p>Vamos a usar los datos de la web <em><strong><a href="https://basketball.realgm.com/international/league/1/Euroleague/team-stats/2025/points/Team_Totals">RealGM</a> </strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-M-1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-M-1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png 424w, https://substackcdn.com/image/fetch/$s_!-M-1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png 848w, https://substackcdn.com/image/fetch/$s_!-M-1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png 1272w, https://substackcdn.com/image/fetch/$s_!-M-1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-M-1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png" width="1456" height="678" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:678,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:454769,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/172149020?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-M-1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png 424w, https://substackcdn.com/image/fetch/$s_!-M-1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png 848w, https://substackcdn.com/image/fetch/$s_!-M-1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png 1272w, https://substackcdn.com/image/fetch/$s_!-M-1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4644d95f-fb8d-4b92-a64c-4be73f45fa8f_2930x1364.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Si quereis los datos de un solo a&#241;o tecleais esto</p><pre><code>df &lt;-"https://basketball.realgm.com/international/league/1/Euroleague/team-stats/2025/Averages/Team_Totals" %&gt;%
  read_html() %&gt;%
  html_element("table") %&gt;%
  html_table() %&gt;%
  clean_names() %&gt;%
  select(team, fgm, fga, fg_percent, x3pm, x3pa, x3p_percent) %&gt;%
  mutate(x2pa = fga- x3pa) %&gt;% #no hay columna de intentos de 2
  summarise(x2pa_media = mean(x2pa),
            x3pa_media = mean(x3pa))</code></pre><p>C&#243;mo dije mas arriba me gusta ahorrar y a la vez que descargo los datos los limpio los selecciono y creo las columnas.</p><p>Ahora vamos a sacar los datos de los &#250;ltimos 20 a&#241;os</p><blockquote><p>Si te gusta lo que lees, p&#225;sate a pago y te llevas el resto del an&#225;lisis + el c&#243;digo R y Python (formato &#8220;piedra de Rosetta&#8221;,&#128584;). Con tu apoyo puedo seguir picando piedra y compartir lo que aprendo. &#127936;</p></blockquote>
      <p>
          <a href="https://www.thecleanshot.com/p/como-se-hace-grafica-de-lineas-y">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Cómo se hace: Extraer Play By Play API Euroliga]]></title><description><![CDATA[Usando Python y crear un Dataframe usable y amigable.]]></description><link>https://www.thecleanshot.com/p/como-se-hace-extraer-play-by-play</link><guid isPermaLink="false">https://www.thecleanshot.com/p/como-se-hace-extraer-play-by-play</guid><dc:creator><![CDATA[Ivo Villanueva]]></dc:creator><pubDate>Fri, 22 Aug 2025 03:00:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d0ff715d-734d-4c34-a712-5d86b628f198_2624x1736.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Tras unos d&#237;as de descanso pensando en cosas&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ovSB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ovSB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif 424w, https://substackcdn.com/image/fetch/$s_!ovSB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif 848w, https://substackcdn.com/image/fetch/$s_!ovSB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif 1272w, https://substackcdn.com/image/fetch/$s_!ovSB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ovSB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif" width="728" height="546" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:165,&quot;width&quot;:220,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:320288,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/171512096?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ovSB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif 424w, https://substackcdn.com/image/fetch/$s_!ovSB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif 848w, https://substackcdn.com/image/fetch/$s_!ovSB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif 1272w, https://substackcdn.com/image/fetch/$s_!ovSB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde2a32d6-63fc-44e7-9686-c76e306bc2a4_220x165.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Bueno, pensando en la nada. &#128517;; hablando con algunos suscriptores premium me surgi&#243; la idea de crear algo &#250;til tambi&#233;n en <strong>Python</strong>, adem&#225;s de R. No porque sea m&#225;s f&#225;cil (&#161;no lo es!), sino porque es un lenguaje m&#225;s popular y quiz&#225; m&#225;s accesible para mucha gente.</p><p>&#128073; En este post voy a mostrar la forma m&#225;s sencilla de conseguir datos de la Euroliga usando la librer&#237;a <code>euroleague_api</code>. M&#225;s adelante, tambi&#233;n en exclusiva para suscriptores premium, compartir&#233; el camino dif&#237;cil: <strong>c&#243;mo extraer los datos directamente de la p&#225;gina oficial de Euroleague</strong>.</p><p>De momento voy a dar por hecho que ten&#233;is unas nociones b&#225;sicas de Python y Jupyter Notebooks (yo suelo trabajar en VSCode).</p><p>Tambi&#233;n aviso: para el <em>data wrangling</em> voy a usar <strong>Polars</strong> en lugar de Pandas. &#191;La raz&#243;n? Viniendo del Tidyverse de R, Pandas me parece un dolor de muelas y una casta&#241;a.</p><p>A m&#237; me gusta escribir el c&#243;digo en Notebooks porque me permite controlar mejor cada resultado.</p><h3>Instalaci&#243;n de librer&#237;as</h3><p>Si a&#250;n no tienes las librer&#237;as, abre tu terminal y escribe:</p><pre><code>pip install -U pyjanitor polars euroleague-api </code></pre><blockquote><p>El par&#225;metro <code>-U</code> actualiza a la &#250;ltima versi&#243;n en caso de que ya las tengas instaladas.</p></blockquote><h3>Primeros imports en Python</h3><pre><code>import polars as pl
import janitor.polars
from euroleague_api.play_by_play_data import PlayByPlay</code></pre><p>Con esto ya tenemos lo necesario para empezar a trabajar.</p><p>En este ejemplo vamos a extraer el <strong>play-by-play completo de la &#250;ltima temporada en Euroliga</strong>.<br><strong><a href="https://github.com/giasemidis/euroleague_api?tab=readme-ov-file">Aqu&#237; </a></strong>tienes el enlace a toda la documentaci&#243;n de la API por si prefieres sacar cualquier otro dataset disponible.</p><p><em>(Tip: para EuroCup solo hay que cambiar la &#8220;E&#8221; por la &#8220;U&#8221;. El a&#241;o siempre corresponde al primero de la temporada: por ejemplo, la 24-25 se escribe como 2024).</em></p><pre><code>competition_code = "E"  #  Rrecuerda EuroLeague ("E"), EuroCup suele ser "U"

# 1) Instanciar
pbp = PlayByPlay(competition_code)

# 2) Descargar toda la temporada (devuelve pandas.DataFrame)
pbp_df = pbp.get_game_play_by_play_data_single_season(season=2024)</code></pre><p>As&#237; es como lo veo yo, y as&#237; se ver&#237;a si trabajas con VSCode y Jupyter Notebooks, tal como coment&#233; antes</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n2H5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n2H5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png 424w, https://substackcdn.com/image/fetch/$s_!n2H5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png 848w, https://substackcdn.com/image/fetch/$s_!n2H5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png 1272w, https://substackcdn.com/image/fetch/$s_!n2H5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n2H5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png" width="1456" height="770" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:770,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:576057,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thecleanshot.substack.com/i/171512096?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!n2H5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png 424w, https://substackcdn.com/image/fetch/$s_!n2H5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png 848w, https://substackcdn.com/image/fetch/$s_!n2H5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png 1272w, https://substackcdn.com/image/fetch/$s_!n2H5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06746f43-5aa2-4ee3-9168-fd082ff26cb7_3344x1768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>La API te devuelve un DataFrame de Pandas, bastante malo (de los peores que he descargado, solo comparable al de la primera FEB). Para poder trabajar con Polars hay que convertirlo a un DataFrame de Polars, y para eso necesitamos tener instalado <code>ipywidgets</code>. As&#237; que, por si acaso, aqu&#237; te dejo el <code>pip</code></p><pre><code>#Escribimos en el terminal
pip install -U ipywidgets</code></pre><p>Ok, ya tenemos el widget instalado, ahora lo convertimos a un dataframe de Polars.</p><pre><code>df = pl.from_pandas(pbp_df)</code></pre><p>Ya tenemos el <em>play-by-play</em>, pero no es muy usable tal y como viene. As&#237; que vamos a transformarlo en algo con lo que realmente podamos trabajar y calcular datos. Lo primero que me llama la atenci&#243;n es la columna <code>PLAYINFO</code>: describe el tipo de jugada, los intentos realizados/convertidos y los puntos acumulados por el jugador. Nosotros vamos a usar &#250;nicamente la jugada y los puntos. En lugar de complicarnos con un regex que extraiga, separe y construya nuevas columnas, lo haremos de una forma m&#225;s sencilla.</p><blockquote><p>Hasta aqu&#237; la parte abierta de este tutorial. Hemos preparado el terreno, instalado librer&#237;as y visto c&#243;mo luce el <em>play-by-play</em> en bruto.</p><p>A partir de aqu&#237; viene lo interesante: <strong>c&#243;mo transformar esos datos en un formato realmente &#250;til para analizarlos</strong>. Te ense&#241;o paso a paso c&#243;mo limpiar la columna <code>PLAYINFO</code>, generar variables nuevas y empezar a construir m&#233;tricas desde cero.</p><p>&#128073; Todo eso lo encontrar&#225;s en la parte premium del post. Si quieres seguir y acceder al c&#243;digo completo con explicaciones detalladas, suscr&#237;bete a la versi&#243;n de pago y apoya este proyecto.</p></blockquote>
      <p>
          <a href="https://www.thecleanshot.com/p/como-se-hace-extraer-play-by-play">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>