<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[El Ingeniero Consciente: Taller de Datos]]></title><description><![CDATA[Fundamentos, buenas prácticas y herramientas de Data Engineering, explicados de forma clara  y orientada a producción.]]></description><link>https://newsletter.elingenieroconsciente.com/s/taller-de-datos</link><image><url>https://substackcdn.com/image/fetch/$s_!agH4!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6019fa70-70b8-4304-acec-5e3d075fb041_500x500.png</url><title>El Ingeniero Consciente: Taller de Datos</title><link>https://newsletter.elingenieroconsciente.com/s/taller-de-datos</link></image><generator>Substack</generator><lastBuildDate>Tue, 21 Apr 2026 11:10:10 GMT</lastBuildDate><atom:link href="https://newsletter.elingenieroconsciente.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Elias Velazquez]]></copyright><language><![CDATA[es]]></language><webMaster><![CDATA[elingenieroconsciente@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[elingenieroconsciente@substack.com]]></itunes:email><itunes:name><![CDATA[Elias Velazquez]]></itunes:name></itunes:owner><itunes:author><![CDATA[Elias Velazquez]]></itunes:author><googleplay:owner><![CDATA[elingenieroconsciente@substack.com]]></googleplay:owner><googleplay:email><![CDATA[elingenieroconsciente@substack.com]]></googleplay:email><googleplay:author><![CDATA[Elias Velazquez]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Extracción y Carga de Datos con Python]]></title><description><![CDATA[Una gu&#237;a de librer&#237;as que no vas a querer perderte]]></description><link>https://newsletter.elingenieroconsciente.com/p/extraccion-y-carga-de-datos-con-python</link><guid isPermaLink="false">https://newsletter.elingenieroconsciente.com/p/extraccion-y-carga-de-datos-con-python</guid><pubDate>Fri, 02 Jan 2026 13:02:53 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6DS5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6DS5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png 424w, https://substackcdn.com/image/fetch/$s_!6DS5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png 848w, https://substackcdn.com/image/fetch/$s_!6DS5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png 1272w, https://substackcdn.com/image/fetch/$s_!6DS5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6DS5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png" width="1100" height="220" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:220,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:329767,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://elingenieroconsciente.substack.com/i/182914993?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6DS5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png 424w, https://substackcdn.com/image/fetch/$s_!6DS5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png 848w, https://substackcdn.com/image/fetch/$s_!6DS5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png 1272w, https://substackcdn.com/image/fetch/$s_!6DS5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1746cf53-e1d5-45a2-8940-d6513d17a638_1100x220.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h4>&#161;Bienvenido/a a <em><strong>Taller de Datos</strong></em>!</h4><p>Conceptos de Data Engineering, Python, SQL, Git y herramientas que forman parte de uno de los roles m&#225;s demandados en el ecosistema de datos.</p><div><hr></div><p></p><h2>Introducci&#243;n</h2><p>Python es el lenguaje de facto en data, y obvio que Data Engineering no escapa a esto.</p><p>Antes de pasar a hablar de librer&#237;as sobre extracci&#243;n y carga, hagamos un inventario de conocimientos (si sos nuevo/a en la newsletter, esto te va a servir):</p><ul><li><p><a href="https://elingenieroconsciente.substack.com/i/169392956/que-es-la-ingenieria-de-datos-que-hay-que-aprender">Vimos qu&#233; se espera del Ingeniero/a de Datos</a></p></li><li><p><a href="https://elingenieroconsciente.substack.com/p/conceptos-esenciales-de-python-para">Conocimientos b&#225;sicos de Python para ser competente</a></p></li><li><p><a href="https://elingenieroconsciente.substack.com/i/174577301/como-mover-y-procesar-datos">Lo que es una pipeline</a> y <a href="https://elingenieroconsciente.substack.com/p/etl-vs-elt">la diferencia entre los patrones ETL y ELT</a></p></li><li><p><a href="https://elingenieroconsciente.substack.com/i/178893315/entornos-virtuales-de-python">Y la importancia de utilizar entornos virtuales en nuestros proyectos con Python</a></p></li></ul><p>Ahora se viene lo bueno: <em><strong>&#191;qu&#233; librer&#237;as tenemos disponibles para extraer datos de una fuente y luego cargarlos en el destino elegido?</strong></em></p><p>Hoy te traigo un compendio de las librer&#237;as mas populares y una breve descripci&#243;n de cada una. Ideal si te est&#225;s familiarizando con el rol, ven&#237;s de otro rol como <em>backend</em> y est&#225;s buscando transicionar a Data Engineering o tan solo quer&#233;s profundizar en el ecosistema de Python. Vamos al grano.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="9000" height="4320" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4320,&quot;width&quot;:9000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a neon circle with a snake on it&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a neon circle with a snake on it" title="a neon circle with a snake on it" srcset="https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1690683790356-c1edb75e3df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxweXRob258ZW58MHx8fHwxNzY3MDUzODMyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@brechtcorbeel">Brecht Corbeel</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p></p><h2>Drivers de bases de datos</h2><p>Esta categor&#237;a involucra a todas aquellas librer&#237;as que nos permiten comunicarnos con bases de datos desde Python.</p><p>Podemos entender a un <em>driver</em> como un &#8220;traductor&#8221; que se encarga de facilitarnos la conexi&#243;n con una base de datos, encapsulando y abstrayendo m&#250;ltiples operaciones intermedias para que nosotros podamos concentrarnos &#250;nicamente en <em>qu&#233;</em> queremos decirle a la base de datos objetivo, y no en <em>c&#243;mo</em> hacerlo a bajo nivel.</p><p>Un driver requiere el uso de credenciales de autenticaci&#243;n (por ejemplo, usuario y contrase&#241;a, certificados, llaves privadas para conexiones v&#237;a SSH, entre otros) para crear una conexi&#243;n. Una vez establecida dicha conexi&#243;n &#8212;que en t&#233;rminos pr&#225;cticos suele ser un objeto, es decir, una instancia de una clase provista por la librer&#237;a&#8212; podemos:</p><ul><li><p>ejecutar consultas en SQL puro (<code>CREATE TABLE</code>, <code>DELETE FROM</code>, <code>SELECT</code>, etc.)</p></li><li><p>o interactuar con la base de datos sin escribir SQL directamente, a trav&#233;s de lo que se conoce como un <em><strong>ORM</strong></em> (<em>Object-Relational Mapper</em>)</p></li></ul><p>Independientemente del enfoque que elijamos (SQL directo u ORM), en l&#237;neas generales podremos:</p><ul><li><p>leer datos desde la base de datos (<code>SELECT ...</code>)</p></li><li><p>cargar o modificar datos en la misma (<code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code>, etc.)</p></li></ul><p>Te comparto 4 librer&#237;as que muy probablemente necesites utilizar en alg&#250;n punto de tu carrera:</p><ul><li><p><code>psycopg2</code>: si necesit&#225;s comunicarte con una base de datos <em>PostgreSQL</em>, este ha sido hist&#243;ricamente uno de los conectores m&#225;s utilizados en el ecosistema Python.</p><ul><li><p>Pip: <a href="https://pypi.org/project/psycopg2/#description">https://pypi.org/project/psycopg2/#description</a></p></li><li><p>Docs: <a href="https://www.psycopg.org/docs/">https://www.psycopg.org/docs/</a></p></li><li><p>Nota: investigando esta librer&#237;a al momento de escribir este art&#237;culo, aparece su versi&#243;n m&#225;s moderna bajo el nombre de <code>psycopg</code> (versi&#243;n 3). Seg&#250;n sus creadores, <code>psycopg2</code> queda principalmente para mantenimiento de aplicaciones existentes, mientras que para nuevos proyectos se recomienda comenzar directamente con <code>psycopg</code>. M&#225;s info <a href="https://pypi.org/project/psycopg/">ac&#225;</a>.</p></li></ul></li><li><p><code>sqlite3</code>: integrada nativamente en Python (<code>import sqlite3</code>), por lo que no requiere instalaci&#243;n adicional. Esta librer&#237;a, escrita en C, provee acceso a una base de datos ligera basada en disco (se almacena como un archivo m&#225;s en tu sistema) y que no requiere un servidor dedicado. Es especialmente &#250;til para prototipar aplicaciones o desarrollar soluciones simples que luego pueden migrarse a motores m&#225;s robustos como <em>PostgreSQL</em>, <em>MySQL</em> u <em>Oracle</em>.</p><ul><li><p>Docs: <a href="https://www.sqlite.org/">https://www.sqlite.org/</a></p></li></ul></li><li><p><code>pandas</code>: un verdadero caballito de batalla en el mundo de los datos, y no solo para Ingenieros de Datos. Si bien su foco principal no est&#225; en la extracci&#243;n y carga de datos sino en su <em>manipulaci&#243;n eficiente</em>, ofrece m&#250;ltiples funcionalidades para leer informaci&#243;n desde distintos formatos (CSV, TXT, XLSX, FWF, entre otros), cargarla en memoria mediante estructuras llamadas <em>DataFrames</em>, y luego exportarla nuevamente a archivos o incluso a bases de datos. Internamente, para estas operaciones, <code>pandas</code> se apoya en otros drivers o conectores (por ejemplo, psycopg para PostgreSQL). Como alternativa moderna existe <code>polars</code>, con un prop&#243;sito y una sintaxis muy similares, pero implementado en Rust, lo que le permite destacar en rendimiento y uso de memoria en ciertos escenarios.</p><ul><li><p>Pip: <a href="https://pypi.org/project/pandas/">https://pypi.org/project/pandas/</a></p></li><li><p>Docs: <a href="https://pandas.pydata.org/pandas-docs/stable/">https://pandas.pydata.org/pandas-docs/stable/</a></p></li></ul></li><li><p><code>duckdb</code>: una base de datos anal&#237;tica embebida que puede utilizarse directamente desde Python. Permite ejecutar consultas SQL de forma muy r&#225;pida y eficiente sobre datasets grandes, incluyendo <em>DataFrames</em> de <code>pandas</code>, archivos CSV o formatos columnar como <em>Parquet</em>. No requiere un servidor independiente, lo que la vuelve comparable a <code>sqlite3</code> en cuanto a simplicidad de uso, pero orientada a workloads anal&#237;ticos en lugar de transaccionales.</p><ul><li><p>Pip: <a href="https://pypi.org/project/duckdb/">https://pypi.org/project/duckdb/</a></p></li><li><p>Docs: <a href="https://duckdb.org/docs/stable/clients/python/overview">https://duckdb.org/docs/stable/clients/python/overview</a></p></li></ul></li></ul><h2>SDKs para proveedores Cloud</h2><p>Muchos proveedores de nube p&#250;blica, como <strong>AWS</strong>, <strong>GCP</strong> y <strong>Azure</strong>, cuentan con su propio <strong>SDK</strong> (<em>Software Development Kit</em>) que nos permite interactuar de forma program&#225;tica con los servicios que ofrecen. En otras palabras, podemos crear, modificar y eliminar recursos desde nuestro lenguaje de programaci&#243;n favorito, en lugar de hacerlo exclusivamente a trav&#233;s de la interfaz web.</p><p>En el contexto de <em>pipelines</em> de datos, estos SDK suelen utilizarse para <strong>extraer datos</strong> desde servicios de almacenamiento de objetos como <em>S3</em> (AWS) o <em>Cloud Storage</em> (GCP) y, luego del procesamiento o transformaci&#243;n correspondiente, <strong>cargarlos nuevamente</strong> en el mismo servicio o en otro distinto. Un patr&#243;n com&#250;n es almacenar los datos crudos y los datos procesados en rutas diferentes dentro del mismo bucket (por ejemplo, distintos prefijos en <em>S3</em>), aunque tambi&#233;n es habitual cargar los resultados finales en servicios como <em>RDS</em> (bases de datos gestionadas en AWS) o <em>Azure SQL Database</em>.</p><p>A continuaci&#243;n, un breve repaso de c&#243;mo se organiza el acceso a estos servicios en cada proveedor:</p><ul><li><p><strong>Google Cloud Platform (GCP):</strong> la nube de Google ofrece librer&#237;as espec&#237;ficas por servicio (por ejemplo, almacenamiento, <em>BigQuery</em>, <em>Pub/Sub</em>, etc.). Este enfoque permite instalar &#250;nicamente los clientes necesarios, dando mayor control sobre las dependencias y manteniendo un entorno de desarrollo m&#225;s liviano.</p><ul><li><p>Docs: <a href="https://docs.cloud.google.com/python/docs/reference">https://docs.cloud.google.com/python/docs/reference</a></p></li></ul></li><li><p><strong>Azure:</strong> presenta una estrategia similar a la de GCP. Se eligen una o m&#225;s librer&#237;as en funci&#243;n de los servicios con los que se necesite interactuar, lo que favorece una gesti&#243;n m&#225;s granular de dependencias.</p><ul><li><p>Docs: <a href="https://learn.microsoft.com/en-us/azure/developer/python/sdk/azure-sdk-overview">https://learn.microsoft.com/en-us/azure/developer/python/sdk/azure-sdk-overview</a></p></li></ul></li><li><p><strong>AWS:</strong> Amazon opt&#243; por un enfoque distinto y centraliz&#243; el acceso a sus servicios en <code>boto3</code>, el SDK oficial de AWS para Python. A trav&#233;s de una &#250;nica instalaci&#243;n, es posible interactuar con pr&#225;cticamente todos los servicios de AWS mediante dos abstracciones principales: <code>clients</code> y <code>resources</code>. Ambas permiten realizar operaciones similares, pero con distintos niveles de abstracci&#243;n y ergonom&#237;a. &#191;Te gustar&#237;a que arme una gu&#237;a r&#225;pida para empezar a usar <code>boto3</code>? Hace ya un par de a&#241;os que lo utilizo y, si bien siempre hay algo nuevo por aprender, creo que puedo aportar una buena base pr&#225;ctica. Decime en los comentarios si te interesar&#237;a. &#128522;</p><ul><li><p>Docs: <a href="https://aws.amazon.com/sdk-for-python/">https://aws.amazon.com/sdk-for-python/</a></p></li></ul></li></ul><h2>APIs</h2><p>Muchos sistemas exponen datos mediante APIs. Es por ello que las APIs son consideradas en la lista de <em>source systems</em> (sistemas fuente), lugares desde donde debemos extraer datos para transformaci&#243;n y posterior carga.</p><p>En t&#233;rminos generales, al comunicarnos con una API lo que hacemos es <strong>enviar una petici&#243;n HTTP</strong> (por ejemplo, <code>GET</code>, <code>POST</code>, <code>PUT</code>, etc.), acompa&#241;ada de ciertos par&#225;metros, encabezados y, en algunos casos, un cuerpo (<em>body</em>). Como respuesta, la API nos devuelve los datos solicitados, habitualmente en formatos como JSON o XML.</p><ul><li><p><code>requests</code>: probablemente la librer&#237;a m&#225;s conocida para realizar peticiones HTTP en Python. No es la &#250;nica opci&#243;n disponible, pero s&#237; una de las m&#225;s simples y amigables de usar. Su principal limitaci&#243;n es que no soporta <em>asincronismo</em> de forma nativa, lo cual puede ser una desventaja en escenarios <em>I/O bound</em> (por ejemplo, cuando realizamos muchas llamadas a APIs externas). En serio: investig&#225; sobre <em>concurrencia y paralelismo</em>, porque tarde o temprano lo vas a necesitar en este contexto.</p><ul><li><p>Pip: <a href="https://pypi.org/project/requests/">https://pypi.org/project/requests/</a></p></li><li><p>Docs: <a href="https://requests.readthedocs.io/en/latest/">https://requests.readthedocs.io/en/latest/</a></p></li></ul></li><li><p><code>HTTPX</code>: una librer&#237;a moderna que ofrece soporte tanto sincr&#243;nico como asincr&#243;nico, con una sintaxis muy similar a <code>requests</code>. Hace un uso intensivo de <em>type annotations</em>, una caracter&#237;stica de Python que vale la pena incorporar, ya que mejora la legibilidad del c&#243;digo y facilita el trabajo con herramientas de an&#225;lisis est&#225;tico.</p><ul><li><p>Pip: <a href="https://pypi.org/project/httpx/">https://pypi.org/project/httpx/</a></p></li><li><p>Docs: <a href="https://www.python-httpx.org/">https://www.python-httpx.org/</a></p></li></ul></li><li><p><code>AIOHTTP</code>: una librer&#237;a puramente as&#237;ncrona, orientada a alto rendimiento y muy eficiente en escenarios que requieren alta concurrencia. Trabajar con concurrencia no siempre es sencillo de implementar ni de <em>debuggear</em>, pero es una habilidad clave en sistemas de datos y, en alg&#250;n momento, conviene &#8220;pelearse&#8221; con este tipo de herramientas para entenderlas bien.</p><ul><li><p>Pip: <a href="https://pypi.org/project/aiohttp/">https://pypi.org/project/aiohttp/</a></p></li><li><p>Docs: <a href="https://docs.aiohttp.org/en/stable/">https://docs.aiohttp.org/en/stable/</a></p></li></ul></li></ul><p></p><div><hr></div><p>&#161;Gracias por leer <em>El Ingeniero Consciente</em>! Si te reenviaron este correo o est&#225;s leyendo desde la web, te invito a suscribirte para recibir m&#225;s ediciones y potenciar tu camino IT con una pizca de consciencia y atenci&#243;n plena</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.elingenieroconsciente.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p></p><h2>Archivos</h2><p>Este apartado puede subdividirse en dos grandes grupos: <strong>archivos locales</strong> (los que ten&#233;s en tu computadora o en el filesystem del entorno donde corre tu c&#243;digo) y <strong>archivos que deben extraerse desde o cargarse hacia servidores</strong> que utilizan protocolos como <strong>FTP</strong> y/o <strong>SFTP</strong>.</p><h3>Archivos locales</h3><ul><li><p><code>csv</code>: librer&#237;a est&#225;ndar de Python (es decir, no hace falta instalar nada) para trabajar con archivos separados por comas. Ojo igual: el nombre enga&#241;a, porque el delimitador no siempre es una coma. Muchas veces vas a encontrarte con <code>;</code>, <code>|</code> u otros separadores, as&#237; que no conviene confiarse. Tambi&#233;n es com&#250;n utilizar esta librer&#237;a para leer archivos <code>.txt</code> que sigan una estructura tabular similar.</p><ul><li><p>Docs: <a href="https://docs.python.org/3/library/csv.html#module-csv">https://docs.python.org/3/library/csv.html#module-csv</a></p></li></ul></li><li><p><strong>Excel:</strong> ac&#225; decid&#237; invertir el enfoque y, en lugar de mencionar una sola librer&#237;a, hablar directamente del tipo de archivo. Y es que lidiar con Excel suele ser todo un desaf&#237;o. Los datos rara vez vienen bien organizados (hay gente que los usa como si fuera Canva o Paint&#8230; mejor no profundizar), y si el archivo es grande, pod&#233;s encontrarte con problemas de memoria. A diferencia de otros formatos, los archivos Excel no est&#225;n pensados para ser le&#237;dos de forma verdaderamente <em>streaming</em>, por lo que en muchos casos terminan carg&#225;ndose completos en memoria. Dicho esto, &#191;qu&#233; librer&#237;as existen para lidiar con estos subproductos de Satan&#225;s?</p><ul><li><p><code>openpyxl</code>: una de las librer&#237;as m&#225;s conocidas y confiables para trabajar con archivos Excel en formato moderno (<code>.xlsx</code>, Excel 2010 en adelante). Es una opci&#243;n s&#243;lida para la mayor&#237;a de los casos.</p><ul><li><p>Pip: <a href="https://pypi.org/project/openpyxl/">https://pypi.org/project/openpyxl/</a></p></li><li><p>Docs: <a href="https://openpyxl.readthedocs.io/en/stable/">https://openpyxl.readthedocs.io/en/stable/</a></p></li></ul></li><li><p><code>python-calamine</code>: una alternativa muy r&#225;pida y robusta, especialmente &#250;til cuando la estructura interna del archivo no puede ser interpretada correctamente por <code>openpyxl</code>. Personalmente, me ha salvado m&#225;s de una vez en escenarios complicados.</p><ul><li><p>Pip: <a href="https://pypi.org/project/python-calamine/">https://pypi.org/project/python-calamine/</a></p></li><li><p>Docs: (no pude encontrar docs, asi que si ten&#233;s el link por ah&#237;, avisame y lo coloco ac&#225;)</p></li></ul></li><li><p><code>xlrd</code>: llibrer&#237;a pensada exclusivamente para leer archivos Excel en formato antiguo (<code>.xls</code>). Importante: no sirve para archivos <code>.xlsx</code>. En mi opini&#243;n, hoy en d&#237;a solo la usar&#237;a como <em>failover</em> cuando necesito leer un <code>.xls</code> y las otras alternativas no funcionan o no aplican.</p><ul><li><p>Pip: <a href="https://pypi.org/project/xlrd/">https://pypi.org/project/xlrd/</a></p></li><li><p>Docs: <a href="https://xlrd.readthedocs.io/en/latest/">https://xlrd.readthedocs.io/en/latest/</a></p></li></ul></li></ul></li></ul><blockquote><p><strong>Recomendaci&#243;n:</strong> si vas a lidiar frecuentemente con archivos Excel, <code>pandas</code><strong> puede alivianarte bastante el proceso</strong>. A trav&#233;s de m&#233;todos como <code>read_excel</code>, pod&#233;s importar los datos del archivo directamente a un <em>DataFrame</em>, una estructura en memoria que ofrece muchas abstracciones y utilidades para trabajar con datos tabulares.</p><p>Internamente, <code>pandas</code> se apoya en varias de las librer&#237;as mencionadas anteriormente. Mediante el argumento <code>engine</code> de <code>read_excel</code>, pod&#233;s alternar entre distintos motores de lectura. Esto resulta muy &#250;til para implementar estrategias de <em>fallback</em>: por ejemplo, si <code>openpyxl</code> no logra parsear un archivo, pod&#233;s capturar la excepci&#243;n y volver a intentar usando <code>calamine</code> como motor alternativo.</p></blockquote><p></p><h3>Servidores FTP/SFTP</h3><p>Estos servidores se utilizan t&#237;picamente para <strong>proveer o intercambiar datos con clientes o terceros</strong> fuera de tu compa&#241;&#237;a. Como Data Engineer, es bastante com&#250;n tener que conectarse a este tipo de servidores para <strong>extraer datos de un cliente</strong>, realizar procesos de transformaci&#243;n y limpieza, y luego <strong>devolver el resultado</strong> ya sea en una ruta espec&#237;fica del mismo servidor o carg&#225;ndolo en un <em>data warehouse</em> como <em>Snowflake</em> para su posterior an&#225;lisis.</p><p>Hay varios puntos importantes a tener en cuenta al trabajar con este tipo de servidores:</p><ul><li><p><strong>FTP:</strong> si el protocolo a utilizar es FTP, la conexi&#243;n es relativamente simple, pero <strong>insegura</strong>. Aunque se maneje autenticaci&#243;n mediante usuario y contrase&#241;a, las credenciales y los datos suelen viajar en texto plano, lo cual hace tiempo dej&#243; de ser una opci&#243;n aceptable desde el punto de vista de seguridad.</p><ul><li><p><code>ftplib</code>: librer&#237;a est&#225;ndar de Python (nuevamente, sin necesidad de instalaciones adicionales). Permite automatizar tareas t&#237;picas sobre servidores FTP, como conectarse, listar directorios, descargar archivos y subir resultados procesados.</p><ul><li><p>Docs: <a href="https://docs.python.org/3/library/ftplib.html">https://docs.python.org/3/library/ftplib.html</a></p></li></ul></li></ul></li><li><p><strong>SFTP:</strong> ac&#225; la historia cambia. Este protocolo funciona sobre <strong>SSH</strong>, lo que implica una conexi&#243;n segura, pero tambi&#233;n un manejo m&#225;s cuidadoso de la autenticaci&#243;n. En la pr&#225;ctica, suele requerirse el uso de <strong>llaves p&#250;blicas y privadas</strong>, aunque tambi&#233;n es posible combinar llaves con usuario y contrase&#241;a seg&#250;n la configuraci&#243;n del servidor.</p><ul><li><p><code>paramiko</code>: librer&#237;a que implementa el protocolo <strong>SSHv2</strong> y permite realizar pr&#225;cticamente las mismas operaciones que <code>ftplib</code>, pero sobre una conexi&#243;n segura. Un detalle a tener en cuenta es que <code>paramiko</code> es relativamente <strong>pesada en tama&#241;o</strong>, lo cual puede convertirse en un problema en entornos con l&#237;mites estrictos de despliegue. Por ejemplo, si tu aplicaci&#243;n Python se ejecuta como una funci&#243;n <em>AWS Lambda</em>, es posible que el peso total del paquete supere el l&#237;mite permitido. En esos casos, suele ser necesario recurrir a <em>Lambda Layers</em> u otras estrategias de empaquetado. Si necesit&#225;s ayuda con este contexto de despliegue en particular, escribime &#128521;</p><ul><li><p>Pip: <a href="https://pypi.org/project/paramiko/">https://pypi.org/project/paramiko/</a></p></li><li><p>Docs: <a href="https://www.paramiko.org/">https://www.paramiko.org/</a></p></li></ul></li></ul></li></ul><h2>Lo que quiero que te lleves</h2><p>Como vimos, existen muchas librer&#237;as en Python para extracci&#243;n y carga de datos. El truco es elegir la herramienta adecuada para la situaci&#243;n correcta.</p><p>Adem&#225;s, est&#225; bueno saber que Python de por s&#237; viene equipado con librer&#237;as para distintos escenarios, por lo que salir corriendo a instalar librer&#237;as de terceros no siempre tiene que ser la mejor alternativa.</p><p>&#191;Crees que falta alguna librer&#237;a para agregar? &#191;Hay algo que deber&#237;a corregir? Avisame en los comentarios, siempre estoy atento a cualquier feedback que puedan darme. La idea no es demostrar qui&#233;n sabe m&#225;s, <em><strong>sino llegar a las conclusiones correctas mediante informaci&#243;n precisa</strong></em>.</p><p>En la pr&#243;xima edici&#243;n de <em><strong>Taller de Datos</strong></em>, vamos a charlar sobre c&#243;mo abordar el <strong>proceso de transformaci&#243;n</strong> de datos en Python a trav&#233;s de librer&#237;as.</p><p>PD: te odio Excel.</p><p></p><h3></h3>]]></content:encoded></item></channel></rss>