<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://antillon.org/feed.xml" rel="self" type="application/atom+xml" /><link href="http://antillon.org/" rel="alternate" type="text/html" /><updated>2025-07-21T17:49:32+00:00</updated><id>http://antillon.org/feed.xml</id><title type="html">Alejandro Antillon</title><subtitle>Data Engineer - Ex. Spotify, Ex F-Secure</subtitle><entry><title type="html">Perfil Economico de Mexico</title><link href="http://antillon.org/2025/07/09/perfil-economico-de-mexico.html" rel="alternate" type="text/html" title="Perfil Economico de Mexico" /><published>2025-07-09T16:00:00+00:00</published><updated>2025-07-09T16:00:00+00:00</updated><id>http://antillon.org/2025/07/09/perfil-economico-de-mexico</id><content type="html" xml:base="http://antillon.org/2025/07/09/perfil-economico-de-mexico.html"><![CDATA[<h1 id="perfil-económico-de-mexico">Perfil Económico de Mexico</h1>

<p>Con el objetivo de poner en práctica un poco de Spark con datos abiertos del INEGI, se desarrolló un breve proyecto que busca realizar un perfil económico para cada estado de la República Mexicana.</p>

<p>El codigo de Spark se encuentra en <a href="https://github.com/aantillonl/mexico-perfil-economico/blob/main/src/main/scala/EconomicProfile.scala">GitHub</a></p>

<p>El objetivo es simple: utilizar el conjunto de datos del Censo Económico de 2019 (el más reciente hasta la fecha), disponible en <a href="https://www.inegi.org.mx/datosabiertos/">https://www.inegi.org.mx/datosabiertos/</a>, y con él obtener dos métricas sencillas:</p>

<ul>
  <li><strong>Top 5 de actividades económicas más importantes por estado</strong></li>
  <li><strong>La contribución de la principal actividad al total de la actividad económica de cada estado</strong>, como una métrica inversa de diversificación económica.</li>
</ul>

<p>Los resultados para cada estado se muestran a continuación.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Estado</th>
      <th style="text-align: left">Actividad Económica 1</th>
      <th style="text-align: left">Actividad Económica 2</th>
      <th style="text-align: left">Actividad Económica 3</th>
      <th style="text-align: left">Actividad Económica 4</th>
      <th style="text-align: left">Actividad Económica 5</th>
      <th style="text-align: right">Contribución 1</th>
      <th style="text-align: right">Contribución 2</th>
      <th style="text-align: right">Contribución 3</th>
      <th style="text-align: right">Contribución 4</th>
      <th style="text-align: right">Contribución 5</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Aguascalientes</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Servicios profesionales, científicos y técnicos</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: right">15958.3</td>
      <td style="text-align: right">15860.8</td>
      <td style="text-align: right">12199.7</td>
      <td style="text-align: right">9853.34</td>
      <td style="text-align: right">9550.33</td>
    </tr>
    <tr>
      <td style="text-align: left">Baja California</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: right">73088.2</td>
      <td style="text-align: right">45647.4</td>
      <td style="text-align: right">31700.7</td>
      <td style="text-align: right">29932.3</td>
      <td style="text-align: right">28441</td>
    </tr>
    <tr>
      <td style="text-align: left">Baja California Sur</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Comercio al por menor</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: left">Servicios de apoyo a los negocios y manejo de residuos, y servicios de remediación</td>
      <td style="text-align: right">8773.74</td>
      <td style="text-align: right">7905.17</td>
      <td style="text-align: right">7604.89</td>
      <td style="text-align: right">6801.64</td>
      <td style="text-align: right">5106.96</td>
    </tr>
    <tr>
      <td style="text-align: left">Campeche</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Comercio al por menor</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: right">33805.4</td>
      <td style="text-align: right">10335.6</td>
      <td style="text-align: right">6766.56</td>
      <td style="text-align: right">6275.26</td>
      <td style="text-align: right">4555</td>
    </tr>
    <tr>
      <td style="text-align: left">Chiapas</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios de alojamiento temporal y de preparación de alimentos y bebidas</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: right">15015.9</td>
      <td style="text-align: right">13290.4</td>
      <td style="text-align: right">8000.91</td>
      <td style="text-align: right">5373.72</td>
      <td style="text-align: right">4923.46</td>
    </tr>
    <tr>
      <td style="text-align: left">Chihuahua</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Comercio al por menor</td>
      <td style="text-align: left">Servicios de alojamiento temporal y de preparación de alimentos y bebidas</td>
      <td style="text-align: left">Servicios de apoyo a los negocios y manejo de residuos, y servicios de remediación</td>
      <td style="text-align: right">77192.6</td>
      <td style="text-align: right">75931.5</td>
      <td style="text-align: right">75104</td>
      <td style="text-align: right">41496.8</td>
      <td style="text-align: right">29947.7</td>
    </tr>
    <tr>
      <td style="text-align: left">Ciudad de México</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Servicios educativos</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: right">499866</td>
      <td style="text-align: right">421076</td>
      <td style="text-align: right">274163</td>
      <td style="text-align: right">271852</td>
      <td style="text-align: right">245083</td>
    </tr>
    <tr>
      <td style="text-align: left">Coahuila de Zaragoza</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Servicios financieros y de seguros</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Otros servicios excepto actividades gubernamentales</td>
      <td style="text-align: right">149412</td>
      <td style="text-align: right">135022</td>
      <td style="text-align: right">126372</td>
      <td style="text-align: right">114695</td>
      <td style="text-align: right">90020.9</td>
    </tr>
    <tr>
      <td style="text-align: left">Colima</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: left">Servicios de esparcimiento culturales y deportivos, y otros servicios recreativos</td>
      <td style="text-align: right">7282.1</td>
      <td style="text-align: right">5589.98</td>
      <td style="text-align: right">4577.91</td>
      <td style="text-align: right">3431.6</td>
      <td style="text-align: right">3229.42</td>
    </tr>
    <tr>
      <td style="text-align: left">Durango</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Servicios educativos</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: right">33001.1</td>
      <td style="text-align: right">21445.3</td>
      <td style="text-align: right">15036</td>
      <td style="text-align: right">14698.1</td>
      <td style="text-align: right">13227.5</td>
    </tr>
    <tr>
      <td style="text-align: left">Guanajuato</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios educativos</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Comercio al por mayor</td>
      <td style="text-align: right">116393</td>
      <td style="text-align: right">61090</td>
      <td style="text-align: right">54548.2</td>
      <td style="text-align: right">44547.2</td>
      <td style="text-align: right">39558.3</td>
    </tr>
    <tr>
      <td style="text-align: left">Guerrero</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios profesionales, científicos y técnicos</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: right">19836.8</td>
      <td style="text-align: right">3751.17</td>
      <td style="text-align: right">3563.9</td>
      <td style="text-align: right">3486.99</td>
      <td style="text-align: right">2745.35</td>
    </tr>
    <tr>
      <td style="text-align: left">Hidalgo</td>
      <td style="text-align: left">Servicios de esparcimiento culturales y deportivos, y otros servicios recreativos</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios de alojamiento temporal y de preparación de alimentos y bebidas</td>
      <td style="text-align: left">Servicios educativos</td>
      <td style="text-align: right">40234.8</td>
      <td style="text-align: right">18380.9</td>
      <td style="text-align: right">11836</td>
      <td style="text-align: right">10767.2</td>
      <td style="text-align: right">9328.39</td>
    </tr>
    <tr>
      <td style="text-align: left">Jalisco</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Servicios de alojamiento temporal y de preparación de alimentos y bebidas</td>
      <td style="text-align: left">Corporativos</td>
      <td style="text-align: right">111370</td>
      <td style="text-align: right">110257</td>
      <td style="text-align: right">90727.6</td>
      <td style="text-align: right">67887.4</td>
      <td style="text-align: right">41436.4</td>
    </tr>
    <tr>
      <td style="text-align: left">Michoacán de Ocampo</td>
      <td style="text-align: left">Servicios profesionales, científicos y técnicos</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Servicios de esparcimiento culturales y deportivos, y otros servicios recreativos</td>
      <td style="text-align: right">24503.7</td>
      <td style="text-align: right">24128.5</td>
      <td style="text-align: right">14313.9</td>
      <td style="text-align: right">13208.1</td>
      <td style="text-align: right">11330.6</td>
    </tr>
    <tr>
      <td style="text-align: left">Morelos</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios de esparcimiento culturales y deportivos, y otros servicios recreativos</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: right">28282.7</td>
      <td style="text-align: right">11433.6</td>
      <td style="text-align: right">11384.5</td>
      <td style="text-align: right">8132.46</td>
      <td style="text-align: right">7527.18</td>
    </tr>
    <tr>
      <td style="text-align: left">México</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Corporativos</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: right">150874</td>
      <td style="text-align: right">91044.7</td>
      <td style="text-align: right">75374.9</td>
      <td style="text-align: right">68839.3</td>
      <td style="text-align: right">65819.2</td>
    </tr>
    <tr>
      <td style="text-align: left">Nayarit</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Comercio al por menor</td>
      <td style="text-align: right">29161.7</td>
      <td style="text-align: right">10565.7</td>
      <td style="text-align: right">10448.1</td>
      <td style="text-align: right">6656.78</td>
      <td style="text-align: right">4431.37</td>
    </tr>
    <tr>
      <td style="text-align: left">Nuevo León</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios de alojamiento temporal y de preparación de alimentos y bebidas</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: right">217167</td>
      <td style="text-align: right">172543</td>
      <td style="text-align: right">123307</td>
      <td style="text-align: right">100166</td>
      <td style="text-align: right">95480.5</td>
    </tr>
    <tr>
      <td style="text-align: left">Oaxaca</td>
      <td style="text-align: left">Servicios educativos</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: left">Servicios de alojamiento temporal y de preparación de alimentos y bebidas</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Comercio al por mayor</td>
      <td style="text-align: right">15373.1</td>
      <td style="text-align: right">10910</td>
      <td style="text-align: right">10290.6</td>
      <td style="text-align: right">7894.52</td>
      <td style="text-align: right">6642.3</td>
    </tr>
    <tr>
      <td style="text-align: left">Puebla</td>
      <td style="text-align: left">Comercio al por mayor</td>
      <td style="text-align: left">Comercio al por menor</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Servicios educativos</td>
      <td style="text-align: right">89672.8</td>
      <td style="text-align: right">47406.9</td>
      <td style="text-align: right">44032.7</td>
      <td style="text-align: right">35288.3</td>
      <td style="text-align: right">28780.1</td>
    </tr>
    <tr>
      <td style="text-align: left">Querétaro de Arteaga</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Otros servicios excepto actividades gubernamentales</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Servicios de esparcimiento culturales y deportivos, y otros servicios recreativos</td>
      <td style="text-align: right">52529.4</td>
      <td style="text-align: right">45412.7</td>
      <td style="text-align: right">33457.7</td>
      <td style="text-align: right">25085.1</td>
      <td style="text-align: right">22152.3</td>
    </tr>
    <tr>
      <td style="text-align: left">Quintana Roo</td>
      <td style="text-align: left">Servicios profesionales, científicos y técnicos</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Servicios de alojamiento temporal y de preparación de alimentos y bebidas</td>
      <td style="text-align: left">Servicios de apoyo a los negocios y manejo de residuos, y servicios de remediación</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: right">31502</td>
      <td style="text-align: right">20537.6</td>
      <td style="text-align: right">20477.1</td>
      <td style="text-align: right">19706.8</td>
      <td style="text-align: right">18211.7</td>
    </tr>
    <tr>
      <td style="text-align: left">San Luis Potosí</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios de apoyo a los negocios y manejo de residuos, y servicios de remediación</td>
      <td style="text-align: left">Otros servicios excepto actividades gubernamentales</td>
      <td style="text-align: right">172670</td>
      <td style="text-align: right">80511.4</td>
      <td style="text-align: right">50861.1</td>
      <td style="text-align: right">28736.8</td>
      <td style="text-align: right">18730.6</td>
    </tr>
    <tr>
      <td style="text-align: left">Sinaloa</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios educativos</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Comercio al por mayor</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: right">31853.6</td>
      <td style="text-align: right">22868.6</td>
      <td style="text-align: right">18021</td>
      <td style="text-align: right">15402.2</td>
      <td style="text-align: right">15031.7</td>
    </tr>
    <tr>
      <td style="text-align: left">Sonora</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Comercio al por menor</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: right">92351.3</td>
      <td style="text-align: right">85979.8</td>
      <td style="text-align: right">81326.2</td>
      <td style="text-align: right">53054.2</td>
      <td style="text-align: right">35307.6</td>
    </tr>
    <tr>
      <td style="text-align: left">Tabasco</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios de apoyo a los negocios y manejo de residuos, y servicios de remediación</td>
      <td style="text-align: left">Corporativos</td>
      <td style="text-align: right">179737</td>
      <td style="text-align: right">17746.4</td>
      <td style="text-align: right">7952.16</td>
      <td style="text-align: right">7895.88</td>
      <td style="text-align: right">7809.66</td>
    </tr>
    <tr>
      <td style="text-align: left">Tamaulipas</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Servicios de salud y de asistencia social</td>
      <td style="text-align: right">65388.2</td>
      <td style="text-align: right">46623.4</td>
      <td style="text-align: right">39902</td>
      <td style="text-align: right">30038.2</td>
      <td style="text-align: right">18387.3</td>
    </tr>
    <tr>
      <td style="text-align: left">Tlaxcala</td>
      <td style="text-align: left">Información en medios masivos</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Servicios inmobiliarios y de alquiler de bienes muebles e intangibles</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: right">26083.1</td>
      <td style="text-align: right">7547.36</td>
      <td style="text-align: right">4098.75</td>
      <td style="text-align: right">3969.16</td>
      <td style="text-align: right">3589.68</td>
    </tr>
    <tr>
      <td style="text-align: left">Veracruz de Ignacio de la Llave</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: left">Servicios de salud y de asistencia social</td>
      <td style="text-align: right">54054.6</td>
      <td style="text-align: right">45857.9</td>
      <td style="text-align: right">38713.2</td>
      <td style="text-align: right">22309.4</td>
      <td style="text-align: right">21966.1</td>
    </tr>
    <tr>
      <td style="text-align: left">Yucatán</td>
      <td style="text-align: left">Servicios financieros y de seguros</td>
      <td style="text-align: left">Generación, transmisión, distribución y comercialización de energía eléctrica, suministro de agua y de gas natural por ductos al consumidor final</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Otros servicios excepto actividades gubernamentales</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: right">24968.9</td>
      <td style="text-align: right">15460</td>
      <td style="text-align: right">10915.2</td>
      <td style="text-align: right">6770.1</td>
      <td style="text-align: right">5981.12</td>
    </tr>
    <tr>
      <td style="text-align: left">Zacatecas</td>
      <td style="text-align: left">Construcción</td>
      <td style="text-align: left">Agricultura, cría y explotación de animales, aprovechamiento forestal, pesca y caza</td>
      <td style="text-align: left">Servicios inmobiliarios y de alquiler de bienes muebles e intangibles</td>
      <td style="text-align: left">Comercio al por menor</td>
      <td style="text-align: left">Minería</td>
      <td style="text-align: right">9763.02</td>
      <td style="text-align: right">7445.96</td>
      <td style="text-align: right">6671.58</td>
      <td style="text-align: right">3792.34</td>
      <td style="text-align: right">3157.62</td>
    </tr>
  </tbody>
</table>

<p>La segunda métrica, la contribución de la principal actividad económica al total de la actividad económica de cada estado, se muestra en el siguiente mapa. Esta metrica tambien refleja la dependencia en una sola actividad economica.</p>

<p><img src="/assets/images/mexico_hhi_map.png" alt="Map" /></p>

<hr />

<h3 id="notas">Notas</h3>

<p>Dado que el conjunto de datos contiene un gran número de registros a diferentes niveles de granularidad, se utilizó un criterio sencillo para seleccionar valores que reflejaran la actividad económica de cada estado de manera general. Sin embargo, un análisis más detallado podría utilizar más variables.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Perfil Económico de Mexico]]></summary></entry><entry><title type="html">Suggesting To Add Feature To Python Invoke</title><link href="http://antillon.org/2025/07/02/suggesting-to-add-feature-to-python-invoke.html" rel="alternate" type="text/html" title="Suggesting To Add Feature To Python Invoke" /><published>2025-07-02T16:00:00+00:00</published><updated>2025-07-02T16:00:00+00:00</updated><id>http://antillon.org/2025/07/02/suggesting-to-add-feature-to-python-invoke</id><content type="html" xml:base="http://antillon.org/2025/07/02/suggesting-to-add-feature-to-python-invoke.html"><![CDATA[<p>After using <a href="https://www.pyinvoke.org">Invoke</a> for a small set of automation tasks,
I realized that when a task is called as a pre-requisite from another task,
the pre-requisite task doesn’t have any context of whether it was run directly
or as a pre-requisite from another task. Having such contest could be helpful to
pass around data from tasks to pre-requisite tasks.</p>

<p>A <a href="https://github.com/pyinvoke/invoke/pull/1041">Pull Request has been open on GitHub</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[After using Invoke for a small set of automation tasks, I realized that when a task is called as a pre-requisite from another task, the pre-requisite task doesn’t have any context of whether it was run directly or as a pre-requisite from another task. Having such contest could be helpful to pass around data from tasks to pre-requisite tasks.]]></summary></entry><entry><title type="html">Suggesting Refactor To The Candy Machine Problem’s Solution</title><link href="http://antillon.org/2025/06/19/suggesting-refactor-to-candy-machine-problem-from-FP-in-scala.html" rel="alternate" type="text/html" title="Suggesting Refactor To The Candy Machine Problem’s Solution" /><published>2025-06-19T16:00:00+00:00</published><updated>2025-06-19T16:00:00+00:00</updated><id>http://antillon.org/2025/06/19/suggesting-refactor-to-candy-machine-problem-from-FP-in-scala</id><content type="html" xml:base="http://antillon.org/2025/06/19/suggesting-refactor-to-candy-machine-problem-from-FP-in-scala.html"><![CDATA[<p>After going through the solution to the Candy Machine Problem of chapter 6 of FP in Scala,
I wanted to suggest a small refactoring of the problem’s solution.</p>

<p>See comments in the <a href="https://github.com/fpinscala/fpinscala/pull/704">Pull Request on Github</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[After going through the solution to the Candy Machine Problem of chapter 6 of FP in Scala, I wanted to suggest a small refactoring of the problem’s solution.]]></summary></entry><entry><title type="html">FP In Scala. Understanding the Candy Machine Problem</title><link href="http://antillon.org/2025/06/17/understanding-the-candy-machine-problem-from-FP-in-scala.html" rel="alternate" type="text/html" title="FP In Scala. Understanding the Candy Machine Problem" /><published>2025-06-17T16:00:00+00:00</published><updated>2025-06-17T16:00:00+00:00</updated><id>http://antillon.org/2025/06/17/understanding-the-candy-machine-problem-from-FP-in-scala</id><content type="html" xml:base="http://antillon.org/2025/06/17/understanding-the-candy-machine-problem-from-FP-in-scala.html"><![CDATA[<p>This document is a transcript of <a href="https://medium.com/@alejandroantillon/the-candy-machine-problem-a30b6b233517">the story published on Medium</a></p>

<p>The aim of this article is to offer a little guidance for the Candy Machine problem from Functional Programming in Scala — Chapter 6 — and the suggested (solution provided in the book’s official GitHub]
(https://github.com/fpinscala/fpinscala/blob/second-edition/src/main/scala/fpinscala/answers/state/State.scala).
And maybe, more importantly, to offer a bit of emotional support for anyone struggling with this book (I certainly am).</p>

<h2 id="-lets-begin-with-the-update-function">🔁 Let’s begin with the update function</h2>

<p>This is the simplest part. The update function takes an Input value and a Machine value and returns another machine. For example, a Coin input and a locked machine will return an unlocked machine with one more coin.
One thing to notice is that its arguments are curried — it first takes an Input and returns a function that then takes a Machine and performs the update. This might seem unnecessary at first, but it’s important because the solution separates the definition of a computation from its execution.
By currying the arguments, we can build a transformation ahead of time, even before having a specific machine. Think of it as a function with the action (Coin or Turn) already “baked in,” just waiting for a machine:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">input</span> <span class="k">=</span> <span class="nc">Coin</span>
<span class="k">val</span> <span class="nv">preBakedUpdate</span> <span class="k">=</span> <span class="nf">update</span><span class="o">(</span><span class="n">input</span><span class="o">)</span>
</code></pre></div></div>

<h2 id="-from-update-functions-to-state-actions">🧠 From update functions to State actions</h2>

<p>To move toward a fully functional solution, we turn this preBakedUpdate into a state action. A state action is a function that:</p>

<ul>
  <li>Takes a state (in our case, a Machine)</li>
  <li>Does “something” with it</li>
  <li>Returns a value and a new state</li>
</ul>

<p>In this case, we don’t care about the value — we just want the updated machine:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">stateAction</span> <span class="k">=</span> <span class="nc">State</span><span class="o">[</span><span class="kt">Machine</span>, <span class="kt">Unit</span><span class="o">](</span><span class="n">machine</span> <span class="k">=&gt;</span> <span class="o">((),</span> <span class="nf">preBakedUpdate</span><span class="o">(</span><span class="n">machine</span><span class="o">)))</span>
<span class="nc">To</span> <span class="n">simplify</span><span class="o">,</span> <span class="n">we</span> <span class="n">use</span> <span class="nv">State</span><span class="o">.</span><span class="py">modify</span><span class="k">:</span>
<span class="kt">val</span> <span class="kt">stateAction</span> <span class="o">=</span> <span class="nv">State</span><span class="o">.</span><span class="py">modify</span><span class="o">(</span><span class="n">preBakedUpdate</span><span class="o">)</span> <span class="c1">// or State.modify(update(input))</span>
</code></pre></div></div>

<p>The book’s syntax can be a bit obscure. I saw a helpful comment (that I can no longer find) suggesting this alternative implementation of modify, which I find cleaner:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">modify</span><span class="o">[</span><span class="kt">S</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="kt">S</span> <span class="o">=&gt;</span> <span class="n">S</span><span class="o">)</span><span class="k">:</span> <span class="kt">State</span><span class="o">[</span><span class="kt">S</span>, <span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="nc">State</span><span class="o">(</span><span class="n">s</span> <span class="k">=&gt;</span> <span class="o">((),</span> <span class="nf">f</span><span class="o">(</span><span class="n">s</span><span class="o">)))</span>
</code></pre></div></div>

<h2 id="-what-have-we-done-so-far">✅ What have we done so far?</h2>

<p>Defined update: Input → Machine → Machine (curried)
Created pre-baked update functions
Wrapped those functions as State actions</p>

<p>Now comes the final boss: combining multiple state actions into one.
🍬 Combining state actions
Let’s say we have:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">sCoin</span> <span class="k">=</span> <span class="nv">State</span><span class="o">.</span><span class="py">modify</span><span class="o">(</span><span class="nf">update</span><span class="o">(</span><span class="nc">Coin</span><span class="o">))</span>
<span class="k">val</span> <span class="nv">m0</span> <span class="k">=</span> <span class="nc">Machine</span><span class="o">(</span><span class="kc">true</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="mi">0</span><span class="o">)</span>
<span class="nf">val</span> <span class="o">(</span><span class="k">_</span><span class="o">,</span> <span class="n">m1</span><span class="o">)</span> <span class="k">=</span> <span class="nv">sCoin</span><span class="o">.</span><span class="py">run</span><span class="o">(</span><span class="n">m0</span><span class="o">)</span>
<span class="nf">assertEquals</span><span class="o">(</span><span class="nv">m0</span><span class="o">.</span><span class="py">locked</span><span class="o">,</span> <span class="kc">true</span><span class="o">)</span>
<span class="nf">assertEquals</span><span class="o">(</span><span class="nv">m1</span><span class="o">.</span><span class="py">locked</span><span class="o">,</span> <span class="kc">false</span><span class="o">)</span>
</code></pre></div></div>

<p>Now we want candy — so we process a Turn:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">sTurn</span> <span class="k">=</span> <span class="nv">State</span><span class="o">.</span><span class="py">modify</span><span class="o">(</span><span class="nf">update</span><span class="o">(</span><span class="nc">Turn</span><span class="o">))</span>
<span class="nf">val</span> <span class="o">(</span><span class="k">_</span><span class="o">,</span> <span class="n">m2</span><span class="o">)</span> <span class="k">=</span> <span class="nv">sTurn</span><span class="o">.</span><span class="py">run</span><span class="o">(</span><span class="n">m1</span><span class="o">)</span>
<span class="nf">assertEquals</span><span class="o">(</span><span class="nv">m2</span><span class="o">.</span><span class="py">candies</span><span class="o">,</span> <span class="nv">m0</span><span class="o">.</span><span class="py">candies</span> <span class="o">-</span> <span class="mi">1</span><span class="o">)</span>
<span class="nf">assertEquals</span><span class="o">(</span><span class="nv">m2</span><span class="o">.</span><span class="py">coins</span><span class="o">,</span> <span class="nv">m0</span><span class="o">.</span><span class="py">coins</span> <span class="o">+</span> <span class="mi">1</span><span class="o">)</span>
</code></pre></div></div>

<p>This works, but we’ve just executed both actions manually. That goes against the spirit of the State monad — we should be composing computations without executing them until the end.</p>

<h2 id="-enter-map2">➕ Enter map2</h2>

<p>Instead of running them step-by-step, we can combine the two State actions using map2:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">sCombined</span> <span class="k">=</span> <span class="nv">sCoin</span><span class="o">.</span><span class="py">map2ViaFlatMap</span><span class="o">(</span><span class="n">sTurn</span><span class="o">)((</span><span class="k">_</span><span class="o">,</span> <span class="k">_</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="o">())</span>
<span class="nf">val</span> <span class="o">(</span><span class="k">_</span><span class="o">,</span> <span class="n">m1</span><span class="o">)</span> <span class="k">=</span> <span class="nv">sCombined</span><span class="o">.</span><span class="py">run</span><span class="o">(</span><span class="n">machine</span><span class="o">)</span>
</code></pre></div></div>

<p>Now we’ve built a single composed computation without executing any partial result. This is the key idea: define the computation separately from its execution.</p>

<h2 id="-handling-a-list-of-inputs">🔁 Handling a list of inputs</h2>

<p>Now let’s tackle the full problem: processing a list of inputs.
We could use State.sequence, which is in my opinion a bit easier to follow than traverse:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">State</span><span class="o">.</span><span class="py">sequence</span><span class="o">(</span><span class="nv">inputs</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">update</span><span class="o">).</span><span class="py">map</span><span class="o">(</span><span class="nv">State</span><span class="o">.</span><span class="py">modify</span><span class="o">))</span>
</code></pre></div></div>

<p>The book’s solution uses State.traverse, which flips the flow:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">State</span><span class="o">.</span><span class="py">traverse</span><span class="o">(</span><span class="n">inputs</span><span class="o">)(</span><span class="n">i</span> <span class="k">=&gt;</span> <span class="nv">State</span><span class="o">.</span><span class="py">modify</span><span class="o">(</span><span class="nf">update</span><span class="o">(</span><span class="n">i</span><span class="o">)))</span>
</code></pre></div></div>

<p>It may look less readable at first, but it accomplishes the same thing. Here’s a breakdown:
*
 sequence: Input → update → modify → sequence</p>
<ul>
  <li>traverse: Input → traverse + modify (in one go)</li>
</ul>

<p>Either way, the result is a combined State action that can process a list of inputs once you provide a starting machine.</p>

<h2 id="-getting-the-final-result">🎯 Getting the final result</h2>

<p>The problem asks for a tuple (coins, candies) at the end. But how do we get it if all our state actions return Unit?
We use State.get, which returns the current state as both value and state, and then map it:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">State</span><span class="o">.</span><span class="py">traverse</span><span class="o">(</span><span class="n">inputs</span><span class="o">)(</span><span class="n">i</span> <span class="k">=&gt;</span> <span class="nv">State</span><span class="o">.</span><span class="py">modify</span><span class="o">(</span><span class="nf">update</span><span class="o">(</span><span class="n">i</span><span class="o">)))</span>
  <span class="o">.</span><span class="py">flatMap</span><span class="o">(</span><span class="k">_</span> <span class="k">=&gt;</span> <span class="nv">State</span><span class="o">.</span><span class="py">get</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">m</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="nv">m</span><span class="o">.</span><span class="py">coins</span><span class="o">,</span> <span class="nv">m</span><span class="o">.</span><span class="py">candies</span><span class="o">)))</span>
</code></pre></div></div>

<p>Yes, this syntax is a little intense — but it makes state flow explicit.
Finally, the book uses a for comprehension to make it more readable:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span>
  <span class="k">_</span> <span class="k">&lt;-</span> <span class="nv">State</span><span class="o">.</span><span class="py">traverse</span><span class="o">(</span><span class="n">inputs</span><span class="o">)(</span><span class="n">i</span> <span class="k">=&gt;</span> <span class="nv">State</span><span class="o">.</span><span class="py">modify</span><span class="o">(</span><span class="nf">update</span><span class="o">(</span><span class="n">i</span><span class="o">)))</span>
  <span class="n">s</span> <span class="k">&lt;-</span> <span class="nv">State</span><span class="o">.</span><span class="py">get</span>
<span class="nf">yield</span> <span class="o">(</span><span class="nv">s</span><span class="o">.</span><span class="py">coins</span><span class="o">,</span> <span class="nv">s</span><span class="o">.</span><span class="py">candies</span><span class="o">)</span>
</code></pre></div></div>

<h2 id="-final-thoughts">💬 Final thoughts</h2>

<p>This solution is not easy to grasp at first — it took me a long time to understand it. That’s exactly why I wanted to write this post. If nothing else, I hope it offers a little clarity and some emotional support if you’re stuck on this chapter.
If you made it this far and found this helpful, I created a PR with some hints for this problem based on this article. Feel free to leave a comment there. Thank you!
Would you like a Markdown version ready to post to Medium, Dev.to, or GitHub? Or maybe a subtitle and cover image idea to go with it?</p>]]></content><author><name></name></author><summary type="html"><![CDATA[This document is a transcript of the story published on Medium]]></summary></entry><entry><title type="html">Contribution To AWS Moto</title><link href="http://antillon.org/2021/02/03/contributions-to-aws-moto.html" rel="alternate" type="text/html" title="Contribution To AWS Moto" /><published>2021-02-03T00:00:00+00:00</published><updated>2021-02-03T00:00:00+00:00</updated><id>http://antillon.org/2021/02/03/contributions-to-aws-moto</id><content type="html" xml:base="http://antillon.org/2021/02/03/contributions-to-aws-moto.html"><![CDATA[<p>I have been a long time user of moto, a testing library for AWS, and I wanted
to try my luck at digging deeper into it’s implementation and if possible
make a contribution to this great project.</p>

<p>I was able to do two small contributions a few years ago. <a href="https://github.com/getmoto/moto/commits/master/?author=aantillonl">Here are my
commits to the project.</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[I have been a long time user of moto, a testing library for AWS, and I wanted to try my luck at digging deeper into it’s implementation and if possible make a contribution to this great project.]]></summary></entry></feed>