<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Andrés  Torres - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Andrés  Torres - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 14 May 2026 19:58:33 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/andres-torres/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Error: failed to push some refs to – ¿Cómo arreglamos esto en Git? ]]>
                </title>
                <description>
                    <![CDATA[ Cuando colaboras con otros desarrolladores utilizando Git, es posible que te encuentres con el error: failed to push some refs to [remote repo]. Este error ocurre principalmente cuando intentas enviar tus cambios locales a GitHub, mientras que el repositorio local aún no ha sido actualizado con los cambios realizados en ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/error-failed-to-push-some-refs-to-como-arreglamos-esto-en-git/</link>
                <guid isPermaLink="false">6609aabf6e403a04017ccf7b</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Tue, 23 Apr 2024 13:48:06 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/roman-synkevych-wX2L8L-fGeA-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/error-failed-to-push-some-refs-to-how-to-fix-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Error: failed to push some refs to – How to Fix in Git</a>
      </p><p>Cuando colaboras con otros desarrolladores utilizando Git, es posible que te encuentres con el error:<strong> </strong><code>failed to push some refs to [remote repo]</code><strong>.</strong></p><p>Este error ocurre principalmente cuando intentas enviar tus cambios locales a GitHub, mientras que el repositorio local aún no ha sido actualizado con los cambios realizados en el repositorio remoto.</p><p>Entonces, Git está tratando de decirte que actualices el repositorio local con los cambios actuales en el remoto antes de enviar tus propios cambios. Esto es necesario para que no sobrescribas los cambios hechos por otros.</p><p>Discutiremos dos posibles formas de solucionar este error en las secciones que siguen.</p><h2 id="-c-mo-solucionar-el-error-failed-to-push-some-refs-to-en-git">¿Cómo solucionar el error: <code>failed to push some refs to</code> en Git?</h2><p>Podemos solucionar el error: <code>failed to push some refs to [remote repo]</code> en Git usando los comandos <code>git pull origin [branch]</code> o <code>git pull --rebase origin [branch]</code>. En la mayoría de los casos, el último comando soluciona el error.</p><p>Veamos cómo puedes usar los comandos mencionados anteriormente.</p><h2 id="-c-mo-solucionar-el-error-failed-to-push-some-refs-to-en-git-usando-git-pull">¿Cómo solucionar el error: <code>failed to push some refs to</code> en Git usando <code>git pull</code>?</h2><p>Enviar una solicitud de extracción (<em>pull request</em>) significa "buscar" nuevos cambios realizados en el repositorio remoto y fusionarlos con el repositorio local.</p><p>Una vez que se haya completado la fusión, puedes enviar tus propios cambios de código a GitHub.</p><p>En nuestro caso, estamos tratando de deshacernos del error: <code>failed to push some refs to [remote repo]</code> enviando una solicitud de extracción.</p><p>Así es como puedes hacerlo:</p><pre><code class="language-bash">git pull origin main</code></pre><p>Si estás trabajando con una rama diferente, entonces tendrías que reemplazar <code>main</code> en el ejemplo anterior con el nombre de tu rama.</p><p>Solo ten en cuenta que existen posibilidades de fallo al usar este comando para sincronizar tus repositorios remotos y locales y así deshacerte del error. <strong>Si la solicitud tiene éxito</strong>, entonces continúa y ejecuta el siguiente comando para enviar tus propios cambios:</p><pre><code class="language-bash">git push -u origin main</code></pre><p><strong>Si el error persiste</strong>, obtendrás un error que dirá: <code>fatal: refusing to merge unrelated histories</code>. En este caso, utiliza la solución disponible en la siguiente sección. </p><h2 id="-c-mo-arreglar-el-error-failed-to-push-some-refs-to-en-git-usando-git-pull-rebase">¿Cómo arreglar el <code>error:failed to push some refs to</code> en Git usando <code>git pull --rebase</code>?</h2><p>El comando <code>git pull --rebase</code> &nbsp;es útil en situaciones donde tu rama local es un <strong><em><a href="https://www.freecodecamp.org/espanol/news/el-comando-git-commit-explicado/">commit </a></em></strong>por detrás de la rama remota</p><p>Para arreglar el error, emplea los siguientes comandos:</p><pre><code class="language-bash">git pull --rebase origin main

git push -u origin main </code></pre><p>Si el primer comando anterior se ejecuta con éxito, deberías recibir una respuesta que diga: <code>Successfully rebased and updated refs/heads/main</code>.</p><p>El segundo comando envía el estado actual de tu repositorio local a la rama remota.</p><h2 id="resumen">Resumen</h2><p>En este artículo, discutimos el error <code>error: failed to push some refs to [remote repo]</code>.</p><p>Este error ocurre cuando intentas enviar tus cambios locales al repositorio remoto sin antes actualizar tu repositorio local con los cambios más recientes del repositorio remoto.</p><p>Exploramos dos comandos para abordar este error: los comandos <code>git pull origin [branch]</code> y <code>git pull --rebase origin [branch]</code>.</p><p>Espero que esta información te ayude a resolver el error.</p><p>¡Feliz programación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Operador C: Operadores lógicos en programación en C ]]>
                </title>
                <description>
                    <![CDATA[ En este artículo, aprenderás sobre los tres operadores lógicos en C. Primero, explicaré qué son los operadores en programación y listaré los diferentes tipos de operadores disponibles en C. Luego, aprenderás el papel que tienen los operadores lógicos y cómo usarlos con la ayuda de ejemplos de código en el ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/operador-c-operadores-logicos-de-programacion-en-c/</link>
                <guid isPermaLink="false">65ff552524402003fe4e4eb0</guid>
                
                    <category>
                        <![CDATA[ programacion c ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Thu, 28 Mar 2024 21:48:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/pexels-mikael-blomkvist-6476587.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/c-operator-logic-operators-in-c-programming/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">C Operator – Logic Operators in C Programming</a>
      </p><p><strong>En este artículo, aprenderás sobre los tres operadores lógicos en C.</strong></p><p>Primero, explicaré qué son los operadores en programación y listaré los diferentes tipos de operadores disponibles en C.</p><p>Luego, aprenderás el papel que tienen los operadores lógicos y cómo usarlos con la ayuda de ejemplos de código en el camino.</p><p>¡Comencemos! ¿Qué es un Operador en Programación de Computadoras?</p><p>En programación de computadoras, un operador es un carácter, símbolo, palabra clave o combinación de estos. Determina qué acción se realiza en uno o más operandos.</p><p>Un operando es un elemento de datos individual que es manipulado por el operador.</p><p>Cada lenguaje de programación de alto nivel define estos caracteres integrados y los utiliza para indicar al compilador que realice operaciones aritméticas, relacionales o lógicas que manipulan elementos de datos y luego devuelven un resultado final. </p><h2 id="-cu-les-son-los-diferentes-tipos-de-operadores-en-la-programaci-n-en-c">¿Cuáles son los Diferentes Tipos de Operadores en la Programación en C?</h2><p>En la programación en C, los operadores caen en una de tres categorías:</p><p><strong>Operadores <a href="https://learn.microsoft.com/es-es/cpp/c-language/c-operators?view=msvc-170">Unarios</a></strong></p><p><strong>Operadores Binarios</strong></p><p><strong>Operadores <a href="https://www.freecodecamp.org/espanol/news/operador-ternario-en-c/">Ternarios</a></strong></p><p>Operadores unarios operan sobre un solo operando. Algunos de los operadores unarios en C son:</p><ul><li><strong>Operadores aritméticos</strong> como el operador de incremento (<code>++</code>), que incrementa el valor del operando en <code>1</code>. Y el operador de decremento (--), que decrementa el valor del operando en <code>1</code>.</li><li><strong>Operadores lógicos</strong> como el operador NOT(<code>!</code>). Este operador invierte el valor lógico del operando: cambia <code>true</code> a <code>false</code> y <code>false</code> a <code>true</code>.</li><li><strong>Operadores a nivel de bits (bitwise) </strong>como el operador NOT(<code>~</code>), que cambia cada bit <code>0</code> a <code>1</code> y cada bit <code>1</code> a <code>0</code>.</li></ul><p>Los operadores <strong>binarios </strong>operan sobre dos operandos. Algunos de los operadores binarios en C son:</p><ul><li>Operadores aritméticos (<code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, <code>%</code>): Estos operadores realizan cálculos matemáticos en datos numéricos como la adición, sustracción, multiplicación, división y encontrar el resto.</li><li>Operadores de igualdad/relacionales (<code>==</code>, <code>!=</code>, <code>&gt;</code>, <code>&lt;</code>, <code>&gt;=</code>, <code>&lt;=</code>): Estos operadores comparan dos valores y determinan si un operando es mayor que, menor que, igual a o no igual a otro operando.</li><li>Operadores lógicos/condicionales como los operadores AND (<code>&amp;&amp;</code>) y OR (<code>||</code>).</li><li>Operadores a nivel de bits (<code>&amp;</code>, <code>|</code>, <code>^</code>, <code>&lt;&lt;</code>, <code>&gt;&gt;</code>): Tratan los elementos de datos como una secuencia de bits (es decir, 0s y 1s).</li><li>Operadores de asignación (<code>=</code>, <code>+=</code>, <code>-=</code> <code>*=</code>, <code>/=</code>, <code>%=</code>): Asignan un valor específico a una variable.</li></ul><p><strong>El operador Ternario</strong> (<code>?:</code>) opera en tres operandos. La sintaxis general se parece a la siguiente:</p><pre><code class="language-c">(condición) ? expresión1 : expresión2;</code></pre><p>El operador ternario es un operador condicional que puedes usar como una abreviatura para <code>if..else</code>. Realiza comparaciones y genera un resultado.</p><h2 id="-cu-l-es-el-papel-de-los-operadores-l-gicos-en-la-programaci-n-en-c">¿Cuál es el papel de los Operadores Lógicos en la Programación en C?</h2><p>Los operadores lógicos se utilizan comúnmente en declaraciones condicionales (como las declaraciones <code>if..else</code>), ya que ayudan en la toma de decisiones: determinan qué acción debe tener lugar y qué código debe ejecutarse a continuación según las condiciones que establezcas.</p><p>Combina los operadores lógicos con una o múltiples condiciones para crear una expresión lógica.</p><p>Los operadores lógicos evalúan la expresión lógica y devuelven un resultado.</p><p>El resultado siempre es un valor booleano. Un valor booleano determina si la expresión es verdadera <code>true</code> o falsa <code>false</code>.</p><p>Hay tres operadores lógicos en la programación en C: el AND lógico (<code>&amp;&amp;</code>), el OR lógico (<code>||</code>) y el NOT lógico (<code>!</code>).</p><p>Vamos a entrar en más detalle sobre cada uno en las siguientes secciones.</p><h2 id="c-mo-usar-el-operador-l-gico-and-en-la-programaci-n-en-c">Cómo Usar el Operador Lógico AND <code>(&amp;&amp;)</code> en la Programación en C</h2><p>El operador lógico AND (<code>&amp;&amp;</code>) verifica si todos los operandos son verdaderos: el resultado es verdadero solo cuando todos los operandos son verdaderos.</p><p>Aquí está la tabla de verdad para el operador AND (<code>&amp;&amp;</code>) cuando estás trabajando con dos operandos:</p><!--kg-card-begin: html--><table><thead><tr><th>Primer Operando</th>
<th>Segundo Operando</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>true</td>
<td>true</td>
<td>true</td>
</tr>
<tr>
<td>true</td>
<td>false</td>
<td>false</td>
</tr>
<tr>
<td>false</td>
<td>true</td>
<td>false</td>
</tr>
<tr>
<td>false</td>
<td>false</td>
<td>false</td></tr></tbody></table><!--kg-card-end: html--><p>Algo importante a tener en cuenta aquí es que, cuando el primer operando es falso, el segundo operando no se evalúa.</p><p>Veamos un ejemplo: El resultado de <code>(10 == 10) &amp;&amp; (20 == 20)</code> es verdadero porque ambos operandos son verdaderos: <code>(10 == 10)</code> es verdadero y <code>(20 == 20)</code> es verdadero.</p><p>Veamos otro ejemplo: El resultado de <code>(10 == 20) &amp;&amp; (20 == 20)</code> es falso porque uno de los operandos es falso: en este caso, el primer operando es falso, por lo que el segundo operando no se evalúa.</p><p>Ahora, veamos cómo puedes usar el operador <code>&amp;&amp;</code> en una declaración <code>if</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  int a = 20;
  int b = 30;

  if (a &gt; 10 &amp;&amp; b &gt; 10)
    printf("Ambos números son mayores que 10\n");
}

// salida

// Ambos números son mayores que 10
</code></pre><p>En el ejemplo anterior, la salida es "Al menos uno de los números es mayor que 10" porque se cumple la condición <code>a &gt; 10 || b &gt; 10</code> – al menos uno de los operandos es verdadero.</p><p>La primera condición, <code>a &gt; 10</code>, es verdadera, por lo que el resultado es verdadero.</p><p>Si tanto <code>a</code> como <code>b</code> fueran falsos, no habría salida.</p><h2 id="c-mo-usar-el-operador-l-gico-to-use-the-or-logical-en-la-programaci-n-en-c">Cómo usar el operador lógico to Use the OR <code>(||)</code> Logical en la programación en C </h2><p>La operación lógica OR (<code>||</code>) verifica si al menos uno de los operandos es verdadero; el resultado es verdadero si al menos uno de los operandos es verdadero.</p><p>Aquí tienes la tabla de verdad para el operador OR (<code>||</code>) cuando estás trabajando con dos operandos:</p><!--kg-card-begin: html--><table><thead><tr><th>Primer Operando</th>
<th>Segundo Operando</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>true</td>
<td>true</td>
<td>true</td>
</tr>
<tr>
<td>true</td>
<td>false</td>
<td>true</td>
</tr>
<tr>
<td>false</td>
<td>true</td>
<td>true</td>
</tr>
<tr>
<td>false</td>
<td>false</td>
<td>false</td></tr></tbody></table><!--kg-card-end: html--><p>Ten en cuenta que con el operador OR (<code>||</code>), si el primer operando es verdadero, entonces el segundo operando no se evalúa.</p><p>Veamos un ejemplo: El resultado de <code>(10 == 20) || (20 == 20)</code> es verdadero porque al menos uno de los operandos es verdadero; en este caso, es el segundo operando, incluso si el primer operando es falso.</p><p>Veamos otro ejemplo: El resultado de <code>(20 == 20) || (10 == 20)</code> es verdadero porque uno de los operandos es verdadero; en este caso, dado que el primer operando es verdadero, el segundo no se evalúa.</p><p>Ahora, veamos cómo puedes usar el operador OR (<code>||</code>) en una declaración if:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  int a = 20;
  int b = 5;

  if (a &gt; 10 || b &gt; 10)
    printf("Al menos uno de los números es mayor que 10");
}</code></pre><p>En el ejemplo anterior, la salida es "Al menos uno de los números es mayor que 10" porque se cumple la condición <code>a &gt; 10 || b &gt; 10</code> – al menos uno de los operandos es verdadero.</p><p>La primera condición, <code>a &gt; 10</code>, es verdadera, por lo que el resultado es verdadero.</p><p>Si tanto <code>a</code> como <code>b</code> fueran falsos, no habría salida.</p><h2 id="c-mo-usar-el-operador-l-gico-not-en-la-programaci-n-en-c">Cómo Usar el Operador Lógico NOT <code>(!)</code> en la Programación en C</h2><p>El operador lógico NOT (<code>!</code>) niega el operando – es decir, devuelve lo opuesto al operando.</p><p>Si el operando es <code>true</code>, devuelve <code>false</code>.</p><p>Y si es <code>false</code>, devuelve <code>true</code>.</p><p>Aquí está la tabla de verdad para el operador NOT (<code>!</code>):</p><!--kg-card-begin: html--><table><thead><tr><th>Operando</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>true</td>
<td>false</td>
</tr>
<tr>
<td>false</td>
<td>true</td></tr></tbody></table><!--kg-card-end: html--><p>Veamos un ejemplo: El resultado de <code>!(10 == 10)</code> es <code>false</code>.</p><p>La condición <code>10 == 10</code> es verdadera, pero el operador <code>!</code> la niega.</p><p>Y veamos otro ejemplo: El resultado de <code>!(10 == 20)</code> es <code>true</code>.</p><p>La condición <code>10 == 20</code> es falsa, pero el operador <code>!</code> la niega.</p><p>Ahora, revisa el siguiente ejemplo para ver cómo puedes usar el operador NOT (<code>!</code>) en una declaración <code>if</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  int a = 20;
  int b = 5;

  if (a &gt; 10 || b &gt; 10)
    printf("Al menos uno de los números es mayor que 10");
}
</code></pre><p>El resultado es <code>a es mayor que b</code> porque la condición <code>a &gt; b</code> es verdadera.</p><p>Sin embargo, si usaste el operador NOT (<code>!</code>), la condición ya no es verdadera, por lo que no habría salida:</p><pre><code class="language-c">
#include &lt;stdio.h&gt;

int main(void) {
  int a = 20;
  int b = 5;

  if ( a &gt; b)
    printf("a es mayor que b\n");
</code></pre><h2 id="conclusi-n">Conclusión</h2><p>¡Y ahí lo tienes! Ahora sabes cómo funcionan los tres operadores lógicos en la programación en C.</p><p>Para aprender más sobre C, te recomiendo leer <a href="https://www.freecodecamp.org/news/the-c-beginners-handbook/">este manual para principiantes en C </a>para familiarizarte con los conceptos básicos del lenguaje.</p><p>¡Gracias por leer, y feliz codificación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Declaraciones C Break y Continue - Explicación de las Declaraciones de Control de Bucle en C ]]>
                </title>
                <description>
                    <![CDATA[ En el lenguaje de programación C, hay momentos en los que querrás cambiar el comportamiento de un bucle. Y las declaraciones continue y break te ayudan a omitir iteraciones y salir de los bucles bajo ciertas condiciones. En este tutorial, aprenderás cómo las declaraciones break y continue alteran el flujo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/declaraciones-c-break-y-continue-explicacion-de-las-declaraciones-de-control-de-bucle-en-c/</link>
                <guid isPermaLink="false">65fa5ba124402003fe4e4ac0</guid>
                
                    <category>
                        <![CDATA[ c ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Tue, 26 Mar 2024 19:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/markus-spiske-C0koz3G1I4I-unsplash--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/c-break-and-continue-statements-loop-control-statements-in-c-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">C Break and Continue Statements – Loop Control Statements in C Explained</a>
      </p><p><strong>En el lenguaje de programación C, hay momentos en los que querrás cambiar el comportamiento de un bucle. Y las declaraciones <code>continue</code> y <code>break</code> te ayudan a omitir iteraciones y salir de los bucles bajo ciertas condiciones.</strong></p><p>En este tutorial, aprenderás cómo las declaraciones <code>break</code> y <code>continue</code> alteran el flujo de control de tu programa.</p><p>¡Comencemos!</p><h2 id="c-mo-usar-break-para-salir-de-bucles-en-c">Cómo Usar break para Salir de Bucles en C</h2><p>En C, si deseas salir de un bucle cuando se cumple una condición específica, puedes utilizar la declaración <code>break</code>.</p><p>Como con todas las declaraciones en C, la declaración <code>break</code> debe terminar con un punto y coma (;).</p><p>Veamos un ejemplo para entender qué significa esto.</p><p>Considera el siguiente fragmento de código.</p><pre><code class="language-c">#include&lt;stdio.h&gt;
int main()
{
    int count = 0;
    while(count &lt; 100)
    {
        printf("The value of count is %d \n", count);
        count++;
    }
    return 0;
}</code></pre><p>En este ejemplo, el bucle while repite las declaraciones en el cuerpo del bucle mientras que la variable <code>count</code> sea menor que 100.</p><p>El contador comienza en 0, y aumenta en 1 con cada iteración.</p><p>Ahora, este es el flujo de control normal.</p><p>Modifiquemos esto un poco.</p><ul><li>Lee un entero <code>fav_num</code> del usuario. Supongamos que <code>fav_num</code> es el número favorito del usuario del conjunto {0, 1, 2, ..., 99}.</li><li>Durante cada paso a través del bucle, debes verificar si el valor actual de <code>count</code> es igual a <code>fav_num</code>.</li><li>Te gustaría salir del bucle cuando <code>count</code> sea igual a <code>fav_num</code>.</li></ul><p>Entonces, ¿cómo haces esto?</p><p>Lee a través del siguiente fragmento de código:</p><pre><code class="language-c">#include&lt;stdio.h&gt;
int main()
{
    // Read in the user's favorite number
    int fav_num;
    printf("Enter your favorite number from 0 to 99: ");
    scanf("%d", &amp;fav_num);
    
    int count = 0;
    while(count &lt; 100)
    {
        printf("\nThe value of count is %d.", count);
        if (count == fav_num)
    		break;
        count++;
    }
    return 0;
}</code></pre><p>Durante cada paso a través del bucle, utilizas <code>if (count == fav_num)</code> para verificar si <code>count</code> es igual a <code>fav_num</code>. </p><p>Luego agregas la declaración <code>break;</code> al cuerpo del condicional <code>if</code>. </p><p>Mientras <code>count</code> ≠ <code>fav_num</code>, el control nunca alcanza la declaración <code>break;</code>. </p><p>Cuando <code>count</code> es igual a <code>fav_num</code>, se activa la declaración <code>break;</code>, y luego sales del bucle. El control ahora llega a la primera declaración fuera del bucle.</p><p>A continuación se muestra un ejemplo de salida:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/03/image-1.png" class="kg-image" alt="image-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/03/image-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/03/image-1.png 616w" width="616" height="187" loading="lazy"></figure><p>Observa cómo el control sale del bucle una vez que el contador alcanza 3, que aquí es <code>fav_num</code>.</p><p>En la próxima sección, verás otro ejemplo que reforzará tu comprensión. </p><h2 id="ejemplo-de-declaraci-n-break-en-c">Ejemplo de Declaración break en C</h2><p>▶ Considera el siguiente ejemplo:</p><ul><li><code>A[10]</code> es un arreglo de 10 enteros, inicializado con ceros.</li><li>Deseas leer los elementos del arreglo <code>A</code> del usuario y calcular la suma de los elementos en el arreglo.</li><li>Sin embargo, requieres que cada elemento de <code>A</code> no sea mayor que 20.</li><li>Una vez que el usuario ingresa un número mayor a 20, optas por terminar el bucle. Aquí es donde entra en juego la declaración <code>break;</code>.</li></ul><p>Ahora, lee el siguiente fragmento de código que hace exactamente esto.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int A[10] = {0};
    int sum = 0;
    
    for(int i = 0; i &lt; 10; i++)
    {
        printf("Enter a number: ");
        scanf("%d",&amp;A[i]);
        if (A[i] &gt; 20)
            break;
        
        sum += A[i];
    }
    printf("Sum: %d",sum);
    return 0;
}
</code></pre><ol><li>Aquí, la <code>sum</code> se inicializa en <code>0</code>. En cada paso a través del bucle, se le pide al usuario que ingrese un número. </li><li>El número ingresado se suma al valor actual de <code>sum</code>. </li><li>Si el usuario ingresa un número mayor que 20, el control sale del bucle.</li></ol><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/03/image-191.png" class="kg-image" alt="image-191" width="543" height="130" loading="lazy"></figure><p>Observa cómo el bucle termina una vez que el usuario ingresa un número mayor que <code>20</code>, en este caso <code>21</code>. Posteriormente se imprime la suma de los otros dos números (2 y 3).</p><p>Si has utilizado la declaración <code>switch</code> en C, probablemente hayas utilizado la declaración <code>break;</code> para salir de la escalera de casos tan pronto como se encuentra una etiqueta de caso coincidente.</p><p>Sin embargo, este tutorial tiene como objetivo enseñar cómo utilizar las declaraciones <code>break;</code> y <code>continue;</code> para cambiar el comportamiento de los bucles.</p><h2 id="c-mo-usar-continue-para-omitir-iteraciones-en-c">Cómo usar continue para omitir Iteraciones en C</h2><p>En C, si deseas omitir iteraciones en las que se cumpla una condición específica, puedes utilizar la declaración <code>continue</code>.</p><p>A diferencia de la declaración <code>break;</code>, la declaración <code>continue;</code> no sale del bucle. En cambio, omite solo aquellas iteraciones en las que la condición es verdadera.</p><p>Una vez que se activa la declaración <code>continue;</code>, se omiten las declaraciones en el resto del bucle. Y el control del bucle continúa con la siguiente iteración.</p><h2 id="ejemplo-de-declaraci-n-continue-en-c">Ejemplo de Declaración <code>continue</code> en C</h2><p>Utilicemos el ejemplo de la sección anterior y modifiquémoslo un poco.</p><p>Digamos que no deseas salir del bucle cuando el usuario ingresa un número mayor que 20. Más bien, deseas ignorar esas entradas particulares y calcular la suma de los números restantes en el arreglo <code>A</code>.</p><p>Supongamos que el usuario ingresa 10 números, 3 de los cuales son mayores que 20. Tu código ahora debería calcular y mostrar la suma de los 7 números restantes.</p><p>Entonces, ¿cómo lo haces?</p><p>Puedes utilizar la declaración <code>continue;</code> para omitir solo aquellas iteraciones para las cuales la entrada del usuario fue mayor que 20. Y puedes hacerlo como se muestra en el código a continuación:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int A[10] = {0};
    int sum = 0;
    
    for(int i = 0; i &lt; 10; i++)
    {
        printf("Enter a number: ");
        scanf("%d",&amp;A[i]);
        if (A[i] &gt; 20)
            continue;
        
        sum += A[i];
    }
    printf("Sum: %d",sum);
    return 0;
}</code></pre><p>En la salida de ejemplo, puedes observar que el primer número ingresado es 21, que es mayor que 20.</p><p>Sin embargo, el bucle se ejecuta 10 veces. Y si estás listo para un rápido ejercicio de suma, puedes notar que los números distintos de 21 (2, 3, 5, 4, 7, 15, 14, 2 y 5) suman efectivamente 57. ✅</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/03/image-192.png" class="kg-image" alt="image-192" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/03/image-192.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/03/image-192.png 656w" width="656" height="322" loading="lazy"></figure><h2 id="conclusi-n">Conclusión</h2><p>En este tutorial, has aprendido cómo puedes utilizar las declaraciones <code>break;</code> y <code>continue;</code> para controlar bucles en C.</p><p>En resumen, has aprendido:</p><ul><li>cómo la declaración <code>break;</code> ayuda a salir de bucles bajo condiciones específicas. </li><li>cómo la declaración <code>continue;</code> ayuda a omitir iteraciones bajo condiciones específicas.</li></ul><p>Espero que hayas encontrado útil este tutorial. ¡Feliz codificación! 😄</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Reiniciar Origen en Git: Cómo reiniciar una rama local a la rama de seguimiento remoto ]]>
                </title>
                <description>
                    <![CDATA[ Git es un sistema de control de versiones gratuito y de código abierto. Es el sistema de control de versiones más popular en uso hoy en día. Git realiza un seguimiento de los cambios realizados en un proyecto a lo largo del tiempo. Esto permite a múltiples desarrolladores colaborar y ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/reiniciar-origen-en-git-como-reiniciar-una-rama-local-a-la-rama-de-seguimiento-remoto/</link>
                <guid isPermaLink="false">65edfce8e41e0704006c1b97</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Tue, 26 Mar 2024 19:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/tanner-van-dera-oaQ2mTeaP7o-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/git-reset-origin-how-to-reset-a-local-branch-to-remote-tracking-branch/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Reset Origin – How to Reset a Local Branch to Remote Tracking Branch</a>
      </p><p><strong>Git es un sistema de control de versiones gratuito y de código abierto. Es el sistema de control de versiones más popular en uso hoy en día.</strong></p><p>Git realiza un seguimiento de los cambios realizados en un proyecto a lo largo del tiempo. Esto permite a múltiples desarrolladores colaborar y trabajar en el mismo proyecto en paralelo, sin importar dónde se encuentren en el mundo.</p><p>Permite a los desarrolladores ver el historial del proyecto y ver quién realizó qué cambios y por qué se realizaron esos cambios en primer lugar. Además, con Git, puedes revertir a una versión anterior del código si es necesario.</p><p>Básicamente, Git garantiza a los desarrolladores que están todos en la misma página y sepan qué está sucediendo en el proyecto.</p><p>Cuando trabajas en un proyecto, uno de los desafíos que puedes enfrentar es tratar de sincronizar tu trabajo, específicamente, sincronizar las ramas locales y remotas.</p><p>En este artículo, aprenderás cómo restablecer y hacer coincidir exactamente una rama Git local con una rama remota.</p><p>Esto es lo que cubriremos:</p><ul><li><a href="#git-branch">¿Qué es una rama en Git?</a></li><li><a href="#branch-differences">¿Cuál es la diferencia entre las ramas locales, remotas y las ramas de seguimiento remoto?</a></li><li><a href="#reset-branch">¿Cómo restablecer una rama local de Git a la remota?</a></li><li><a href="#save-state">Guardar el estado actual de tu rama local</a></li><li><a href="#git-checkout">Hacer un git checkout</a></li><li><a href="#get-origin">Hacer fetch de origen</a></li><li><a href="#reset-repo">Restablecer el repositorio local</a></li><li><a href="#clean-changes">Limpiar cualquier cambio no rastreado</a></li><li><a href="#conclusion">Conclusión</a></li></ul><!--kg-card-begin: html--><h2 id="git-branch">¿Qué es una rama en Git? Ramas de Git en pocas palabras para principiantes</h2><!--kg-card-end: html--><p>La ramificación es un aspecto fundamental del control de versiones y un concepto importante de aprender.</p><p>Gracias a la ramificación, los desarrolladores pueden colaborar de una manera más flexible. La ramificación hace que el proceso de desarrollo diario sea más fluido y eficiente.</p><p>La ramificación es una forma de gestionar diferentes versiones de tu código y actúa como un puntero a una instantánea de tus cambios.</p><p>Cuando creas por primera vez un repositorio Git para tu proyecto, en ese mismo momento se crea también la rama principal.</p><p>La rama principal es la rama primaria y predeterminada de tu proyecto. Representa la versión libre de errores, estable y utilizable de tu código que está lista para ser lanzada y compartida con el público. Es la base de código principal.</p><p>Pero, ¿qué sucede cuando quieres añadir una nueva característica a tu proyecto?</p><p>Antes de añadirla, necesitas probarla y asegurarte de que no introduce nuevos errores o interfiere con el código existente.</p><p>Debe haber una forma de trabajar en la nueva característica sin afectar la base de código.</p><p>Y aquí es donde la ramificación resulta útil.</p><p>Las ramas son espacios aislados para experimentar y probar código nuevo sin afectar al código en la rama principal.</p><p>Puedes crear una nueva rama y hacer los cambios que desees. Si estás satisfecho con los cambios, puedes añadirlos a la rama principal fusionándolos. Si no lo estás, puedes eliminar esa rama sin interferir con el código principal en el proyecto.</p><p>Las ramas también permiten a los desarrolladores trabajar en diferentes características al mismo tiempo sin interferir en el trabajo de los demás.</p><p>Para obtener más información sobre las ramas en Git, echa un vistazo a este <a href="https://www.youtube.com/watch?v=e2IbNHi4uCI">vídeo</a> que explica cómo funcionan, y marca este <a href="https://www.freecodecamp.org/news/how-to-use-branches-in-git/">artículo </a>que proporciona una hoja de trucos sobre cómo usarlas.</p><!--kg-card-begin: html--><h3 id="branch-differences">Ramas locales VS remotas VS ramas de seguimiento remoto en Git - ¿Cuál es la diferencia?</h3><!--kg-card-end: html--><p>Una rama local es una rama que solo es accesible en tu máquina local y existe allí de manera aislada. Desde aquí, puedes agregar archivos y hacer confirmaciones de cualquier cambio que realices. Esos cambios se guardarán localmente y solo serán visibles para ti y estarán disponibles en tu máquina física local.</p><p>Los otros desarrolladores no podrán ver tu trabajo ni los cambios que hayas hecho.</p><p>Puedes crear una rama local llamada <code>my_branch</code> usando el siguiente comando:</p><pre><code class="language-bash">git branch my_branch
</code></pre><p>Y para luego listar todas tus ramas locales, solo necesitas usar el comando <code>git branch</code>.</p><p>Para colaborar con otros desarrolladores en el mismo proyecto y para que ellos puedan ver cualquier cambio que realices, necesitas enviar los cambios desde tu rama local a un repositorio remoto. Esto nos lleva a las ramas remotas. </p><p>Una rama remota se refiere a una rama que existe en un repositorio remoto. Un repositorio remoto, también conocido como remoto, típicamente será un repositorio alojado en algún lugar en Internet, en una ubicación remota como en los servidores de GitHub. </p><p>El nombre predeterminado de un repositorio remoto es <code>origin</code>.</p><p>Ahora, una rama de seguimiento remoto se refiere a una referencia local del estado de la rama remota. Por defecto, las ramas no tienen conexión entre sí. Dicho esto, puedes indicarle a una rama local que siga a una remota.</p><!--kg-card-begin: html--><h2 id="reset-branch">Cómo restablecer una rama local de Git a la remota</h2><!--kg-card-end: html--><p>Es posible que hayas estado trabajando en tu rama local, realizando diversos cambios y modificaciones en un proyecto, y hayas concluido que esos cambios ya no son necesarios.</p><p>Quieres eliminarlos y restablecer la rama a la rama remota.</p><p>Además, otro desarrollador puede haber realizado cambios y los haya enviado a la rama remota, por lo que necesitas obtener esos últimos cambios del repositorio remoto para estar al día.</p><p>Los pasos que necesitas seguir para lograr esto son los siguientes:</p><ul><li>Guardar el estado actual de tu rama local (opcional). </li><li>Obtener la última versión del código desde el remoto. </li><li>Restablecer la rama local. </li><li>Limpiar archivos (opcional).</li></ul><!--kg-card-begin: html--><h3 id="save-state">Guardar el Estado Actual de tu Rama Local</h3><!--kg-card-end: html--><p>Antes de comenzar, es posible que desees guardar el estado de tu rama actual en otra rama.</p><p>Cuando restableces una rama local de Git a la remota, perderás los cambios que hayas realizado localmente.</p><p>Este paso es opcional, y puedes elegir hacerlo en caso de que algo salga mal o desees volver a ese trabajo nuevamente en el futuro.</p><p>Para guardar el trabajo utiliza los siguientes comandos: </p><pre><code class="language-bash">git commit -a -m "Estoy guardando mi trabajo"
git branch backup_trabajo</code></pre><p>Tu trabajo se guardó como <code>backup_trabajo</code>.</p><!--kg-card-begin: html--><h3 id="git-checkout">Hacer un git checkout</h3><!--kg-card-end: html--><p>Por lo general, habrá una rama de seguimiento remoto local con el mismo nombre que la remota a la que deseas restablecer, como <code>main</code>.</p><p>Para este proceso usamos:</p><pre><code class="language-bash">git checkout main
</code></pre><p>Si estás utilizando un nombre diferente para esta rama, reemplaza <code>main</code> con el nombre que estés utilizando.</p><!--kg-card-begin: html--><h3 id="get-origin">Obtener origen</h3><!--kg-card-end: html--><p>Para obtener el repositorio remoto y el estado y la versión más recientes del código en el repositorio remoto, introduce el siguiente comando:</p><pre><code class="language-bash">git fetch origin
</code></pre><p><code>origin</code> es un alias creado por Git y especifica la URL remota del repositorio remoto. Por lo general, Git asume automáticamente que el nombre del repositorio remoto es <code>origin</code>.</p><p>Si tienes un nombre remoto diferente, reemplaza <code>origin</code> con el nombre que estés usando.</p><!--kg-card-begin: html--><h3 id="reset-repo">Restablecer el repositorio local</h3><!--kg-card-end: html--><p>Ahora, restablece la rama local <code>main</code> al repositorio remoto utilizando el siguiente comando:</p><pre><code class="language-bash">git reset --hard origin/main
</code></pre><!--kg-card-begin: html--><h3 id="clean-changes">Limpiar cualquier cambio no rastreado</h3><!--kg-card-end: html--><p>Este paso es opcional. Después de usar los comandos anteriores, es posible que te encuentres con algunos archivos no rastreados. Utiliza el siguiente comando para limpiar cualquier cambio no rastreado:</p><pre><code class="language-bash">git clean -xdf
</code></pre><p>Vamos a desglosar la bandera <code>-xdf</code> y explicar qué hace cada parte: </p><ol><li>La bandera <code>-x</code> elimina archivos ignorados. </li><li>La bandera <code>-d</code> elimina carpetas no rastreadas. </li><li>La bandera <code>-f</code> elimina archivos no rastreados.</li></ol><!--kg-card-begin: html--><h2 id="conclusion">Conclusión</h2><!--kg-card-end: html--><p>Y ahí lo tienes: ahora has restablecido tu rama local a la remota. Esperemos que hayas encontrado útil este artículo. </p><p>Para aprender más sobre Git, echa un vistazo a los siguientes recursos gratuitos:</p><ul><li><a href="https://www.youtube.com/watch?v=RGOj5yH7evk">Git y GitHub para Principiantes - Curso Intensivo</a></li><li><a href="https://www.youtube.com/watch?v=Uszj_k0DGsg">Tutorial de Git para Profesionales - Herramientas y Conceptos para Dominar el Control de Versiones con Git</a></li><li><a href="https://www.youtube.com/watch?v=qsTthZi23VE">Tutorial Avanzado de Git - Rebase Interactivo, Cherry-Picking, Reflog, Submódulos y más </a></li></ul><p>¡Gracias por leer y feliz codificación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Eliminar columna en los Marcos de Datos de Pandas  - Cómo quitar columnas de los Marcos de Datos ]]>
                </title>
                <description>
                    <![CDATA[ En Pandas, a veces necesitarás eliminar columnas de un Marco de Datos por varias razones, como limpiar datos, reducir el uso de memoria o simplificar el análisis. Es por ello que en este artículo, te mostraré cómo hacerlo. Comenzaré presentando el método .drop() que es el método principal para eliminar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/eliminar-columna-en-los-dataframes-de-pandas-como-quitar-columnas-de-dataframes/</link>
                <guid isPermaLink="false">65fa679524402003fe4e4b58</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Fri, 22 Mar 2024 18:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/Shittu-Olumide-Dataframe-Drop-Column-in-Pandas---How-to-Remove-Columns-from-Dataframes.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/dataframe-drop-column-in-pandas-how-to-remove-columns-from-dataframes/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Dataframe Drop Column in Pandas – How to Remove Columns from Dataframes</a>
      </p><p><strong>En Pandas, a veces necesitarás eliminar columnas de un Marco de Datos por varias razones, como limpiar datos, reducir el uso de memoria o simplificar el análisis. Es por ello que en este artículo, te mostraré cómo hacerlo.</strong></p><p>Comenzaré presentando el método <code>.drop()</code> que es el método principal para eliminar columnas en Pandas. </p><p>Repasaremos la sintaxis y los parámetros del método <code>.drop()</code>, incluyendo cómo especificar las columnas a eliminar y cómo controlar si el Marco de Datos original se modifica en su lugar o se devuelve un nuevo Marco de Datos.</p><p>A continuación, proporcionaré un ejemplo de cómo usar el método <code>.drop()</code> para eliminar columnas de un Marco de Datos.</p><h2 id="c-mo-usar-el-m-todo-drop-en-pandas">Cómo usar el método <code>.drop()</code> en Pandas</h2><p>El método <code>.drop()</code> es una función incorporada en Pandas que te permite eliminar una o más filas o columnas de un Marco de Datos. </p><p>Devuelve un nuevo Marco de Datos con las filas o columnas especificadas eliminadas y no modifica el Marco de Datos original en su lugar, a menos que establezcas el parámetro <code>inplace</code> en <code>True</code>.</p><p>La sintaxis para usar el método <code>.drop()</code> es la siguiente:</p><pre><code class="language-py">DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')</code></pre><p>Aquí, DataFrame se refiere al Marco de Datos de Pandas del cual deseas eliminar filas o columnas. Los parámetros que puedes usar con el método <code>.drop()</code> incluyen:</p><ul><li><code>labels</code>: Este parámetro especifica las etiquetas o índices de las filas o columnas que se van a eliminar. Puedes pasar una sola etiqueta o índice, o una lista de etiquetas o índices.</li><li><code>axis</code>: Este parámetro especifica si se van a eliminar filas o columnas. Por defecto, está configurado en <code>0</code>, lo que significa que se eliminan filas. Si deseas eliminar columnas, configúralo en <code>1</code>.</li><li><code>index</code> y <code>columns</code>: Estos parámetros son alternativas al parámetro de etiquetas y especifican las etiquetas o índices de las filas o columnas que se van a eliminar, respectivamente.</li><li><code>level</code>: Este parámetro se utiliza para eliminar un nivel específico de un índice jerárquico.</li><li><code>inplace</code>: Este parámetro es un valor booleano que determina si modificar el DataFrame original en su lugar. Por defecto, está configurado en <code>False</code>.</li><li><code>errors</code>: Este parámetro especifica cómo manejar errores si la(s) etiqueta(s) o índice(s) especificado(s) no se encuentran en el DataFrame. Por defecto, está configurado en <code>raise</code>, lo que significa que se genera un <code>KeyError</code>. Otras opciones son <code>ignore</code> y <code>warn</code>, que respectivamente ignorarán o mostrarán una advertencia cuando la etiqueta o índice no se encuentre.</li></ul><p>Cómo eliminar una sola columna de un Marco de Datos en Pandas</p><p>Vamos a empezar suavemente aprendiendo primero cómo eliminar una sola columna de un Marco de Datos antes de eliminar múltiples columnas.</p><p><strong>Muestra del código:</strong></p><pre><code class="language-py">#Traducción al español del código
import pandas as pd
#Creamos un marco de datos de muestra
datos = {"nombre": ['Alicia', 'Bob', 'Charlie'],
        "edad": [25, 30, 35],
        "género": ['F', 'M', 'M']
        }
df = pd.DataFrame(datos)

# Mostramos el Marco de Datos original
print("DataFrame Original:\n", df)

# Damos drop a la columna "género"
df = df.drop(columns=['género'])

# Mostramos el Marco de Datos modificado
print("DataFrame Modificado:\n", df)</code></pre><p><strong>Resultado:</strong></p><pre><code class="language-py">DataFrame Original:
     nombre  edad género
0   Alicia    25      F
1      Bob    30      M
2  Charlie    35      M
DataFrame Modificado:
     nombre  edad
0   Alicia    25
1      Bob    30
2  Charlie    35</code></pre><p>En el ejemplo anterior, primero creamos un Marco de Datos de muestra con tres columnas: <code>nombre</code>, <code>edad</code> y <code>género</code>. Luego utilizamos el método <code>.drop()</code> con el parámetro <code>columns</code> para eliminar la columna <code>género</code>. El Marco de Datos resultante solo contiene las columnas <code>nombre</code> y <code>edad</code>.</p><p>Es importante tener en cuenta que el método <code>.drop()</code> no modifica el Marco de Datos original en su lugar. En su lugar, devuelve un nuevo Marco de Datos con la(s) columna(s) especificada(s) eliminada(s). Si deseas modificar el Marco de Datos original, necesitas asignar el resultado del método <code>.drop()</code> de nuevo a la variable original, como hicimos en el ejemplo anterior.</p><p>Además del parámetro <code>columns</code>, el método <code>.drop()</code> también tiene varios otros parámetros opcionales que puedes usar para controlar cómo se eliminan las columnas.</p><p>Por ejemplo, puedes usar el parámetro <code>inplace</code> para modificar el Marco de Datos original en su lugar en lugar de devolver un nuevo Marco de Datos. También puedes usar el parámetro <code>axis</code> para eliminar columnas por índice en lugar de por nombre.</p><h2 id="c-mo-eliminar-varias-columnas-de-un-marco-de-datos-en-pandas">Cómo eliminar varias columnas de un Marco de Datos en Pandas</h2><p>En esta sección, eliminaremos varias columnas de nuestro Marco de Datos. Este enfoque es similar a eliminar una sola columna del Marco de Datos.</p><p>Para eliminar dos o más columnas de un Marco de Datos usando el método <code>.drop()</code> en Pandas, podemos pasar una lista de nombres de columnas al parámetro <code>columns</code> del método.</p><pre><code class="language-py">import pandas as pd

# creando -otra vez- un Marco de Datos
datos = {'nombre': ['John', 'Maria', 'Pedro'],
        'edad': [30, 25, 35],
        'género': ['M', 'F', 'M'],
        'ciudad': ['Ciudad de México', 'San José', 'Buenos Aires']}
df = pd.DataFrame(datos)

# Removiendo las columnas género y ciudad
df.drop(columns=['género', 'ciudad'], inplace=True)

# Damos print en el Marco de Datos modificado
print(df)
</code></pre><p><strong>Resultado:</strong></p><pre><code class="language-bash"> nombre  edad
0   John    30
1  Maria    25
2  Pedro    35</code></pre><p><strong>Explicación del código:</strong></p><p>En este ejemplo, primero creamos un Marco de Datos de muestra con cuatro columnas: <code>nombre</code>, <code>edad</code>, <code>género</code> y <code>ciudad</code>. Luego, usamos el método .drop() para eliminar las columnas <code>ciudad</code> y <code>género</code> &nbsp;pasando una lista con sus nombres al parámetro <code>columns</code>. </p><p>Finalmente, establecemos el parámetro <code>inplace</code> en <code>True</code> para modificar el Marco de Datos original e imprimir el Marco de Datos modificado.</p><p>Ten en cuenta que también puedes eliminar columnas por sus índices pasando una lista de índices al parámetro <code>columns</code>. Por ejemplo, para eliminar la segunda y tercera columnas, puedes usar:</p><pre><code class="language-py">df.drop(columns=df.columns[1:3], inplace=True)</code></pre><p>Esto eliminará las columnas con índices 1 y 2 (que son las columnas de <code>edad</code> y <code>género</code> en este ejemplo).</p><h2 id="conclusi-n">Conclusión</h2><p>Espero que este artículo sea un recurso útil para cualquier persona que trabaje con Marco de Datos de Pandas y necesite eliminar columnas de manera eficiente y efectiva.</p><p>¡Conéctate conmigo en <a href="https://www.twitter.com/Shittu_Olumide_">Twitter </a>y <a href="https://www.linkedin.com/in/olumide-shittu">LinkedIn</a>! También puedes suscribirte a mi canal de <a href="https://www.youtube.com/channel/UCNhFxpk6hGt5uMCKXq0Jl8A">YouTube</a>.</p><p>¡Feliz Codificación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo automatizar tareas de Excel con Python ]]>
                </title>
                <description>
                    <![CDATA[ Excel es una herramienta sorprendentemente común para el análisis de datos. Los analistas de datos pueden modificar, examinar y mostrar grandes cantidades de datos con facilidad utilizando Excel, lo que facilita la obtención de perspectivas y la toma de decisiones acertadas. La versatilidad de Excel permite a los usuarios llevar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-automatizar-tareas-de-excel-con-python/</link>
                <guid isPermaLink="false">65f603bffef4be04135ccba4</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                    <category>
                        <![CDATA[ análisis de datos ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Excel ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Fri, 22 Mar 2024 18:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/FreecodeCamp-data-analysis.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/automate-excel-tasks-with-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Automate Excel Tasks with Python</a>
      </p><p><strong>Excel es una herramienta sorprendentemente común para el análisis de datos.</strong></p><p>Los analistas de datos pueden modificar, examinar y mostrar grandes cantidades de datos con facilidad utilizando Excel, lo que facilita la obtención de perspectivas y la toma de decisiones acertadas.</p><p>La versatilidad de Excel permite a los usuarios llevar a cabo una variedad de actividades de análisis de datos, desde operaciones matemáticas sencillas hasta análisis estadísticos complejos. Además, Excel ofrece automatización mediante el uso de programas de terceros como Python o el lenguaje de programación integrado VBA.</p><p>Excel se utiliza con frecuencia para el análisis de datos en una variedad de industrias, incluyendo la banca, la atención médica y el marketing, gracias a su versatilidad y facilidad de uso.</p><p>Pero como analista de datos, es posible que te encuentres repitiendo tareas mundanas a diario cuando trabajas con Excel.</p><p>Estas tareas pueden incluir copiar y pegar datos, dar formato a celdas y crear gráficos, entre otras. Con el tiempo, esto puede volverse monótono y consumir mucho tiempo, dejándote con menos tiempo para concentrarte en aspectos más importantes del análisis de datos, como identificar tendencias, valores atípicos y perspectivas.</p><p>Por eso, automatizar Excel utilizando Python puede cambiar el juego, ayudándote a optimizar tus flujos de trabajo y liberar tiempo para un análisis más significativo.</p><p>En este tutorial, te mostraré algunas formas útiles de crear, actualizar y analizar hojas de cálculo de Excel utilizando programación en Python. ¡Vamos a sumergirnos! </p><h2 id="-c-mo-fusionar-dos-hojas-de-c-lculo-separadas-con-python"><strong>¿Cómo fusionar dos hojas de cálculo separadas con Python?</strong></h2><p>Los analistas de datos a menudo tienen que trabajar con muchas hojas de cálculo, lo que puede volverse agobiante cuando tienes que fusionar esos archivos juntos.</p><p>El código a continuación te ayuda a fusionar dos archivos separados juntos.</p><pre><code class="language-python">import pandas as pd

# Read in the two Excel files

file1 = pd.read_excel('file1.xlsx')file2 = pd.read_excel('file2.xlsx')

# Merge the two files using the concat() method
merged_file = pd.concat([file1, file2], ignore_index=True)

# Write the merged file to a new Excel file
merged_file.to_excel('merged_file.xlsx', index=False)</code></pre><p>En este código, primero importamos la biblioteca Pandas, que utilizaremos para leer y manipular los archivos de Excel.</p><p>Primero usamos el método <code>read_excel()</code> para leer tanto en <code>file1.xlsx</code> como en <code>file2.xlsx</code>. </p><p>Luego, empleamos el método <code>concat()</code> para unir los dos archivos juntos. El argumento<code>ignore_index=True</code> garantiza que los valores de índice de ambos archivos se reinicien, de modo que no terminemos con valores de índice duplicados en el archivo fusionado.</p><p>Finalmente recurrimos al método <code>to_excel()</code> para escribir el archivo fusionado en un nuevo archivo de Excel llamado <code>merged_file.xlsx</code>. También establecemos <code>index=False</code> para asegurarnos de que la columna de índice no se incluya en el archivo de salida.</p><h2 id="c-mo-importar-y-exportar-datos-con-python">Cómo Importar y Exportar Datos con Python</h2><p>Esta tarea implica el uso de bibliotecas de Python como Pandas para leer archivos de Excel en un objeto DataFrame. Luego puedes manipularlo y analizarlo utilizando Python.</p><p>También puedes exportar datos desde Python de vuelta a un archivo de Excel utilizando las mismas bibliotecas.</p><pre><code class="language-python">import pandas as pd
# Import Excel file

df = pd.read_excel('filename.xlsx', sheet_name='Sheet1')

# Export to Excel file
df.to_excel('new_filename.xlsx', index=False)</code></pre><p>El código dado importa la biblioteca Pandas y lee un archivo de Excel llamado "filename.xlsx" desde la Hoja1 del libro de trabajo, almacenando los datos en un marco de datos de Pandas llamado "df". Luego, el marco de datos se exporta a un nuevo archivo de Excel llamado "new_filename.xlsx" utilizando el método "to_excel". El parámetro "index=False" se utiliza para excluir la indexación de filas en el archivo de salida.</p><p>Esencialmente, el código copia el contenido del archivo de Excel original a un nuevo archivo utilizando Pandas.</p><h2 id="c-mo-limpiar-y-transformar-datos-usando-python">Cómo Limpiar y Transformar Datos usando Python</h2><p>Esta tarea implica el uso de bibliotecas de Python como Pandas para limpiar y transformar datos en Excel.</p><p>Esto puede incluir la eliminación de duplicados, filtrado de datos según criterios específicos y realización de cálculos sobre los datos.</p><pre><code class="language-python">import pandas as pd

# Remove duplicates
df = df.drop_duplicates()

# Filter data
df = df[df['column_name'] &gt; 10]

# Perform calculations
df['new_column'] = df['column1'] + df['column2']</code></pre><p>El fragmento de código anterior realiza tareas de limpieza y manipulación de datos en un marco de datos de Pandas llamado 'df' utilizando la biblioteca Pandas.</p><p>En primer lugar, elimina filas duplicadas de 'df' utilizando el método "drop_duplicates". En segundo lugar, filtra el marco de datos 'df' seleccionando las filas donde el valor en la columna 'column_name' es mayor que 10 y asigna el resultado filtrado a un nuevo marco de datos llamado 'data_df'.</p><p>Por último, se añade una nueva columna llamada 'new_column' a 'df' que contiene la suma de los valores de 'column1' y 'column2'.</p><p>En general, el código limpia y manipula eficazmente los datos eliminando duplicados, filtrando filas específicas y añadiendo una nueva columna calculada al marco de datos original.</p><h2 id="c-mo-realizar-an-lisis-de-datos-con-python">Cómo Realizar Análisis de Datos con Python</h2><p>Este proceso implica utilizar bibliotecas de Python como Pandas y NumPy para llevar a cabo análisis de datos en datos de Excel.</p><p>Esto podría abarcar desde calcular estadísticas resumidas, como la media y la desviación estándar, hasta crear informes personalizados mediante la agrupación de datos según criterios específicos.</p><pre><code class="language-python">import pandas as pd
import numpy as np

# Calculate summary statistics
df.describe()
# Create custom reports
df.pivot_table(values='column_name', index='category_name', columns='date')</code></pre><p>El código utiliza las bibliotecas Pandas y NumPy y realiza tareas de análisis de datos e informes en un marco de datos de Pandas llamado "df".</p><p>En primer lugar, calcula estadísticas resumidas para los datos numéricos en el marco de datos utilizando el método "describe". Este método genera información valiosa sobre la distribución, tendencia central y dispersión de los datos.</p><p>En segundo lugar, el código utiliza el método "pivot_table" para crear informes personalizados a partir del marco de datos. Este método resume y agrega los datos en el dataframe y puede producir tablas en varios formatos.</p><p>En este código, genera un nuevo marco de datos donde los valores de 'column_name' están agrupados por las columnas 'category_name' y 'date'.</p><p>En resumen, el código realiza tareas de análisis estadístico e informes en el marco de datos para obtener información de los datos.</p><h2 id="c-mo-crear-gr-ficos-con-python">Cómo Crear Gráficos con Python</h2><p>Esta tarea implica utilizar bibliotecas de Python como matplotlib o seaborn para crear gráficos y diagramas a partir de datos de Excel.</p><p>Puedes personalizar estos gráficos para mostrar datos específicos y darles formato para cumplir con requisitos particulares.</p><pre><code class="language-python">import pandas as pd
import matplotlib.pyplot as plt
# Create a bar chart
df.plot(kind='bar', x='category_name', y='sales')
plt.show()
# Create a scatter plot
df.plot(kind='scatter', x='column1', y='column2')plt.show()</code></pre><p>El código importa dos bibliotecas, Pandas y matplotlib.pyplot, utilizando los alias 'pd' y 'plt', respectivamente.</p><p>Luego, se utiliza el método "plot" de Pandas para crear dos tipos de gráficos. El primer tipo de gráfico es un gráfico de barras que muestra la relación entre las columnas 'category_name' y 'sales' en el dataframe "df".</p><p>El segundo tipo de gráfico es un gráfico de dispersión que muestra la relación entre las columnas 'column1' y 'column2' en el mismo marco de datos. El código utiliza los parámetros "kind='bar'" para el gráfico de barras y "kind='scatter'" para el gráfico de dispersión para crear los respectivos gráficos.</p><p>Por último, se llama al método "show" para mostrar los gráficos en la pantalla. En resumen, el código utiliza Pandas y matplotlib para crear un gráfico de barras y un gráfico de dispersión para visualizar los datos en el marco de datos "df".</p><h2 id="c-mo-realizar-visualizaci-n-de-datos-en-python">Cómo Realizar Visualización de Datos en Python</h2><p>Esta tarea implica utilizar bibliotecas de Python como Plotly y Bokeh para crear visualizaciones de datos interactivas a partir de datos de Excel.</p><p>Estas visualizaciones permiten a los usuarios explorar los datos de nuevas formas, como mediante el zoom en puntos de datos específicos o el filtrado de datos según criterios específicos.</p><pre><code class="language-python">import pandas as pd
import plotly.express as px
# Create a heatmap
fig = px.imshow(df.corr())
fig.show()
# Create a line chart
fig = px.line(df, x='date', y='sales', color='category')
fig.show()</code></pre><p>El código utiliza las bibliotecas Pandas y plotly.express para crear dos tipos de visualizaciones. Primero, se crea un gráfico de mapa de calor utilizando el método "imshow" de plotly.express que visualiza la correlación entre las columnas en el marco de datos "df".</p><p>En segundo lugar, se crea un gráfico de líneas utilizando el método "line" de plotly.express que muestra la relación entre las columnas 'date' y 'sales' mientras diferencia entre las categorías basadas en la columna 'category' del dataframe. Ambos gráficos se muestran utilizando el método "show".</p><h2 id="c-mo-automatizar-la-generaci-n-de-informes-con-python">Cómo Automatizar la Generación de Informes con Python</h2><p>Esta tarea implica utilizar scripts de Python para automatizar el proceso de generación de informes a partir de datos de Excel.</p><p>Puedes configurar estos scripts para que se ejecuten según un horario regular, como diario o semanal. También pueden actualizarse automáticamente a medida que haya nuevos datos disponibles.</p><pre><code class="language-python">import pandas as pd
# Create daily report
df_daily = df[df['date'] == '2022-01-01']
df_daily.to_excel('daily_report.xlsx', index=False)
# Create weekly report
df_weekly = df.groupby('category').sum()
df_weekly.to_excel('weekly_report.xlsx', index=False)</code></pre><p>El código crea un informe diario mediante la creación de un nuevo marco de datos "df_daily" que incluye solo las filas donde la columna 'date' es igual a '2022-01-01'. Esto se logra utilizando la función de indexación booleana de Pandas.</p><p>Posteriormente, se utiliza el método "to_excel" para exportar los datos filtrados a un archivo de Excel llamado "daily_report.xlsx", sin incluir la columna de índice.</p><p>A continuación, el código crea un informe semanal agrupando el marco de datos "df" por la columna 'category' y sumando los valores de todas las demás columnas. Esto se logra utilizando los métodos "groupby" y "sum" de Pandas.</p><p>El resultado se guarda en un nuevo marco de datos llamado "df_weekly". Por último, se utiliza el método "to_excel" para exportar los datos agregados a un archivo de Excel llamado "weekly_report.xlsx", sin incluir la columna de índice.</p><p>En resumen, el código crea dos informes utilizando la biblioteca Pandas. El primer informe es un informe diario que incluye solo datos de una fecha específica, y el segundo informe es un informe semanal que agrupa los datos por categoría. Ambos informes se exportan a archivos de Excel utilizando el método "to_excel".</p><h2 id="c-mo-automatizar-tareas-repetitivas-con-macros-y-scripts-en-python">Cómo Automatizar Tareas Repetitivas con Macros y Scripts en Python</h2><p>Esta tarea implica utilizar Python para automatizar tareas repetitivas en Excel, como la entrada de datos o el formato. </p><p>Puedes hacer esto creando macros o scripts que se ejecuten automáticamente, o utilizando Python para interactuar directamente con la aplicación de Excel.</p><pre><code class="language-python">import win32com.client as win32
# Open Excel file
excel = win32.gencache.EnsureDispatch('Excel.Application')
workbook = excel.Workbooks.Open(r'filename.xlsx')
# Run macro
excel.Application.Run('macro_name')
# Save and close Excel
 fileworkbook.Save()workbook.Close()excel.Quit()</code></pre><p>El código utiliza el módulo win32com.client para interactuar con Microsoft Excel a través de la API de Windows.</p><p>Primero, se abre una instancia de la aplicación Excel utilizando el método <code>EnsureDispatch()</code>, y el archivo de Excel especificado se abre utilizando el método <code>Workbooks.Open()</code>.</p><p>A continuación, se ejecuta una macro utilizando el método <code>Application.Run()</code>, pasando el nombre de la macro como argumento.</p><p>Finalmente, los cambios realizados en el archivo de Excel se guardan utilizando el método <code>Save()</code>, el libro de trabajo se cierra utilizando el método <code>Close()</code>, y la aplicación de Excel se termina utilizando el método <code>Quit()</code>.</p><p><strong>Cómo Extraer Datos con Python</strong></p><p>Esta tarea implica utilizar bibliotecas de Python como requests y Beautiful Soup para extraer datos de páginas web u otras fuentes e importarlos a Excel.</p><p>Luego, puedes analizar y manipular estos datos utilizando bibliotecas de Python como Pandas.</p><pre><code class="language-python">import pandas as pd
import requests
from bs4 import BeautifulSoup
# Scrape data from web page
url = 'https://www.website.com/data'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table')
df = pd.read_html(str(table))[0]
# Export to Excel file
df.to_excel('scraped_data.xlsx', index=False)</code></pre><p>Este código utiliza la biblioteca requests para enviar una solicitud GET HTTP a la URL '<a href="https://www.example.com">https://www.example.com</a>'. Luego utiliza la biblioteca BeautifulSoup para analizar el contenido HTML de la respuesta en un objeto BeautifulSoup nombrado 'soup'.</p><p>Puedes luego utilizar métodos de BeautifulSoup como <strong><code>find_all()</code></strong> para extraer datos específicos del HTML:</p><p><code>links = []for link in soup.find_all('a'): &nbsp; &nbsp;href = link.get('href') &nbsp; &nbsp;links.append(href)</code></p><p>Este código encuentra todas las etiquetas de anclaje en el HTML y extrae el valor del atributo 'href' para cada una, agregándolos a una lista nombrada 'links'.</p><h2 id="c-mo-utilizar-python-para-integrar-excel-con-otras-aplicaciones">Cómo Utilizar Python para Integrar Excel con Otras Aplicaciones</h2><p>Esta tarea implica utilizar Python para integrar Excel con otras aplicaciones, como bases de datos o servicios web.</p><p>Puedes hacer esto utilizando bibliotecas de Python como pyodbc para conectarte a bases de datos o mediante el uso de APIs para conectarte a servicios web. Esto permite una transferencia y análisis de datos sin problemas entre diferentes aplicaciones.</p><pre><code class="language-python">import pandas as pd
import pyodbc
# Connect to database
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=server_name;DATABASE=db_name;UID=user_id;PWD=password')
# Read data from database
query = 'SELECT * FROM table_name'
df = pd.read_sql(query, cnxn)
# Export to Excel file
df.to_excel('database_data.xlsx', index=False)</code></pre><p>El código establece una conexión a una base de datos SQL Server utilizando el método <code>pyodbc.connect()</code>, donde el controlador, el nombre del servidor, el nombre de la base de datos, el ID de usuario y la contraseña se proporcionan como argumentos.</p><p>Luego, se define y ejecuta una consulta SQL para recuperar datos de una tabla en la base de datos utilizando el método <code>pd.read_sql()</code>, donde la consulta SQL y el objeto de conexión se proporcionan como argumentos. Los datos recuperados se almacenan en un marco de datos de pandas.</p><p>Finalmente, los datos en el Marco de Datos se exportan a un archivo de Excel llamado "database_data.xlsx" utilizando el método <code>to_excel()</code>, excluyendo la columna de índice de la exportación al establecer el parámetro <code>index</code> en <code>False</code>.</p><h2 id="conclusi-n">Conclusión</h2><p>Python es un lenguaje versátil que puedes utilizar para automatizar muchas tareas de Excel. También puedes utilizar diversas bibliotecas como Pandas, openpyxl, xlwings y pyautogui para manipular datos, extraer información, generar informes y automatizar tareas repetitivas.</p><p>La automatización puede ahorrar tiempo y esfuerzo, reducir errores y aumentar la productividad. La competencia en Python puede ser una habilidad valiosa para cualquier profesional que trabaje con Excel, ya sea un analista de datos o financiero. Al aprender Python, puedes llevar tu trabajo a nuevos niveles.</p><p>¡Conéctate en <a href="https://twitter.com/Olujerry19">Twitter </a>y <a href="https://www.linkedin.com/in/jeremiah-oluseye-58457719a/">LinkedIn</a>. ¡Gracias por leer!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Consejos de búsqueda en GitHub: Cómo buscar problemas, repositorios y más de manera efectiva en GitHub ]]>
                </title>
                <description>
                    <![CDATA[ Cuando era principiante en contribuciones de código abierto, uno de mis mayores desafíos era encontrar los proyectos o problemas correctos en los que trabajar. Durante mucho tiempo, confié en recursos seleccionados por diferentes autores en Internet -muy buenos-, por cierto.  No obstante, siempre quise encontrar una forma de evitar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/consejos-de-busqueda-en-github-como-buscar-problemas-repositorios-y-mas-de-manera-efectiva-en-github/</link>
                <guid isPermaLink="false">65d04f88400c3a03efdc9435</guid>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Tue, 19 Mar 2024 07:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/Search-Github-Freecodecamp-English.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/github-search-tips/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">GitHub Search Tips – How to Search Issues, Repos, and More Effectively on GitHub</a>
      </p><h3 id="cuando-era-principiante-en-contribuciones-de-c-digo-abierto-uno-de-mis-mayores-desaf-os-era-encontrar-los-proyectos-o-problemas-correctos-en-los-que-trabajar-">Cuando era principiante en contribuciones de código abierto, uno de mis mayores desafíos era encontrar los proyectos o problemas correctos en los que trabajar.</h3><p>Durante mucho tiempo, confié en recursos seleccionados por diferentes autores en Internet -muy buenos-, por cierto. </p><p>No obstante, siempre quise encontrar una forma de evitar mi denominado problema personal: una forma de buscar, acceder y seguir proyectos que fueran adecuados para mis habilidades (a fin de poder maximizar mi contribución en línea).</p><p>Acordemos una cosa: a diferencia de Google, buscar en GitHub no es fácil. Pero como desarrollador, es probable que interactúes con GitHub o Gitlab a diario.</p><p>Ahora la pregunta no es para qué usas estos<strong> <a href="https://www.freecodecamp.org/espanol/news/aprende-los-conceptos-basicos-de-git-en-menos-de-10-minutos/">sistemas de control de versiones</a></strong>, sino cómo los estás usando. </p><p>Así como dominar las habilidades de búsqueda en Google es esencial para cualquier usuario regular de Internet; creo que también es esencial para los desarrolladores aprender a buscar eficazmente en GitHub.</p><p>En este artículo vamos a echar un vistazo a diferentes técnicas que puedes emplear para <strong>efectuar búsquedas más exactas en GitHub</strong>. Aprenderás cómo buscar a través de:</p><ul><li>Problemas y solicitudes de extracción</li><li>Repositorios</li><li>Usuarios</li><li>Temas</li></ul><p>Y más... Vamos a empezar.</p><h2 id="consultas-de-b-squeda-de-github">Consultas de búsqueda de GitHub </h2><p>Es bien sabido que para encontrar información detallada sobre algo en Internet, necesitas tener las habilidades de búsqueda correctas. </p><p>No es diferente con GitHub: para encontrar información detallada, puedes utilizar <strong>técnicas comunes de filtrado, ordenación y búsqueda</strong> para encontrar fácilmente problemas y solicitudes de extracción específicos de un proyecto dado.</p><p>Aunque tienes múltiples recursos enumerados en Internet para diferentes proyectos, el principal problema surge cuando quieres hacer una búsqueda por ti mismo. </p><p>¿Cómo empiezas? ¿Qué palabras clave deberías usar para encontrar los resultados correctos?</p><p>La mayoría de los <a href="https://docs.github.com/es/organizations/organizing-members-into-teams/assigning-the-team-maintainer-role-to-a-team-member">mantenedores </a>tienden a etiquetar sus proyectos con problemas, lo que facilita que los colaboradores encuentren proyectos adecuados. A continuación se muestran algunos de los trucos que pueden ayudarte cuando estás usando GitHub.</p><h2 id="c-mo-buscar-problemas-y-solicitudes-de-extracci-n-en-github">Cómo buscar problemas y solicitudes de extracción en GitHub</h2><p>Una de las formas más comunes de encontrar proyectos para contribuir es buscando a través de problemas y solicitudes de extracción relacionadas. Aquí hay algunos trucos que puedes usar para encontrar fácilmente respuestas confiables:</p><ol><li><strong><a href="https://github.com/search?q=is%3Aissue+is%3Aopen+label%3Abeginner&amp;type=issues">is:issue is:open label:beginner</a></strong> - Esta consulta particular mostrará todos los proyectos con problemas abiertos etiquetados como principiante. <code>beginner</code>.</li><li><strong><a href="https://github.com/search?q=is%3Aissue+is%3Aopen+label%3Aeasy&amp;type=issues">is:issue is:open label:easy</a></strong> - Aquí mostrará todos los problemas abiertos etiquetados como fáciles.<code>easy</code>.</li><li><strong><a href="https://github.com/search?q=is%3Aissue+is%3Aopen+label%3Afirst-timers-only&amp;type=issues">is:issue is:open label:first-timers-only</a></strong> - De esta forma se listan todos los problemas abiertos que dan la bienvenida a contribuciones de recién llegados.</li><li><strong><a href="https://github.com/search?q=is%3Aissue+is%3Aopen+label%3Agood-first-bug&amp;type=issues">is:issue is:open label:good-first-bug</a></strong> - Esto enumera los proyectos con problemas abiertos (<em>open issues</em>) etiquetados como "buenos primeros errores" <code>good-first-bug</code>, para atraer a los colaboradores a trabajar en ellos.</li><li><strong><a href="https://github.com/search?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22&amp;type=issues">is:issue is:open label:"good first issue"</a></strong> - Con esta consulta se te mostrarán todos los problemas abiertos con la etiqueta buen primer problema, <code>good first issue</code>, lo que significa que es un buen lugar para que los principiantes comiencen. </li><li><strong><a href="https://github.com/search?q=is%3Aissue+is%3Aopen+label%3Astarter&amp;type=issues">is:issue is:open label:starter</a></strong> - Lista todos los problemas abiertos de GitHub etiquetados como iniciadores <code>starters</code></li><li><strong><a href="https://github.com/search?q=is%3Aissue+is%3Aopen+label%3Aup-for-grabs&amp;type=issues">is:issue is:open label:up-for-grabs</a></strong> - Enumera problemas abiertos que están listos para ser trabajados si tienes las habilidades necesarias.</li><li><strong><a href="https://github.com/search?q=no%3Aproject+type%3Aissue+is%3Aopen&amp;type=issues">no:project type:issue is:open</a></strong> - Mostrará todos los problemas abiertos que no están asignados a un proyecto específico.</li><li><strong><a href="https://github.com/search?q=no%3Amilestone+type%3Aissue+is%3Aopen&amp;type=issues">no:milestone type:issue is:open</a></strong> - Muchas veces, los proyectos están organizados con hitos. Pero si quieres encontrar problemas que no estén rastreados, esta consulta de búsqueda los listará para ti.</li><li><strong><a href="https://github.com/search?q=no%3Alabel+type%3Aissue+is%3Aopen&amp;type=issues">no:label type:issue is:open</a></strong> - Señala todos los problemas abiertos que no tienen etiquetas.</li><li><strong><a href="https://github.com/search?q=is%3Aissue+is%3Aopen+no%3Aassignee&amp;type=issues">is:issue is:open no:assignee</a></strong> - Enseña todos los problemas abiertos que aún no han sido asignados a una persona.</li></ol><h2 id="c-mo-buscar-repositorios">Cómo buscar repositorios</h2><p>Por defecto, para realizar una búsqueda, escribirás el nombre del repositorio en la barra de búsqueda ¡y <em>voilà</em>! Obtendrás algunos resultados de búsqueda.</p><p>Pero las probabilidades de que llegues al repositorio exacto que tenías en mente son muy bajas.</p><p>Veamos algunas formas de estrechar tu búsqueda: </p><h2 id="c-mo-encontrar-por-nombre-descripci-n-readme">Cómo encontrar por nombre, descripción/README</h2><p>Al buscar por nombre y descripción del archivo README, hay que tener en cuenta que la frase de búsqueda debe comenzar con el calificador <em><strong>in</strong></em>. Esto hace posible buscar "dentro" de lo que estamos buscando.</p><p>Veamos un ejemplo de cómo sería una búsqueda individual:</p><ul><li>Usando <code>in:name</code>. Digamos que estás buscando recursos para aprender más sobre Ciencia de Datos. En este caso, puedes usar el comando <code>Ciencia de Datos in:name</code>, que listará los repositorios con Ciencia de Datos <strong><em>en el nombre</em></strong> del repositorio.</li><li>Usando <code>in:description</code>. Si deseas encontrar repositorios con una descripción específica, por ejemplo, repositorios donde se incluya el término "freeCodeCamp" <strong><em>en la descripción</em></strong>, nuestra búsqueda será: <code>freecodecamp in:description</code>.</li><li>Usando <code>in:readme</code> Utilizas esto para buscar a través de un README de un archivo para una cierta frase. Si queremos encontrar repositorios donde se incluya el término freecodecamp <strong><em>en el README</em></strong>, nuestra búsqueda será: freecodecamp <code>in:readme</code>.</li><li>Usando <code>in:topic</code>. Utilizas esto para encontrar si una cierta frase o palabra está etiquetada en los temas. Por ejemplo, para encontrar todos los repositorios donde freecodecamp esté listado <strong><em>en el tema</em></strong>, nuestra búsqueda será: freecodecamp <code>in:topic</code>.</li></ul><p>También se pueden combinar múltiples consultas de búsqueda para estrechar aún más la búsqueda.</p><h2 id="c-mo-encontrar-por-estrellas-forks">Cómo encontrar por Estrellas, Forks </h2><p>Podemos además buscar un repositorio basado en cuántas estrellas y forks tiene el proyecto. Esto nos facilita saber qué tan popular es el proyecto.</p><p><strong>Ejemplos</strong></p><p>Usando <code>stars:n</code>. Si buscamos un repositorio con 1000 estrellas entonces la consulta será <code>stars:1000</code>. Esta acción listará exactamente 1000 repositorios. </p><p>Empleando <code>forks:n</code>. Aquí especificamos el número de <em>forks (</em>es decir<em> </em>las bifurcaciones o ramificaciones<em>) </em>que deseamos de un repositorio. Si queremos que los forks sean menos de 100 entonces nuestra consulta será la siguiente: <code>forks:&lt;100</code>.</p><p>¿La buena noticia? ¡Siempre podemos usar operadores relacionales! &nbsp;<code>&lt;</code>, <code>&gt;</code>, <code>&lt;=</code>, <code>&gt;=</code> &amp; <code>..</code> Esto nos ayudará a hacer más fácil y rápida la búsqueda.</p><h2 id="realizando-b-squedas-mediante-el-lenguaje">Realizando búsquedas mediante el lenguaje</h2><p>Otra forma genial de buscar en GitHub es mediante el lenguaje. Ello nos ayuda a filtrar nuestro repositorio en base al<strong> lenguaje de programación </strong>que buscamos.</p><p><strong>Por ejemplo:</strong></p><ul><li>Tenemos la forma <code>language:LANGUAGE</code>. Si quisieramos buscar un proyecto con código en PHP, nuestra búsqueda sería: <code>language:PHP</code></li></ul><h2 id="b-squedas-mediante-el-nombre-de-la-organizaci-n">Búsquedas mediante el nombre de la organización</h2><p>También podemos buscar repositorios/proyectos que son mantenidos o creados por una organización en específico. Para ello necesitamos empezar nuestra búsqueda con la palabra clave <code>org:</code> seguida del nombre de la organización.</p><p>Si usamos <code>org:freecodecamp</code> nos mostrará los repositorios que sean de freeCodeCamp.</p><h2 id="encontrando-mediante-fechas">Encontrando mediante fechas</h2><p>Si deseamos que los resultados se ajusten a una fecha específica, podemos buscar usando una las siguientes palabras clave: <code>created</code>, <code>updated</code>, <code>merged</code> and <code>closed</code>. Estas palabras clave deberán estar acompañadas por la fecha en el formato <code>YYYY-MM-DD</code>.</p><p><strong>Ejemplo:</strong></p><ul><li>Usando <code>keyword:YYYY-MM-DD</code>. Supongamos que deseamos buscar <strong><em>todos </em></strong>los repositorios con la palabra freeCodeCamp que fueron creados después de 2022-10-01. Entonces nuestra búsqueda será: <code>freecodecamp created:&gt;2022-10-01</code></li></ul><p>También podemos usar los operadores relaciones <code>&lt;</code>, <code>&gt;</code>, <code>&gt;=</code> y<code>&lt;=</code> para buscar repositorios después de, antes de o en una fecha exacta . Si queremos buscar en un <strong><em>rango</em></strong>, entonces usamos<code>...</code>.</p><h4 id="encontrando-repositorios-mediante-el-tipo-de-licencia"><strong>Encontrando repositorios mediante el tipo de licencia</strong></h4><p>Las licencias son muy importantes cuando estamos buscando un proyecto al cual contribuir. Diferentes licencias otorgan diferentes derechos en cuanto a lo que un contribuidor puede o no puede hacer. </p><p>Para facilitarnos la búsqueda de proyectos con las licencias adecuadas, necesitamos tener un buen entendimiento de las licencias. Podemos leer más sobre ellas aquí.</p><p><strong>Ejemplo:</strong></p><ul><li>Usamos <code>license:LICENSE_KEYWORD</code>. Esta es una buena forma de buscar proyectos con licencias específicas. Para buscar proyectos con la licencia MIT, por ejemplo, haríamos lo siguiente: <code>license:MIT</code>.</li></ul><h2 id="encontrar-por-visibilidad">Encontrar por visibilidad</h2><p>También podemos llevar a cabo nuestra búsqueda en términos de la visibilidad del repositorio. En este caso, podemos usar tanto público como privado.</p><p>Esto coincidirá con los problemas (<em>issues</em>) y las <a href="https://docs.github.com/es/issues/tracking-your-work-with-issues/viewing-all-of-your-issues-and-pull-requests">solicitudes de extracción (PRs)</a> que estén en un repositorio público o privado, respectivamente.</p><p><strong>Ejemplos:</strong></p><ul><li>Usamos <code>is:public</code>. Esto mostrará una lista de repositorios públicos. Tomemos un ejemplo donde queramos buscar todos los repositorios <strong><em>públicos </em></strong>propiedad de freeCodeCamp. Entonces nuestra búsqueda será: <code>is:public org:freecodecamp</code>.</li><li>Usando <code>is:private</code>. Dicha consulta significa que listará todos los repositorios <strong><em>privados </em></strong>dentro de los parámetros.</li></ul><h2 id="conclusi-n">Conclusión</h2><p>Aunque hemos cubierto muchas consultas de búsqueda aquí, siempre podemos agregar nuestra creatividad para estrechar aún más nuestra búsqueda combinando varios parámetros juntos. </p><p>Para obtener recursos adicionales y más parámetros de búsqueda, siempre podemos consultar la <a href="https://docs.github.com/es/search-github/searching-on-github">documentación de GitHub</a> o hacer uso de la <a href="https://github.com/search/advanced?">Búsqueda Avanzada de GitHub. </a></p><p>Estos métodos siempre nos serán útiles ya que ofrecen más opciones de filtrado. Hay una miríada de parámetros de búsqueda y variaciones que podríamos utilizar para hacer más fácil nuestra actividad diaria en GitHub. </p><p>Espero que esto les ayude a utilizar la plataforma de manera más fácil y efectiva.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Recursos para aprender Ciencia de Datos y no desistir en el intento: algunos links y consejos ]]>
                </title>
                <description>
                    <![CDATA[ La Ciencia de Datos es un campo emocionante y en constante crecimiento que combina matemáticas, estadísticas y programación para analizar datos y extraer  insights. Si estás interesado en adentrarte en este fascinante mundo, aquí tienes una lista de enlaces recomendados para comenzar tu aprendizaje.  Antes que nada tengo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-aprender-ciencia-de-datos-y-no-desistir-en-el-intento-10-consejos-y-algunos-links-de-apoyo/</link>
                <guid isPermaLink="false">64a0ebaf13b6b807a602e35a</guid>
                
                    <category>
                        <![CDATA[ ciencia de datos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Wed, 12 Jul 2023 14:01:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/07/pexels-markus-spiske-330771.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>La Ciencia de Datos es un campo emocionante y en constante crecimiento que combina matemáticas, estadísticas y programación para analizar datos y extraer <em>insights</em>. Si estás interesado en adentrarte en este fascinante mundo, aquí tienes una lista de enlaces recomendados para comenzar tu aprendizaje. </p><p>Antes que nada tengo que aclarar que incluyo <strong>recursos <em>aparte </em>de FreeCodeCamp. </strong>Estos recursos pueden ser perfectamente <strong>complementarios </strong>para los que desean estudiar algunas de las<strong> certificaciones de FreeCodeCamp. </strong></p><p><strong>Este artículo es un poco más personal dado que la gran mayoría de estos recursos me han ayudado en mi aprendizaje de Ciencia de Datos</strong>. Los comparto como aditamiento a un futuro Podcast de FreeCodeCamp español, organizado por Rafael Hernandez.</p><p>Si lo que buscas son proyectos de Python, <a href="https://www.freecodecamp.org/espanol/news/25-proyectos-en-python-para-principiantes/">aquí tienes algunos</a>. Por otra parte, si necesitas un esquema de la disciplina, puedes <a href="https://www.freecodecamp.org/espanol/news/cientifico-de-datos-narrado-en-5-minutos/">consultar este artículo</a>. Las recomendaciones son opcionales y están basadas en mi análisis propio (que puede errar), aún así espero que alguna parte de este artículo te sea de ayuda. Sin más demoras, he aquí los recursos.</p><h2 id="recursos-en-espa-ol-">Recursos en español:</h2><ol><li><strong>Afi Escuela </strong>- Machine Learning: <a href="https://www.youtube.com/playlist?list=PLwQjmtXIX1O3n7Dkz2lR011jA9joKXSb0"><strong>Enlace</strong></a><br>Descripción: Este canal de YouTube ofrece una serie de videos sobre Machine Learning, donde podrás aprender los conceptos básicos y técnicas avanzadas de esta disciplina.</li><li>Data Science: <a href="https://www.youtube.com/playlist?list=PLwQjmtXIX1O2uQUG-WLDvIiQAgH_VEBBv"><strong>Enlace</strong></a><br>Descripción: Explora esta lista de reproducción que cubre diversos temas relacionados con la Ciencia de Datos, incluyendo análisis exploratorio de datos, visualización y algoritmos de aprendizaje automático.</li><li>Píldoras Informáticas - SQL: <strong><a href="https://www.youtube.com/playlist?list=PLU8oAlHdN5Bmx-LChV4K3MbHrpZKefNwn">Enlace</a><br></strong>Descripción: Aprende SQL, un lenguaje de consulta utilizado para trabajar con bases de datos, a través de esta serie de videos que cubren desde los fundamentos hasta técnicas más avanzadas.</li><li><strong>Píldoras Informáticas</strong> - Python: <strong><a href="https://www.youtube.com/playlist?list=PLU8oAlHdN5BlvPxziopYZRd55pdqFwkeS">Enlace</a><br></strong>Descripción: Descubre el lenguaje de programación Python con esta serie de videos que te guiarán desde los conceptos básicos hasta temas más avanzados.</li><li>Aprendizaje y Minería de Datos (Con R)<strong> - Universidad Politécnica de Valencia: <a href="https://www.youtube.com/playlist?list=PL6kQim6ljTJsmPM_v_b2p8p-GPQhtoekI">Enlace</a><br>Descripción: </strong>Esta lista de reproducción ofrece un curso completo sobre Aprendizaje y Minería de Datos utilizando el lenguaje R. Aprenderás técnicas estadísticas y algoritmos utilizados en este campo.</li><li>Fundamentos de Estadística - <strong>Universidad de los Andes: <a href="https://www.coursera.org/learn/estadistica-aplicada-fundamentos">Enlace</a><br></strong>Descripción: A través de este curso en Coursera, obtendrás los fundamentos de la estadística y aprenderás a aplicarlos en situaciones reales.</li><li>Curso de R - SEE <strong>Sociedad Ecuatoriana de Estadística: <a href="https://www.youtube.com/playlist?list=PL2PpISw8vp_qiCJ-ld_iiRZLi1Cq8xLEs ">Enlace</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</strong>Descripción: Este es un curso en español ofrecido por la Sociedad Ecuatoriana de Estadística (SEE). Está enfocado en el lenguaje de programación R, ampliamente utilizado en análisis estadístico y en ciencia de datos. R es una herramienta poderosa para visualización, manipulación y análisis de datos. Es ideal para aquellos que deseen fortalecer sus habilidades en el análisis estadístico y la manipulación de datos utilizando R.</li></ol><h2 id="recursos-en-ingl-s-para-aprender-ciencia-de-datos-"><strong>Recursos en inglés para aprender Ciencia de Datos:</strong></h2><p>A continuación, se presentan una serie de enlaces recomendados en inglés que te serán útiles para aprender sobre Ciencia de Datos:</p><ol><li><strong><a href="https://www.youtube.com/playlist?list=PLMrJAkhIeNNQV7wi9r7Kut8liLFMWQOXn">Intro to Data Science (Enfoque Matemático)</a></strong></li><li><strong><a href="https://www.youtube.com/playlist?list=PLiiljHvN6z1_o1ztXTKWPrShrMrBLo5P3">Matemáticas para Ciencia de Datos (Álgebra Lineal)</a> y <a href="https://www.youtube.com/playlist?list=PLiiljHvN6z193BBzS0Ln8NnqQmzimTW23">Cálculo Multivariable</a></strong></li><li><strong><a href="https://www.youtube.com/playlist?list=PLoROMvodv4rMiGQp3WXShtMGgzqpfVfbU">Aprendizaje Automático (Andrew NG es un clásico)</a></strong></li><li><strong><a href="https://www.youtube.com/playlist?list=PLD63A284B7615313A">Aprendizaje Automático (También un clásico y mi primer curso teórico en ML)</a></strong></li><li><strong><a href="https://www.youtube.com/playlist?list=PLiud-28tsatIKUitdoH3EEUZL-9i516IL">Matemáticas para Ciencia de Datos (Avanzado)</a></strong></li><li><strong><a href="https://www.youtube.com/playlist?list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI">Introducción al Aprendizaje Profundo (Mejor hacer este después de varios cursos introductorios)</a></strong></li><li><strong><a href="https://www.youtube.com/playlist?list=PLl8OlHZGYOQ7bkVbuRthEsaLr7bONzbXS">Aprendizaje Automático (¡Este es mi curso favorito en ML! El curso del Prof. Kilian es muy recomendado)</a></strong></li><li><strong><a href="https://www.youtube.com/playlist?list=PL2UML_KCiC0UlY7iCQDSiGDMovaupqc83">Aprendizaje Automático (Curso muy práctico y estructurado, necesitarás trabajar en un Notebook de Jupyter para seguir el curso)</a></strong></li><li><strong><a href="https://www.youtube.com/playlist?list=PL05umP7R6ij2XCvrRzLokX6EoHWaGA2cC">Teoría del Aprendizaje Estadístico (Curso bastante avanzado)</a></strong></li><li><strong><a href="https://open.hpi.de/courses/datascience2023">Bootcamp de Ciencia de Datos del Hasso Plattner Institute</a> (Este es reciente, la información es libre pero para sacarle provecho tienes que saber las bases de Python y SQL.) </strong></li></ol><h2 id="cursos-gratuitos-que-no-son-simples-moocs-"><strong>Cursos gratuitos que NO son simples MOOCs:</strong></h2><ol><li><strong><a href="https://programming-23.mooc.fi/">Programación en Python</a>: </strong>Este curso es de la Universidad de Helsinki. Aprendí mucho en los cursos de 2019 y 2020, por lo que considero que la tradición aún continúa.</li><li><strong><a href="https://courses.mooc.fi/org/uh-cs/courses/dap-22">Data Análisis en Python</a>: </strong>De la misma universidad, solo que centrado en el análisis de datos.</li><li><strong><a href="https://grow.google/certificates/data-analytics/#?modal_active=none">Certificado de Analítica de Datos de Google</a>: </strong>Sinceramente, no hice el curso de Data Analytics porque era en R y en ese entonces estaba centrado en Python. Sin embargo, completé el <a href="https://grow.google/intl/es-419_us/certificates/project-management/#?modal_active=none"><strong>Certificado en Gestión de Proyectos</strong></a>, por lo que puedo recomendar la calidad de los cursos de Google. El certificado es de pago, pero puedes pedir ayuda financiera a Coursera en caso de tener una situación económica difícil.</li><li><strong><a href="https://www.udacity.com/scholarships/aws-machine-learning-scholarship-program">Beca AWS Machine Learning Scholarship Program</a>:</strong> También tienes que aplicar a ayuda financiera. En este caso, la beca es condicional a una selección siguiendo los criterios y la fecha de aplicación.</li><li><strong><a href="https://www.wqu.edu/programs/applied-ds-lab/">Applied Data Science Lab</a>: </strong>Este es como un bootcamp de Ciencia de Datos. El lenguaje de programación es Python y tienes que aprobar una preselección. El programa es bastante práctico y puede ser bastante demandante si no estás familiarizado/a con la programación orientada a objetos.</li></ol><p>Por cierto, la universidad también tiene una Maestría en Ingeniería Financiera. Pero a ver, primero debes tener un título de pregrado, aprobar un test cuantitativo y comprometerte a dedicar hasta 25 horas a la semana en el estudio, lo cual puede generar tensión si ya tienes un trabajo.</p><p><strong>Otros consejos para aprender:</strong></p><p><strong>Aporta a las comunidades: </strong>En mi caso, estuve activo en los foros de R Studio y de la Python Software Foundation, aunque la comunidad a la que más he contribuido ha sido FreeCodeCamp. También he tenido el placer de apreciar el proceso de colaboración en GitLab de la comunidad de NumPy. Incluso sin hacer aportes trascendentales, he aprendido mucho en el proceso. Solo en Python, por ejemplo, hay diversas comunidades que puedes explorar. Puedes encontrar sitios como <a href="https://dev.to/">Devto</a> y otros que son muy útiles para conectar con desarrolladores. No todos necesariamente son científicos de datos, pero puedes aprender mucho de otros roles, lo que fortalecerá tu capacidad. Si estás interesado en una comunidad de nicho, puedes visitar <a href="https://www.kaggle.com/">Kaggle</a>.</p><p><strong>Lee materiales de Data Science: </strong>No voy a recomendar sitios específicos para evitar hacer publicidad, pero leer materiales de Data Science puede ayudarte a reforzar lo que has puesto en práctica. </p><p>Aunque no puedes aprender Data Science solo leyendo, el acto de leer puede consolidar tus conocimientos. También puedes optar por revisar exclusivamente el código de otros y analizar si podrías resolver los problemas de manera diferente.</p><p><strong>No te preocupes por ser constante: </strong>Ok aclarando, hay dos formas de ser constante, una buena en la que tu empiezas algo y te has propuesto casi bajo juramento estudiar una determinada materia o avanzar en cierto proyecto hasta terminar. NO me refiero a ese tipo, eso está muy bien.</p><p>Me refiero a la forma "falsa" de ser constante que solo está en nuestra mente debido a nuestros sesgos, es algo así como "el perfil perfecto". Tienes que tener título x, más tantos años de experiencia, y esos mismos años deben de ser en un nicho muy específico, y además debes saber <em>solo </em>cierto lenguaje o cierta herramiento, cierto framework para los proyectos, etc. &nbsp;No se permiten desvíos en la carrera, ni cambios de sector o algo que ponga en evidencia tu "carrera progresiva".</p><p><strong>Este es un error que puede surgir en recursos humanos, </strong><a href="https://www.forbes.com/sites/nextavenue/2014/09/22/why-so-many-job-postings-are-so-ridiculous/">perfiles idealizados en los que los requisitos están mucho más orientados a encontrar un personaje</a> más que personas que sepan hacer el trabajo. </p><p>La diversidad de capacidades y experiencias es parte importante del ser humano, simplemente no necesitas ser el "personaje perfecto". Es muy cierto que muchas veces lo mejor es aplicar, no obstante, s<strong>aber analizar <a href="https://www.recruiter.com/recruiting/how-unrealistic-job-descriptions-build-a-phantom-workforce/">cuales ofertas son realmente irrealistas</a> te ayudará a ahorrar tiempo y esfuerzo.</strong></p><!--kg-card-begin: markdown--><p><em>Puede haber asomo de razón en juzgar a un hombre por los más comunes rasgos de su vida, pero en atención a la natural instabilidad de nuestras costumbres e ideas, entiendo que hasta los buenos autores hacen mal obstinándose en formar del hombre una contextura sólida y constante: eligen un principio general, y de acuerdo con él ordenan o interpretan las acciones, y si no logran acomodarlas a la idea preconcebida, toman el partido de disimular las que no entran en su patrón.</em> Montaigne "De la inconstancia de nuestras acciones". Ensayos</p>
<!--kg-card-end: markdown--><p>La recomendación es la siguiente,<strong> no te dejes intimidar por este tipo de "ofertas", </strong>analiza bien y verás que hay empresas que cuyos requisitos <em>realmente </em>concuerdan con la necesidad que estas tienen. </p><p><strong>Pregúntate lo siguiente: ¿Estos requisitos que solicitan, qué necesidad llegarán a satisfacer en la empresa? </strong>No es lógico solicitar a alguien con un MBA, con 4 años de experiencia en proyectos, dos de ellos <em>solo </em>con Kanban y que sepa Python, R, y también HTML solo para un puesto de analista de datos. O tampoco sería cuerdo solicitar alguien con ingeniería en ciencias de la computación y 3 años de experiencia <em>solo</em><strong><em> </em></strong><em>en determinado sector</em> para un puesto con funciones similares al de Junior Developer pero con otro nombre.</p><p><strong>Escribe para reforzar lo aprendido: </strong>Este consejo puede ser un poco sesgado, ya que yo amo escribir. No es necesario tener el talento de Jorge Luis Borges, pero creo que en la escritura técnica sobre ciencia de datos, lo que importa es que el mensaje cumpla una función pedagógica. </p><p>No se trata de entretener o impresionar, sino de crear contenido útil que simplifique el aprendizaje. Debe ser un contenido educativo que facilite el proceso al máximo. Al ponerse en el lugar de quien explica y de la audiencia/estudiante, podrás reflexionar sobre el proceso y ayudarte a memorizar el tema de forma inconsciente.</p><p><strong>Haz voluntariado: </strong>Existen dos formas de poner en práctica lo aprendido. Una es participar en proyectos de código en comunidades donde todos tienen conocimientos de programación, como trabajar en un repositorio de Github. La otra forma es trabajar en un entorno 100% "natural", donde la mayoría no tiene idea de programación o solo tiene conocimientos generales. </p><p>Contribuir a proyectos sociales u ONGs que te interesen realizando tareas como procesamiento, análisis y visualización de datos te dará una idea de las dificultades del "mundo real". Descubrirás que no todas las organizaciones tienen un marco adecuado para trabajar con los datos. </p><p>En algunos casos, incluso podrías convertirte en educador además de analista de datos, ya que tendrás que explicar los procesos a tu equipo. Incluso para el diseño de una campaña de educación ambiental, podrías necesitar una muestra confiable, y la recolección de datos en los plazos establecidos por el project manager requerirá ajustar la metodología y la gestión...</p><p>¡Ups! Perdón por la digresión, pero espero que haya quedado clara la moraleja: en un caso real, el entorno organizacional tiene su peso y siempre debes recordar que trabajarás con personas, no solo con programas. Tus habilidades de comunicación serán clave. Tu trabajo no consistirá simplemente en trabajar con notebooks de jupyter.</p><p>PD. Si puedes conseguir una pasantía o un trabajo junior remunerado, puedes prescindir del voluntariado.</p><p><strong>Aquí te dejo 3 enlaces relevantes:</strong></p><ul><li><strong><a href="https://www.kdnuggets.com/2020/12/data-science-volunteering.html">Voluntariado en Data Science</a></strong></li><li><strong><a href="https://www.datascienceforsocialgood.org/">Data Science for Social Good</a></strong></li><li><strong><a href="https://datakind.org.uk/volunteer-with-us/">Volunteer with DataKind</a></strong></li></ul><h2 id="la-pregunta-del-mill-n-es-necesario-tener-estudios-universitarios-pregrado-m-ster-para-ejercer-en-data-science"><strong>La pregunta del millón: ¿Es necesario tener estudios universitarios (pregrado, máster) para ejercer en Data Science?</strong></h2><p><strong>Respuesta rápida: No. Respuesta extensa: Depende de lo que quieras hacer y dónde quieras trabajar. </strong></p><p>Algunas empresas tienen requisitos específicos según el sector. Sin duda, tener una formación universitaria es beneficioso para solicitar el puesto, pero la experiencia suele tener más peso. Puedes empezar creando tu propio portafolio (incluso un portafolio como desarrollador de front-end podría ser un buen comienzo). También existe la posibilidad de hacer una t<a href="https://www.institutedata.com/blog/how-can-you-easily-switch-from-software-testing-to-data-science-and-analytics/">ransición desde otro rol como Software Testing a Data Science</a>.</p><p>Incluso puestos como analista de negocios (business analyst) o analista de datos son buenos antecedentes. Estos roles también cuentan como experiencia relevante y, junto con un portafolio y algunas certificaciones, puedes realizar una transición. Esto también aplica si tienes formación universitaria pero en áreas no cuantitativas.</p><h2 id="otras-salidas-profesionales-en-el-campo-de-la-ciencia-de-datos"><strong>Otras Salidas Profesionales en el Campo de la Ciencia de Datos</strong></h2><p><strong>Por último, es necesario que te preguntes acerca de tus objetivos. </strong>Al tener conocimientos de Data Science, hay opciones de carrera<strong>. No es como si Data Scientist fuera tu única opción. </strong>Incluso fuera del sector de tecnología, existen diversas salidas en las que tu conocimiento de programación te daría una ventaja.</p><p>Hoy día, hay periodistas utilizando la ciencia de datos en sus investigaciones, como se evidenció en el caso de los <a href="https://blogs.lse.ac.uk/polis/2017/04/21/backstage-to-the-panama-papers-big-data-analytics-and-collaborative-journalism/">"Panamá Papers"</a>, donde se analizaron millones de documentos para revelar información sobre evasión fiscal y corrupción. Estos periodistas combinan su experiencia en periodismo con habilidades en ciencia de datos para desentrañar historias complejas y presentar información de manera impactante.</p><p><a href="https://www.pmi.org/learning/publications/pm-network/digital-exclusives/5-predictions-for-the-future-of-project-management">Los project managers también se benefician de tener conocimientos en ciencia de datos.</a> Dirigir proyectos con soluciones centradas en inteligencia artificial se ha vuelto cada vez más relevante en el mundo empresarial. Los project managers con habilidades en ciencia de datos pueden aprovechar las capacidades analíticas y predictivas para tomar decisiones informadas y liderar proyectos exitosos en entornos tecnológicos.</p><p>Además, existen carreras especializadas en campos como el <a href="https://www.unir.net/empresa/revista/analista-mercado/">analista de investigación de mercado</a>, donde la capacidad de utilizar herramientas de ciencia de datos para analizar datos de mercado y extraer información relevante es fundamental. Los analistas de investigación de mercado pueden utilizar técnicas de minería de datos y análisis predictivo para comprender mejor las tendencias del mercado y ayudar a las empresas a tomar decisiones estratégicas.</p><p>La consultoría en transformación digital es otro campo donde los conocimientos de ciencia de datos son altamente valorados. Recientemente un <a href="https://www.deloitte.com/global/en/about/press-room/new-deloitte-report-finds-digital-transformation.html">estudio de Deloitte </a>encontró que la capitalización potencial de este mercado posee muy altas prospectivas. </p><p>Ayudar a las organizaciones a aprovechar los datos para optimizar sus procesos, tomar decisiones basadas en datos y adaptarse a los desafíos digitales se ha convertido en una necesidad en la era de la transformación digital. Los consultores en transformación digital con habilidades en ciencia de datos pueden guiar a las empresas en su viaje hacia la adopción de tecnologías y prácticas basadas en datos.</p><p>Estas son solo algunas de tantas opciones, por otra parte, cada vez es más popular el término <a href="https://www.gartner.com/smarterwithgartner/a-data-and-analytics-leaders-guide-to-data-literacy">Data Literacy</a>, o alfabetismo de datos, de allí que un conocimiento mínimo de esta disciplina se pueda volver un requisito creciente en varios sectores.</p><h2 id="conclusi-n-">Conclusión.</h2><p>A lo largo de nuestro recorrido, hemos descubierto que adquirir habilidades en ciencia de datos no solo es valioso para convertirse en un Data Scientist, sino que también abre un abanico de oportunidades profesionales en campos muy diversos.</p><p>En un mundo impulsado por los datos, la capacidad de recopilar, analizar y transformar información en conocimiento es una habilidad altamente demandada. Los profesionales de la ciencia de datos son buscados por su capacidad para extraer insights significativos de grandes volúmenes de datos, identificar patrones, predecir tendencias y tomar decisiones basadas en evidencia.</p><p>No hay tal cosa como un "perfil fijo" para ciencia de datos, así que no te presiones más de lo necesario a la hora de las entrevistas.</p><p>Por último, sonará un poco cliché, pero la ciencia de datos se ha convertido en un elemento clave para que las organizaciones impulsen la innovación, optimicen sus operaciones, comprendan mejor a sus clientes y se adelanten a las demandas del mercado. La combinación de conocimientos en programación, estadísticas, aprendizaje automático y visualización de datos otorga a los científicos de datos una ventaja competitiva para abordar los desafíos complejos de hoy en día.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo triunfar en la entrevista de programación: consejos que me ayudaron a conseguir ofertas de trabajo de Google, Airbnb y Dropbox ]]>
                </title>
                <description>
                    <![CDATA[ En 2017, pasé por algunas entrevistas de programación y recibí ofertas de varias grandes empresas tecnológicas. Entonces, en ese momento, decidí compartir lo que había aprendido en este artículo. Y es que lo acabo de actualizar para 2022, por lo que será relativamente útil y relevante si estás buscando trabajo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-triunfar-en-la-entrevista-de-programacion-consejos-que-me-ayudaron-a-conseguir-ofertas-de-trabajo-de-google-airbnb-y-dropbox/</link>
                <guid isPermaLink="false">64852f964ecd43077f3f625e</guid>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Mon, 26 Jun 2023 18:15:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/06/1_Qf9fEs5XdOEQiWX3R6R6ww.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/coding-interviews-for-dummies-5e048933b82b/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Rock the Coding Interview – Tips That Helped Me Land Job Offers from Google, Airbnb, and Dropbox</a>
      </p><p>En 2017, pasé por algunas entrevistas de programación y recibí ofertas de varias grandes empresas tecnológicas. Entonces, en ese momento, decidí compartir lo que había aprendido en este artículo.</p><p>Y es que lo acabo de actualizar para 2022, por lo que será relativamente útil y relevante si estás buscando trabajo ahora.</p><p>A pesar de obtener calificaciones decentes tanto en mi clase de Algoritmos CS101 como en mi clase de Estructuras de Datos en la universidad, me estremezco al pensar en pasar por una entrevista de programación que se enfoca en algoritmos.</p><p>Por lo tanto, pasé los últimos tres meses averiguando cómo mejorar mis habilidades de programación de entrevistas y finalmente recibí ofertas de grandes compañías tecnológicas como Google, Facebook, Airbnb, Lyft, Dropbox y más.</p><p>En esta publicación, compartiré las ideas y los consejos que obtuve en el camino. Los candidatos experimentados también pueden esperar preguntas sobre el diseño de sistemas, pero eso está fuera del alcance de esta publicación.</p><p>Muchos de los conceptos algorítmicos probados en entrevistas de programación no son los que uso habitualmente en el trabajo, donde soy Ingeniero Front End (web). Naturalmente, me he olvidado un poco de estos algoritmos y estructuras de datos, que aprendí principalmente durante mi primer y segundo año de universidad.</p><p>Es estresante tener que producir código (de trabajo) en una entrevista, mientras alguien examina cada pulsación de tecla que haces. Lo que es peor es que, como entrevistado, se te anima a comunicar su proceso de pensamiento en voz alta al entrevistador.</p><p>Solía pensar que ser capaz de pensar, programar y comunicarse simultáneamente era una hazaña imposible, hasta que me di cuenta de que la mayoría de las personas simplemente no son buenas programando en entrevistas cuando recién comienzan. La entrevista es una habilidad en la que puedes mejorar estudiando, preparándose y practicando.</p><p>Mi reciente búsqueda de trabajo me ha llevado a un viaje para mejorar mis habilidades de programación en las entrevistas. A los ingenieros front-end les gusta despotricar sobre cómo se rompe el proceso de contratación actual porque las entrevistas técnicas pueden incluir habilidades que no están relacionadas con el desarrollo front-end. </p><p>Por ejemplo, escribir un algoritmo de resolución de laberintos y fusionar dos listas ordenadas de números. Como ingeniero front-end, puedo empatizar con ellos.</p><p>El front-end es un dominio especializado en el que los ingenieros tienen que preocuparse por muchos problemas relacionados con la compatibilidad de los navegadores, el modelo de objetos del documento, el rendimiento de JavaScript, los diseños de CSS, etc. </p><p>Es poco común que los ingenieros front-end implementen algunos de los complejos algoritmos probados en las entrevistas.</p><blockquote>En empresas como Facebook y Google, las personas son ingenieros de software en primer lugar y, en segundo lugar, expertos en dominios.<br></blockquote><p>Lamentablemente, las reglas las establecen las empresas, no los candidatos. Hay un gran énfasis en conceptos generales de informática como algoritmos, patrones de diseño, estructuras de datos. Habilidades básicas que debe poseer un buen ingeniero de software. Si deseas el trabajo, debes seguir las reglas establecidas por los maestros del juego: ¡Mejorar tus habilidades de entrevista de programación!</p><p>Este post está estructurado en las siguientes dos secciones. Siéntete libre de pasar directamente a la sección que te interese.</p><ul><li>El desglose de las entrevistas de programación y cómo prepararse para ellas.</li><li>Sugerencias y sugerencias útiles para cada tema de algoritmo (matrices, árboles, programación dinámica, etc.), junto con preguntas de práctica recomendadas de LeetCode para revisar los conceptos básicos y mejorar esos temas.</li></ul><p>El contenido de esta publicación <a href="https://www.techinterviewhandbook.org/">se puede encontrar aquí</a>. Haré actualizaciones allí cuando sea necesario.</p><p>Si estás interesado en el contenido de Front End, consulta mi <a href="https://www.frontendinterviewhandbook.com/">manual de entrevistas de front end aquí.</a></p><h2 id="elige-un-lenguaje-de-programaci-n">Elige un lenguaje de programación</h2><p>Antes que nada, debe elegir un lenguaje de programación para su entrevista de programación algorítmica.</p><p>La mayoría de las empresas te permitirán programar en el lenguaje de tu elección. La única excepción que conozco es Google. Permiten que sus candidatos elijan solo Java, C++, Python, Go o JavaScript.</p><p>En su mayor parte, recomiendo utilizar un lenguaje con el que esté muy familiarizado, en lugar de uno que sea nuevo para usted pero que la empresa utilice ampliamente.</p><p>Hay algunos lenguajes que son más adecuados que otros para codificar entrevistas. Luego hay algunos que absolutamente querrás evitar.</p><p>Según mi experiencia como entrevistador, la mayoría de los candidatos eligen Python o Java. Otros lenguajes comúnmente seleccionados incluyen JavaScript, Ruby y C++. Absolutamente, evitaría los lenguajes de nivel inferior como C o Go, simplemente porque carecen de estructuras de datos y funciones de biblioteca estándar.</p><p>Personalmente, Python es mi elección de facto para codificar algoritmos durante las entrevistas. Es sucinto y tiene una enorme biblioteca de funciones y estructuras de datos.</p><p>Una de las principales razones por las que recomiendo Python es que utiliza API consistentes que operan en diferentes estructuras de datos, como <code>len()</code>, <code>for ... in ...</code> y notación de corte en secuencias (cadenas, listas y tuplas). Obtener el último elemento en una secuencia es <code>arr[-1]</code> , e invertirlo es simplemente <code>arr[::-1]</code>. Puede lograr mucho con una sintaxis mínima en Python.</p><p>Java también es una opción decente. Pero debido a que tendrás que declarar constantemente tipos en su código, significa ingresar pulsaciones de teclas adicionales. Esto ralentizará la velocidad a la que codifica y escribe. Este problema será más evidente cuando tengas que escribir en una pizarra durante las entrevistas en el sitio.</p><p>Las razones para elegir o no C++ son similares a Java. En última instancia, Python, Java y C++ son opciones decentes. Si has estado usando Java por un tiempo y no tienes tiempo para familiarizarse con otro lenguaje, te recomiendo que te ciña a Java en lugar de retomar Python desde cero.</p><p>Esto te ayuda a evitar tener que usar un lenguaje para el trabajo y otro para las entrevistas. La mayoría de las veces, el cuello de botella está en el pensamiento y no en la escritura.</p><p>Una excepción a la convención de permitir que el candidato "escoja cualquier lenguaje de programación que desee" es cuando la entrevista es para un puesto de dominio específico, como roles de ingeniero front-end, iOS o Android. Debes estar familiarizado con los algoritmos en JavaScript, Objective-C, Swift y Java, respectivamente.</p><p>Si necesitas usar una estructura de datos que el lenguaje no admite, como una cola o un montón en JavaScript, pregúntale al entrevistador si puede suponer que tiene una estructura de datos que implementa ciertos métodos con complejidades de tiempo específicas. </p><p>Si la implementación de esa estructura de datos no es crucial para resolver el problema, el entrevistador generalmente lo permitirá.</p><p>En realidad, ser consciente de las estructuras de datos existentes y seleccionar las adecuadas para abordar el problema en cuestión es más importante que conocer los intrincados detalles de implementación.</p><h2 id="revisa-introducci-n-a-las-ciencias-de-la-computaci-n">Revisa introducción a las ciencias de la computación</h2><p>Si has estado fuera de la universidad durante algún tiempo, es muy recomendable que revises los fundamentos de CS. Prefiero repasarlo mientras practico. Escaneo mis notas de la universidad y reviso los diversos algoritmos mientras trabajo en los problemas de algoritmos de LeetCode y Cracking the Coding Interview.</p><p>Si tienes interés en cómo se implementan las estructuras de datos, consulta <a href="https://github.com/yangshun/lago">Lago</a>, un repositorio de GitHub que contiene ejemplos de estructuras de datos y algoritmos en JavaScript.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yangshun/lago"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - yangshun/lago: ? Data Structures and Algorithms library in TypeScript</div><div class="kg-bookmark-description">? Data Structures and Algorithms library in TypeScript - GitHub - yangshun/lago: ? Data Structures and Algorithms library in TypeScript</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" width="32" height="32" alt="favicon" loading="lazy"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yangshun</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/39ada1a566f82185e85c8120be8d9c0d1608443f10be70f2430769f3ac8cbbdd/yangshun/lago" width="1200" height="600" alt="lago" loading="lazy"></div></a></figure><h2 id="la-maestr-a-deviene-de-la-pr-ctica">La maestría deviene de la práctica</h2><p>Luego, adquiere familiaridad y dominio de los algoritmos y las estructuras de datos en el lenguaje de programación elegido.</p><p>Practica y resuelve preguntas de algoritmos en el lenguaje que elijas. Si bien Cracking the Coding Interview es un buen recurso, prefiero resolver problemas escribiendo código, dejándolo funcionar y recibiendo comentarios instantáneos.</p><p>Existen diversos recursos online como <a href="https://leetcode.com/" rel="noopener">LeetCode</a>, <a href="https://www.hackerrank.com/" rel="noopener">HackerRank</a>, y <a href="http://codeforces.com/" rel="noopener">CodeForces</a> con los que puedes practicar ejercicios a la vez que te acostumbras al lenguaje. </p><p>Según mi experiencia, las preguntas de LeetCode son muy similares a las preguntas que se hacen en las entrevistas.</p><p>Las preguntas de HackerRank y CodeForces son más similares a las preguntas de la programación competitiva. Si practicas suficientes preguntas de LeetCode, es muy probable que veas o completes una de las preguntas de su entrevista real (o alguna variante de la misma).<br>Aprender y llegar a comprender las complejidades de tiempo y espacio de las operaciones comunes en el lenguaje elegido. Para Python, esta página será útil. Además, aprende sobre el algoritmo de clasificación subyacente que se usa en la función sort() del lenguaje y sus complejidades de tiempo y espacio (en Python es Timsort, que es un híbrido).<br>Después de completar una pregunta sobre LeetCode, generalmente agrego las complejidades de tiempo y espacio del código escrito como comentarios sobre el cuerpo de la función. </p><p>En lo personal utilizo los comentarios para recordarme comunicar el análisis del algoritmo después de haber completado la implementación.<br>Lee sobre el estilo de programación recomendado para tu lenguaje y apégate a él. Si eliges Python, consulta la Guía de estil. Si eliges Java, consulta la Guía de estilo de Java de Google.<br>Aprende y acostúmbrate a las trampas y advertencias comunes del lenguaje. Si las señalas durante la entrevista y evitas caer en ellos, ganarás puntos de bonificación e impresionarás al entrevistador, independientemente de si el entrevistador está familiarizado con el lenguaje o no.<br>Obtén una amplia exposición a las preguntas de varios temas. En la segunda mitad del artículo, menciono temas de algoritmos y las preguntas útiles para practicar cada tema. Hacer alrededor de 100 a 200 preguntas de LeetCode debería considerarse como algo bueno.</p><p>Si prefieres cursos donde el aprendizaje está más estructurado, aquí hay algunas recomendaciones. De ninguna manera es obligatorio tomar cursos en línea para aprobar las entrevistas.</p><ul><li><a href="https://algo.monster/">AlgoMonster</a> :Tiene como objetivo ayudarlo a superar la entrevista técnica en el menor tiempo posible. Diseñado por los ingenieros de Google, AlgoMonster utiliza un enfoque basado en datos para enseñarte los patrones de preguntas clave más útiles y tiene contenido para ayudarte a revisar rápidamente las estructuras de datos y los algoritmos básicos. Lo mejor de todo es que AlgoMonster no está basado en suscripción: paguas una tarifa única y obtienes acceso de por vida.</li><li><a href="https://www.educative.io/courses/grokking-the-coding-interview">Grokking the Coding Interview: Patterns for Coding Questions</a>: por Educative amplía las preguntas de práctica recomendadas en este artículo, pero aborda la práctica desde una perspectiva de patrón de preguntas. Este es un enfoque con el que también estoy de acuerdo para aprender y que he usado personalmente para mejorar en las entrevistas de programación. El curso te permite practicar preguntas seleccionadas en Java, Python, C++, JavaScript y también proporciona soluciones de muestra en esos lenguajes. Aprende y entiende los patrones, no memorices las respuestas.<br>Y por supuesto, práctica, práctica y más práctica!</li></ul><h2 id="fases-de-una-entrevesta-de-programaci-n"><strong>Fases de una entrevesta de programación </strong></h2><p>¡Felicitaciones, estás listo para poner en práctica tus habilidades! En una entrevista de programación, el entrevistador te hará una pregunta técnica. Escribirás el código en un editor colaborativo en tiempo real (pantalla del teléfono) o en una pizarra (<em>whiteboard</em>), y tendrás de 30 a 45 minutos para resolver el problema. </p><p>¡Aquí es donde comienza la verdadera diversión!<br>Tu entrevistador buscará que cumplas con los requisitos del puesto. Depende de ti demostrarles que tienes las habilidades. Inicialmente, puede parecer extraño hablar mientras programan, ya que la mayoría de los programadores no tienen la costumbre de explicar en voz alta sus pensamientos mientras escriben el código.<br>Sin embargo, es difícil para el entrevistador saber lo que estás pensando con solo mirar tu código. </p><p>Si comunicas tu enfoque al entrevistador incluso antes de comenzar a codificar, puedes validar tu enfoque con ellos. De esta manera, los dos pueden ponerse de acuerdo sobre un enfoque aceptable.</p><h2 id="prepar-ndote-para-una-entrevista-remota">Preparándote para una entrevista remota</h2><p>Para pantallas telefónicas y entrevistas remotas, ten papel y bolígrafo o lápiz para anotar notas o diagramas. Si te hacen una pregunta sobre árboles y gráficos, generalmente ayuda si dibuja ejemplos de la estructura de datos.</p><p>Usa auriculares. Asegúrate de estar en un ambiente tranquilo. No querrás tener un teléfono en una mano y escribir con la otra. Trate de evitar el uso de altavoces. Si la retroalimentación es mala, la comunicación se hace más difícil. Tener que repetirse solo resultará en la pérdida de un tiempo valioso.</p><h2 id="-qu-hacer-cuando-tengas-la-pregunta">¿Qué hacer cuando tengas la pregunta?</h2><p>Muchos candidatos comienzan a programar tan pronto como escuchan la pregunta. Eso suele ser un gran error. Primero, tómate un momento y repita la pregunta al entrevistador para asegurarse de que comprendes la pregunta. </p><p>Si no entiendes la pregunta, entonces el entrevistador puede aclararla.<br>Siempre busca una aclaración sobre la pregunta al escucharla, incluso si crees que está clara. Es posible que descubras que te has perdido de algo. De esta forma también le muestras al entrevistador que estás atento a los detalles.</p><p>Considera hacer las siguientes preguntas.</p><ul><li>¿Cuál es el tamaño del <em>input</em>?</li><li>¿Cuál es el tamaño del rango de valores?</li><li>¿Qué tipo de valores hay? ¿Hay números negativos? ¿Puntos flotantes? ¿Habrá entradas vacías?</li><li>¿Hay duplicados en el <em>input</em>?</li><li>¿Cuáles son algunos casos extremos que aplican para el <em>input</em>?</li><li>¿Cómo se almacena el input ? Si me dan un diccionario de palabras... ¿Es una lista de cadenas o un <em>trie</em>?</li></ul><p>Después de haber aclarado suficientemente el alcance y la intención del problema, explica tu enfoque de alto nivel al entrevistador, incluso si es una solución ingenua. Si estás atascado, considera varios enfoques y explica en voz alta por qué puede o no funcionar. A veces, tu entrevistador puede dar pistas y guiarte hacia el camino correcto.<br>Comienza con un enfoque algo directo; comunica al entrevistador. Explica las complejidades de tiempo y espacio y aclara por qué es malo. En este punto, el entrevistador generalmente mostrará el temido "¿Podemos hacerlo mejor?" pregunta. </p><p>Esto significa que<strong> están buscando un enfoque más óptimo.</strong><br>Esta suele <strong>ser la parte más difícil de la entrevista. </strong>En general, busca trabajos repetidos e intenta optimizarlos almacenando potencialmente en caché el resultado calculado en alguna parte. </p><p>Consúltalo más tarde, en lugar de calcularlo todo de nuevo. Proporciono aquí algunos consejos sobre cómo abordar preguntas específicas del tema en detalle a continuación.<br>Solo comienza a programar después de que tú y tu entrevistador hayan acordado un enfoque y le hayan dado luz verde.</p><h2 id="comenzando-a-programar"><strong>Comenzando a programar</strong></h2><p>Usa un buen estilo para escribir tu código. Leer código escrito por otros no suele ser una tarea agradable. Leer código con un formato horrible escrito por otros es aún peor. Tu objetivo es hacer que su entrevistador entienda tu código para que pueda evaluar rápidamente si tu código hace lo que se supone que debe hacer y si resuelve un problema determinado.<br>Utiliza nombres de variables claros y evita nombres que sean letras sueltas, a menos que sean para iteración. Sin embargo, si estás programando en <em>whiteboard</em>, evita usar nombres de variables detallados. Esto reduce la cantidad de escritura que tendrás que hacer.<br>Siempre explica al entrevistador lo que estás escribiendo. No se trata de leer, palabra por palabra, al entrevistador el código que estás produciendo. Habla sobre la sección del código que estás implementando actualmente en un nivel superior. Explica por qué está escrito así y qué estás tratando de lograr.<br>Cuando copies y pegues el código, considera si es necesario. A veces lo es, a veces no lo es. </p><p>Si te encuentras copiando y pegando una gran cantidad de código que abarca varias líneas, probablemente sea un indicador de que puedas reestructurar el código extrayendo esas líneas en una función. Si se trata de una sola línea que copiaste, por lo general está bien.<br>Sin embargo, recuerda cambiar las variables respectivas en tu línea de código copiada cuando sea relevante. Los errores de copiado y pegado son una fuente común de errores, ¡Incluso en la programación diaria!</p><h2 id="despu-s-de-programar">Después de programar</h2><p>Una vez que hayas terminado de codificar, no anuncies inmediatamente al entrevistador que has terminado. En la mayoría de los casos, tu código no suele ser perfecto. Puede contener bugs o errores de sintaxis. Lo que tienes que hacer es revisar tu código.<br>Primero, revisa tu código de principio a fin. Míralo como si lo hubiera escrito otra persona, lo estás viendo por primera vez y tratando de detectar errores en él. Eso es exactamente lo que hará tu entrevistador. Revisa y arregla cualquier problema que puedas encontrar.<br>A continuación, propón casos de prueba pequeños y avance a través del código (no tu algoritmo) con esas entradas de muestra.<br>A los entrevistadores les gusta cuando les lees la mente. Lo que suelen hacer después de que hayas terminado de codificar es pedirte que escribas pruebas. Es una gran ventaja si escribes pruebas para su código incluso antes de que te soliciten que lo haga. Deberías estar emulando un depurador al recorrer su código. Anota o diles los valores de ciertas variables mientras guía al entrevistador a través de las líneas de código.</p><p>Si hay grandes fragmentos de código duplicados en su solución, reestructura el código para mostrarle al entrevistador que valoras la progamación de calidad. Además, busca lugares donde pueda hacer una <a href="https://en.wikipedia.org/wiki/Short-circuit_evaluation">evaluación de cortocircuito.</a></p><p><br>Por último, menciona las complejidades de tiempo y espacio de su código y explicas por qué es así. Puedes anotar fragmentos de su código con sus diversas complejidades de tiempo y espacio para demostrar su comprensión del código. Incluso puedes proporcionar las API de su lenguaje de programación elegido. Explica cualquier compensación entre tu enfoque actual y los enfoques alternativos, posiblemente en términos de tiempo y espacio.<br>Si tu entrevistador está satisfecho con la solución, la entrevista generalmente termina aquí. </p><p>También es común que el entrevistador te haga preguntas de extensión, como cómo manejarías el problema si toda la entrada es demasiado grande para caber en la memoria, o si la entrada llega como un flujo. Esta es una pregunta de seguimiento común en Google, donde se preocupan mucho por la escala.<br>La respuesta suele ser un enfoque de divide y vencerás: realiza un procesamiento distribuido de los datos y solo lee ciertos fragmentos de la entrada del disco en la memoria, escribe la salida nuevamente en el disco y combínalos más tarde.</p><h2 id="practica-con-entrevistas-simuladas">Practica con entrevistas simuladas</h2><p>Los pasos mencionados anteriormente se pueden ensayar una y otra vez hasta que los hayas internalizado por completo y se conviertan en una segunda naturaleza para ti. Una buena manera de practicar es asociarse con un amigo y turnarse para entrevistarse.<br>Un gran recurso para prepararse para entrevistas de codificación es <a href="https://iio.sh/r/DMCa">interviewing.io.</a> Esta plataforma ofrece entrevistas de práctica gratuitas y anónimas con ingenieros de Google y Facebook, que pueden conducir a trabajos y pasantías reales.<br>En virtud de ser anónimo durante la entrevista, el proceso de entrevista inclusiva es imparcial y de bajo riesgo. Al final de la entrevista, tanto el entrevistador como el entrevistado pueden retroalimentarse mutuamente con el fin de ayudarse mutuamente a mejorar.<br>Hacer bien las entrevistas simuladas desbloqueará la página de trabajos para los candidatos y les permitirá reservar entrevistas (también de forma anónima) con las principales empresas como Uber, Lyft, Quora, Asana y más. </p><p>Para aquellos que son nuevos en las entrevistas de codificación, se puede ver una entrevista de demostración en <a href="https://start.interviewing.io/interview/9hV9r4HEONf9/replay">este sitio</a>. Ten en cuenta que este sitio requiere que los usuarios inicien sesión.<br>He usado interviewing.io, tanto como entrevistador como como entrevistado. La experiencia fue genial. A Aline Lerner, directora ejecutiva y cofundadora de entrevistas.io, y a su equipo les apasiona revolucionar el proceso de codificación de entrevistas y ayudar a los candidatos a mejorar sus habilidades de entrevista.<br>También ha publicado una serie de artículos relacionados con entrevistas de codificación en el blog interviewing.io. Recomiendo registrarse lo antes posible en interviewing.io, aunque esté en versión beta, para aumentar la probabilidad de recibir una invitación.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/02/image-58.png" class="kg-image" alt="image-58" width="600" height="400" loading="lazy"></figure><p>Otra plataforma útil para las entrevistas es <a href="https://pramp.com/" rel="noopener">Pramp</a>. Mientras que Interviewing.io conecta a los posibles buscadores de empleo con entrevistadores de codificación experimentados, Pramp adopta un enfoque diferente. Pramp te empareja con otro compañero que también busca trabajo. Los dos se turnan para asumir los roles de entrevistador y entrevistado. Pramp también prepara preguntas y brinda soluciones e indicaciones para guiar al entrevistado.</p><h2 id="avanza-y-conquista"><strong>Avanza y conquista </strong></h2><p>Después de hacer una buena cantidad de preguntas en LeetCode y tener suficiente práctica haciendo entrevistas simuladas, continúe y ponga a prueba sus nuevas habilidades de entrevista.<br>Postula a tus empresas favoritas o, mejor aún, obtén referencias de tus amigos que trabajan para esas empresas. Las referencias tienden a notarse antes y tienen una tasa de respuesta más rápida que la solicitud sin una referencia. ¡Buena suerte!</p><h2 id="consejos-pr-cticos-para-resolver-preguntas-de-programaci-n"><strong>Consejos prácticos para resolver preguntas de programación</strong></h2><p>Esta sección profundiza en consejos prácticos para temas específicos de algoritmos y estructuras de datos, que aparecen con frecuencia en las preguntas de codificación. Muchas preguntas de algoritmos involucran técnicas que se pueden aplicar a preguntas de naturaleza similar.<br>Cuantas más técnicas tengas en tu arsenal, mayores serán tus posibilidades de pasar la entrevista. Para cada tema, también hay una lista de preguntas recomendadas, que es valiosa para dominar los conceptos básicos. Algunas de las preguntas solo están disponibles con una suscripción paga a LeetCode, que en mi opinión vale la pena si te consigue un trabajo.</p><h2 id="consejos-generales"><strong>Consejos generales</strong></h2><p>Siempre valida la entrada primero. Verifica las entradas que no son válidas, están vacías, son negativas o diferentes. Nunca asumas que te dan los parámetros válidos. </p><p>Alternativamente, aclara con el entrevistador si puedes asumir una entrada válida (generalmente sí), lo que puede ahorrarte tiempo al escribir código que valida la entrada.<br>¿Hay algún requisito o restricción de complejidad de tiempo y espacio?<br>Comprueba si hay errores de apagado por uno.</p><p>En lenguajes donde no hay coerción automática de tipos, comprobar que la concatenación de valores sea del mismo tipo: <code>int</code>,<code>str</code>, y <code>list</code>.</p><p>Después de terminar tu código, use algunas entradas de ejemplo para probar su solución.<br>¿Se supone que el algoritmo debe ejecutarse varias veces, quizás en un servidor web? En caso afirmativo, es probable que la entrada se pueda procesar previamente para mejorar la eficiencia en cada llamada a la API.</p><p>Usa una combinación de paradigmas de programación funcional e imperativa:</p><ul><li>Escribe funciones puras tan a menudo como sea posible.</li><li>Usa funciones puras porque es más fácil razonar con ellas y pueden ayudar a reducir errores en su implementación.</li><li>Evita mutar los parámetros pasados a su función, especialmente si se pasan por referencia, a menos que esté seguro de lo que está haciendo.</li><li>Logra un equilibrio entre precisión y eficiencia. Usa la cantidad correcta de código funcional e imperativo cuando corresponda. La programación funcional suele ser costosa en términos de complejidad espacial debido a la no mutación y la asignación repetida de nuevos objetos. Por otro lado, el código imperativo es más rápido porque opera en objetos existentes.</li><li>Evita confiar en la mutación de variables globales. Las variables globales introducen el estado.</li><li>Asegúrate de no mutar accidentalmente las variables globales, especialmente si tienes que depender de ellas.</li></ul><p>Generalmente, para mejorar la velocidad de un programa, podemos optar por usar una estructura de datos o algoritmo apropiado, o usar más memoria. Es un intercambio clásico de espacio y tiempo.<br>Las estructuras de datos son sus armas. Elegir el arma adecuada para la batalla adecuada es la clave de la victoria. Conozca las fortalezas de cada estructura de datos y la complejidad del tiempo para sus diversas operaciones.<br>Las estructuras de datos se pueden aumentar para lograr una complejidad de tiempo eficiente en diferentes operaciones. Por ejemplo, un HashMap se puede usar junto con una lista doblemente enlazada para lograr una complejidad de tiempo O(1) para la operación &nbsp;<code>get</code> <em>and</em> <code>put</code> &nbsp;en una <a href="https://leetcode.com/problems/lru-cache/">memoria caché LRU.</a></p><p>HashMaps es probablemente la estructura de datos más utilizada para preguntas de algoritmos. Si estás atascado en una pregunta, su último recurso puede ser enumerar las posibles estructuras de datos (afortunadamente no hay tantas) y considerar si cada una de ellas se puede aplicar al problema. Esto ha funcionado para mí a veces.<br>Si estás tomando atajos en tu código, díselo en voz alta a tu entrevistador y explícale lo que harías fuera de un entorno de entrevista (sin limitaciones de tiempo). Por ejemplo, explica que escribirías una expresión regular para analizar una cadena en lugar de usar <code>split</code> , que no cubre todos los casos.</p><h2 id="secuencia"><strong>Secuencia</strong></h2><h4 id="notas">Notas</h4><p>Las matrices y las cadenas se consideran secuencias (una cadena es una secuencia de caracteres). Hay consejos para tratar con matrices y cadenas, que se tratarán aquí.<br>¿Hay valores duplicados en la secuencia? ¿Afectarían la respuesta?<br>Comprueba si hay una secuencia fuera de los límites.<br>Ten cuidado con dividir o concatenar secuencias en tu código. Por lo general, las secuencias de corte y concatenación requieren tiempo O(n). Utiliza índices de inicio y finalización para delimitar un subarreglo o una subcadena siempre que sea posible.<br>A veces se atraviesa la secuencia desde el lado derecho en lugar de desde el izquierdo.</p><p>Domina la técnica de <a href="https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-problems" rel="noopener">sliding window</a> ya que se aplica a muchos problemas de subcadenas o subarreglos.</p><p>Cuando se le dan dos secuencias para procesar, es común tener un índice por secuencia para recorrer. Por ejemplo, usamos el mismo enfoque para fusionar dos matrices ordenadas.</p><h4 id="casos-comunes">Casos comunes</h4><ul><li>Secuencia vacía</li><li>Secuencia con 1 o 2 elementos </li><li>Secuencia con elementos repetidos</li></ul><h2 id="arreglos">Arreglos</h2><h4 id="notas-1"><strong><strong><strong>Not</strong></strong>as</strong></h4><p>¿La matriz está ordenada o parcialmente ordenada? Si es así, alguna forma de búsqueda binaria debería ser posible. Esto generalmente significa que el entrevistador está buscando una solución que sea más rápida que O(n).<br>¿Puedes ordenar la matriz? A veces, ordenar la matriz primero puede simplificar significativamente el problema. Asegúrate de que no sea necesario conservar el orden de los elementos de la matriz antes de intentar ordenarlos.<br>Para las preguntas en las que se trata de la suma o la multiplicación de un subarreglo, puede ser útil el cálculo previo mediante hashing o un prefijo, una suma de sufijos o un producto.<br>Si te dan una secuencia y el entrevistador te pide espacio O(1), podría ser posible usar la matriz en sí como una tabla hash. Por ejemplo, si la matriz tiene valores solo de 1 a N, donde N es la longitud de la matriz, niega el valor en ese índice (menos uno) para indicar la presencia de ese número.</p><h4 id="practice-questions"><strong><strong><strong>Practice Questions</strong></strong></strong></h4><ul><li><a href="https://leetcode.com/problems/two-sum/" rel="noopener">Dos Sumas </a></li><li><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock/" rel="noopener">Mejor tiempo para comprar y vender existencias</a></li><li><a href="https://leetcode.com/problems/contains-duplicate/" rel="noopener">Contenido duplicado </a></li><li><a href="https://leetcode.com/problems/product-of-array-except-self/" rel="noopener">Producto del arreglo con excepción de Self</a></li><li><a href="https://leetcode.com/problems/maximum-subarray/" rel="noopener">Máximo subarreglo</a></li><li><a href="https://leetcode.com/problems/maximum-product-subarray/" rel="noopener">Máximo producto del subarreglo</a></li><li><a href="https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/" rel="noopener"> Encuentra el mínimo en una matriz traspuesta ordenada </a></li><li><a href="https://leetcode.com/problems/search-in-rotated-sorted-array/" rel="noopener">SearchBusca en un arreglo traspuesto ordenado</a></li><li><a href="https://leetcode.com/problems/3sum/" rel="noopener">3Sum</a></li><li><a href="https://leetcode.com/problems/container-with-most-water/" rel="noopener">Contenedor con mayor cantidad de agua </a></li></ul><h2 id="binario"><strong>Binario</strong></h2><h4 id="links-de-estudio"><strong>Links de estudio</strong></h4><ul><li><a href="https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa" rel="noopener">Bits, Bytes, construyendo con los binarios</a></li></ul><h4 id="notas-2">Notas</h4><p>A veces se hacen preguntas que involucran representaciones binarias y operaciones bit a bit. Debes saber cómo convertir un número de forma decimal a forma binaria, y viceversa, en el lenguaje de programación elegido.<br>Algunos fragmentos útiles de utilidad:</p><ul><li>Probar que kth es: <code>num &amp; (1 &lt;&lt; k) != 0</code></li><li>Conjunto kth bit es: <code>num |= (1 &lt;&lt; k)</code></li><li>Turn off kth bit: <code>num &amp;= ~(1 &lt;&lt; k)</code></li><li>Alternar el k-ésimo bit: <code>num ^= (1 &lt;&lt; k)</code></li><li>Para comprobar si un número es una potencia de 2: <code>num &amp; num - 1 == 0</code>.</li></ul><h4 id="casos-comunes-1"><strong>Casos comunes</strong></h4><ul><li>Comprueba si hay desbordamiento/subdesbordamiento</li><li>Números negativos</li></ul><h4 id="preguntas-de-pr-cticas"><strong><strong><strong>Pr</strong></strong>eguntas de prácticas<strong><strong> </strong></strong></strong></h4><ul><li><a href="https://leetcode.com/problems/sum-of-two-integers/" rel="noopener">Suma de dos enteros </a></li><li><a href="https://leetcode.com/problems/number-of-1-bits/" rel="noopener">Número de 1 Bits</a></li><li><a href="https://leetcode.com/problems/counting-bits/" rel="noopener">Contador de Bits</a></li><li><a href="https://leetcode.com/problems/missing-number/" rel="noopener">Número faltante</a></li><li><a href="https://leetcode.com/problems/reverse-bits/" rel="noopener">Reverso de Bits</a></li></ul><h2 id="programaci-n-din-mica">Programación Dinámica</h2><h4 id="links-de-estudio-1"><strong>Links de estudio</strong></h4><ul><li><a href="https://medium.freecodecamp.org/demystifying-dynamic-programming-3efafb8d4296" rel="noopener">Desmistificando la Programación Dinámica </a></li></ul><h4 id="notas-3">Notas</h4><p>La Programación Dinámica (DP) se usa generalmente para resolver problemas de optimización.<a href="https://www.freecodecamp.org/news/coding-interviews-for-dummies-5e048933b82b/undefined"> Alaina Kafkes</a> ha escrito una <a href="https://medium.freecodecamp.org/demystifying-dynamic-programming-3efafb8d4296">publicación increíble </a>sobre cómo abordar los problemas de DP. Deberías leerlo.<br>La única forma de mejorar en DP es con práctica. Se necesita mucha práctica para reconocer que un problema puede ser resuelto por DP.<br>Para optimizar el espacio, a veces no es necesario almacenar toda la tabla DP en la memoria. Los dos últimos valores o las dos últimas filas de la matriz serán suficientes.</p><h4 id="practice-questions-1"><strong><strong><strong>Practice Questions</strong></strong></strong></h4><ul><li><a href="http://www.geeksforgeeks.org/knapsack-problem/" rel="noopener">0/1 Knapsack</a></li><li><a href="https://leetcode.com/problems/climbing-stairs/" rel="noopener">Subiendo escaleras </a></li><li><a href="https://leetcode.com/problems/coin-change/" rel="noopener">Cambio de moneda</a></li><li><a href="https://leetcode.com/problems/longest-increasing-subsequence/" rel="noopener">Subsecuencia creciente más larga </a></li><li><a href="https://github.com/yangshun/tech-interview-handbook/blob/master/algorithms" rel="noopener">Subsecuencia común más larga</a></li><li><a href="https://leetcode.com/problems/word-break/">Problema de salto de palabra</a></li><li><a href="https://leetcode.com/problems/combination-sum-iv/" rel="noopener">Suma de combinación</a></li><li><a href="https://leetcode.com/problems/house-robber/" rel="noopener">House Robber</a> y <a href="https://leetcode.com/problems/house-robber-ii/" rel="noopener">House Robber II</a></li><li><a href="https://leetcode.com/problems/decode-ways/" rel="noopener">Formas de decodificar</a></li><li><a href="https://leetcode.com/problems/unique-paths/" rel="noopener">Caminos únicos</a></li><li><a href="https://leetcode.com/problems/jump-game/" rel="noopener">Jump Game</a></li></ul><h2 id="geometr-a">Geometría</h2><p><strong>Notas</strong></p><p>Al comparar la distancia euclidiana entre dos pares de puntos, es suficiente usar dx² + dy². No es necesario sacar la raíz cuadrada del valor.<br>Para saber si dos círculos se superponen, verifica que la distancia entre los dos centros de los círculos sea menor que la suma de sus radios.</p><h3 id="grafos"><strong><strong><strong>Gr</strong></strong>afos</strong></h3><h4 id="links-de-estudio-2"><strong><strong><strong>Links</strong></strong> de estudio</strong></h4><ul><li><a href="https://medium.com/basecs/from-theory-to-practice-representing-graphs-cfd782c5be38" rel="noopener">De la teoría a la práctica: Representando grafos Theory To Practice: Representing Graphs</a></li><li><a href="https://medium.com/basecs/deep-dive-through-a-graph-dfs-traversal-8177df5d0f13" rel="noopener">Profundiza a través de un grafo: DFS Traversal</a></li><li><a href="https://medium.com/basecs/going-broad-in-a-graph-bfs-traversal-959bd1a09255" rel="noopener">Explicando un grafo: BFS Traversal</a></li></ul><h4 id="notas-4"><strong>Notas</strong></h4><p>Estar familiarizado con las diversas representaciones gráficas y algoritmos de búsqueda de gráficos, y con sus complejidades de tiempo y espacio.<br>Se le puede dar una lista de bordes y se le puede asignar la tarea de construir su propio gráfico a partir de los bordes para realizar un recorrido. Las representaciones gráficas comunes son</p><ul><li>Matriz de<a href="https://es.wikipedia.org/wiki/Matriz_de_adyacencia"> adyacencia</a></li><li>Lista de adyacencia</li><li>HashMap de HashMaps</li></ul><p>Algunas entradas parecen árboles, pero en realidad son grafos. Aclara esto con tu entrevistador. En ese caso, deberá manejar los ciclos y mantener un conjunto de nodos visitados al atravesar.</p><h4 id="algoritmos-de-b-squeda-de-grafos"><strong>Algoritmos de búsqueda de grafos</strong></h4><ul><li>Común: Primera Búsqueda en Amplitud (BFS), Primera búsqueda en profundidad (DFS)</li><li>Poco común: clasificación topológica, algoritmo de Dijkstra<br>Raro: algoritmo de Bellman-Ford, algoritmo de Floyd-Warshall, algoritmo de Prim y algoritmo de Kruskal</li></ul><p>En las entrevistas de codificación, los grafos se representan comúnmente como matrices 2-D, donde las celdas son los nodos y cada celda puede atravesar a sus celdas adyacentes (arriba, abajo, izquierda y derecha). Por lo tanto, es importante estar familiarizado con atravesar una matriz 2-D.<br>Cuando atravieses recursivamente la matriz, siempre asegúrate de que su próxima posición esté dentro de los límites de la matriz. Puedes encontrar más consejos para hacer DFS en una matriz <a href="https://discuss.leetcode.com/topic/66065/python-dfs-bests-85-tips-for-all-dfs-in-matrix-question/">aquí</a>. Una plantilla simple para hacer DFS en una matriz aparece así:</p><pre><code class="language-py">def traverse(matrix):
  rows, cols = len(matrix), len(matrix[0])
  visited = set()
  directions = ((0, 1), (0, -1), (1, 0), (-1, 0))
  def dfs(i, j):
    if (i, j) in visited:
      return
    visited.add((i, j))
    # Traverse neighbors
    for direction in directions:
      next_i, next_j = i + direction[0], j + direction[1]
      if 0 &lt;= next_i &lt; rows and 0 &lt;= next_j &lt; cols: # Check boundary
        # Add any other checking here ^
        dfs(next_i, next_j)
  for i in range(rows):
    for j in range(cols):
      dfs(i, j)</code></pre><h4 id="casos-comunes-2">Casos comunes</h4><ul><li>Grafo vacío</li><li>Grafo con uno o dos nodos</li><li>Grafo disjuntas</li><li>Grafo con ciclos</li></ul><h4 id="preguntas-de-pr-ctica">Preguntas de práctica</h4><ul><li><a href="https://leetcode.com/problems/clone-graph/" rel="noopener">Gráfica de clón </a></li><li><a href="https://leetcode.com/problems/course-schedule/" rel="noopener">Horario de clases </a></li><li><a href="https://leetcode.com/problems/alien-dictionary/" rel="noopener">Diccionario Alien </a></li><li><a href="https://leetcode.com/problems/pacific-atlantic-water-flow/" rel="noopener">Flujo de agua del Pacífico-Atlántico</a></li><li><a href="https://leetcode.com/problems/number-of-islands/" rel="noopener">Número de islas</a></li><li><a href="https://leetcode.com/problems/graph-valid-tree/" rel="noopener">Grafo de árbol válido</a></li><li><a href="https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/" rel="noopener">Número de componentes conectados en un grafo no dirigido </a></li><li><a href="https://leetcode.com/problems/longest-consecutive-sequence/" rel="noopener">Secuencia consecutiva más larga Consecutive </a></li></ul><h2 id="intervalo"><strong>Intervalo</strong></h2><h4 id="notas-5">Notas</h4><p>Las preguntas de intervalo son preguntas que dan una matriz de matrices de dos elementos (un intervalo). Los dos valores representan un valor inicial y final. Las preguntas de intervalo se consideran parte de la familia de matrices, pero involucran algunas técnicas comunes. Por lo tanto, tienen su propia sección especial.</p><p>Un ejemplo de un arreglo con intervalo es el siguiente: <code>[[1, 2], [4, 7]]</code>.</p><p>Las preguntas de intervalo pueden ser complicadas para aquellos que no tienen experiencia con ellas. Esto se debe a la gran cantidad de casos a considerar cuando las matrices de intervalos se superponen.</p><p>Aclara con el entrevistador si <code>[1, 2]</code> y <code>[2, 3]</code> se consideran intervalos superpuestos, porque afecta cómo escribirá sus comprobaciones de igualdad. </p><p>Una rutina común para las preguntas de intervalo es ordenar la matriz de intervalos por el valor inicial de cada intervalo.<br>Tienes que familiarizarte con la escritura de código para verificar si dos intervalos se superponen y fusionar dos intervalos superpuestos:</p><pre><code class="language-js">def is_overlap(a, b):
  return a[0] &lt; b[1] and b[0] &lt; a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]</code></pre><h4 id="casos-comunes-3"><strong>Casos comunes</strong></h4><ul><li>Intervalo único</li><li>Intervalos no superpuestos</li><li>Un intervalo totalmente consumido dentro de otro intervalo</li><li>Intervalos duplicados</li></ul><h4 id="practice-questions-2"><strong><strong><strong>Practice Questions</strong></strong></strong></h4><ul><li><a href="https://leetcode.com/problems/insert-interval/" rel="noopener">Inserta un Intervalo</a></li><li><a href="https://leetcode.com/problems/merge-intervals/" rel="noopener">Une intervalos</a></li><li><a href="https://leetcode.com/problems/meeting-rooms/" rel="noopener">Meeting Rooms</a> and <a href="https://leetcode.com/problems/meeting-rooms-ii/" rel="noopener">Meeting Rooms II</a></li><li><a href="https://leetcode.com/problems/non-overlapping-intervals/" rel="noopener">Intervalos no superpuestos</a></li></ul><h2 id="lista-enlazada"><strong>Lista enlazada</strong></h2><h4 id="notas-6">Notas</h4><p>Al igual que las matrices, las listas enlazadas se utilizan para representar datos secuenciales. El beneficio de las listas enlazadas es que la inserción y eliminación de código desde cualquier lugar de la lista es O(1), mientras que en las matrices, los elementos deben cambiarse.<br>Agregar un nodo ficticio en la cabeza o en la cola podría ayudar a manejar muchos casos extremos en los que las operaciones deben realizarse en la cabeza o en la cola. La presencia de nodos ficticios asegura que las operaciones nunca se ejecutarán en la cabeza o la cola. Los nodos ficticios eliminan el dolor de cabeza de escribir comprobaciones condicionales para tratar con punteros nulos. Asegúrate de quitarlos al final de la operación.<br>A veces, el problema de las listas enlazadas se puede resolver sin almacenamiento adicional. Trata de tomar prestadas ideas del problema de listas enlazadas inversas.<br>Para la eliminación en listas vinculadas, puedes modificar los valores de los nodos o cambiar los punteros de los nodos. Es posible que debas mantener una referencia al elemento anterior.<br>Para particionar listas vinculadas, crea dos listas vinculadas separadas y vuelve a unirlas.<br>Los problemas de listas enlazadas comparten similitudes con los problemas de matrices. Piensa en cómo resolvería un problema de matriz y aplíquelo a una lista enlazada.</p><p>Los enfoques de dos punteros también son comunes para las listas enlazadas:</p><ul><li>Obtener el kth del último nodo: tienes dos punteros, donde uno está k nodos delante del otro. Cuando el nodo de delante llega al final, el otro nodo está k nodos detrás.</li><li>Ciclos de detección: tienes dos punteros, donde un puntero aumenta el doble que el otro. Si los dos punteros se encuentran, significa que hay un ciclo.</li><li>Obtener el nodo medio: tienes dos punteros. Un puntero se incrementa el doble que el otro. Cuando el nodo más rápido llegue al final de la lista, el nodo más lento estará en el medio.</li></ul><p>Es bueno acostumbrarse a las siguientes rutinas porque muchas preguntas de listas enlazadas utilizan una o más de estas rutinas en su solución.</p><ul><li>Contar el número de nodos en la lista enlazada</li><li>Invertir una lista enlazada en su lugar</li><li>Encuentra el nodo medio de la lista enlazada usando punteros rápidos o lentos</li><li>Combinar dos listas juntas</li></ul><h4 id="casos-comunes-4"><strong>Casos comunes</strong></h4><ul><li>Nodo único</li><li>Dos nodos</li><li>La lista enlazada tiene un ciclo. Aclare con el entrevistador si puede haber un ciclo en la lista. Por lo general, la respuesta es no.</li></ul><h4 id="preguntas-de-pr-ctica-1"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/reverse-linked-list/" rel="noopener">Revierte una lista enlazada </a></li><li><a href="https://leetcode.com/problems/linked-list-cycle/" rel="noopener">Detecta un ciclo en una lista enlazada </a></li><li><a href="https://leetcode.com/problems/merge-two-sorted-lists/" rel="noopener">Une dos listas ordenadas Two Sorted Lists</a></li><li><a href="https://leetcode.com/problems/merge-k-sorted-lists/" rel="noopener">Une K listas ordenadas</a></li><li><a href="https://leetcode.com/problems/remove-nth-node-from-end-of-list/" rel="noopener">Remueve el nodo Nth del final de la lista </a></li><li><a href="https://leetcode.com/problems/reorder-list/" rel="noopener">Reordena la Lista</a></li></ul><h2 id="matem-ticas">Matemáticas</h2><h4 id="notas-7">Notas</h4><p>Si el código implica división o módulo, recuerda verificar si hay división o módulo por 0.<br>Cuando una pregunta involucra "un múltiplo de un número", el módulo puede ser útil.<br>Verifica y maneja el desbordamiento y el subdesbordamiento si estás utilizando un lenguaje escrito como Java y C++. Como mínimo, menciona que es posible un desbordamiento o un desbordamiento y pregunta si necesitas manejarlo.<br>Considera números negativos y números de coma flotante. Esto puede sonar obvio, pero cuando estás bajo presión en una entrevista, muchos puntos obvios pasan desapercibidos.<br>Si la pregunta pide implementar un operador como potencia, raíz cuadrada o división, y debes ser más rápido que O(n), la búsqueda binaria suele ser el enfoque.</p><h4 id="algunas-f-rmulas-comunes"><strong>Algunas fórmulas comunes</strong></h4><ul><li>Suma de 1 a N = (n+1) * n/2</li><li>Suma de GP = 2⁰ + 2¹ + 2² + 2³ + … 2^n = 2^(n+1)-1</li><li>Permutaciones of N = N! / (N-K)!</li><li>Combinaciones of N = N! / (K! * (N-K)!)</li></ul><h4 id="casos-comunes-5">Casos comunes</h4><ul><li>División por 0</li><li>Desbordamiento y subdesbordamiento de enteros</li></ul><h4 id="preguntas-de-pr-ctica-2"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/powx-n/" rel="noopener">Pow(x, n)</a></li><li><a href="https://leetcode.com/problems/sqrtx/" rel="noopener">Sqrt(x)</a></li><li><a href="https://leetcode.com/problems/integer-to-english-words/" rel="noopener">Entero a palabras en inglés </a></li></ul><h2 id="matriz"><strong>Matriz</strong></h2><h4 id="notas-8"><strong><strong><strong>Not</strong></strong>as</strong></h4><p>Una matriz es un arreglo bidimensional. Las preguntas que involucran matrices generalmente están relacionadas con la programación dinámica o el recorrido de gráficos.<br>Para preguntas que involucren programación transversal o dinámica, tienes que hacer una copia de la matriz con las mismas dimensiones que se inicializan a valores vacíos. Utiliza estos valores para almacenar el estado visitado o la tabla de programación dinámica. Familiarízate con esta rutina:</p><pre><code class="language-py">rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)</code></pre><ul><li>Muchos juegos basados en cuadrículas se pueden modelar como una matriz. Por ejemplo, Tic-Tac-Toe, Sudoku, Crossword, Connect 4 y Battleship. No es raro que se te pida que verifiques la condición ganadora del juego. </li><li>Para juegos como Tic-Tac-Toe, Connect 4 y Crosswords, la verificación debe realizarse vertical y horizontalmente. Un truco es escribir código para verificar la matriz de las celdas horizontales. Luego transpón la matriz, reutilizando la lógica utilizada para la verificación horizontal para verificar celdas originalmente verticales (que ahora son horizontales).</li><li>Transponer una matriz en Python es simple:</li></ul><pre><code class="language-py">transposed_matrix = zip(*matrix)</code></pre><h4 id="casos-comunes-6"><strong>Casos comunes</strong></h4><ul><li>Matriz vacía. Verifique que ninguna de las matrices tenga una longitud de 0.</li><li>Matriz 1 x 1.</li><li>Matriz con una fila o columna</li></ul><h4 id="preguntas-de-pr-ctica-3"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/set-matrix-zeroes/" rel="noopener">Conjunto de matriz cero </a></li><li><a href="https://leetcode.com/problems/spiral-matrix/" rel="noopener">Matriz espiral</a></li><li><a href="https://leetcode.com/problems/rotate-image/" rel="noopener">Imagen traspuesta </a></li><li><a href="https://leetcode.com/problems/word-search/" rel="noopener">Buscador de palabras </a></li></ul><h2 id="recursi-n"><strong>Recursión</strong></h2><h4 id="notas-9">Notas</h4><p>La recursividad es útil para la permutación, porque genera todas las combinaciones y preguntas basadas en árboles. Debes saber cómo generar todas las permutaciones de una secuencia y cómo manejar los duplicados.<br>Recuerda siempre definir un caso base para que su recursión termine.</p><p>La recursividad utiliza implícitamente una pila. Por lo tanto, todos los enfoques recursivos se pueden reescribir iterativamente usando una pila.</p><p>Ten cuidado con los casos en los que el nivel de recurrencia es demasiado profundo y provoca un desbordamiento de la pila (el límite predeterminado en Python es 1000). Puedes obtener puntos de bonificación por señalar esto al entrevistador.</p><p>La recursividad nunca será una complejidad de espacio O(1) porque se trata de una pila, a menos que haya una<a href="https://stackoverflow.com/questions/310974/what-is-tail-call-optimization"> optimización de llamada final (TCO)</a>. Averigua si su lenguaje elegido es compatible con TCO.</p><h4 id="preguntas-de-pr-ctica-4"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/subsets/" rel="noopener">Subconjunto</a> and <a href="https://leetcode.com/problems/subsets-ii/" rel="noopener">Subconjunto II</a></li><li><a href="https://leetcode.com/problems/strobogrammatic-number-ii/" rel="noopener">Número Strobogramático II</a></li></ul><h2 id="cadenas"><strong>Cadenas</strong></h2><h4 id="notas-10">Notas</h4><p>Por favor lee los siguientes tips en la <a href="https://github.com/yangshun/tech-interview-handbook/tree/main/algorithms#sequence">secuencia</a>. Aplica para las cadenas también.</p><p>Pregunta sobre el conjunto de caracteres de entrada y la distinción entre mayúsculas y minúsculas. Por lo general, los caracteres se limitan a caracteres latinos en minúsculas, por ejemplo, de la a a la z.<br>Cuando necesites comparar cadenas donde el orden no es importante (como un anagrama), puedes considerar usar un HashMap como contador.</p><p>Si tu lenguaje de programación tiene una clase <code>Counter</code> como Python, pregunta si puedes usar esta clase mejor.</p><p>Si necesitas mantener un contador de caracteres, un error común es decir que la complejidad del espacio requerida para el contador es O(n). El espacio requerido para un contador es O(1) no O(n). Esto se debe a que el límite superior es el rango de caracteres, que suele ser una constante fija de 26. El conjunto de entrada son solo caracteres latinos en minúsculas.<br>Las estructuras de datos comunes para buscar cadenas de manera eficiente son</p><ul><li><a href="https://www.wikiwand.com/en/Trie" rel="noopener">Trie/Árbol de prefijo</a></li><li><a href="https://www.wikiwand.com/en/Suffix_tree" rel="noopener">Árbol de sufijo</a></li></ul><p>Algunos algoritmos comunes son:</p><ul><li><a href="https://www.wikiwand.com/en/Rabin%E2%80%93Karp_algorithm" rel="noopener">Rabin Karp</a>, que realiza búsquedas eficientes de subcadenas, utilizando un hash rodante</li><li><a href="https://www.wikiwand.com/en/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm" rel="noopener">KMP</a>, que realiza búsquedas eficientes de subcadenas</li></ul><p><strong>Caracteres que no se repiten</strong></p><p>Usa una máscara de bits de 26 bits para indicar qué caracteres latinos en minúsculas están dentro de la cadena.</p><pre><code class="language-py">mask = 0
for c in set(word):
  mask |= (1 &lt;&lt; (ord(c) - ord('a')))</code></pre><p>Para determinar si dos cadenas tienen caracteres comunes, realiza <code>&amp;</code> en las dos máscaras de bits. Si el resultado es distinto de cero, <code>mask_a &amp; mask_b &gt; 0</code> , entonces las dos cadenas tienen caracteres comunes.</p><h4 id="anagrama"><strong>Anagrama</strong></h4><p>Un anagrama es cambio de palabra o juego de palabras. Es el resultado de reorganizar las letras de una palabra o frase para producir una nueva palabra o frase, usando todas las letras originales una sola vez. En las entrevistas, por lo general solo nos molestan las palabras sin espacios en ellas.<br>Para determinar si dos cadenas son anagramas, existen algunos enfoques plausibles:</p><ul><li>Ordenar ambas cadenas debería producir la misma cadena resultante. Esto toma el tiempo O (log n) y el espacio O (logn).</li><li>Si asignamos cada carácter a un número primo y multiplicamos cada número asignado, los anagramas deben tener el mismo múltiplo (descomposición en factores primos). Esto toma O(n) tiempo y O(1) espacio.</li><li>El conteo de frecuencia de caracteres ayudará a determinar si dos cadenas son anagramas. Esto también toma tiempo O(n) y espacio O(1).<br>Palíndromo</li></ul><p><strong>Palíndromo</strong></p><p>Un palíndromo es una palabra, frase, número u otra secuencia de caracteres que se lee igual hacia adelante y hacia atrás, como señora o coche de carreras.<br>Aquí hay formas de determinar si una cadena es un palíndromo:</p><ul><li>Invierte la cuerda y debería ser igual a sí misma.</li><li>Tienes dos punteros al principio y al final de la cadena. Mueve los punteros hacia adentro hasta que se encuentren. En cualquier momento, los caracteres de ambos punteros deben coincidir.</li></ul><p>El orden de los caracteres dentro de la cadena es importante, por lo que los HashMaps generalmente no son útiles.<br>Cuando una pregunta se trata de contar el número de palíndromos, un truco común es tener dos punteros que se muevan hacia afuera, alejándose del centro. Ten en cuenta que los palíndromos pueden tener una longitud par o impar. Para cada posición de pivote central, debes verificarla dos veces: una vez que incluye el personaje y otra sin el personaje.</p><ul><li>Para las subcadenas, puedes terminar antes de tiempo una vez que no haya ninguna coincidencia.</li><li>Para las subsecuencias, use la programación dinámica ya que hay subproblemas superpuestos. <a href="https://leetcode.com/problems/longest-palindromic-subsequence/">Mira esta pregunta.</a></li></ul><h4 id="casos-comunes-7"><strong>Casos comunes</strong></h4><ul><li>Cadena vacía</li><li>Cadena de un solo carácter</li><li>Cadenas con un solo carácter diferente</li></ul><h4 id="preguntas-de-pr-ctica-5"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/longest-substring-without-repeating-characters/">Subcadena más larga sin caracteres repetidos</a></li><li><a href="https://leetcode.com/problems/longest-repeating-character-replacement/">Reemplazo de caracteres repetitivo más largo</a></li><li><a href="https://leetcode.com/problems/minimum-window-substring/description/" rel="noopener">Subcadena de ventana mínima </a></li><li><a href="https://leetcode.com/problems/encode-and-decode-strings/" rel="noopener">Cadenas Encode y Decode</a></li><li><a href="https://leetcode.com/problems/valid-anagram" rel="noopener">Anagrama válidoa</a></li><li><a href="https://leetcode.com/problems/group-anagrams/" rel="noopener">Anagramas de grupo</a></li><li><a href="https://leetcode.com/problems/valid-parentheses" rel="noopener">Parentesis válidos</a></li><li><a href="https://leetcode.com/problems/valid-palindrome/" rel="noopener">Palíndromo válido</a></li><li><a href="https://leetcode.com/problems/longest-palindromic-substring/" rel="noopener">Cadena con Palíndromos más larga </a></li><li><a href="https://leetcode.com/problems/palindromic-substrings/" rel="noopener">Subcadenas con palíndromos</a></li></ul><h2 id="-rboles"><strong>Árboles</strong></h2><h4 id="links-de-estudio-3"><strong>Links de estudio</strong></h4><ul><li><a href="https://medium.com/basecs/leaf-it-up-to-binary-trees-11001aaf746d">Lánzalo a árboles binarios</a></li></ul><h4 id="notas-11"><strong>Notas</strong></h4><p>Un árbol es un grafo acíclico no dirigido y conexo.<br>La recursividad es un enfoque común para los árboles. Cuando notes que el problema del subárbol se puede usar para resolver el problema completo, intenta usar la recursividad.<br>Cuando utilices la recursividad, recuerda siempre verificar el caso base, generalmente donde está el nodo. <code>null</code>.</p><p>Cuando se te pida que atravieses un árbol por nivel, utiliza primero la búsqueda en profundidad.<br>A veces es posible que tu función recursiva necesite devolver dos valores.<br>Si la pregunta involucra la suma de nodos en el camino, asegúrate de verificar si los nodos pueden ser negativos.<br>Debes estar muy familiarizado con la escritura transversal recursiva en orden previo, en orden y posterior al pedido. Como extensión, desafíate a ti mismo escribiéndolos iterativamente. </p><p>A veces, los entrevistadores preguntan a los candidatos por el enfoque iterativo, especialmente si el candidato termina de escribir el enfoque recursivo demasiado rápido.</p><h2 id="-rbol-binario"><strong>Árbol binario</strong></h2><p>El recorrido en orden de un árbol binario no es suficiente para serializar un árbol de forma única. También se requiere un recorrido previo o posterior al pedido.</p><h2 id="-rbol-de-b-squeda-binario-bst-"><strong>Árbol de búsqueda binario (BST)</strong></h2><p>El recorrido en orden de un BST te dará todos los elementos en orden.<br>Estar muy familiarizado con las propiedades de un BST. Valida que un árbol binario sea un BST. Esto aparece con más frecuencia de lo esperado.<br>Cuando una pregunta implica un BST, el entrevistador suele buscar una solución que se ejecute más rápido que O(n).</p><h4 id="casos-comunes-8"><strong>Casos comunes</strong></h4><ul><li>Árbol vacío</li><li>Un solo nodo</li><li>Dos nodos</li><li>Árbol muy inclinado (como una lista enlazada)</li></ul><h4 id="preguntas-de-pr-cticas-1"><strong>Preguntas de prácticas</strong></h4><ul><li><a href="https://leetcode.com/problems/maximum-depth-of-binary-tree/">Profundidad máxima del árbol binario</a></li><li><a href="https://leetcode.com/problems/same-tree/">Mismo árbol</a></li><li><a href="https://leetcode.com/problems/invert-binary-tree/">Invertir o voltear árbol binario</a></li><li><a href="https://leetcode.com/problems/binary-tree-maximum-path-sum/">Suma máxima de ruta de acceso del árbol binario </a></li><li><a href="https://leetcode.com/problems/binary-tree-level-order-traversal/">Recorrido de orden a nivel de árbol binario </a></li><li><a href="https://leetcode.com/problems/serialize-and-deserialize-binary-tree/">Serializar y deserializar árbol binario </a></li><li><a href="https://leetcode.com/problems/subtree-of-another-tree/">Subárbol de otro árbol </a></li><li><a href="https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/">Construir árbol binario a partir de preorden y recorrido en orden </a></li><li><a href="https://leetcode.com/problems/validate-binary-search-tree/">Validar árbol de búsqueda binario </a></li><li><a href="https://leetcode.com/problems/kth-smallest-element-in-a-bst/">Elemento Kth más pequeño en un BST </a></li><li><a href="https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/">Ancestro común más bajo de BST</a></li></ul><h2 id="tries">Tries</h2><h4 id="links-de-estudio-4"><strong>Links de estudio</strong></h4><ul><li><a href="https://medium.com/basecs/trying-to-understand-tries-3ec6bede0014" rel="noopener">Intentando entender los Tries</a></li><li><a href="https://leetcode.com/articles/implement-trie-prefix-tree/" rel="noopener">Implementando un Trie (Tree de prefijo)</a></li></ul><h4 id="notas-12"><strong>Notas</strong></h4><p>Los Tries son un tipo específico de estructura de datos. &nbsp;Como tal son árboles especiales (árboles de prefijos) que hacen que la búsqueda y el almacenamiento de cadenas sean más eficientes. Los intentos tienen muchas aplicaciones prácticas, como realizar búsquedas y proporcionar autocompletado. Es útil conocer estas aplicaciones comunes para que puedas identificar fácilmente cuándo un problema se puede resolver de manera eficiente utilizando un trie.<br>A veces, el procesamiento previo de un diccionario de palabras (dado en una lista) en un trie mejorará la eficiencia de la búsqueda de una palabra de longitud k, entre n palabras. La búsqueda se convierte en O(k) en lugar de O(n).</p><p>Estar familiarizado con la implementación, desde cero, de una clase <code>Trie</code> y sus métodos<code>add</code>, <code>remove</code> , y <code>search</code>.</p><p><strong>Preguntas de Práctica</strong></p><ul><li><a href="https://leetcode.com/problems/implement-trie-prefix-tree" rel="noopener">Implementando un Trie ( Tree de prefijo)</a></li><li><a href="https://leetcode.com/problems/add-and-search-word-data-structure-design" rel="noopener">Añadir y buscar palabras</a></li><li><a href="https://leetcode.com/problems/word-search-ii/" rel="noopener">Buscador de palabras II</a></li></ul><h2 id="mont-culo">Montículo</h2><h4 id="links-de-estudios"><strong>Links de estudios</strong></h4><ul><li><a href="https://medium.com/basecs/learning-to-love-heaps-cef2b273a238" rel="noopener">Aprendiendo a amar los montículos</a></li></ul><h4 id="notas-13">Notas</h4><p>Si ves un k superior o inferior mencionado en la pregunta, generalmente es una señal de que se puede usar un montón para resolver el problema, como en Elementos frecuentes K principales.<br>Si necesitas los k elementos superiores, use un Min Heap de tamaño k. Iterar a través de cada elemento, empujándolo en el montón. </p><p>Siempre que el tamaño del almacenamiento dinámico exceda k, elimina el elemento mínimo. Eso garantizará que tengas los k elementos más grandes.</p><h4 id="preguntas-de-pr-ctica-6">Preguntas de práctica</h4><ul><li><a href="https://leetcode.com/problems/merge-k-sorted-lists/" rel="noopener">Une K listas ordenadas</a></li><li><a href="https://leetcode.com/problems/top-k-frequent-elements/" rel="noopener">Top de elementos K más frecuentes</a></li><li><a href="https://leetcode.com/problems/find-median-from-data-stream/" rel="noopener">Encuetra la mediana a partir de un conjunto de datos </a></li></ul><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Las entrevistas de programación son difíciles. Pero afortunadamente, puedes mejorar tus resultados estudiando y practicando para ellas, así como haciendo entrevistas simuladas.<br>En resumen, para hacerlo bien en la codificación de entrevistas:</p><ol><li>Elige un lenguaje de programación</li><li>Estudia los principios de las Ciencias de la Computación.</li><li>Practica resolviendo ejercicios de algoritmos.</li><li>Internaliza el qué hacer y el qué no en las<a href="https://github.com/yangshun/tech-interview-handbook/blob/master/preparing/cheatsheet.md" rel="noopener"> entrevistas</a></li><li>Practica haciendo entrevistas simuladas</li><li>Ve a la entrevista a obtener el trabajo</li></ol><p>Al seguir estos pasos, mejorarás tus habilidades de codificación de entrevistas y estarás un paso más cerca (o probablemente más) de conseguir el trabajo de sus sueños.</p><p>¡Mis mejores deseos!</p><p>Si te ha gustado este artículo, ¡compártelo con tus amigos!<br>También puedes seguirme en <a href="https://github.com/yangshun">GitHub</a> y <a href="https://twitter.com/yangshunz">Twitter</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprende los conceptos básicos de Git en menos de 10 minutos ]]>
                </title>
                <description>
                    <![CDATA[ Sí, el título es un clickbait. No hay forma de que puedas comprender los conceptos básicos de la tecnología git en solo 10 minutos. Pero puedes acercarte bastante en unos 25 minutos. Y ese es el propósito de este artículo. Si deseas comenzar a aprender sobre la tecnología Git, has ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/aprende-los-conceptos-basicos-de-git-en-menos-de-10-minutos/</link>
                <guid isPermaLink="false">6478104949c8db0881633ccf</guid>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Mon, 26 Jun 2023 17:49:33 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/06/git-fcc.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/learn-the-basics-of-git-in-under-10-minutes-da548267cc91/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Learn the Basics of Git in Under 10 Minutes</a>
      </p><p>Sí, el título es un <em>clickbait</em>. No hay forma de que puedas comprender los conceptos básicos de la tecnología git en solo 10 minutos. Pero puedes acercarte bastante en unos 25 minutos. Y ese es el propósito de este artículo.</p><p>Si deseas comenzar a aprender sobre la tecnología Git, has venido al lugar correcto. Esta es una guía completa para principiantes de Git. Hay muchos clientes para Git. La tecnología es la misma sin importar el cliente. Pero en esta guía usaremos GitHub para entender Git.</p><h3 id="-empecemos-">¡Empecemos!</h3><h2 id="-qu-es-el-control-de-versiones">¿Qué es el control de versiones?</h2><blockquote>El control de versiones es un sistema que registra los cambios en un archivo o conjunto de archivos a lo largo del tiempo para que pueda recuperar versiones específicas más adelante. Es decir que, idealmente; podemos colocar cualquier archivo en la computadora en el control de versiones. </blockquote><h2 id="en-teor-a-esto-est-bien-pero-por-qu-habr-amos-de-hacer-eso">En teoría esto está bien... ¿Pero por qué habríamos de hacer eso?</h2><h3 id="este-es-el-por-qu-">Este es el por qué:</h3><p>Un Sistema de control de versiones (VCS en inglés) nos permite revertir los archivos a un estado anterior, revertir todo el proyecto a un estado anterior, revisar los cambios realizados a lo largo del tiempo, ver quién modificó por última vez algo que podría estar causando un problema, quién introdujo un problema y cuando, y más. El uso de un VCS también significa que si por descuido arruinamos las cosas o perdemos nuestros archivos, generalmente podemos recuperarlos fácilmente. Y a veces solo quieres saber “quién escribió esta porquería”. ¿y tener acceso a esa información vale la pena?.</p><h3 id="entonces-qu-es-git">Entonces, ¿qué es Git?</h3><p>Git es un sistema de control de versiones para rastrear cambios en archivos de computadora y coordinar el trabajo en esos archivos entre varias personas. Git es un sistema de control de versiones distribuido. Git no depende necesariamente de un servidor central para almacenar todas las versiones de los archivos de un proyecto. En cambio, cada usuario “clona” una copia de un repositorio (una colección de archivos) y tiene el historial completo del proyecto en su propio disco duro. Este clon tiene todos los metadatos del original, mientras que el original en sí se almacena en un servidor autohospedado o en un servicio de alojamiento de terceros como GitHub.</p><p>Git te ayuda a realizar un seguimiento de los cambios que realizas en tu código. Es básicamente la pestaña de historial para tu editor de código (¿sin modo de incógnito?). Si en algún momento durante la codificación te encuentras con un error fatal y no sabes qué lo está causando, siempre puedes volver al estado estable. Por lo tanto, es muy útil para la depuración. O simplemente puede ver qué cambios realizó en su código a lo largo del tiempo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/06/image.png" class="kg-image" alt="image" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/06/image.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/06/image.png 800w" sizes="(min-width: 720px) 720px" width="800" height="325" loading="lazy"><figcaption>Una versión simple del historial de un archivo.</figcaption></figure><p>En el ejemplo anterior, las tres "tarjetas" representan diferentes versiones del mismo archivo. Podemos seleccionar qué versión del archivo queremos usar en cualquier momento. Entonces puedo saltar de un lado a otro a cualquier versión del archivo en el continuo de tiempo de git.</p><p>Git también te <strong>ayuda a sincronizar código </strong>entre varias personas. Así que imagina que tú y tu amigo están colaborando en un proyecto. Ambos están trabajando en los mismos archivos de proyecto. Git toma esos cambios que tú y su amigo hicieron de forma independiente y los fusiona en un solo repositorio "maestro" (Master). Entonces, al usar Git, puedes asegurarse de que ambos estén trabajando en la versión más reciente del repositorio. Por lo tanto, no tienes que preocuparte por enviar tus archivos por correo y trabajar con una cantidad ridícula de copias del archivo original. ¿Y colaborar a larga distancia se vuelve tan fácil como HTML?.</p><h3 id="flujo-de-trabajo-git-"><strong>Flujo de trabajo Git:</strong></h3><p>Antes de comenzar a trabajar con los comandos de Git, es necesario que comprendas lo que representa.</p><h3 id="-qu-es-un-repositorio">¿Qué es un Repositorio?</h3><p>Un repositorio, también conocido como repositorio, no es más que una colección de código fuente.</p><h3 id="hay-cuatro-elementos-fundamentales-en-el-flujo-de-trabajo-de-git-">Hay cuatro elementos fundamentales en el flujo de trabajo de Git.</h3><p><strong>1.Directorio de trabajo.</strong></p><p><strong>2.Área de ensayo.</strong></p><p><strong>3.Repositorio local.</strong></p><p><strong>4.Repositorio remoto.</strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/06/image-1.png" class="kg-image" alt="image-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/06/image-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/06/image-1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="470" loading="lazy"><figcaption>Diagrama de un flujo de trabajo Git simple</figcaption></figure><p><strong>Si consideras un archivo en su Directorio de trabajo, puedes estar en tres estados posibles.</strong></p><ol><li><strong>Puede ser escenificado</strong>. Lo que significa que los archivos con los cambios actualizados están marcados para ser confirmados en el repositorio local pero aún no confirmados.</li><li>Se puede <strong>modificar</strong>. Lo que significa que los archivos con los cambios actualizados aún no están almacenados en el repositorio local.</li><li>Se puede<strong> consolidar (commit).</strong> Lo que significa que los cambios que realizó en su archivo se almacenan de forma segura en el repositorio local.</li></ol><ul><li><code>git add</code> es un comando que se usa para agregar un archivo que está en el <strong>directorio de trabajo </strong>al área de preparación.</li><li><code>git commit</code> es un comando que se usa para agregar todos los archivos que están almacenados en el <strong>repositorio local.</strong></li><li><code>git push</code> es un comando que se usa para agregar todos los archivos comprometidos en el repositorio local al repositorio remoto. Entonces, en el repositorio remoto, todos los archivos y cambios serán visibles para cualquier persona con acceso al repositorio remoto.</li><li><code>git fetch</code> es un comando que se usa para obtener archivos del repositorio remoto al repositorio local, pero no al directorio de trabajo.</li><li><code>git merge</code> es un comando que se usa para obtener los archivos del repositorio local en el directorio de trabajo.</li><li><code>git pull</code> Este comando se usa para obtener archivos del repositorio remoto directamente en el directorio de trabajo. es equivalente a un <code>git fetch</code> y un <code>git merge</code> .</li></ul><p><strong>Ahora que sabemos qué es Git y sus terminologías básicas, veamos cómo podemos colocar un archivo en git.</strong> Lo haremos de la manera correcta y de la manera difícil. Sin ninguna aplicación GUI.</p><p>Supongo que ya tienes un archivo que deseas colocar bajo el control de versiones. Si no, cree una carpeta de muestra llamada 'MuskCult' y coloques algunos archivos de código de muestra en ella.</p><h2 id="paso-0-crea-una-cuenta-de-github">Paso 0: Crea una cuenta de GitHub</h2><p>Si aún no tienes una cuenta, puedes crear una <a href="https://github.com/join" rel="noopener">aquí</a>.</p><h2 id="paso-1-aseg-rate-de-tener-installado-git-en-tu-equipo">Paso 1: Asegúrate de tener installado Git en tu equipo</h2><p>Si estás en una<strong> <strong>Mac</strong></strong>, enciende la terminal e ingresa el siguiente comando:</p><pre><code>$ git --version</code></pre><p>Esto te pedirá que abras un instalador si aún no tienes git. Así que configúralo usando el instalador. Si ya tienes git, solo te mostrará qué versión de git tienes instalada.</p><p>Si estás usando <strong><strong>Linux</strong></strong>(deb), escribe lo siguiente en la terminal:</p><pre><code>$ sudo apt install git-all</code></pre><p>Si estás en <strong><strong><a href="https://git-scm.com/download/win">Windows</a></strong></strong>:</p><pre><code>winget install --id Git.Git -e --source winget</code></pre><h2 id="paso-2-dile-a-git-quien-eres">Paso 2: Dile a Git quien eres</h2><p>Preséntate. En serio, menciona tu nombre de usuario y dirección de correo electrónico de Git, ya que en cada confirmación de Git se utilizará esta información para identificarte como el autor.</p><pre><code>$ git config --global user.name "YOUR_USERNAME"

$ git config --global user.email "im_satoshi@musk.com"

$ git config --global --list # To check the info you just provided</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*JbyUdhLMEdglRxQk6PH7Vg.gif" class="kg-image" alt="1*JbyUdhLMEdglRxQk6PH7Vg" width="800" height="477" loading="lazy"></figure><h2 id="paso-3-genera-comprueba-tu-equipo-en-busca-de-claves-ssh-existentes-opcional-">Paso 3: Genera/comprueba tu equipo en busca de claves SSH existentes. (Opcional)</h2><p>¿Porque preguntas? Con el protocolo SSH, puede conectarse y autenticarse en servidores y servicios remotos. Con las claves SSH, puede conectarse a GitHub sin proporcionar su nombre de usuario o contraseña en cada visita.</p><p>Sigue este<strong><strong> <a href="https://help.github.com/articles/about-ssh/" rel="noopener">link</a> </strong></strong>para aprender más acerca de SSH.<br>Visita <strong><a href="https://help.github.com/articles/checking-for-existing-ssh-keys/">aquí</a><strong> </strong></strong>para verificar si tienes una clave SSH existente.<br>Ve <strong><a href="https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/">aquí</a></strong> para generar una clave SSH.<br>Ve <strong><a href="https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/">aquí</a><strong> </strong></strong>para añadir la clave SSH a tu cuenta de GitHub.<br>Finalmente <strong><a href="https://help.github.com/articles/testing-your-ssh-connection/">aquí</a></strong> puedes comprobar la conección.</p><p>Si configuraste SSH, cada comando de git que tiene un enlace lo reemplazará por:</p><pre><code>Instead of : https://github.com/username/reponame

You use    : git@github.com:username/reponame.git

           Note : You can use both ways alternatively</code></pre><p><strong>Usaré el protocolo SSH en este tutorial.</strong></p><h2 id="paso-4-hagamos-git">Paso 4: Hagamos Git</h2><p>Crear un nuevo repositorio en GitHub. Sigue este <a href="https://github.com/new" rel="noopener">link</a>.<br>Ahora, ubica la carpeta que deseas colocar debajo de git en su terminal.</p><pre><code>$ cd Desktop/MuskCult</code></pre><h4 id="inicia-git-"><strong>Inicia Git:</strong></h4><p>Y para colocar la carpeta debajo de git, ingresa:</p><pre><code>$ touch README.md    # To create a README file for the repository
$ git init           # Initiates an empty git repository</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*Q_DUXRghgFQb9F47mUB6LQ.gif" class="kg-image" alt="1*Q_DUXRghgFQb9F47mUB6LQ" width="800" height="477" loading="lazy"></figure><p>Cómo editar el archivo README.md para proporcionar información acerca del repositorio.</p><h3 id="agrega-archivos-al-rea-de-preparaci-n-para-la-confirmaci-n-">Agrega archivos al área de preparación para la confirmación:</h3><p>Ahora, para agregar los archivos al repositorio de git el commit:</p><pre><code>$ git add .  
# Adds all the files in the local repository and stages them for commit

OR if you want to add a specific file

$ git add README.md 
# To add a specific file</code></pre><h3 id="antes-del-commit-veamos-qu-archivos-se-preparan-">Antes del commit, veamos qué archivos se preparan:</h3><pre><code>$ git status # Lists all new or modified files to be committed</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/06/image-2.png" class="kg-image" alt="image-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/06/image-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/06/image-2.png 800w" sizes="(min-width: 720px) 720px" width="800" height="477" loading="lazy"></figure><p><strong>Confirma los cambios que realizaste en tu Git Repo:</strong><br>Ahora para confirmar los archivos que agregó a su repositorio de git:</p><pre><code>$ git commit -m "First commit"
# The message in the " " is given so that the other users can read the message and see what changes you made</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*LoUwFy29RkgCS7hCajd_3g.gif" class="kg-image" alt="1*LoUwFy29RkgCS7hCajd_3g" width="800" height="478" loading="lazy"></figure><h3 id="anula-la-confirmaci-n-de-los-cambios-que-acaba-de-realizar-en-su-git-repo-">Anula la confirmación de los cambios que acaba de realizar en su Git Repo:</h3><p>Ahora supongamos que que acabamos de cometer algún error en el código o colocamos un archivo no deseado dentro del repositorio. Este archivo no deseado puede desorganizar los archivos que acabamos de agregar, por lo tanto usamos:</p><pre><code>$ git reset HEAD~1
# Remove the most recent commit
# Commit again!</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*rxOX_U-ZRmGfhgIhNWlDIQ.gif" class="kg-image" alt="1*rxOX_U-ZRmGfhgIhNWlDIQ" width="800" height="477" loading="lazy"></figure><h3 id="a-adiendo-un-origen-remoto-y-un-git-push-">Añadiendo un origen remoto y un Git Push:</h3><p>Ahora cada vez que tú hagas cambios en los archivos y los guardes, no será automáticamente actualizado en GitHub. Todos los cambios que hicimos en el archivo se actualizan en el repositorio local. Ahora para actualizar los cambios en el repositorio maestro:</p><pre><code>$ git remote add origin remote_repository_URL
# sets the new remote</code></pre><p>El comando <strong>git remote</strong> nos permite crear, ver y eliminar conexiones a otros repositorios.</p><pre><code>$ git remote -v
# List the remote connections you have to other repositories.</code></pre><p>El comando <strong>git remote -v</strong> enumera las URL de las conexiones remotas que tiene con otros repositorios.</p><pre><code>$ git push -u origin master # pushes changes to origin</code></pre><p>Ahora, el comando <strong>git push </strong>traslada los cambios en su repositorio local hasta el repositorio remoto que especificó como origen.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*w-nfopsKIks_JRzFe5D8xA.gif" class="kg-image" alt="1*w-nfopsKIks_JRzFe5D8xA" width="800" height="477" loading="lazy"></figure><p>Y ahora, si vamos y revisamos nuestra página de repositorio en GitHub, debería verse así:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/06/image-3.png" class="kg-image" alt="image-3" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/06/image-3.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/06/image-3.png 800w" sizes="(min-width: 720px) 720px" width="800" height="491" loading="lazy"></figure><p>Y eso es. Acabas de agregar los archivos al repositorio que acabas de crear en GitHub.</p><h3 id="observa-los-cambios-que-realizaste-en-tu-archivo-">Observa los cambios que realizaste en tu archivo:</h3><p>Una vez que empieces a hacer cambios en tus archivos y los guardes, el archivo no coincidirá con la última versión que se comprometió con git. Para ver los cambios que acabas de hacer:</p><p>Has hecho lo siguiente:</p><pre><code>$ git diff # To show the files changes not yet staged</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*xym1QvvvWorfoyGMXv28Yg.gif" class="kg-image" alt="1*xym1QvvvWorfoyGMXv28Yg" width="800" height="477" loading="lazy"></figure><h3 id="vuelve-a-la-ltima-versi-n-comprometida-con-git-repo-">Vuelve a la última versión comprometida con Git Repo:</h3><p>Ahora puedes optar por volver a la última versión confirmada ingresando:</p><pre><code>$ git checkout .

OR for a specific file

$ git checkout -- &lt;filename&gt;</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*HYgYkfo3W4MUA8CJl12rXg.gif" class="kg-image" alt="1*HYgYkfo3W4MUA8CJl12rXg" width="800" height="477" loading="lazy"></figure><h3 id="ver-historial-de-commits-">Ver historial de commits:</h3><p>Puedes emplear el comando <strong><strong>git log</strong></strong> para observar el historial de <em>commits</em> que has hecho en tus archivos.</p><pre><code>$ git log</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*9w7uBJcQMxc708DBw8Sewg.gif" class="kg-image" alt="1*9w7uBJcQMxc708DBw8Sewg" width="800" height="473" loading="lazy"></figure><p>Cada vez que realiza cambios que desea que se reflejen en GitHub, los siguientes son los flujos de comandos más comunes:</p><pre><code>$ git add .
$ git status # Lists all new or modified files to be committed
$ git commit -m "Second commit"
$ git push -u origin master</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*rWBJnBdF1V8YO_mi-jEfxA.gif" class="kg-image" alt="1*rWBJnBdF1V8YO_mi-jEfxA" width="800" height="477" loading="lazy"></figure><p>Ahora, si vamos y vemos nuestro repositorio, podemos identificar si la confirmación fue exitosa mirando el mensaje de confirmación para cada archivo.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*QHM8m5HGavHkdzPz06UWGw.png" class="kg-image" alt="1*QHM8m5HGavHkdzPz06UWGw" width="800" height="524" loading="lazy"></figure><h2 id="paso-5-eso-est-muy-bien-pero-c-mo-descargo-y-trabajo-en-otros-repositorios-en-github">Paso 5 : Eso está muy bien... Pero, ¿cómo descargo y trabajo en otros repositorios en GitHub?</h2><h3 id="clonando-un-repo-de-git-">Clonando un Repo de Git:</h3><p>Localiza el directorio en el que deseas clonar el repositorio. Copia el enlace del repositorio que deseas e ingresa lo siguiente:</p><pre><code>$ git clone remote_repository_URL</code></pre><p>Siéntete libre de seguir adelante y clonar el repositorio que creé arriba usando: <a href="https://github.com/Gothamv/MuskCult" rel="noopener">https://github.com/Gothamv/MuskCult</a></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*6NACk8-IiBjbauM-k-aesQ.gif" class="kg-image" alt="1*6NACk8-IiBjbauM-k-aesQ" width="800" height="477" loading="lazy"></figure><h3 id="empujar-cambios-al-git-repo-">Empujar cambios al Git Repo:</h3><p>Ahora puedes trabajar en los archivos que deseas y comprometerte con los cambios localmente. Si deseas enviar cambios a ese repositorio, debes<a href="https://docs.github.com/es/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository"> agregarte como colaborador para el repositorio o bien,</a> debes crear algo conocido como solicitud de extracción. Observa cómo hacer uno aquí y envíame una solicitud de extracción con tu archivo de código.</p><h3 id="colaborando-">Colaborando:</h3><p>Así que imagina que tú y tu amigo están colaborando en un proyecto. Ambos están trabajando en los mismos archivos de proyecto. Cada vez que realizas algunos cambios y los inserta en el repositorio maestro, tu amigo tiene que extraer los cambios que insertaste en el repositorio de git. </p><p>Es decir, para asegurarse de que está trabajando en la última versión del repositorio de git cada vez que comienzas a trabajar, un comando de extracción de git es el camino a seguir.<br>Ahora a continuación hay un ejemplo de un proyecto en el que mi amigo y yo estamos colaborando:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*2-tl2rHsgPqiv88aI55CPw.png" class="kg-image" alt="1*2-tl2rHsgPqiv88aI55CPw" width="800" height="434" loading="lazy"><figcaption>There has just been a commit on the repo</figcaption></figure><p>Entonces, para asegurarme de que esos cambios se reflejen en mi copia local del repositorio:</p><pre><code>$ git pull origin master</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*ySDKu2OEdkc26yOUp-TJJQ.gif" class="kg-image" alt="1*ySDKu2OEdkc26yOUp-TJJQ" width="798" height="473" loading="lazy"></figure><h3 id="aqu-hay-dos-comandos-git-m-s-tiles-">Aquí hay dos comandos git más útiles:</h3><pre><code>$ git fetch
    AND
$ git merge</code></pre><p>En los términos más simples, <code>git fetch</code> seguido de un <code>git merge </code>equivale a un <code>git pull</code>. Pero entonces... ¿Porqué existe?</p><p>Cuando usas <code>git pull</code>, Git intenta hacer tu trabajo automáticamente. Es sensible al contexto, por lo que Git fusionará cualquier confirmación extraída en la rama en la que estás trabajando actualmente. <code>git pull</code> <strong>fusiona automáticamente las confirmaciones sin permitirle revisarlas primero.</strong></p><p>Cuando aplicas <code>git fetch</code>, Git recopila todas las confirmaciones de la rama de destino que no existen en tu rama actual <strong>y las almacena en tu repositorio local. Sin embargo, no los fusiona con su rama actual</strong>. Esto es particularmente útil si necesita mantener su repositorio actualizado, pero está trabajando en algo que podría fallar si actualiza sus archivos. Para integrar las confirmaciones en su rama maestra, usa <code>git merge</code>.</p><h3 id="un-detalle-m-s-"><strong>Un detalle más:</strong></h3><pre><code>.gitignore</code></pre><p>¿Qué es esto?</p><p><code>.gitignore</code> le dice a git qué archivos (o patrones) debe ignorar. Por lo general, se usa para evitar enviar archivos transitorios de su directorio de trabajo que no son útiles para otros colaboradores, como productos de compilación, archivos temporales creados por IDE, etc.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*3NFtOjfz0NvNSwba7YCmDA.png" class="kg-image" alt="1*3NFtOjfz0NvNSwba7YCmDA" width="800" height="625" loading="lazy"></figure><p>Entonces, en el ejemplo anterior, el sistema usa archivos como <strong>pycache</strong>, .DS_Store para almacenar información para un acceso más rápido. Esto no es útil para otros colaboradores. <strong>Entonces podemos decirle a git que los ignore</strong> agregando un archivo <code>.gitignore</code> .</p><p>Usa el comando <em>touch </em>para crear el archivo &nbsp;<code>.gitignore</code> :</p><pre><code>$ touch .gitignore</code></pre><p>Y puede agregar los siguientes patrones para decirle a git que ignore dichos archivos.</p><pre><code>/*.cmake
/*.DS_Store
/.user
/build
etc. depending upon the files you want git to untrack</code></pre><p><strong>Y eso es todo por lo básico. Estén atentos a la Parte 2, que se centrará en Branch, Merge, Stash, Rebase, etc.</strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Descenso de gradiente: ejemplo de algoritmo de aprendizaje automático ]]>
                </title>
                <description>
                    <![CDATA[ ¿Qué es el algoritmo de descenso de gradiente? El descenso de gradiente es probablemente el algoritmo de aprendizaje automático más popular. En esencia, el algoritmo existe para minimizar los errores tanto como sea posible. El objetivo del descenso de gradiente como algoritmo es minimizar la función de costo de un ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/descenso-de-gradiente-ejemplo-de-algoritmo-de-aprendizaje-automaticod/</link>
                <guid isPermaLink="false">6461b30ecc6454089f94bd5e</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Fri, 19 May 2023 01:50:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/05/pexels-pixabay-159751.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/gradient-descent-machine-learning-algorithm-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Gradient Descent – Machine Learning Algorithm Example</a>
      </p><p>¿Qué es el algoritmo de descenso de gradiente?</p><p>El descenso de gradiente es probablemente el algoritmo de aprendizaje automático más popular. En esencia, el algoritmo existe para minimizar los errores tanto como sea posible.</p><p>El objetivo del descenso de gradiente como algoritmo es minimizar la función de costo de un modelo. Podemos decir esto por los significados de las palabras '<em>Gradiente</em>' y '<em>Descenso</em>'.</p><p>Mientras que gradiente significa la brecha entre dos puntos definidos (esa es la función de costo en este contexto), el descenso se refiere al movimiento hacia abajo en general (es decir, minimizar la función de costo en este contexto).</p><p>Entonces, en el contexto del aprendizaje automático, Descenso de Gradiente (Gradient Descent en inglés) se refiere al <strong>intento iterativo de minimizar el error de predicción de un modelo de aprendizaje automático </strong>ajustando sus parámetros para producir el menor error posible.</p><p>Este error se conoce como la Función de Costo. La función de costo es un gráfico de la respuesta a la pregunta "¿En cuánto difiere el valor predicho del valor real?". Si bien la forma de evaluar las funciones de costo a menudo difiere para diferentes modelos de aprendizaje automático, en un modelo de regresión lineal simple, generalmente se refiere al error cuadrático medio del modelo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/image.png" class="kg-image" alt="image" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/image.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/image.png 688w" width="688" height="417" loading="lazy"><figcaption>Un gráfico 3D de la función de costo de un modelo de regresión lineal simple con M que representa el punto mínimo.</figcaption></figure><p>Es importante tener en cuenta que para los modelos más simples como la regresión lineal, un gráfico de la función de costo suele tener forma de arco, lo que facilita determinar el punto mínimo. </p><p>Sin embargo, este no es siempre el caso. Para modelos más complejos (por ejemplo, redes neuronales), es posible que el gráfico no tenga forma de arco. Es posible que la función de costo tenga múltiples puntos mínimos como se muestra en la imagen a continuación.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/image-1.png" class="kg-image" alt="image-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/image-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/image-1.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="519" loading="lazy"><figcaption>Un gráfico 3D de la función de costo de una red neuronal. Fuente: <a href="https://www.coursera.org/lecture/machine-learning/gradient-descent-2f2PA">Coursera</a></figcaption></figure><h2 id="-c-mo-funciona-el-descenso-de-gradiente">¿Cómo funciona el descenso de gradiente?</h2><p>En primer lugar, es importante tener en cuenta que, como la mayoría de los procesos de aprendizaje automático, el algoritmo de descenso de gradiente<strong> es un proceso iterativo.</strong></p><p>Suponiendo que tiene la función de costo para un modelo de regresión lineal simple como j(w,b) donde j es una función de w y b, el algoritmo de descenso de gradiente funciona de tal manera que <strong>comienza con una conjetura aleatoria inicial para w y b.</strong> El algoritmo <strong>seguirá modificando los parámetros w y b</strong> en un intento de <strong>optimizar</strong> la función de costo, j.</p><p>En la regresión lineal, la elección de los valores iniciales no importa mucho. Una opción común es cero.</p><p>La analogía perfecta para el algoritmo de descenso de gradiente que minimiza la función de costo j(w, b) y alcanza su mínimo local ajustando los parámetros w y b es caminar hasta el pie de una montaña o colina (como se muestra en la gráfica 3D de la función de costo de un modelo de regresión lineal simple mostrado anteriormente). </p><p>O bien, podemos imaginar que estamos tratando de llegar al punto más bajo de un campo de golf. En cualquier caso, darán pasos cortos, repetitivos hasta llegar al pie de la montaña o colina.</p><h2 id="la-f-rmula-de-descenso-de-gradiente">La fórmula de descenso de gradiente</h2><p><strong>Aquí está la fórmula para el descenso de gradiente: b = a - γ Δ f(a)</strong></p><p>La ecuación anterior describe el accionar del algoritmo de descenso de gradiente.</p><p>Es decir, b es la siguiente posición del excursionista, mientras que representa la posición actual. El signo menos es para la parte de minimización del algoritmo de descenso de gradiente, ya que el objetivo es minimizar el error tanto como sea posible. γ en el medio es un factor conocido como tasa de aprendizaje, y el término Δf(a) es un término de gradiente que define la dirección del punto mínimo.</p><p>Como tal, esta fórmula indica la siguiente posición para el excursionista/la persona en el campo de golf (esa es la dirección del descenso más empinado). </p><p>Es importante notar que el término γΔ f(a) se resta de a porque el objetivo es moverse contra el gradiente, hacia el mínimo local.</p><h2 id="-qu-es-la-tasa-de-aprendizaje">¿Qué es la tasa de aprendizaje?</h2><p><strong>La tasa de aprendizaje es el determinante de cuán grandes son los pasos que toma el descenso del gradiente en la dirección del mínimo local. </strong>Determina la <strong><em>velocidad </em></strong>con la que el algoritmo se mueve hacia los valores óptimos de la función de coste.</p><p>Debido a esto, la elección de la tasa de aprendizaje, γ, es importante y tiene un impacto significativo en la efectividad del algoritmo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/image-2.png" class="kg-image" alt="image-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/image-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/image-2.png 788w" sizes="(min-width: 720px) 720px" width="788" height="366" loading="lazy"><figcaption>La tasa de aprendizaje de la izquierda es excesiva, por lo que la función no encuentra el punto óptimo. En el caso de la derecha, como los pasos son muy pequeños, es muy probable que el algoritmo acierte, aunque de forma <em>muy</em> lenta.</figcaption></figure><p><strong>Si la tasa de aprendizaje es demasiado grande</strong> como se muestra arriba, en un intento por encontrar el punto óptimo, se mueve desde el punto de la izquierda hasta el punto de la derecha (como la tasa de aprendizaje es muy grande, los "saltos" también lo son, por lo que es muy difícil que el algoritmo acierte en el punto óptimo).En ese caso, vemos<strong> que la función de costo ha empeorado.</strong></p><p>Por otro lado, si la tasa de aprendizaje es demasiado pequeña, los descensos de gradiente funcionarán, aunque <em>muy</em> lentamente. Es decir, como los pasos son muy pequeños, es muy probable que el algoritmo acierte, aunque la optimización irá muy despacio.</p><p>Es por ello, importante elegir cuidadosamente la tasa de aprendizaje.</p><h2 id="c-mo-implementar-el-descenso-de-gradiente-en-la-regresi-n-lineal">Cómo implementar el descenso de gradiente en la regresión lineal</h2><pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt

class Linear_Regression:
	def __init__(self, X, Y):
		self.X = X
		self.Y = Y
		self.b = [0, 0]
	
	def update_coeffs(self, learning_rate):
		Y_pred = self.predict()
		Y = self.Y
		m = len(Y)
		self.b[0] = self.b[0] - (learning_rate * ((1/m) * np.sum(Y_pred - Y)))
		self.b[1] = self.b[1] - (learning_rate * ((1/m) * np.sum((Y_pred - Y) * self.X)))
        
	def predict(self, X=[]):
		Y_pred = np.array([])
		if not X: X = self.X
		b = self.b
		for x in X:
			Y_pred = np.append(Y_pred, b[0] + (b[1] * x))

		return Y_pred
	
	def get_current_accuracy(self, Y_pred):
		p, e = Y_pred, self.Y
		n = len(Y_pred)
		return 1-sum(
			[
				abs(p[i]-e[i])/e[i]
				for i in range(n)
				if e[i] != 0]
		)/n
	#def predict(self, b, yi):

	def compute_cost(self, Y_pred):
		m = len(self.Y)
		J = (1 / 2*m) * (np.sum(Y_pred - self.Y)**2)
		return J

	def plot_best_fit(self, Y_pred, fig):
				f = plt.figure(fig)
				plt.scatter(self.X, self.Y, color='b')
				plt.plot(self.X, Y_pred, color='g')
				f.show()


def main():
	X = np.array([i for i in range(11)])
	Y = np.array([2*i for i in range(11)])

	regressor = Linear_Regression(X, Y)

	iterations = 0
	steps = 100
	learning_rate = 0.01
	costs = []
	
	#original best-fit line
	Y_pred = regressor.predict()
	regressor.plot_best_fit(Y_pred, 'Initial Best Fit Line')
	

	while 1:
		Y_pred = regressor.predict()
		cost = regressor.compute_cost(Y_pred)
		costs.append(cost)
		regressor.update_coeffs(learning_rate)
		
		iterations += 1
		if iterations % steps == 0:
			print(iterations, "epochs elapsed")
			print("Current accuracy is :",
				regressor.get_current_accuracy(Y_pred))

			stop = input("Do you want to stop (y/*)??")
			if stop == "y":
				break

	#final best-fit line
	regressor.plot_best_fit(Y_pred, 'Final Best Fit Line')

	#plot to verify cost function decreases
	h = plt.figure('Verification')
	plt.plot(range(iterations), costs, color='b')
	h.show()

	# if user wants to predict using the regressor:
	regressor.predict([i for i in range(10)])

if __name__ == '__main__':
	main()
</code></pre><p>En esencia, puedes ver que el bloque de código entrena un algoritmo de descenso de gradiente para un modelo de aprendizaje automático de regresión lineal usando <code>0.01</code> &nbsp;como tasa de aprendizaje, basándose en <code>100</code> pasos.</p><p>Al ejecutar el código, tenemos lo siguiente:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/10/image-43.png" class="kg-image" alt="image-43" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/10/image-44.png" class="kg-image" alt="image-44" width="600" height="400" loading="lazy"></figure><h2 id="conclusi-n"><strong><strong>Conclusi</strong>ó<strong>n</strong></strong></h2><p>En conclusión, es importante tener en cuenta que el algoritmo de descenso de gradiente es especialmente importante en los dominios de inteligencia artificial y aprendizaje automático, ya que los modelos deben optimizarse para la precisión.<br>En este artículo, aprendimos qué es el algoritmo de descenso de gradiente, cómo funciona, su fórmula, qué tasa de aprendizaje es y la importancia de elegir la tasa de aprendizaje correcta. También vimos una ilustración de código de cómo funciona Gradient Descent.<br>Finalmente, compartí mis escritos sobre inteligencia artificial, aprendizaje automático y Microsoft Azure en<a href="https://twitter.com/SalimOpines"> Twitter</a> si disfrutaste este artículo y quieres ver más.<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Python devuelve múltiples: cómo trabajar con una tupla, una lista o un diccionario ]]>
                </title>
                <description>
                    <![CDATA[ Puedes devolver múltiples valores de una función en Python. Para hacerlo, devuelves una estructura de datos que contenga varios valores, como una lista con la cantidad de millas para correr cada semana. def total_millas(minimo_millas):     semana_1=minimo_millas+2     semana_2=minimo_millas+4     semana_3=minimo_millas+6  ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/python-devuelve-multiples-como-trabajar-con-una-tupla-una-lista-o-un-diccionario/</link>
                <guid isPermaLink="false">643b8bb710657f0643dec5f4</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Sun, 23 Apr 2023 00:53:54 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/04/values-python.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/python-returns-multiple-values-how-to-return-a-tuple-list-dictionary/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python Return Multiple Values – How to Return a Tuple, List, or Dictionary</a>
      </p><p>Puedes devolver múltiples valores de una función en Python.</p><p>Para hacerlo, devuelves una estructura de datos que contenga varios valores, como una lista con la cantidad de millas para correr cada semana.</p><pre><code class="language-python">def total_millas(minimo_millas):
    semana_1=minimo_millas+2
    semana_2=minimo_millas+4
    semana_3=minimo_millas+6
    return [semana_1,semana_2,semana_3]
print(total_millas(2))
#resultado: [4,6,8]
</code></pre><p>Las estructuras de datos en Python se utilizan para almacenar colecciones de datos, que pueden devolverse desde funciones. En este artículo, exploraremos cómo devolver múltiples valores de estas estructuras de datos: tuplas, listas y diccionarios.</p><h2 id="tuplas"><strong>Tuplas</strong></h2><p>Una tupla es una secuencia ordenada e inmutable. Eso significa que una tupla no puede cambiar.<br>Utilizamos una tupla, por ejemplo, para almacenar información sobre una persona: su nombre, edad y ubicación.</p><pre><code class="language-python">nancy = ("nancy", 55, "chicago")
</code></pre><p>Así es como yo escribiría una función que devuelve una tupla.</p><pre><code class="language-python">def persona():
   return "bob", 32, "boston"
 
print(persona())
# resultado: ('bob', 32, 'boston')
</code></pre><p>Ten en cuenta que no usamos paréntesis en la declaración de devolución. Esto se debe a que es posible devolver una tupla separando cada elemento con una coma, como se muestra en el ejemplo anterior.</p><p>“En realidad, es la coma la que forma una tupla, no los paréntesis”. Tal y como indica la <a href="https://docs.python.org/es/3/library/stdtypes.html#tuple">documentación</a>. Sin embargo, los <a href="https://docs.python.org/es/3/library/stdtypes.html#tuple">paréntesis </a>son requeridos con tuplas vacías o para evitar confusiones.</p><p>Aquí hay un ejemplo que emplea el paréntesis <code>()</code> para retornar una tupla.</p><pre><code class="language-python">def persona(nombre, edad):
   return (nombre, edad)
print(persona("henry", 5))
#resultado: ('henry', 5)
</code></pre><h2 id="listas"><strong>Listas</strong></h2><p>Una lista es una secuencia ordenada y mutable. Eso significa que una lista puede cambiar.<br>Puede utilizar una lista para almacenar ciudades:</p><pre><code class="language-python">ciudades = ["Boston", "Chicago", "Jacksonville"]
</code></pre><p>O resultados de exámenes:</p><pre><code class="language-python">puntuaciones_examenes = [55, 99, 100, 68, 85, 78]
</code></pre><p>Observa la función de abajo. Simplemente, nos regresa una línea que contiene 10 números</p><pre><code class="language-python">def diez_numeros():
   numeros = []
   for i in range(1, 11):
       numeros.append(i)
   return numeros
 
print(diez_numeros())
#resultado: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code></pre><p>Aquí hay otro ejemplo. Esta vez pasamos varios argumentos cuando llamamos a la función.</p><pre><code class="language-python">def millas_recorridas(semana_1, semana_2, semana_3, semana_4):
   return [semana_1, semana_2, semana_3, semana_4]
 
recorrido_mensual = millas_recorridas(25, 30, 28, 40)
print(recorrido_mensual)
#resultado: [25, 30, 28, 40]
</code></pre><p>Es fácil confundir tuplas y listas. Al fin y al cabo, ambos son contenedores que almacenan objetos. No obstante, recuerda estas diferencias clave:<br>1.Las tuplas no pueden cambiar.<br>2.Las listas pueden cambiar.</p><h2 id="diccionarios"><strong>Diccionarios</strong></h2><p>Un diccionario contiene pares clave-valor entre corchetes {}. Cada "clave" tiene un "valor" relacionado.<br>Consideremos el diccionario de empleados a continuación. Cada nombre de empleado es una "clave" y su posición es el "valor".</p><pre><code class="language-python">empleados = {
   "Muan": "ingeniero",
   "Maria": "gerente",
   "Henry": "escritor",
}
</code></pre><p>Así es como escribiríamos una función que devuelve un diccionario con un par clave-valor.</p><pre><code class="language-python">def ciudad_pais(ciudad,pais):
    lugar= {}
    lugar[ciudad]= pais
    return lugar
lugar_favorito= ciudad_pais("Santiago","Chile")
print(lugar_favorito)
#resultado: {"Santiago":"Chile"}
</code></pre><p>En el ejemplo anterior, "Santiago" es la clave y "Chile" es el valor.<br>Hemos cubierto mucho terreno. El punto clave es este: puede devolver múltiples valores desde una función de Python, y hay varias formas de hacerlo.</p><p>Escribo sobre las habilidades de programación que necesita desarrollar y los conceptos que necesitas aprender, y las mejores formas de aprenderlos en amymhaddad.com.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo resolver el problema de la Torre de Hanoi: Una guía ilustrada del algoritmo ]]>
                </title>
                <description>
                    <![CDATA[ Antes de empezar, hablemos de qué es el problema de la Torre de Hanoi. Bueno, este es un divertido juego de rompecabezas en el que el objetivo es mover una pila completa de discos desde la posición de origen a otra posición. Se siguen tres reglas simples: 1.Solo se puede ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-resolver-el-problema-de-la-torre-de-hanoi-una-guia-ilustrada-del-algoritmo/</link>
                <guid isPermaLink="false">641d4027083d0a0781fde073</guid>
                
                    <category>
                        <![CDATA[ Algoritmos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Mon, 03 Apr 2023 20:22:24 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/03/5f9ca6e9740569d1a4ca739a.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/analyzing-the-algorithm-to-solve-the-tower-of-hanoi-problem-686685f032e3/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Solve the Tower of Hanoi Problem - An Illustrated Algorithm Guide</a>
      </p><p>Antes de empezar, hablemos de qué es el problema de la Torre de Hanoi. Bueno, este es un divertido juego de rompecabezas en el que el objetivo es mover una pila completa de discos desde la posición de origen a otra posición. Se siguen tres reglas simples:</p><p>1.Solo se puede mover un disco a la vez.<br>2.Cada movimiento consiste en tomar el disco superior de una de las pilas y colocarlo encima de otra pila. En otras palabras, un disco solo se puede mover si es el disco superior de una pila.<br>3.No se puede colocar un disco más grande encima de un disco más pequeño.</p><p>Ahora, intentemos imaginar un escenario. Supongamos que tenemos una pila de tres discos. Nuestro trabajo es mover esta pila del origen A al destino C. ¿Cómo hacemos esto?</p><p>Antes de que podamos llegar allí, imaginemos que hay un punto intermedio B.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-21.png" class="kg-image" alt="image-21" width="500" height="375" loading="lazy"><figcaption><a href="http://www.texample.net/tikz/examples/towers-of-hanoi/">Tres discos.</a></figcaption></figure><p>Podemos usar a B como ayudante para terminar este trabajo. Ahora estamos listos para seguir adelante. Veamos cada uno de los pasos:</p><p>Mueve el primer disco de A a C<br>Mover el primer disco de A a B<br>Mueva el primer disco de C a B<br>Mueve el primer disco de A a C<br>Mueva el primer disco de B a A<br>Mueva el primer disco de B a C<br>Mueve el primer disco de A a C<br>¡Excelente! Hemos resuelto nuestro problema.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-22.png" class="kg-image" alt="image-22" width="320" height="98" loading="lazy"><figcaption><a href="https://en.wikipedia.org/wiki/Tower_of_Hanoi">Torre de Hanoi para 3 discos. Wikipedia</a></figcaption></figure><p><br><br>Puedes ver la imagen animada de arriba para una mejor comprensión.</p><p>Ahora, intentemos construir el algoritmo para resolver el problema. Espera, tenemos una nueva palabra aquí: "<strong>Algoritmo</strong>". ¿Qué es eso? ¿Alguna idea? No hay problema, vamos a ver.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-23.png" class="kg-image" alt="image-23" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-23.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-23.png 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"><figcaption>Foto por <a href="https://unsplash.com/@brucemars?utm_source=medium&amp;utm_medium=referral" rel="noopener">bruce mars</a> en <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral" rel="noopener">Unsplash</a></figcaption></figure><h3 id="-qu-es-un-algoritmo"><strong>¿Qué es un algoritmo?</strong></h3><p>Un algoritmo es uno de los conceptos más importantes para un desarrollador de software. De hecho, creo que no solo es importante para el desarrollo o la programación de software, sino para todos. Los algoritmos nos afectan en nuestra vida cotidiana. Veamos cómo.</p><p>Supongamos que trabaja en una oficina. Así que cada mañana haces una serie de tareas en secuencia: primero te levantas, luego vas al baño, desayunas, te preparas para la oficina, sales de casa, luego puedes tomar un taxi o un autobús o empezar a caminar hacia la oficina y, después de un tiempo determinado, llega a su oficina. Puedes decir que todos esos pasos forman un algoritmo.</p><p>En términos simples, un algoritmo es un conjunto de tareas. Espero que no hayas olvidado los pasos que hicimos para mover tres pilas de discos de A a C. También puedes decir que esos pasos son el algoritmo para resolver el problema de la Torre de Hanoi.</p><p><em>En Matemáticas y Ciencias de la Computación; un <a href="https://en.wikipedia.org/wiki/Algorithm">algoritmo</a> es una especificación inequívoca de cómo resolver una clase de problemas. Los algoritmos pueden realizar tareas de cálculo, procesamiento de datos y razonamiento automatizado. —</em></p><p>Si observas esos pasos, puedes ver que estábamos haciendo la misma tarea varias veces: mover discos de una pila a otra. Podemos denominar a estos pasos como <strong>recursión.</strong></p><h3 id="recursi-n"><strong>Recursión</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-24.png" class="kg-image" alt="image-24" width="384" height="312" loading="lazy"><figcaption>Recursión — <a href="https://giphy.com/gifs/homer-simpson-the-simpsons-3ov9jQX2Ow4bM5xxuM" rel="noopener">giphy</a></figcaption></figure><p><a href="https://en.wikipedia.org/wiki/Recursion_(computer_science)" rel="noopener"><strong><strong>Recursion</strong></strong></a><strong> </strong>es estar<strong> </strong>llamando a la misma acción desde esa acción. Al igual que en la imagen de arriba.</p><p>Entonces, hay una regla para hacer cualquier trabajo recursivo: debe haber una condición para detener la ejecución de esa acción. Espero que entiendas los conceptos básicos sobre la recursividad.</p><p>Ahora, intentemos construir un procedimiento que nos ayude a resolver el problema de la Torre de Hanoi. Estamos tratando de construir la solución usando pseudocódigo. El pseudocódigo es un método para escribir código de computadora utilizando el idioma inglés.</p><pre><code>torre(disco, origen, intermedio, destinacion)
{

}</code></pre><p>Este es el esqueleto de nuestra solución. Tomamos el número total de discos como argumento. Luego, debemos pasar el origen, el lugar intermedio y el destino para que podamos entender el mapa que usaremos para completar el trabajo.</p><p>Ahora necesitamos encontrar un estado terminal. El estado terminal es el estado en el que ya no vamos a llamar a esta función.</p><pre><code>IF disco is igual 1</code></pre><p>En nuestro caso, este sería nuestro estado terminal. Porque cuando haya un disco en nuestra pila, entonces es fácil hacer ese paso final y luego nuestra tarea estará completa. No te preocupes si no te queda claro. Cuando lleguemos al final, este concepto será más claro.</p><p>Muy bien, hemos encontrado nuestro punto de estado terminal donde movemos nuestro disco al destino de esta manera:</p><pre><code>mover disco desde el origen a nuestra destinación</code></pre><p>Ahora volvemos a llamar a nuestra función pasando estos argumentos. En ese caso, dividimos la pila de discos en dos partes. El disco más grande (disco n) está en una parte y todos los demás discos (n-1) están en la segunda parte. Allí llamamos al método dos veces para -(n-1).</p><pre><code>torre(disco - 1, origen, destinacion, intermedio)</code></pre><p>Ahora pasaremos a un ejemplo de pseudocódigo más realista. Usaremos <strong><strong>total_di</strong>scos<strong>_on_stack — 1</strong></strong> como un argumento. Después de ello, procedemos a mover nuestro disco nuevamente de esta forma:</p><pre><code>mover disco desde el origen a la destinación</code></pre><p>Después de eso, volvemos a llamar a nuestro método así:</p><pre><code>torre(disco - 1, intermedio, origen, destinacion)</code></pre><p>Veamos el pseudocódigo:</p><pre><code>torre(disco, origen, inter, dest)

IF disco is equal 1, THEN
       mover disco desde el origen a la destinación
   ELSE
       torre(disco- 1, origen, destinacion, intermedio)   // Step 1
       mover disco desde el origen a la destinación       // Step 2
       torre(disco - 1, intermedio, origen, destinacion)  // Step 3
   END IF
   
END</code></pre><p>Este es el árbol para tres discos:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-25.png" class="kg-image" alt="image-25" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-25.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-25.png 800w" sizes="(min-width: 720px) 720px" width="800" height="315" loading="lazy"><figcaption>Esquema de la torre de hanoi (3 discos)</figcaption></figure><p>Este es el código completo en <strong><a href="https://www.freecodecamp.org/news/learning-ruby-from-zero-to-hero-90ad4eecc82d/">Ruby</a></strong>:</p><pre><code class="language-rb">def tower(disk_numbers, source, auxilary, destination)
  if disk_numbers == 1
    puts "#{source} -&gt; #{destination}"
    return
  end
  tower(disk_numbers - 1, source, destination, auxilary)
  puts "#{source} -&gt; #{destination}"
  tower(disk_numbers - 1, auxilary, source, destination)
  nil
end
</code></pre><p>Empleamos <code>tower(3, 'source','aux','dest')</code></p><p>Resultado:</p><pre><code>source -&gt; dest
source -&gt; aux
dest -&gt; aux
source -&gt; dest
aux -&gt; source
aux -&gt; dest
source -&gt; dest</code></pre><p>Se necesitaron siete pasos para que tres discos llegaran al destino. A esto lo llamamos un método recursivo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-26.png" class="kg-image" alt="image-26" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-26.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-26.png 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"><figcaption>Foto por <a href="https://unsplash.com/@aronvisuals?utm_source=medium&amp;utm_medium=referral" rel="noopener">Aron Visuals</a> en <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral" rel="noopener">Unsplash</a></figcaption></figure><h3 id="c-lculos-en-la-complejidad-del-tiempo-y-el-espacio"><strong>Cálculos en la complejidad del tiempo y el espacio</strong></h3><h4 id="complejidad-temporal"><strong><a href="https://es.wikipedia.org/wiki/Complejidad_temporal">Complejidad Temporal</a></strong></h4><p>Cuando ejecutamos código o una aplicación en nuestra máquina, lleva tiempo: ciclos de CPU. Pero no es lo mismo para todas las computadoras. Por ejemplo, el tiempo de procesamiento de un core i7 y de un dual core no es el mismo. Para resolver este problema existe un concepto utilizado en informática llamado <strong>complejidad temporal.</strong></p><p><em>La complejidad del tiempo es un concepto en informática que se ocupa de la cuantificación de la cantidad de tiempo que tarda un conjunto de código o algoritmo en procesarse o ejecutarse en función de la cantidad de entrada.</em></p><p><em>En otras palabras, la complejidad del tiempo es esencialmente eficiencia, o cuánto tarda una función de programa en procesar una entrada determinada.</em></p><p>La complejidad temporal de los algoritmos se expresa más comúnmente utilizando la <a href="https://es.wikipedia.org/wiki/Cota_superior_asint%C3%B3tica#searchInput">Cota superior asintótica</a>. Una notación asintótica para representar la complejidad del tiempo.</p><p>Ahora, el tiempo requerido para mover n discos es <strong>T(n)</strong>. Hay dos llamadas recursivas para <strong>(n-1)</strong>. Hay una operación de tiempo constante para mover un disco desde el origen hasta el destino, sea m1. Por lo tanto:</p><pre><code>T(n) = 2T(n-1) + m1    ..... eq(1)</code></pre><p>Y también:</p><pre><code>T(0) = m2, a constant   ...... eq(2)
From eq (1)
T(1) = 2T(1-1) + m1
     = 2T(0)+m1
     = 2m2 + m1 ..... eq(3) [From eq 2]
T(2) = 2T(2-1) + m1
     = 2T(1) + m1
     = 4m2 + 2m1 + m1 .... eq(4) [From eq(3)]
T(3) = 2T(3-1) + m1
     = 2T(2) + m1
     = 8m2 + 4m1 + 2m1 + m1  [From eq(4)]</code></pre><p>A partir de estos patrones, eq(2) hasta el último, podemos decir que la complejidad temporal de este algoritmo es O(2^n) u O(a^n) donde a es una constante mayor que 1. Por lo tanto, tiene una exponencial complejidad del tiempo. Para el aumento único del tamaño del problema, el tiempo requerido es el doble del anterior. Esto es computacionalmente muy costoso.<strong> La mayoría de los programas recursivos toman un tiempo exponencial, y por eso es muy difícil escribirlos iterativamente.</strong></p><h4 id="complejidad-espacial"><strong><a href="https://www.cs.northwestern.edu/academics/courses/311/html/space-complexity.html" rel="noopener">Complejidad Espacial</a></strong></h4><p>Después de la explicación del análisis de la complejidad del tiempo, creo que ahora puedes adivinar qué es esto... Este es el cálculo del espacio requerido en RAM para ejecutar un código o una aplicación.</p><p>En nuestro caso, el espacio para el parámetro de cada llamada es independiente de n, lo que significa que es constante. Que sea J. Cuando hacemos la segunda llamada recursiva, la primera ha terminado. Eso significa que podemos reutilizar el espacio después de terminar el primero. Por eso:</p><p>Por tanto:</p><pre><code>T(n) = T(n-1) + k .... eq(1)
T(0) = k, [constant] .... eq(2)
T(1) = T(1-1) + k
     = T(0) + k
     = 2K
T(2) = 3k
T(3) = 4k</code></pre><p>Entonces la complejidad del espacio es O(n).</p><p>Después de estos análisis, podemos ver que la complejidad temporal de este algoritmo es exponencial, pero la complejidad espacial es lineal.</p><p><strong>Conclusión</strong><br>A partir de este artículo, espero que ahora puedas entender el rompecabezas de la <strong>Torre de Hanoi</strong> y cómo resolverlo. Además, traté de brindarle una comprensión básica sobre los<strong> algoritmos, su importancia, recursividad, pseudocódigo, complejidad temporal </strong>y <strong>complejidad espacial. </strong><br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es un desarrollador full stack? Back end + front end = Ingeniero full stack ]]>
                </title>
                <description>
                    <![CDATA[ Si recién empiezas en la industria de la tecnología, es posible que hayas oído hablar del término Full Stack. Pero, ¿qué significa eso exactamente? En este artículo, explicaré qué es Full Stack Development, qué habilidades necesitas para convertirte en Full Stack Developer, así como el tema de las expectativas salariales, ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-un-desarrollador-full-stack-back-end-front-end-ingeniero-full-stack/</link>
                <guid isPermaLink="false">6419497555e3ad15a8936695</guid>
                
                    <category>
                        <![CDATA[ full stack ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Mon, 27 Mar 2023 20:54:05 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/03/christina-wocintechchat-com-IxmHiUC-yOw-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/what-is-a-full-stack-developer-back-end-front-end-full-stack-engineer/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is a Full Stack Developer? Back End + Front End = Full Stack Engineer</a>
      </p><p>Si recién empiezas en la industria de la tecnología, es posible que hayas oído hablar del término <em>Full Stack</em>. Pero, ¿qué significa eso exactamente?</p><p>En este artículo, explicaré qué es Full Stack Development, qué habilidades necesitas para convertirte en Full Stack Developer, así como el tema de las expectativas salariales, sumado a unos consejos para conseguir el trabajo.</p><h2 id="-qu-es-el-desarrollo-full-stack">¿Qué es el Desarrollo Full Stack?</h2><p>Un desarrollador Full Stack es alguien que trabaja tanto con el <strong>front-end</strong> como con el <strong>back-end</strong> de una aplicación web. El front-end es responsable de la apariencia visual del sitio web, mientras que el back-end es responsable de la lógica y la infraestructura detrás de escena del sitio.</p><p>Echemos un vistazo más de cerca a los términos front-end y back-end.</p><h3 id="desarrollo-frontend-punto-de-vista-del-cliente-">Desarrollo Frontend (Punto de vista del cliente)</h3><p>Todo en una página web, desde el logotipo hasta la barra de búsqueda, los botones, el diseño general y la forma en que el usuario interactúa con la página, fue creado por un desarrollador front-end. Los desarrolladores <strong>front-end están a cargo de la apariencia del sitio web.</strong></p><p>Los desarrolladores front-end también deben asegurarse de que el sitio web se vea bien en todos los dispositivos (teléfonos, tabletas y pantallas de computadora). Esto se llama Diseño Web Adaptable.</p><h3 id="desarrollo-back-end-punto-de-vista-del-servidor-">Desarrollo back-end (Punto de vista del servidor)</h3><p>El desarrollo de back-end se refiere a<strong> la parte de la aplicación que el usuario no ve.</strong> Los desarrolladores de back-end se centran en<strong> la lógica del sitio, creando servidores y trabajando con bases de datos y API </strong>(interfaces de programación de aplicaciones).</p><p>Por ejemplo, el<strong> contenido y el diseño</strong> de un formulario se crearían en el lado del <strong>cliente.</strong> Pero cuando los usuarios envían su <strong>información</strong>, esta se procesa en el lado del<strong> servidor (back-end)</strong>.</p><h3 id="ejemplo-de-una-aplicaci-n-full-stack-del-mundo-real">Ejemplo de una aplicación Full Stack del mundo real</h3><p>Para comprender mejor el aspecto de una aplicación de pila completa, examinemos el sitio web de<a href="https://www.freecodecamp.org/espanol/"> freeCodeCamp</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-13.png" class="kg-image" alt="image-13" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-13.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2023/03/image-13.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-13.png 1347w" sizes="(min-width: 720px) 720px" width="1347" height="602" loading="lazy"></figure><p>Todo lo que ves en la página se consideraría front-end. Todos los botones, texto, colores y diseño son trabajo del desarrollador front-end.</p><p>Cuando se trata de cosas como las credenciales de usuario, todo eso lo mantiene el back-end. Todos los procesos de inicio de sesión y la información del usuario son ejemplos de desarrollo de back-end en el trabajo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-14.png" class="kg-image" alt="image-14" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-14.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-14.png 605w" width="605" height="625" loading="lazy"></figure><p>Si tienes curiosidad y quieres echar un vistazo al código, puedes encontrarlo en la página de <a href="https://github.com/freeCodeCamp/">código abierto de freeCodeCamp.</a></p><h2 id="habilidades-que-necesitas-en-el-desarrollo-full-stack">Habilidades que necesitas en el desarrollo Full Stack</h2><p>Echemos un vistazo a las tecnologías y herramientas que necesitará aprender para convertirse en un desarrollador de pila completa.</p><p><strong>HTML</strong><br>HTML significa lenguaje de marcado de hipertexto. HTML muestra el contenido de la página como botones, enlaces, encabezados, párrafos y listas.</p><p>Para aprender los conceptos básicos de HTML, freeCodeCamp tienes un curso acelerado de HTML para principiantes: <a href="https://www.youtube.com/watch?v=XqFR2lqBYPs">Tutorial del sitio web.</a></p><p><strong>CSS</strong><br>CSS significa hojas de estilo en cascada. CSS es responsable del estilo de su página web, incluidos los colores, los diseños y las animaciones.</p><p>El curso de <a href="https://www.freecodecamp.org/espanol/learn/2022/responsive-web-design/">diseño web adaptativo de freeCodeCamp</a> te enseñará los conceptos básicos de CSS, diseño adaptativo y accesibilidad. El <a href="https://www.freecodecamp.org/espanol/news/diseno-web-responsive-como-hacer-que-un-sitio-web-se-vea-bien-en-telefonos-y-tabletas/">diseño adaptativo </a> es esencial para crear sitios web que se vean bien en todos los dispositivos.</p><p>La accesibilidad es la práctica de asegurarse de que todos puedan usar fácilmente sus sitios web. No deseamos crear sitios web que no puedan utilizar aquellos que utilizan tecnologías de asistencia como lectores de pantalla.</p><p><strong>JavaScript</strong><br>Utiliza JavaScript con HTML y CSS para crear páginas web y aplicaciones móviles dinámicas e interactivas. Los ejemplos de JavaScript incluyen animaciones, relojes de cuenta regresiva, menús móviles desplegables y mostrar/ocultar información cuando un usuario hace clic en un elemento de la página.</p><p>Para comenzar a aprender JavaScript, puedes tomar el <a href="https://www.freecodecamp.org/espanol/learn/javascript-algorithms-and-data-structures/">curso de estructuras de datos y algoritmos de JavaScript de FreeCodeCamp</a>. A partir de ahí, puedes comenzar a crear proyectos desde mi artículo <a href="https://www.freecodecamp.org/news/javascript-projects-for-beginners/">40 proyectos de JavaScript para principiantes.</a> También están disponibles<a href="https://www.freecodecamp.org/espanol/news/aprende-javascript-curso-js-gratis-para-principiantes/"> otros cursos</a>.</p><h3 id="frameworks-bibliotecas-y-preprocesadores-de-css">Frameworks, bibliotecas y preprocesadores de CSS</h3><p>Estas herramientas se crearon para <strong>ayudar a acelerar el proceso de desarrollo</strong>. En lugar de escribir todo el CSS personalizado, puedex usar el catálogo de un marco de clases de CSS en sus páginas web.</p><p>No hay necesidad de aprenderlos todos, pero aquí hay una lista de algunas opciones:</p><ul><li><a href="https://tailwindcss.com/">Tailwind CSS</a></li><li><a href="https://getbootstrap.com/">Bootstrap</a></li><li><a href="https://bulma.io/">Bulma</a></li><li><a href="https://materializecss.com/">Materialize</a></li><li><a href="https://semantic-ui.com/">Semantic UI</a></li></ul><p>Los preprocesadores de CSS como <a href="https://sass-lang.com/">Sass</a> y <a href="https://lesscss.org/">Less</a> le permiten agregar lógica y funcionalidad a su CSS. Estas herramientas hacen que tu CSS sea limpio y fácil de usar.</p><h3 id="bibliotecas-y-marcos-de-javascript">Bibliotecas y marcos de JavaScript</h3><p>Estos marcos y bibliotecas te permiten ahorrar tiempo y hacer más con menos código.</p><h3 id="aqu-hay-algunas-opciones-populares-">Aquí hay algunas opciones populares:</h3><ul><li><a href="https://reactjs.org/">React</a></li><li><a href="https://angular.io/">Angular</a></li><li><a href="https://vuejs.org/">Vue</a></li></ul><p>No es necesario aprenderlos todos. Simplemente debes investigar qué tecnología se usa en su área y comenzar a aprenderla bien.</p><p>Aquí hay algunos recursos de aprendizaje sugeridos.</p><ul><li><a href="https://youtu.be/6Jfk8ic3KVk"> Curso de React en Youtube de freeCodeCamp</a></li><li><a href="https://www.youtube.com/watch?v=Fdf5aTYRW0E">Curso de Angular de Brad Traversy en YouTube</a></li><li><a href="https://www.youtube.com/watch?v=Fdf5aTYRW0E">Curso de Vue de Brad Traversy en </a><a href="https://www.youtube.com/watch?v=qZXt1Aom3Cs"> YouTube</a></li></ul><h3 id="bases-de-datos">Bases de Datos</h3><p>Es importante que un desarrollador Full Stack sepa cómo trabajar con bases de datos. Una base de datos en una aplicación web es un lugar para almacenar y organizar los datos de tu proyecto.</p><p>Hay muchos tipos de bases de datos para aprender, pero aquí hay algunas opciones populares.</p><ul><li><a href="https://www.freecodecamp.org/espanol/news/search?query=sql">SQL</a></li><li><a href="https://www.freecodecamp.org/news/learn-to-use-the-mysql-database/">MySQL</a></li><li><a href="https://www.freecodecamp.org/news/postgresql-full-course/">PostgreSQL</a></li><li><a href="https://www.freecodecamp.org/news/mongodb-full-course-nodejs-express-mongoose/">MongoDB</a></li></ul><p><strong>Lenguajes de Programación para Back- end</strong><br>Los lenguajes que puedes emplear para el desarrollo de back-end incluyen <strong>Java, Python, Node y PHP.</strong> No es necesario aprender todos estos lenguajes, sino concentrarse en uno para comenzar.</p><p>Aquí hay algunos recursos de aprendizaje sugeridos.</p><ul><li><a href="https://youtu.be/DLikpfc64cA">Curso de Python para principiantes de freeCodeCamp </a></li><li><a href="https://www.youtube.com/watch?v=OK_JCtrrv-c">Curso de PHP de freeCodeCamp PHP</a></li><li><a href="https://www.youtube.com/watch?v=eIrMbAQSU34">Curso de programación en Java de Mosh's Java </a></li></ul><p>También hay muchas tecnologías para el desarrollo de front-end y back-end. Aquí hay algunos populares.</p><ul><li><a href="https://www.freecodecamp.org/news/cjn-understanding-mean-stack-through-diagrams/">MEAN stack</a> (MongoDB, Express, Angular and Node)</li><li><a href="https://www.freecodecamp.org/news/create-a-mern-stack-app-with-a-serverless-backend/">MERN stack</a> (MongoDB, Express, React and Node)</li><li><a href="https://www.freecodecamp.org/learn/back-end-development-and-apis/">NodeJS</a></li><li><a href="https://www.freecodecamp.org/news/how-to-setup-a-lamp-server-on-a-local-ubuntu-linux-machine-or-vm/">LAMP stack</a> (Linux, Apache, MySQL, and PHP)</li></ul><p>En realidad hay más lenguajes de back-end para elegir, pero te sugiero que investigues los idiomas más utilizados en tu área.</p><h3 id="habilidades-de-prueba-y-depuraci-n">Habilidades de prueba y depuración</h3><p>A medida que desarrollas tu aplicación, habrá errores en el código que deben corregirse. <strong>La depuración es el acto de identificar esos errores ("bugs") y corregirlos.</strong></p><p>La prueba (mejor conocida como <strong>Testing</strong>) es otra habilidad importante para aprender. Escribir pruebas para tu código es una forma de asegurarte el mismo está haciendo lo que se supone que debe hacer.</p><p>Para una explicación más detallada sobre los diferentes tipos de pruebas, sugiero <a href="https://www.freecodecamp.org/news/types-of-software-testing/">leer este artículo.</a></p><h3 id="control-de-versiones">Control de versiones</h3><p>El control de versiones es una forma de <strong>rastrear y administrar los cambios en el código del proyecto.</strong> Git es un software popular que puede usar para rastrear su código.</p><p>Si estropeas muchas cosas en tu código, puedes<strong> usar Git para volver a una versión anterior de este</strong> en lugar de volver a escribir todo manualmente.</p><p>Aprender Git también te permite <strong>colaborar con otros en un equipo </strong>y realizar cambios en la misma base de código desde diferentes ubicaciones.</p><p>Sugeriría <strong>comenzar a <a href="https://www.youtube.com/watch?v=mBYSUUnMt9M">aprender Git </a>y usar un servicio como <a href="https://github.com/">GitHub</a> para alojar tus proyectos personales.</strong></p><h3 id="resoluci-n-de-problemas">Resolución de problemas</h3><p>La habilidad más importante para cualquier desarrollador es saber cómo resolver problemas. Empresas y clientes te buscan para aportar soluciones.</p><p>Es importante aprender a abordar un problema, dividirlo en partes más pequeñas y manejables y solucionar el problema en estas aplicaciones web.</p><h2 id="-debo-perseguir-como-objetivo-el-desarrollo-full-stack">¿Debo perseguir como objetivo el desarrollo full stack?</h2><p>Si recién estás comenzando y no puedes determinar si el desarrollo Full Stack es para tí, simplemente no se preocupes por eso tan temprano en tu aprendizaje.</p><p>Sugeriría centrarse en <strong>aprender los tres lenguajes principales de la web, que son HTML, CSS y JavaScript.</strong> A medida que avanza en su viaje, entonces puedes decidir qué camino es apropiado para tí.</p><p><strong>¿Cuánto gana un desarrollador Full Stack?</strong><br>El rango de salario para los trabajos de Full Stack completa diferirá según el lugar del mundo en el que te encuentres. Sugeriría usar sitios como <strong><a href="https://www.glassdoor.com/index.htm">Glassdoor</a>, <a href="https://www.indeed.com/">Indeed</a> y <a href="https://www.ziprecruiter.com/">ZipRecruiter </a>para buscar salarios en su área.</strong></p><p>Aquí hay ejemplos de salarios para los Estados Unidos. Estos datos fueron proporcionados por <a href="https://www.ziprecruiter.com/">ZipRecruiter</a> y muestran el promedio nacional.</p><p>Veamos primero el salario de un desarrollador junior Full Stack. <strong>Los desarrolladores junior son aquellos que han estado trabajando en la industria durante dos años o menos.</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-15.png" class="kg-image" alt="image-15" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-15.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-15.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="624" loading="lazy"></figure><p>A continuación, echemos un vistazo a los salarios de full stack de nivel medio. Estos desarrolladores <strong>han estado trabajando entre 2-4 años aproximadamente.</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-16.png" class="kg-image" alt="image-16" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-16.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-16.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="636" loading="lazy"></figure><p>Por último, echemos un vistazo a los salarios senior full stack. Estos desarrolladores han estado trabajando en la industria <strong>durante algunos años y, a menudo, sirven como mentores para desarrolladores de nivel junior y medio.</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-17.png" class="kg-image" alt="image-17" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-17.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-17.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="633" loading="lazy"></figure><h2 id="-c-mo-puedes-obtener-un-trabajo-como-desarrollador-full-stack"><strong><strong>¿Cómo puedes obtener un trabajo como Desarrollador<strong> Full Stack?</strong></strong></strong></h2><p>Una vez que hayas aprendido los aspectos técnicos del desarrollo Full Stack; debes concentrarte en reunir los materiales de tu solicitud de empleo. </p><p>Hay muchos recursos increíbles que pueden ayudarlo a aprender cómo obtener un trabajo en el área.</p><h3 id="recursos-para-la-elaboraci-n-de-curr-culos">Recursos para la elaboración de currículos</h3><ul><li><a href="https://www.freecodecamp.org/news/how-to-get-your-first-dev-job/">Cómo obtener tu primer trabajo de desarrollador: Perspectivas de la revisión de los currículos de quienes cambian de carrera</a></li><li><a href="https://www.freecodecamp.org/news/how-to-write-a-developer-resume-recruiters-will-read/">Cómo escribir un currículum de desarrollador que leerán los reclutadores</a></li><li><a href="https://www.freecodecamp.org/news/how-to-write-an-awesome-junior-developer-resume-in-a-few-simple-steps-316010db80ec/">Cómo escribir un impresionante currículum de desarrollador junior en unos simples pasos</a></li></ul><h3 id="recursos-para-entrevistas-t-cnicas">Recursos para entrevistas técnicas</h3><ul><li><a href="https://www.freecodecamp.org/news/how-to-prepare-for-a-technical-interview/">Cómo prepararse para una entrevista técnica</a></li><li><a href="https://www.freecodecamp.org/news/how-to-answer-any-technical-interview-question-with-example/">Cómo responder cualquier pregunta técnica de la entrevista: ejemplo incluido</a></li><li><a href="https://www.freecodecamp.org/news/what-i-learned-from-doing-60-technical-interviews-in-30-days/">Lo que aprendí al hacer más de 60 entrevistas técnicas en 30 días</a></li><li><a href="https://www.freecodecamp.org/news/is-this-the-best-book-for-coding-interview-preparation/">El mejor libro para la preparación de la entrevista de codificación técnica</a></li><li><a href="https://www.freecodecamp.org/news/interviewing-prep-tips-and-tricks/">Cómo prepararse para una entrevista técnica: consejos y trucos para ayudarlo a rendir al máximo</a></li></ul><h3 id="consejos-para-conseguir-un-trabajo">Consejos para conseguir un trabajo</h3><ul><li><a href="https://www.freecodecamp.org/news/networking-for-aspiring-developers/">Cómo obtener su primer trabajo de desarrollador a través de networking genuino e inteligente</a></li><li><a href="https://www.youtube.com/watch?v=K3B5AltcCTY">Consejos para la búsqueda de empleo en 2021</a></li><li><a href="https://www.youtube.com/watch?v=KPzFCZ_u_sY">Cómo dominar su búsqueda de empleo</a></li><li><a href="https://www.youtube.com/watch?v=SG5Sb5WTV_g">¡CÓMO USAR LINKEDIN COMO DESARROLLADOR para conseguir un trabajo en tecnología! ¡Cómo hacer networking!</a></li></ul><p>También incluiré recursos sobre cómo comenzar a trabajar independientemente si está interesado en seguir esa ruta.</p><ul><li><a href="https://www.freecodecamp.org/news/what-is-freelancing/">¿Qué es Freelance? Cómo encontrar trabajos independientes en línea y clientes en tu ciudad</a></li><li><a href="https://www.freecodecamp.org/news/free-web-design-proposal-template/">Cómo escribir propuestas independientes que atraigan a los clientes + una plantilla gratuita</a></li><li><a href="https://www.freecodecamp.org/news/freelance-web-developer-guide/">La guía completa para desarrolladores web independientes: Cómo ganar dinero a través de trabajos de programación independientes</a></li></ul><p><br>Espero que hayas disfrutado este artículo. Te deseo mucha suerte en tu camino para convertirte en un desarrollador Full Stack.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Guía de cálculo científico en Python. Matemáticas en SciPy y NumPy explicadas con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ En este artículo se presentan varias aplicaciones científicas y prácticas de Scipy y Numpy ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/funciones-en-python-introduccion/</link>
                <guid isPermaLink="false">6270a6bc42dfce088476a677</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Mon, 27 Mar 2023 19:56:51 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/03/Mathematics-Scipy.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>SciPy y NumPy son bibliotecas de Python que se utilizan comúnmente en cálculo científico y en ciencia de datos. </strong></p><p>NumPy proporciona una infraestructura para trabajar con arreglos numéricos y matrices, mientras que SciPy proporciona una amplia gama de algoritmos numéricos, cálculos matemáticos avanzados y herramientas para aplicaciones científicas.</p><p>Una de las principales razones por las que estas bibliotecas son tan populares en el ámbito científico es porque <strong>son muy eficientes en el manejo de grandes conjuntos de datos numéricos y matrices. </strong></p><p>Además, SciPy y NumPy tienen una gran cantidad de funciones integradas para <strong>realizar operaciones numéricas complejas</strong>, como la transformada de Fourier, la optimización numérica, el álgebra lineal, la estadística y el procesamiento de señales. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-20.png" class="kg-image" alt="image-20" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-20.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2023/03/image-20.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-20.png 1352w" sizes="(min-width: 720px) 720px" width="1352" height="647" loading="lazy"><figcaption>Página oficial de <a href="https://scipy.org/">SciPy</a></figcaption></figure><p>Estas funciones son esenciales en muchas aplicaciones científicas, desde el procesamiento de imágenes hasta el análisis de datos biomédicos. Sin embargo, esto no excluye que podamos emplearlas para resolver problemas más burdos.</p><p>Otro aspecto importante es que ambas bibliotecas son de código abierto y tienen una gran comunidad de desarrolladores, lo que permite que los usuarios obtengan soporte y contribuyan a la mejora de las bibliotecas.</p><h3 id="motivo-y-enfoque-de-este-art-culo">Motivo y enfoque de este artículo</h3><p>Este artículo busca proporcionar una visión general aunque no por ello ligera, sobre algunas de las aplicaciones matemáticas y estadísticas que pueden tener NumPy y SciPy. </p><p>Si bien, ya existe información acerca de estas librerías, -especialmente sobre NumPy-. El enfoque de este contenido será dar un pantallazo amplio pero detallado a las principales aplicaciones científicas de estas librerías. No tanto así a un "procedimiento" en específico. Si por otra parte requieres de un tutorial más concreto te recomiendo <a href="https://www.freecodecamp.org/espanol/news/la-guia-definitiva-del-paquete-numpy-para-computacion-cientifica-en-python/">esta guía</a> y este <a href="https://www.freecodecamp.org/espanol/news/curso-intensivo-de-python-numpy-como-construir-arreglos-n-dimensionales-para-aprendizaje-automatico/">curso de arreglos en NumPy</a>.</p><p>Habiendo aclarado esto, en este artículo se presentan varias aplicaciones científicas y prácticas de SciPy y NumPy. Ya sea que te interesen los aspectos más teóricos de la ciencia de datos, tengas una profesión científica o de ingeniería, seas estudiante de carreras cuantitativas, o simplemente busques crecer en el desarrollo de aplicaciones especializadas; este tutorial podría serte útil. </p><p>Tres notas o más bien "<em>disclaimers</em>" antes de empezar: </p><ol><li>Este artículo se centra en el desarrollo de varios problemas matemáticos y científicos y pese a que traté de organizarlos en un orden más o menos coherente algún ejercicio puede resultar chocante, o difícil de entender a nivel teórico. Mi consejo es el siguiente: Toma lo que te sirva, no te preocupes por tratar de entenderlo todo, aunque, desde luego, tampoco hay quejas si lo entiendes el 100% :D.</li><li>Debido a que son ejercicios separados verás repetidamente "import matplotlib.pyplot as plt" o <code>import numpy as np</code>. Sé que es redundante, pero la idea que es todos los ejercicios estén listos "para tomar" y tratar de replicarlos sin preocuparte por el orden.</li><li>Siento no poder incluir ejemplos de otros campos -eg. como la física o la epidemiología-, pero carezco de la formación para ello. </li></ol><p>Bien, ahora sin más preámbulos pasemos a los ejercicios.</p><h2 id="estad-stica-y-probabilidad-con-scipy-y-numpy">Estadística y probabilidad con SciPy y NumPy</h2><h3 id="m-todo-de-montecarlo">Método de Montecarlo</h3><p>El código presentado es una implementación de un <a href="https://www.ibm.com/mx-es/cloud/learn/monte-carlo-simulation">método de simulación</a> para estimar el valor de π (pi). La idea detrás del método es simular el lanzamiento de dardos aleatorios sobre un cuadrado con un círculo inscrito. Al lanzar dardos aleatorios, podemos <strong>contar cuántos de ellos caen dentro del círculo y cuántos fuera.</strong> </p><p>Con esta información, <em><strong>podemos hacer una estimación del área del círculo y, por lo tanto, del valor de π.</strong></em></p><p>El código utiliza la biblioteca NumPy para generar coordenadas aleatorias para los dardos y para realizar operaciones matemáticas. La biblioteca SciPy se utiliza para calcular la <strong><a href="https://openstax.org/books/introducci%C3%B3n-estad%C3%ADstica-empresarial/pages/5-1-propiedades-de-las-funciones-de-densidad-de-probabilidad-continuas">función de densidad de probabilidad acumulada</a></strong>, que se utiliza para determinar cuántos dardos caen dentro del círculo.</p><pre><code class="language-python">#Cálculo del número PI de forma aleatoria
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# Número de dardos a lanzar
N = 1000000

# Generar coordenadas aleatorias
x = np.random.uniform(low=-1, high=1, size=N)
y = np.random.uniform(low=-1, high=1, size=N)

# Calcular la distancia al centro
dist = np.sqrt(x**2 + y**2)

# Calcular el número de dardos que caen dentro del círculo
num_dentro = np.sum(dist &lt; 1)

# Estimar pi
pi_estimado = 4 * num_dentro / N

# Comparar con el valor real de pi
pi_real = np.pi
error_relativo = np.abs(pi_estimado - pi_real) / pi_real

# Mostrar resultados
print(f"Valor estimado de pi: {pi_estimado}")
print(f"Valor real de pi: {pi_real}")
print(f"Error relativo: {error_relativo}")

#Visualización del círculo de pi
fig, ax = plt.subplots(figsize=(7, 7))
ax.set_aspect('equal')
circulo = plt.Circle((0, 0), 1, color='grey', alpha=0.2)
ax.add_artist(circulo)
ax.scatter(x[dist &lt; 1], y[dist &lt; 1], s=0.5, color='white')
ax.scatter(x[dist &gt;= 1], y[dist &gt;= 1], s=0.5, color='turquoise')

# Mostrar resultados gráficamente
ax.set_title(f"Estimación de Pi: {pi_estimado:.5f} (error relativo: {error_relativo:.5f})")
plt.show()</code></pre><pre><code class="language-python">#Resultados
Valor estimado de pi: 3.143684
Valor real de pi: 3.141592653589793
Error relativo: 0.0006656962378038079
#Nuestro número estimado se aproxima mucho al número pi!</code></pre><p>Primero, el número de dardos que se lanzará se define como N=1000000. A continuación, se generan coordenadas aleatorias para los dardos utilizando la función np.random.uniform(). Se genera un conjunto de coordenadas para la coordenada x y otro para la coordenada y, ambos en el rango de [-1, 1].</p><p>Luego, se calcula la distancia euclidiana desde el origen de cada punto generado. Si la distancia es menor que 1, significa que el punto cae dentro del círculo. Se cuentan cuántos puntos caen dentro del círculo mediante np.sum() y np.where().</p><p>Una vez se tiene el número de puntos que caen dentro del círculo, se estima el valor de π mediante la fórmula π = 4 * puntos dentro del círculo / total de puntos.</p><p>Por último, se comparan el valor estimado de π con el valor real y se muestra el error relativo en la estimación.</p><p>Este método de simulación es muy útil ya que puede ser utilizado para estimar π en cualquier dimensión. Además, este método se puede utilizar para simular cualquier otro problema donde se desee obtener una estimación numérica de una cantidad desconocida.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-9.png" class="kg-image" alt="image-9" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/03/image-9.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-9.png 611w" width="611" height="603" loading="lazy"><figcaption>Resultado gráfico de nuestra estimación.</figcaption></figure><h3 id="ajustando-una-curva-de-datos">Ajustando una curva de datos</h3><p>Estos son dos ejemplos de cómo ajustar una curva de datos con una función, utilizando la biblioteca NumPy, Matplotlib y SciPy de Python.</p><p>En general, el <a href="https://statologos.com/ajuste-de-curvas/">ajuste de curvas</a> es un <strong>proceso importante en el análisis de datos </strong>que se utiliza para encontrar<a href="https://sites.google.com/site/ittgmetodosnumericos/home/unidad-4-ajuste-de-curvas-e-interpolacion"> relaciones funcionales </a>entre las variables. Los modelos que se ajustan pueden variar desde simples funciones polinómicas hasta modelos más complejos con múltiples parámetros. </p><p>El ajuste de curvas es una herramienta útil para la predicción y la interpretación de los datos, especialmente en áreas como la estadística, la física, la ingeniería y la ciencia de datos.</p><pre><code class="language-python">#Ajustando una curva de datos
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# Datos
x = np.array([1, 2, 3, 4, 5])
y = np.array([1.1, 3.5, 7.2, 13.1, 21.3])

# Función a ajustar
def func(x, a, b, c):
    return a * x**2 + b * x + c

# Ajuste
popt, pcov = curve_fit(func, x, y)

# Coeficientes
a, b, c = popt

# Gráfica
plt.plot(x, y, 'ro', label='Datos')
plt.plot(x, func(x, a, b, c), label='Ajuste')
plt.legend()
plt.show()</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-4.png" class="kg-image" alt="image-4" width="556" height="413" loading="lazy"><figcaption>Resultado Ejemplo 1.</figcaption></figure><pre><code class="language-python">#Ejemplo 2
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

# Función a la que se quiere ajustar la curva
def func(x, a, b, c):
    return a*np.exp(-b*x) + c

# Datos a los que se quiere ajustar la curva
xdata = np.linspace(0, 4, 50)
ydata = func(xdata, 2.5, 1.3, 0.5) + 0.2*np.random.normal(size=len(xdata))

# Ajuste de la curva
popt, pcov = curve_fit(func, xdata, ydata)

# Graficar los datos y la curva ajustada
plt.plot(xdata, ydata, 'o', label='Datos')
plt.plot(xdata, func(xdata, *popt), '-', label='Curva ajustada')
plt.legend()
plt.show()</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-5.png" class="kg-image" alt="image-5" width="547" height="413" loading="lazy"><figcaption>Resultado, ejemplo 2.</figcaption></figure><p>Aquí hemos visto como ajustar una curva de datos con una función, utilizando la biblioteca NumPy, Matplotlib y SciPy de Python.</p><p>Primero, se definen dos matrices NumPy de 1D, x e y, que contienen los datos de los puntos a ajustar. Luego se define una función "func" que se utilizará para realizar el ajuste de la curva. Esta función toma tres argumentos, a, b y c, que son los coeficientes de la función cuadrática ax^2 + bx + c.</p><p>El ajuste de la curva se realiza utilizando la función curve_fit de SciPy. Esta función devuelve dos valores, popt y pcov. El primero es una matriz NumPy de 1D que contiene los valores óptimos para a, b y c, y el segundo es una matriz NumPy de 2D que contiene la covarianza de los parámetros.</p><p>A continuación, se asignan los valores óptimos de los coeficientes a, b y c a variables separadas a partir de popt. A continuación, se grafican los puntos de datos originales junto con la curva ajustada utilizando la función plot de Matplotlib.</p><h3 id="medidas-de-dispersi-n">Medidas de dispersión </h3><p>Las medidas de dispersión son estadísticas que indican cuánto se alejan los datos de un conjunto de valores respecto a su valor central o promedio. Estas medidas se utilizan para analizar la variabilidad o heterogeneidad de los datos.</p><pre><code class="language-python">#Medidas de dispersión en Numpy y Scipy
import numpy as np
from scipy import stats

import numpy as np

# Datos
datos = np.array([4, 49, 19, 4, 14, 20, 17, 50, 4, 20])

# Media
media = np.mean(datos)
print("Media:", media)

# Mediana
mediana = np.median(datos)
print("Mediana:", mediana)

# Desviación estándar
desviacion_estandar = np.std(datos)
print("Desviación estándar:", desviacion_estandar)

# Moda
moda = stats.mode(datos)
print("Moda:", moda.mode[0])
</code></pre><pre><code class="language-python">#Resultado
Media: 20.1
Mediana: 18.0
Desviación estándar: 15.984054554461457
Moda: 4</code></pre><p>Aquí se define una lista de datos llamada "data".La media, mediana y desviación estándar de los datos se calculan utilizando las funciones "mean", "median" y "std" de NumPy. Nótese que para el caso de la moda recurrimos a SciPy. </p><p>La media es la suma de todos los valores dividida por el número de valores, la mediana es el valor que se encuentra en el centro de un conjunto de datos ordenados, y la desviación estándar mide la cantidad de variabilidad o dispersión en los datos. La moda por su parte, es el valor que más se repite en la serie.</p><h3 id="ajuste-de-regresi-n-lineal">Ajuste de regresión lineal</h3><p>Anteriormente vimos el ajuste de curva, esta vez veremos un ajuste parecido pero limitado a la regresión lineal, y por tanto, de una mayor aplicación estarística.</p><p>El ajuste de curva permite modelar una amplia variedad de formas de curva, mientras que el ajuste de regresión lineal se limita a modelos lineales. Pero esa no es la única diferencia. El primero es más una mera optimización, mientras que con el ajuste de regresión lineal, nos jugamos la integridad de todo el modelo estadístico, de allí que en esta ocasión trajemos con 'stats'. </p><pre><code class="language-python">#Ajuste de modelo de regresión lineal
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# Datos de ejemplo
x = np.array([10, 20, 30, 40, 50, 60])
y = np.array([2.5, 5.1, 7.3, 9.1, 11.2, 13.5])

# Ajuste de modelo de regresión lineal
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)

# Imprimir resultados
print(f"Coeficiente de pendiente: {slope}")
print(f"Coeficiente de intersección: {intercept}")
print(f"Coeficiente de correlación: {r_value}")
print(f"Valor p: {p_value}")
print(f"Error estándar: {std_err}")

#Graficando los datos originales y la línea de regresión
plt.scatter(x, y)
plt.plot(x, slope*x + intercept, color='red')
plt.title('Regresión lineal')
plt.xlabel('Variable independiente')
plt.ylabel('Variable dependiente')
plt.show()</code></pre><pre><code class="language-python">#Resutado
Coeficiente de pendiente: 0.21457142857142858
Coeficiente de intersección: 0.6066666666666665
Coeficiente de correlación: 0.998781193835107
Valor p: 2.227327440120712e-06
Error estándar: 0.0053017773941776</code></pre><p>Este código realiza un ajuste de modelo de regresión lineal a un conjunto de datos utilizando la biblioteca SciPy.</p><p>Primero, se definen los datos de ejemplo x e y como matrices NumPy. Luego, se utiliza la función stats.linregress(x, y) de SciPy para realizar el ajuste de regresión lineal.</p><p>La función stats.linregress() devuelve cinco valores: la pendiente (slope), la intersección (intercept), el coeficiente de correlación (r_value), el valor p (p_value) y el error estándar (std_err).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-10.png" class="kg-image" alt="image-10" width="563" height="454" loading="lazy"><figcaption>Resultado gráfico del ajuste de regresión lineal</figcaption></figure><h2 id="matem-ticas-financieras">Matemáticas financieras</h2><p>Pasemos ahora a ver un par de aplicaciones de estas bibliotecas a las matemáticas financieras.</p><pre><code class="language-python">#Matemáticas financieras con Numpy
#Comenzamos instalando el paquete numpy-financial
pip install numpy-financial

#Calculando el VAN
import numpy_financial as npf

# Datos de entrada
tasa_descuento = 0.1
flujos_efectivo = [-100, 60, 60, 60, 60]
inversion_inicial = 100

# Cálculo del valor presente neto
vpn = npf.npv(tasa_descuento, flujos_efectivo) + inversion_inicial

print("El valor presente neto es:", round(vpn, 2))
</code></pre><pre><code class="language-python">#Resultado
El valor presente neto es: 190.19</code></pre><p>El código anterior muestra cómo calcular el valor presente neto de una serie de flujos de efectivo utilizando la biblioteca numpy_financial. <strong>Recuerda primero instalar la librería Numpy Financial.</strong></p><p>Primero, se definen las variables de entrada del problema. La tasa de descuento se establece en 0.1, lo que significa que se asume que el costo de oportunidad del capital es del 10%. Los flujos de efectivo se dan como una lista de valores. En este caso, hay un flujo inicial de efectivo de -100, lo que significa que hay una inversión inicial de 100, seguido de cuatro flujos positivos de efectivo de 60.</p><p>Luego, se utiliza la función npf.npv() de la biblioteca numpy_financial para calcular el valor presente neto de los flujos de efectivo. Esta función toma como argumentos la tasa de descuento y una lista de flujos de efectivo. También se agrega la inversión inicial al resultado final.</p><p>Finalmente, el valor presente neto se imprime en la pantalla redondeado a dos decimales.</p><p>El valor presente neto es una herramienta útil en la toma de decisiones de inversión, ya que permite evaluar la rentabilidad de un proyecto de inversión. Si el valor presente neto es positivo, significa que el proyecto es rentable, mientras que un valor negativo indica que el proyecto no es rentable.</p><pre><code class="language-python">#Calculando la TIR
import numpy_financial as npf

flujos_efectivo = [-1000, 200, 250, 300, 350, 400, 450]
tir = npf.irr(flujos_efectivo)

print("La TIR es:", round(tir, 4))</code></pre><pre><code class="language-python">#Resultado
La TIR es: 0.1979</code></pre><p>A continuación hemos utilizado la librería numpy_financial para calcular la TIR (tasa interna de retorno) de un flujo de caja.</p><p>Primero, se define la lista de flujos de efectivo llamada flujos_efectivo. Esta lista contiene los flujos de efectivo del proyecto en diferentes periodos de tiempo. En este caso, el proyecto requiere una inversión inicial de -1000 unidades monetarias y se espera que genere flujos de efectivo de 200, 250, 300, 350, 400 y 450 unidades monetarias en cada uno de los siguientes 6 periodos.</p><p>Luego, se utiliza la función npf.irr de la librería numpy_financial para calcular la TIR. La TIR es la tasa de interés que hace que el valor presente neto (VPN) de los flujos de efectivo sea igual a cero. En otras palabras, es la tasa a la que el proyecto es rentable. La función npf.irr utiliza una técnica de interpolación para encontrar la tasa de descuento que hace que el VPN sea igual a cero.</p><p>Finalmente, se imprime el resultado redondeado a 4 decimales utilizando la función round(). En este caso, la TIR calculada es de aproximadamente 18.97%, lo que significa que el proyecto es rentable y ofrece un rendimiento superior al 18.97% de interés anual.</p><h2 id="-lgebra-lineal-con-numpy-y-scipy">Álgebra lineal con NumPy y SciPy</h2><p>Tanto SciPy como NumPy proporcionan un conjunto de módulos específicos para el álgebra lineal. Estos incluyen herramientas para la solución de sistemas de ecuaciones lineales, la diagonalización de matrices, la descomposición de valores singulares y la descomposición de matrices de covarianza, entre muchas otras aplicaciones.</p><p><strong>Producto de dos matrices</strong></p><p>El producto de dos matrices es una operación matemática que se realiza entre dos matrices y produce una nueva matriz como resultado.</p><pre><code class="language-python">#Álgebra lineal con numpy
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

c = np.dot(a, b)

print(c)</code></pre><pre><code class="language-python">#Resultado
[[19 22]
 [43 50]]</code></pre><p><strong>Traspuesta de una matriz</strong></p><p>La traspuesta de una matriz es simplemente una matriz en la que las filas y columnas han sido intercambiadas. En otras palabras, la traspuesta de una matriz es una matriz en la que las filas de la matriz original se convierten en columnas y las columnas se convierten en filas.</p><pre><code class="language-python">import numpy as np

a = np.array([[1, 2], [3, 4]])

b = np.transpose(a)

print(b)</code></pre><pre><code class="language-python">#Resultado 
[[1 3]
 [2 4]]</code></pre><p><strong>Inversa de una matriz</strong></p><p>La inversa de una matriz es una matriz que, al multiplicarse por la matriz original, produce la<a href="https://www.studysmarter.es/resumenes/matematicas/numeros-y-algebra/matriz-inversa/"> matriz identidad.</a></p><pre><code class="language-python">#Inversa de una matriz
import numpy as np
from scipy.linalg import inv

a = np.array([[1, 2], [3, 4]])

b = inv(a)

print(b)
</code></pre><pre><code class="language-python">#Resultado
[[-2.   1. ]
 [ 1.5 -0.5]]
</code></pre><h3 id="determinante-de-una-matriz">Determinante de una matriz</h3><p>Si bien podemos explicar el determinante de una matriz de muchas formas. En este artículo nos conformaremos con decir que <strong>el determinante de una matriz <a href="https://aga.frba.utn.edu.ar/determinante-matriz/">nos dice si una matriz </a>posee inversa o no.</strong></p><pre><code class="language-python">#Determinante de una matriz
import numpy as np
from scipy.linalg import det

a = np.array([[1, 2], [3, 4]])

b = det(a)

print(b)</code></pre><pre><code class="language-python">#Resultado
-2.0
</code></pre><h3 id="eigenvalores">Eigenvalores</h3><p>Solo como ejemplo, que sepas que el paquete de algebra lineal de SciPy no se limita a operaciones básicas con matrices, sino que también permite temas más avanzados .</p><pre><code class="language-python">#Eigenvalores
import numpy as np
from scipy.linalg import eig

a = np.array([[1, 2], [3, 4]])

b, c = eig(a)

print(b)
print(c)

</code></pre><pre><code class="language-python">#Resultado
[-0.37228132+0.j  5.37228132+0.j]
[[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]
</code></pre><p>Esta función calcula los valores y vectores propios (también llamados eigenvalores y eigenvectores) de la matriz <code>a</code>.</p><p>La función <code>eig</code> devuelve dos matrices, <code>b</code> y <code>c</code>. La matriz <code>b</code> contiene los valores propios de <code>a</code> y la matriz <code>c</code> contiene los vectores propios de <code>a</code>, donde cada columna de <code>c</code> corresponde a un vector propio.</p><h3 id="sistemas-de-ecuaciones-lineales">Sistemas de ecuaciones lineales</h3><p>Esta función resuelve el sistema de ecuaciones lineales <code>a x = b</code>, donde <code>a</code> es la matriz definida anteriormente y <code>b</code> es el vector definido anteriormente, y devuelve el valor de <code>x</code> que satisface la ecuación. El resultado se almacena en la variable <code>c</code>.</p><pre><code class="language-python">import numpy as np
from scipy.linalg import solve

a = np.array([[1, 2], [3, 4]])
b = np.array([5, 6])

c = solve(a, b)

print(c)</code></pre><pre><code class="language-python">#Resultado
[-4.   4.5]</code></pre><p>Nota Final: Puedes encontrar la amalgama de<a href="https://docs.scipy.org/doc/scipy/reference/linalg.html"> funciones de algebra lineal de SciPy en su manual.</a></p><h2 id="c-lculo-diferencial-e-integral-en-numpy-y-scipy">Cálculo diferencial e integral en NumPy y SciPy</h2><p>El cálculo diferencial es el estudio del cambio y la tasa de cambio de funciones, mientras que el cálculo integral se ocupa de la acumulación de pequeños cambios para encontrar áreas, volúmenes y otros conceptos geométricos. Ambos temas son fundamentales en matemáticas y tienen una amplia gama de aplicaciones en ciencias físicas y sociales, ingeniería y otras áreas de la industria.</p><p>SciPy proporciona una serie de herramientas para trabajar con cálculo diferencial e integral, incluyendo la capacidad de integrar y diferenciar funciones de manera numérica. Algunas de las funciones clave incluyen <code>scipy.integrate.quad</code> para integrar funciones unidimensionales, <code>scipy.integrate.nquad</code> para integrar funciones de varias variables, y <code>scipy.integrate.solve_ivp</code> para resolver ecuaciones diferenciales ordinarias.</p><p>Además, SciPy tiene funciones para realizar la diferenciación numérica, lo que permite calcular la derivada de una función en un punto dado sin la necesidad de conocer la fórmula analítica de la función. Las funciones relevantes incluyen <code>scipy.misc.derivative</code> y <code>scipy.interpolate.UnivariateSpline</code>.</p><p>Veamos pues, solo unos cuantos ejemplos de este extenso campo de aplicación.</p><h3 id="derivadas">Derivadas</h3><pre><code class="language-python">import numpy as np
from scipy.misc import derivative

# Definir la función para la que se calculará la derivada
def f(x):
    return x**2 + 2*x + 1

# Calcular la derivada de la función (evaluada) en x=2
derivada = derivative(f, 2)

# Imprimir la derivada
print(derivada)
</code></pre><pre><code class="language-python">#Resultado
6.0</code></pre><p>Aquí no hicimos más que evaluar la función en 2. La derivada de la función es 2x+2, por lo que tenemos 2 (2) +2=6. &nbsp;En este ejemplo lo vemos fácil pero la utilidad de SciPy radica en calcular derivadas mucho más complejas.</p><h3 id="derivadas-parciales">Derivadas Parciales</h3><p>La <strong>derivada parcial</strong> de una función de varias variables es la derivada con respecto a cada una de esas variables manteniendo las otras como constantes.</p><pre><code class="language-python">import numpy as np
from scipy.misc import derivative

# Definir la función
def f(x,y):
    return x**2 + y**2

# Calcular la derivada parcial con respecto a x en el punto (1,2)
x0 = 1
y0 = 2
dx = 1e-6  # tamaño de paso para la derivada
df_dx = derivative(lambda x: f(x,y0), x0, dx=dx)

print(f"La derivada parcial de f(x,y) con respecto a x en el punto (1,2) es {df_dx:.2f}")</code></pre><pre><code class="language-python">#Resultado
La derivada parcial de f(x,y) con respecto a x en el punto (1,2) es 2.00
</code></pre><p>La derivada parcial de <code>f(x,y) = x^2 + y^2</code> con respecto a <code>x</code> es <code>2x</code>, y evaluada en <code>(1,2)</code> nos da <code>2</code>, ya que <code>x</code> en ese punto es igual a <code>1</code>. Por lo tanto, la tasa de cambio instantánea de <code>f</code> en la dirección <code>x</code> en el punto <code>(1,2)</code> es <code>2</code>.</p><h3 id="integrales">Integrales</h3><p>En este ejemplo vamos a empezar directamente con una integral definida. En el proceso veremos la función <code>quad</code> de SciPy para calcular la integral definida de <code>f</code> en el intervalo <code>[0, 1]</code>.</p><p>Donde <code>f</code> es la función a integrar, <code>a</code> es el límite inferior de la integral y <code>b</code> es el límite superior de la integral.</p><p>La función <code>quad</code> utiliza un algoritmo de integración numérica para aproximar la integral definida de <code>f</code>. En este caso, la integral definida es:</p><pre><code class="language-python">from scipy.integrate import quad

# Definimos la función a integrar
def f(x):
    return x**2 + 2*x + 1

# Calculamos la integral definida entre 0 y 1
resultado, error = quad(f, 0, 1)

# Imprimimos el resultado
print(f"La integral definida es {resultado}")</code></pre><pre><code class="language-python">#Resultado
La integral definida es 2.3333333333333335
</code></pre><p>Si lo hubieramos hecho "a mano" tendríamos que haber encontrado la<a href="http://prometeo.matem.unam.mx/recursos/Bachillerato/DGEE_DGTIC_IMATE/recursos/3_065/index.html"> primitiva</a> de <code>f</code>: F(x) = (1/3)*x^3 + x^2 + x + C </p><p>Después nos habría tocado que evaluar la primitiva <code>F(x)</code> en los límites de integración <code>[0,1]</code> . La función <code>quad</code> de SciPy nos ahora este proceso y nos proporciona un valor aproximado de la integral sin conocer el valor de la constante de integración.</p><h3 id="m-nimo-global">Mínimo Global</h3><p>El mínimo global de una función es el valor más bajo que toma la función en todo su dominio. En otras palabras, es el punto más bajo en la gráfica de la función. Este valor representa el valor mínimo absoluto de la función, ya que no hay otro valor en el dominio de la función que produzca un resultado más bajo. </p><p>En términos matemáticos, un mínimo global es un valor "y" en la función "f(x)" que cumple con la condición de que "f(x) ≤ f(a)" para todos los valores de "x" en el dominio de la funció</p><pre><code class="language-python">from scipy.optimize import differential_evolution

# Definimos la función a minimizar
def f(x):
    return (x[0] - 1)**2 + (x[1] - 2.5)**2 + (x[2] - 5)**2

# Definimos los límites de búsqueda
limites = [(0, 5), (0, 5), (0, 10)]

# Buscamos el mínimo global
resultado = differential_evolution(f, limites)

# Imprimimos el resultado
print(f"El mínimo global es {resultado.x}")
</code></pre><pre><code class="language-python">#Resultado
El mínimo global es [1.  2.5 5. ]</code></pre><p>Es importante recordar que solo hay un mínimo (y un máximo) global, aunque pueden haber diversos mínimos y máximos locales.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-19.png" class="kg-image" alt="image-19" width="412" height="206" loading="lazy"><figcaption>Representación genérica de una Mínimo global. Fuente: <a href="https://www.disfrutalasmatematicas.com/algebra/funciones-maximo-minimo.html">Disfrutalasmatemáticas</a></figcaption></figure><h3 id="series-de-taylor">Series de Taylor</h3><p>Las series de Taylor son una herramienta matemática utilizada para aproximar funciones mediante una serie infinita de términos polinómicos. La idea detrás de esta técnica es descomponer una función en términos de sus derivadas, lo que permite aproximar la función en un punto determinado.</p><pre><code class="language-python">import numpy as np
from scipy.misc import derivative
from scipy.special import factorial
from scipy import poly1d

# Función a la que queremos calcular la serie de Taylor
def f(x):
    return np.sin(x)

# Punto alrededor del cual queremos centrar la serie de Taylor
a = 0

# Orden de la serie de Taylor
n = 5

# Calculamos los coeficientes de la serie de Taylor utilizando la fórmula para la función seno
coeficientes = [(-1)**i/factorial(2*i+1) for i in range(n+1)]

# Creamos el polinomio a partir de los coeficientes
polinomio = poly1d(coeficientes)

# Evaluamos el polinomio en el punto x
x = 1
valor_aproximado = polinomio(x)

# Comparamos con el valor real de la función en el punto x
valor_real = f(x)
error_relativo = abs(valor_aproximado - valor_real)/valor_real

print(f"Valor aproximado: {valor_aproximado}")
print(f"Valor real: {valor_real}")
print(f"Error relativo: {error_relativo}")</code></pre><pre><code class="language-python">#Resultado
Valor aproximado: 0.841470984648068
Valor real: 0.8414709848078965
Error relativo: 1.8993938788946215e-10</code></pre><p>Este código calcula la serie de Taylor de la función seno en un punto específico y luego evalúa el polinomio de Taylor resultante en otro punto. A continuación, compara el valor aproximado obtenido a partir de la serie de Taylor con el valor real de la función en el punto evaluado, y calcula el error relativo.</p><p>Puedes encontrar una explicación más detallada y más técnica en el siguiente <a href="https://openstax.org/books/c%C3%A1lculo-volumen-2/pages/6-3-series-de-taylor-y-maclaurin">texto online.</a></p><h3 id="ecuaciones-diferenciales">Ecuaciones Diferenciales </h3><pre><code class="language-python">from scipy.integrate import solve_ivp

# Definimos la ecuación diferencial
def f(t, y):
    return [y[1], -2*y[1] - y[0]]

# Condiciones iniciales
y0 = [0, 1]

# Intervalo de tiempo a considerar
t_span = [0, 10]

# Resolución de la ecuación diferencial
solucion = solve_ivp(f, t_span, y0)

# Resultado
print(solucion.y)</code></pre><p>Este código resuelve una ecuación diferencial de segundo orden utilizando la función <code>solve_ivp</code> de la biblioteca SciPy.</p><p>Primero se define la ecuación diferencial a resolver en la función <code>f</code>, donde se especifica la derivada de la función <code>y</code> con respecto a <code>t</code>. En este caso, se trata de una ecuación diferencial de segundo orden de la forma <code>y'' + 2y' + y = 0</code>.</p><p>Luego se especifican las condiciones iniciales <code>y0</code> para la función <code>y</code> y el intervalo de tiempo <code>t_span</code> en el que se desea resolver la ecuación diferencial.</p><p>Finalmente, se utiliza la función <code>solve_ivp</code> para resolver la ecuación diferencial con los parámetros especificados, y se almacena la solución en la variable <code>solucion</code>. Se imprime el resultado de la solución <code>y</code> en cada punto en el intervalo de tiempo especificado.</p><p>La solución devuelta será una matriz de dos filas, una para cada variable en el sistema de ecuaciones diferenciales.</p><h3 id="optimizaci-n-con-numpy-y-scipy-ejemplo-pr-ctico-de-maximizaci-n-de-beneficios-">Optimización con NumPy y SciPy: Ejemplo práctico de Maximización de Beneficios.</h3><p>En economía, una función de producción describe la relación entre los insumos (factores productivos) y la cantidad de producto que una empresa puede producir utilizando esos insumos. Básicamente, es una fórmula que nos dice cuánta producción se puede obtener con diferentes combinaciones de trabajo, capital y otros insumos.</p><p>Los insumos son los recursos que una empresa utiliza para producir bienes o servicios. Los insumos más comunes son el trabajo (es decir, el tiempo y la energía que las personas dedican a la producción) y el capital (es decir, las herramientas, maquinaria y edificios que se utilizan en el proceso productivo).</p><p>La función de producción es importante porque permite modelar cómo los cambios a las cantidades de insumos afecta la cantidad de producción. Por ejemplo, si se aumenta la cantidad de trabajo, ¿cómo afectará esto a la cantidad de producción? ¿Cuánto capital es necesario para producir una cantidad determinada de producción?</p><h3 id="un-ejemplo-imaginario-para-entender-la-optimizaci-n">Un ejemplo imaginario para entender la optimización</h3><p>Veremos que en este ejemplo hipotético, la empresa no puede gastar más de $300 para adquirir el capital y trabajo para su proceso de producción (la restricción presupuestaria). En otras palabras, l<strong>a restricción presupuestaria se define como el costo total de contratar trabajadores (4L) y unidades de capital (6K), que no puede superar los $300.</strong></p><p>Es lógico pensar que $300 es muy poco para poner en marcha un proceso productivo, y ¡estamos en lo cierto! Pero en este caso solo queremos analizar la optimización en SciPy por lo que está simplificado al máximo. Si aún te parece un ejemplo "chocante"; podemos pensar que es una pequeña fábrica y que la producción es <em><strong>por hora. </strong></em></p><p>Por otra parte; l<strong>a función de beneficios se define como la diferencia entre los ingresos generados por la producción y los costos de los inputs (4L y 6K).</strong></p><p>Buscamos la combinación de trabajo y capital que maximicen la producción los beneficios de esta empresa, teniendo en cuenta la restricción presupuestaria.</p><pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize

# Definimos la función de producción
def funcion_produccion(inputs):
    L, K = inputs
    return (L**(1/2)) * (K**(1/2))

# Definimos la función de beneficios
def funcion_beneficios(inputs):
    return 10 * funcion_produccion(inputs) - 4 * inputs[0] - 6 * inputs[1]

# Definimos la restricción presupuestaria
def restriccion_presupuestaria(inputs):
    return 4 * inputs[0] + 6 * inputs[1] - 300

# Encontramos los inputs óptimos sujetos a la restricción presupuestaria
guess_inicial = [1, 1]
resultado = minimize(lambda x: -funcion_beneficios(x), guess_inicial, constraints=[{'type': 'eq', 'fun': restriccion_presupuestaria}])
inputs_optimos = resultado.x

# Calculamos la producción y los beneficios óptimos
produccion_optima = funcion_produccion(inputs_optimos)
beneficios_optimos = funcion_beneficios(inputs_optimos)

# Graficamos la función de producción
valores_L = np.linspace(0, 100, 100)
valores_K = np.linspace(0, 100, 100)
L_mesh, K_mesh = np.meshgrid(valores_L, valores_K)
Q_mesh = funcion_produccion([L_mesh, K_mesh])
fig, ax = plt.subplots()
ax.set_xlabel('Trabajo (L)')
ax.set_ylabel('Capital (K)')
ax.set_title('Función de producción')
ax.contour(L_mesh, K_mesh, Q_mesh, levels=10)
ax.plot(inputs_optimos[0], inputs_optimos[1], 'ro', label='Punto óptimo')
ax.legend()

plt.show()

# Imprimimos los resultados
print(f"Inputs óptimos: {inputs_optimos}")
print(f"Producción óptima: {produccion_optima}")
print(f"Beneficios óptimos: {beneficios_optimos}")</code></pre><pre><code class="language-python">#Resultado
Inputs óptimos: [37.49974611 25.00016926]
Producción óptima: 30.618621784087956
Beneficios óptimos: 6.186217840879607</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/03/image-8.png" class="kg-image" alt="image-8" width="585" height="454" loading="lazy"><figcaption>Resultado gráfico de la optimización de la función de producción</figcaption></figure><h3 id="explicaci-n-de-los-resultados">Explicación de los resultados</h3><p>Los resultados indican que la empresa<strong> debería utilizar aproximadamente 37 unidades de trabajo (L) y 25 unidades de capital (K) por hora para obtener la máxima producción y beneficios.</strong> Con estos inputs óptimos,<strong> la producción óptima es de aproximadamente 31 unidades por hora, mientras que los beneficios óptimos son de 6.19 dólares por hora. </strong></p><p>Es decir, que si la empresa utiliza en promedio 37 unidades de trabajo y 25 de capital; <strong>obtendrá $6.19 de beneficios por cada $300 invertidos en capital y trabajo.</strong></p><p>También podemos interpretar los resultados gráficamente a partir del gráfico de la función de producción. El punto óptimo, representado por un círculo rojo, se encuentra en el lugar donde las curvas de nivel de la función de producción son tangentes a la restricción presupuestaria. </p><p>En este punto, la pendiente de la curva de nivel de la función de producción coincide con la pendiente de la recta presupuestaria, lo que indica que la empresa está utilizando de manera eficiente sus recursos para maximizar sus beneficios.</p><p>Nuestro ejercicio resuelve un problema de optimización en el que una empresa hipotética desea maximizar sus beneficios al elegir<strong> la cantidad óptima de dos factores de producción: trabajo y capital. </strong></p><p>La empresa está <strong>limitada por un presupuesto dado</strong>, es decir, no puede gastar más dinero del que tiene disponible, y además tiene una función de producción que describe cómo la <strong>cantidad de trabajo y capital utilizada afecta la cantidad producida.</strong></p><p>El objetivo de la empresa es determinar la cantidad óptima de trabajo y capital para maximizar sus beneficios, dada la restricción presupuestaria y la función de producción.<strong> Para resolver este problema, utilizamos la biblioteca SciPy que proporciona herramientas para la optimización numérica. </strong></p><p>Dado que el enfoque de este artículo es en la programación no entraremos en los detalles de la microeconomía (Función Cobb Douglas, isocuantas, rendimientos constantes a escala etc). Ten en cuenta que este ejercicio es un ejemplo <em>grosso modo,</em> de las capacidades de SciPy y que pudieramos agregar mucho más.</p><p>En nuestro código tenemos definida la función de producción, la función de beneficios y la restricción presupuestaria en términos matemáticos. Luego utilizamos <strong>la función <code>minimize</code> de SciPy </strong>para encontrar la<em><strong> combinación óptima </strong></em>de trabajo y capital que maximiza los beneficios de la empresa, sujeto a la restricción presupuestaria.</p><p>Finalmente, el código grafica la función de producción para visualizar la combinación óptima de trabajo y capital, y muestra los resultados óptimos de producción, beneficios y los inputs óptimos.</p><h3 id="palabras-finales-y-recomendaciones-">Palabras finales y recomendaciones. </h3><p>Hemos llegado al final de este artículo. Si llegaste hasta aquí, muchísimas gracias por leer. En este artículo hemos cubierto algunas de las aplicaciones de SciPy y NumPy al cálculo scientífico. </p><p>Aún así, esto solo es una pequeña presentación de un campo de aplicación muchísimo más vasto. Aún así, espero haya sido de relevancia y utilidad. </p><p>Quisiera cerrar esta guía con 3 conclusiones/recomendaciones al respecto. Debido a que NumPy es un poco más popular, me centraré más en SciPy:</p><ol><li>SciPy es la biblioteca de Python más utilizada para el análisis científico y matemático además de tener las características de optimización más potentes. A su vez destaca por su facilidad de usar para resolver problemas complejos.</li><li>Si bien hay muchas bibliotecas mucho más populares que SciPy, entre los científicos de datos y profesiones afines; lo cierto es que recomiendo aprender un poco de SciPy, o por lo menos ver algunos proyectos para tener una idea general. En lo personal considero que <strong>esta biblioteca ayuda a desarrollar el planteamiento y resolución de problemas así como el pensamiento sistémico. </strong></li></ol><p>A diferencia de Matplotlib o Pandas, en donde puedes pensar que ya sabes más o menos "cómo hacer lo que quieres hacer";<strong> en SciPy necesitas plantear primero el problema </strong>y después estructurar el código. </p><ol><li>En este artículo se introdujeron SciPy y NumPy juntos, pero no es que sea inseparables o algo por el estilo, la asociación fue por motivos pedagógicos. Lo cierto es que <strong>puedes integrar SciPy y NumPy cada vez que necesites un cálculo específico en tus proyectos</strong>, de hecho muy a menudo tienen el papel de simples "calculadoras" más que de protagonistas. </li></ol><p>En otras palabras; estas bibliotecas no son una especie de "campo de estudio" o algo "exhaustivo" que hay que dominar, aunque ciertamente te pueden facilitar la vida en tu camino hacia la programación.</p><p>Nuevamente, muchas gracias por leer, y si te interesa aprender más acerca del cálculo científico en Python, freeCodeCamp ofrece una <a href="https://www.freecodecamp.org/learn/scientific-computing-with-python/#python-for-everybody">certificación </a>en detalle. Te deseo lo mejor y, ¡Feliz Programación!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
