Distancia Hamming: Concepto y Cálculo en Python.

Destacado

La distancia Hamming es una métrica fundamental en teoría de la información y ciencias de la computación, que mide la diferencia entre dos cadenas de caracteres de igual longitud. Específicamente, la distancia Hamming se define como el número de posiciones en las que los correspondientes símbolos son diferentes. Esta métrica tiene diversas aplicaciones en campos tales como la detección y corrección de errores, genética (por ejemplo, para medir diferencias en secuencias genéticas), criptografía (por ejemplo en la comparación de claves) y en el procesamiento de señales.

Dicha distancia entre dos cadenas A y B de la misma longitud se calcula contando el número de posiciones en las que los caracteres correspondientes difieren. Por ejemplo, consideremos las siguientes dos cadenas binarias:

En este caso, la distancia Hamming entre A y B será de 2, ya que las cadenas difieren en las posiciones 2 y 4.

CALCULANDO DISTANCIA HAMMING EN PYTHON:

A continuación, vamos a ver como podemos efectuar el calculo de esta distancia usando Python. Para ello nos valdremos de una función que realice un recorrido por ambas cadenas usando un bucle ‘for‘:

En este prime ejemplo hemos utilizado una función (a la que hemos llamado ‘hamming_distance()‘) que tomando como argumentos las dos cadenas a comparar, empieza verificando si ambas tienen la misma longitud de modo que de no ser así, lanzará un error. Tras esta primera comprobación, inicializa una variable (‘distance‘) a 0 y recorre ambas cadenas (mediante el bucle ‘for‘) en paralelo usando la función ‘zip()‘, comparando cada par de caracteres correspondientes. De modo que si los caracteres son diferentes, incrementará la variable ‘distance‘ en 1. Al finalizar el bucle, el valor de ‘distance‘ representará la cantidad de posiciones en las que las cadenas difieren, es decir, la distancia Hamming entre las dos cadenas.

OUTPUT:

A su vez podemos utilizar las compresión de listas (de las que ya hemos hablado en alguna ocasión) para ahorrar algunas líneas de código, obteniendo el mismo resultado:

La principal diferencia con el caso anterior estriba en el uso de la función ‘sum()‘. Dentro de la cual, se utiliza una expresión para recorrer las cadenas en paralelo con (usando nuevamente ‘zip()‘), comparando cada par de caracteres correspondientes. De modo que la expresión generadora producirá True (equivalente a 1) cada vez que los caracteres son diferentes y False (equivalente a 0) cuando sean iguales. Así, la función ‘sum()‘ sumará estos valores booleanos, proporcionando directamente la cantidad de posiciones en las que las cadenas difieren, es decir, la distancia Hamming. Tal y como hemos señalado, este método es más conciso y utiliza menos líneas de código.

Un modo aún mas directo que el anterior es el basado en el uso de la función ‘hamming()‘ de la librería externa ‘scipy‘, la cual, también a sido objeto de estudio en artículos anteriores:

En este caso los que hacemos es convertir las cadenas en listas de caracteres (con la función ‘list()‘) incluyendo las listas creadas como argumentos de la función ‘hamming()‘ de ‘scipy.spatial.distance‘ para calcular la distancia Hamming normalizada (es decir, la proporción de posiciones diferentes). Dado que esta función devuelve un valor entre 0 y 1, multiplicaremos por la longitud de las cadenas para obtener la distancia Hamming real. Este enfoque es eficiente y reduce la cantidad de código necesario, aprovechando las capacidades de una biblioteca científica bien establecida.

OUTPUT:

CONCLUSION:

En conclusión, la distancia Hamming proporciona una forma simple y efectiva de medir diferencias entre cadenas de igual longitud. Python ofrece múltiples métodos para calcularla, desde bucles básicos hasta el uso de bibliotecas especializadas como scipy. Esta versatilidad y simplicidad de implementación hacen que la distancia Hamming sea ampliamente utilizada en numerosos campos científicos y técnicos.

Saludos.

EFECTUANDO CONVERSIONES DE MONEDA UTILIZANDO ‘forex-python’.

Destacado

Hace algunas semanas estuvimos viendo el modo en que podíamos crear una calculadora de divisas mediante la obtención del cambio actual de moneda a través de ‘yfinance‘. En el día de hoy os mostramos otro sistema para realizar conversiones de moneda de un modo más sencillo y directo, en el que solamente haremos uso de la librería ‘forex-python‘. Una herramienta útil para trabajar con tasas de cambio y conversiones entre diferentes monedas en Python, y que instalaremos en nuestro sistema mediante ‘pip‘:

Una vez instalada la librería podemos empezar a experimentar con ella. Para ello comenzaremos importando la clase ‘CurrencyRates‘ para a continuación crear una instancia de la misma:

A continuación podemos empezar a hacer uso de los métodos de la clase. Por ejemplo podemos empezar obteniendo la tasa de cambio de una moneda (por ejemplo el Dolar estadounidense ‘USD’) con respecto a otras principales. Para ello emplearemos la función ‘get_rates()‘ que tomará por argumento la moneda en cuestión:

Obtenemos de este modo un diccionario en el que se muestra la tasa de cambio del Dolar frente a otras monedas internacionales como el Euro (‘EUR’), Yen japonés (‘JPY’), Libra inglesa (‘GBP’)…etc.

Por su parte, también podemos acceder a la tasa de cambio de la moneda de referencia frente a otra de modo individual, con ‘get_rate()‘. En este caso introduciremos como argumentos la moneda de referencia y aquella frente a la que queremos obtener dicha tasa de cambio:

A su vez, podemos utilizar la función ‘convert()‘ para cambios entre monedas manejando cantidades de un modo bien sencillo. De ese modo, supongamos que queremos saber a cuantos Dolares canadienses (‘CAD‘) equivalen 100 Dolares estadouinidenses (‘USD’). En esta ocasión introduciremos como tercer argumento, dicha cifra. Como se ve en el ejemplo, aplicaremos a la salida un redondeo de 2 decimales (como hicimos también en el ejemplo anterior):

No obstante, cuando presentamos resultados de conversión entre monedas, puede resultar de interés mostrar el símbolo de la moneda en cuestión. Para ello deberemos importar la clase ‘CurrencyCodes‘ creando la pertinente instancia a continuación. Tras lo cual, utilizaremos el método ‘get_symbol()‘ pasando como argumento la moneda cuyo símbolo queremos obtener (en nuestro caso, el de la Libra inglesa ‘GBP’)

La obtención de los correspondientes símbolos de moneda nos permitirá mejorar el modo en que se presenta el resultado de la conversión:

Finalmente hacer alusión a la posibilidad de realizar conversiones de diferentes monedas y a monedas digitales como es el Bitcoin:

CONCLUSION:

La biblioteca ‘forex-python‘ es una herramienta poderosa y fácil de usar para trabajar con conversiones de divisas y tasas de cambio en Python. Con su capacidad para realizar conversiones precisas y obtener tasas de cambio actualizadas, es una opción invaluable para desarrolladores que trabajan en aplicaciones financieras, comerciales y de comercio electrónico. Esperamos que este artículo haya proporcionado una introducción útil al mundo de las conversiones de divisas. ¡Ahora es tu turno de explorar y experimentar con esta potente biblioteca!

Saludos.

ANALISIS TECNICO EN PYTHON, CON ‘PANDAS_TA’.

Destacado

Cuando se trata de análisis financiero, el análisis técnico es una herramienta crucial para comprender el comportamiento de los precios de los activos financieros en el mercado. Python, con su ecosistema de bibliotecas de análisis de datos, ofrece una amplia gama de herramientas para llevar a cabo análisis técnico de manera eficiente. Una de estas bibliotecas es ‘pandas_ta‘, una extensión de la popular biblioteca ‘pandas‘, que proporciona una amplia variedad de indicadores técnicos listos para usar y que instalaremos en nuestro sistema con el comando ‘pip‘:

Tal y como hemos señalado, ‘pandas_ta‘ es una biblioteca de análisis técnico escrita en Python que amplía las capacidades de la biblioteca pandas. Proporcionando una amplia gama de indicadores técnicos comúnmente utilizados en el análisis financiero. Lo cual permite a los usuarios realizar análisis técnico de datos financieros de manera rápida y sencilla. Entre dichos indicadores podemos encontrar los siguientes:

  • Medias móviles (SMA, EMA, WMA, etc.)
  • Bandas de Bollinger
  • Índice de Fuerza Relativa (RSI)
  • MACD (Convergencia/Divergencia de Medias Móviles)
  • Estocástico
  • ATR (Rango Promedio Verdadero)

ALGUNOS EJEMPLOS:

Una vez dadas unas breves pinceladas acerca de en que consiste ‘pandas_ta‘, pasaremos a continuación a mostrar algunos sencillos ejemplos de uso. Dado que en este blog nos gusta utilizar datos reales para nuestros ejemplos, vamos a aplicar estos sobre los datos de cierre de una compañía (Apple en este caso) para el pasado año 2023. Para la obtención de dichos datos, vamos a valernos de otra librería ‘yfinance‘ (de la que ya hemos hablado en ocasiones anteriores) la cual importaremos junto a ‘pandas_ta‘:

OUTPUT:

Una vez obtenidos los datos para el periodo de tiempo deseado, pasaremos a calcular algunos indicadores de interés utilizando ‘pandas_ta‘:

1) MEDIA MOVIL SIMPLE Y EXPONENCIAL (SMA Y EMA):

Con la media móvil simple calculamos el promedio de los precios de cierre durante un período específico. Es útil para suavizar la tendencia general de los datos de precios y para identificar posibles puntos de entrada o salida basados en los cruces de estas. Para ello utilizaremos la función «sma()» la información sobre la que queremos calcularla y la ventana de tiempo que queramos usar:

Igualmente podemos calcular la media móvil exponencial (la cual es semejante a la media móvil simple, solo que dando mayor peso a los valores más recientes) de nuestra serie temporal, mediante la función ‘ema()‘ determinando igualmente la ventana de tiempo antes referida:

2) BANDAS DE BOLLINGER:

Estas consisten en una banda central (media móvil simple) y dos bandas exteriores que se colocan a una cierta distancia (generalmente dos desviaciones estándar) de la central. Son útiles para identificar la volatilidad del mercado y posibles puntos de reversión. Su calculo para nuestra serie temporal de precios de cierre, la obtendremos mediante la función ‘bbands()‘:

Como se ve, la función devuelve un dataframe con la siguiente información por columnas:

  • BBL_5_2.0: Banda Baja de las Bandas de Bollinger con una ventana de 5 periodos y un ancho de banda de 2.0 desviaciones estándar.
  • BBM_5_2.0: Banda Media de las Bandas de Bollinger con una ventana de 5 periodos y un ancho de banda de 2.0 desviaciones estándar.
  • BBU_5_2.0: Banda Alta de las Bandas de Bollinger con una ventana de 5 periodos y un ancho de banda de 2.0 desviaciones estándar.
  • BBB_5_2.0: Ancho de Banda de las Bandas de Bollinger con una ventana de 5 periodos y un ancho de banda de 2.0 desviaciones estándar.
  • BBP_5_2.0: Porcentaje de Banda de las Bandas de Bollinger con una ventana de 5 periodos y un ancho de banda de 2.0 desviaciones estándar.

3) INDICE DE FUERZA RELATIVA (RSI):

Otro indicador interesante es el RSI. Este es un indicador de momentum que oscila entre 0 y 100. Se utiliza para medir la velocidad y el cambio de los movimientos de precios. Un RSI por encima de 70 generalmente se considera sobrecompra, mientras que un RSI por debajo de 30 se considera sobrevendido. Su computo con ‘pandas_ta‘ lo llevaremos a cabo mediante la función ‘rsi()‘ determinando, una vez más, la correspondiente ventana temporal:

4) OSCILADOR ESTOCASTICO:

Este indicador compara el precio de cierre actual con el rango entre el máximo más alto y el mínimo más bajo durante un período de tiempo específico. Se utiliza para identificar condiciones de sobrecompra o sobreventa en el mercado. Un estocástico por encima de 80 generalmente se considera sobrecompra, mientras que un estocástico por debajo de 20 se considera sobrevendido. Esto último lo obtendremos mediante la función ‘stock()’ a la que pasaremos los valores máximos (‘High’), mínimos (‘Low’) y de cierre (‘Close’), especificando igualmente la ventana de tiempo:

CONCLUSIÓN:

Tal y como hemos visto, ‘pandas_ta‘ es una herramienta poderosa y versátil para realizar análisis técnico en Python. Con su amplia gama de indicadores técnicos (de los que solo hemos visto una pequeña muestra) y su integración perfecta con pandas, es una opción excelente para los analistas financieros y los traders que desean llevar a cabo análisis técnico de manera eficiente y efectiva.

Saludos.

ESQUELETIZADO DE IMAGENES CON PYTHON Y SCIKIT-IMAGE.

Destacado

El procesamiento de imágenes es una disciplina fascinante que abarca una amplia gama de técnicas para manipular imágenes digitales con el fin de mejorar su calidad, extraer información relevante o realizar tareas específicas. Una de estas técnicas es el esqueletizado de imágenes, que tiene aplicaciones en diversas áreas, como visión por computadora, reconocimiento de patrones, análisis de formas y más. Concretamente consiste en un proceso en el que se reduce una forma binaria a su representación más esquemática, manteniendo la topología de la forma original. Esencialmente, el esqueleto de una imagen representa la «columna vertebral» de la forma, conservando su estructura esencial. Esta técnica es útil para simplificar la representación de formas y facilitar la extracción de características relevantes.

En este artículo, exploraremos en detalle la utilidad del esqueletizado de imágenes y cómo se implementa en Python utilizando la biblioteca ‘scikit-image‘ la cual deberemos instalar previamente en nuestro sistema con ‘pip install scikit-image‘:

IMPLEMENTACION EN PYTHON:

La mencionada biblioteca ‘scikit-image‘ proporciona una implementación eficiente y fácil de usar del esqueletizado de imágenes a través de la función skeletonize. Esta función toma una imagen binaria como entrada y devuelve el esqueleto de la forma representado como una matriz binaria. A continuación, veremos un ejemplo de cómo implementar el esqueletizado de imágenes en Python utilizando dicha librería aplicada a la siguiente imagen:

Así el primer paso que deberemos dar es naturalmente el de importar las librerías y recursos a utilizar y proceder al cargado y lectura de la imagen en cuestión con ‘OpenCV‘. En este punto usaremos la función ‘imread()‘ pasándole como primer argumento, la ruta a la imagen en cuestión y como segundo argumento, el valor 0, con lo que estaremos indicando que queremos cargarla en escala de grises:

Hecho esto y teniendo en cuenta que la operación que queremos realizar, ha de efectuarse sobre una imagen binaria, el siguiente paso será realizar dicha conversión mediante la aplicación de los correspondientes umbrales. En ocasiones puede ser útil la aplicación de inversión sobre la misma. Usándose en este caso la función ‘bitwise_not()‘:

Una vez realizados estos pasos previos, llevaremos a cabo la operación de esqueletización con ‘scikit-image‘ y su función ‘skeletonize()‘:

Finalmente mostraremos el resultado final, junto al original en gris y su versión binaria invertida, utilizando la función para visualizar fotos de ‘OpenCV‘, ‘imshow()‘:

OUTPUT:

CONCLUSION:

El esqueletizado de imágenes es una técnica poderosa en el campo del procesamiento de imágenes, con aplicaciones en diversas áreas como análisis de formas, extracción de características, reconocimiento de patrones y más. La implementación de esta técnica en Python utilizando la biblioteca ‘scikit-image‘ proporciona una forma eficiente y flexible de realizar operaciones de esqueletizado en imágenes digitales. Al comprender la utilidad y la implementación del esqueletizado de imágenes, los practicantes de procesamiento de imágenes pueden aprovechar esta técnica para una variedad de aplicaciones prácticas y proyectos de visión por computadora.

Saludos.

NUEVAS PRACTICAS CON ARREGLOS, USANDO NUMPY.

Destacado

NumPy‘ es una biblioteca fundamental en el ecosistema de Python para computación numérica y manipulación de datos. Aunque muchos usuarios están familiarizados con las operaciones básicas proporcionadas por esta librería, tales como la creación de matrices y la realización de operaciones elementales, hay una serie de técnicas avanzadas que pueden llevar nuestra experiencia con NumPy al siguiente nivel. En este artículo, exploraremos algunas de estas técnicas para aprovechar al máximo NumPy en nuestros proyectos de análisis de datos y computación científica.

1) INDEXACIÓN AVANZADA:

NumPy permite la indexación avanzada, lo que significa que podemos seleccionar elementos de una matriz utilizando una variedad de métodos más allá de la indexación básica. Por ejemplo, nos permite utilizar arreglos de índices, arreglos booleanos o incluso funciones para seleccionar elementos de una matriz. Esto proporciona una gran flexibilidad y poder para manipular datos de manera eficiente:

OUTPUT:

2) BROADCASTING:

El broadcasting es una técnica de gran efectividad en NumPy que nos permite realizar operaciones entre matrices de diferentes formas y tamaños de manera eficiente. Esto significa que podremos realizar operaciones entre matrices que no son del mismo tamaño sin tener que crear copias adicionales de los datos. Por ejemplo, podemos sumar un vector a cada fila de una matriz sin necesidad de expandir el vector a la forma de la matriz:

OUTPUT:

3) FUNCIONES UNIVERSALES:

Las Funciones Universales (ufuncs) en NumPy son funciones que operan elemento por elemento en matrices generadas por esta librería, permitiendo realizar operaciones matemáticas y de manipulación de datos de manera eficiente. Estas funciones están diseñadas para aplicarse a matrices completas sin la necesidad de utilizar bucles explícitos en Python, lo que las hace extremadamente rápidas y eficientes. Las ufuncs abarcan una amplia gama de operaciones, desde funciones matemáticas básicas como suma, resta y multiplicación, hasta operaciones más complejas como exponenciación, trigonometría y manipulación de matrices. Gracias a su implementación en código C, las ufuncs de NumPy son esenciales para el procesamiento eficiente de grandes conjuntos de datos en el análisis de datos y la computación científica.

NumPy proporciona una amplia gama de funciones ufuncs para realizar una variedad de operaciones matemáticas y de manipulación de datos. Algunas de las más comunes son las siguientes:

  • np.sin(): Calcula el seno de cada elemento de la matriz.
  • np.cos(): Calcula el coseno de cada elemento de la matriz.
  • np.exp(): Calcula la exponencial de cada elemento de la matriz.
  • np.log(): Calcula el logaritmo natural de cada elemento de la matriz.
  • np.sqrt(): Calcula la raíz cuadrada de cada elemento de la matriz.
  • np.abs(): Calcula el valor absoluto de cada elemento de la matriz.

Veamos un sencillo ejemplo:

OUTPUT:

Igualmente podemos utilizar esta técnica, definiendo nuestras propias funciones a aplicar a cada elemento de la matriz. Para ello utilizaremos la función ‘np.frompyfunc()‘:

En este código, definimos una función de Python llamada ‘mi_funcion()‘ que toma un único argumento ‘x‘ y devuelve el resultado de calcular ‘x ** 2 + 2 * x + 1‘. Luego, utilizamos la función ‘np.frompyfunc()‘ para convertir esta función de Python en una función universal (ufunc) que aplicaremos a cada elemento de ‘matriz‘. Por su parte, la llamada a ‘np.frompyfunc(mi_funcion, 1, 1)‘ especifica que la función ‘mi_funcion()‘ toma un argumento y devuelve un único resultado. El resultado es una nueva matriz que contiene los valores resultantes de aplicar nuestra función ‘mi_funcion()‘ a cada elemento de la matriz original:

OUTPUT:

4) OPTIMIZACIÓN DE RENDIMIENTO:

En aquellos casos en los que estemos trabajando con conjuntos de datos muy grandes, es posible que necesitemos optimizar el rendimiento de nuestro código para garantizar tiempos de ejecución rápidos. NumPy proporciona varias técnicas de optimización de rendimiento, como el uso de operaciones vectorizadas, el uso de vistas en lugar de copias y el uso de tipos de datos específicos para reducir el uso de memoria y mejorar la velocidad de cálculo:

OUTPUT:

CONCLUSIÓN:

NumPy es una herramienta poderosa y versátil para el análisis de datos y la computación científica en Python. Con estas técnicas avanzadas, podremos aprovechar al máximo las capacidades de NumPy y mejorar el rendimiento y la eficiencia de nuestro código. Experimenta con estas técnicas en tus proyectos y descubre cómo pueden llevar tu experiencia con NumPy al siguiente nivel.

Saludos.

VISUALIZACIÓN DE SEÑALES DE AUDIO EN PYTHON CON ‘Matplotlib’ Y ‘librosa’.

Destacado

El procesamiento digital de señales de audio es un campo emocionante que abarca una amplia gama de aplicaciones, desde la música y el entretenimiento hasta la comunicación y la ingeniería de audio. Con Python y algunas bibliotecas especializadas, como ‘NumPy‘ y ‘librosa‘, podemos realizar una variedad de tareas de procesamiento de señales de audio de manera efectiva. En este artículo, expondremos algunos ejemplos de cómo podemos utilizar Python para trabajar con señales de audio y realizar tareas como carga, visualización y análisis de dichas señales, ayudándonos de las librerías ‘Matplotlib‘ (de la que ya hemos hablado en repetidas ocasiones) y ‘librosa‘. La cual deberemos instalar previamente en nuestro sistema:

CARGA Y VISUALIZACIÓN DE SEÑALES DE AUDIO:

El primer paso para trabajar con señales de audio en Python es cargarlas desde archivos de audio. Con la biblioteca ‘librosa‘, podemos cargar fácilmente archivos de audio en matrices ‘NumPy‘ para su manipulación posterior. Veamos un ejemplo:

Este código carga un archivo de audio llamado «guitar2.wav» y visualiza su forma de onda utilizando la librería ‘Matplotlib‘. La forma de onda muestra la amplitud de la señal de audio en función del tiempo, lo que nos permite visualizar la señal de audio en dicho dominio.

OUTPUT:

ANALISIS DE LA SEÑAL DE AUDIO:

Una vez que hemos cargado una señal de audio, podemos realizar una variedad de análisis para extraer información útil de dicha señal. Por ejemplo, podemos calcular y visualizar su correspondiente espectrograma, lo cual, nos mostrará el modo en que varía la energía de la señal en diferentes frecuencias a lo largo del tiempo:

Este código calcula el espectrograma de la señal de audio y lo visualiza utilizando nuevamente ‘Matplotlib‘. Aquí, el espectrograma muestra la energía de la señal en diferentes frecuencias a lo largo del tiempo, lo que nos permite identificar características importantes en la señal, como tonos y patrones de sonido.

OUTPUT:

A la representación anterior, podemos, también, añadir las líneas de beat que indican la ubicación de los beats o pulsos rítmicos en la señal de audio. Aquí, los marcadores de beat se mostrarán como líneas verticales discontinuas en la forma de onda de la señal de audio:

OUTPUT:

Un tipo especial de espectrograma que también podemos obtener es el conocido como Espectrograma de Mel, el cual también muestra la variación de energía de una señal de audio en el tiempo y en diferentes bandas de frecuencia, pero con una representación más adaptada a la percepción auditiva humana:

OUTPUT:

Otra representación que puede ser de gran utilidad para el análisis de la señal es el cromagrama, el cual puede proporcionar información valiosa sobre la estructura armónica y rítmica de la señal de audio:

OUTPUT:

CONCLUSIÓN:

Python proporciona una amplia variedad de herramientas y bibliotecas para trabajar con señales de audio de manera efectiva. En este artículo, exploramos cómo podemos cargar, visualizar y analizar señales de audio utilizando Python y librerías como ‘librosa‘ y ‘Matplotlib‘. Al comprender estas técnicas, podemos realizar una amplia gama de tareas de procesamiento de señales de audio y explorar nuevos enfoques para trabajar con datos de audio en nuestros proyectos.

Saludos.

BREVE INTRODUCCIÓN A LOS OPERADORES ‘BIT A BIT’ EN PYTHON.

Destacado

Saludos y bienvenidos una semana más a vuestro blog sobre programación En Python, en una ocasión en las que nos disponemos a realizar un primer acercamiento a los llamados operadores ‘bit a bit’, los cuales, a pesar de ser menos comunes que los operadores aritméticos o lógicos, pueden ser muy útiles en ciertos contextos, especialmente cuando se trabaja con manipulación de bits, codificación de datos o algoritmos de bajo nivel. En este artículo, exploraremos los operadores bit a bit en Python, cómo funcionan y cómo se pueden aplicar en diferentes situaciones.

QUE SON LOS OPERADORES BIT A BIT:

Hemos de empezar diciendo que estos operadores presentan la particularidad de actuar sobre los bits individuales de las representaciones binarias de los valores numéricos. A diferencia de lo que sucede con los operadores aritméticos y lógicos a los que estamos más acostumbrados, en la que las operaciones se realizan sobre los valores completos. En Python tenemos 6 operadores ‘bit a bit’, que listamos a continuación:

  • & : AND bit a bit
  • | : OR bit a bit
  • ^ : XOR bit a bit
  • ~ : Complemento bit a bit (NOT)
  • << : Desplazamiento a la izquierda
  • >> : Desplazamiento a la derecha

A continuación veremos un ejemplo en código Python del uso de cada uno de ellos.

EJEMPLOS EN PYTHON:

AND Bit a Bit (&): Este operador toma dos números y realiza una operación AND bit a bit en cada par de bits correspondientes. El resultado será 1 si ambos bits son 1, de lo contrario, será 0:

OR Bit a Bit (|): Este operador realiza una operación OR bit a bit en cada par de bits correspondientes. El resultado será 1 si al menos uno de los bits es 1:

XOR Bit a Bit (^): Este operador realiza una operación XOR bit a bit en cada par de bits correspondientes. Donde el resultado será 1 si los bits son diferentes, de lo contrario, será 0:

Complemento Bit a Bit (~): Este operador realiza una negación bit a bit, es decir, invierte todos los bits de un número:

Desplazamiento a la Izquierda (<<) y Desplazamiento a la Derecha (>>): Estos operadores desplazan los bits hacia la izquierda o hacia la derecha, respectivamente, en el número dado. Los bits que se desplazan más allá de los límites del número se pierden. En este caso, también especificaremos el número de posiciones en el que deberán desplazarse los bits:

USOS:

Los operadores bit a bit en Python y otros lenguajes de programación son herramientas versátiles con una amplia gama de aplicaciones. Desde la manipulación eficiente de datos hasta la optimización de algoritmos, estos operadores ofrecen diversas utilidades. Por ejemplo, en el campo de la criptografía, se pueden usar para implementar algoritmos de cifrado y descifrado, donde el procesamiento a nivel de bits es esencial para garantizar la seguridad de los datos. En la compresión de datos, los operadores bit a bit permiten la implementación de algoritmos de compresión eficientes, como la codificación de longitud de ejecución (RLE) o la codificación Huffman, que buscan reducir el tamaño de los archivos mediante la manipulación precisa de los bits. Además, en la programación de dispositivos embebidos y sistemas de bajo nivel, los operadores bit a bit son fundamentales para el control y la comunicación con hardware específico, donde cada bit puede representar un estado o una configuración particular. En resumen, los operadores bit a bit son una herramienta poderosa y fundamental en la caja de herramientas de cualquier programador, ofreciendo soluciones eficientes para una amplia variedad de problemas y escenarios de programación.

CONCLUSIÓN:

Para terminar, los operadores ‘bit a bit‘ son una herramienta de gran utilidad para manipular datos a nivel de bits en Python. Al comprender cómo funcionan estos operadores y cómo se aplican, los programadores pueden escribir código más eficiente y efectivo para una gran variedad de aplicaciones. Si bien pueden parecer menos comunes en comparación con otros operadores más tradicionales, su utilidad en ciertos dominios no debe subestimarse.

Saludos.

TRADUCIENDO TEXTO EN PYTHON, CON ‘translate’.

Destacado

La traducción de texto es una tarea común en muchas aplicaciones de procesamiento de lenguaje natural y análisis de datos. Python ofrece una variedad de bibliotecas para realizar esta tarea, y una de las opciones más efectivas es la biblioteca ‘translate‘. En este artículo, exploraremos cómo usar dicha librería para traducir texto de un idioma a otro de manera rápida y sencilla.

INTRODUCCIÓN E INSTALACIÓN.

La librería ‘translate‘ es una envoltura simple y elegante alrededor de varios servicios de traducción en línea, como ‘Google Translate‘, ‘Microsoft Translator‘, ‘Yandex Translate‘ y otros que permite a los desarrolladores integrar fácilmente capacidades de traducción en sus aplicaciones de Python con solo unas pocas líneas de código.

Para comenzar a usar la biblioteca ‘translate‘, primero debemos instalarla. Esto se puede hacer fácilmente a través de pip, el gestor de paquetes de Python. Ejecute el siguiente comando en su terminal o símbolo del sistema:

Una vez instalada, podemos comenzar a utilizar la biblioteca en nuestros proyectos de Python.

USO BÁSICO:

A continuación mostraremos un ejemplo básico y muy sencillo que muestra cómo usar ‘translate‘ para traducir texto de inglés a español:

OUTPUT:

Como puede verse facilmente, en este ejemplo, creamos un objeto traductor especificando el idioma al que queremos traducir (en este caso, español) para luego proporcionarle el texto que queremos traducir llamando al método ‘translate()‘ del objeto traductor para realizar la traducción. Finalmente, usaremos ‘print()’ para mostrar el texto traducido.

TRADUCCIÓN ENTRE DIFERENTES IDIOMAS:

Hay que señalar también que la librería ‘translate‘ es muy flexible permitiéndonos traducir texto entre una amplia variedad de idiomas. Podemos especificar tanto el idioma de origen como el idioma de destino al crear el objeto traductor usando las variables ‘from_lang‘ y ‘to_lang‘ respectivamente. Veamos un ejemplo de traducción del español al francés:

OUTPUT:

CONCLUSIÓN:

La librería ‘translate‘ es una herramienta fácil de usar y extremadamente útil para agregar capacidades de traducción a sus proyectos de Python. Con su amplio soporte para diferentes servicios de traducción en línea y una API simple e intuitiva, es una opción excelente para cualquier aplicación que requiera traducción de texto. Experimenta con diferentes idiomas y servicios de traducción para encontrar la combinación que mejor se adapte a tus necesidades.

Saludos.

TRABAJANDO CON ARCHIVOS EXCEL CON PYTHON Y ‘openpyxl’.

Destacado

Saludos y bienvenidos una semana más a vuestro blog sobre programación en lenguaje Python: En el día de hoy os presentamos ‘openpyxl‘. Una librería para Python que nos permitirá trabajar con archivos excel (‘xlsx‘) de un modo cómodo y sencillo que instalaremos en nuestro equipo usando el comando ‘pip’:

Una vez instalada, lo primero que haremos será crear nuestro primer libro mediante la selección de la hoja activa:

Estas líneas generarán un nuevo archivo excel, en el directorio en el que estemos trabajando, con el nombre que hayamos pasado como argumento de la función ‘save()‘. En nuestro caso ‘mi_libro.xlsx‘):

Ahora que tenemos creado nuestro primer archivo excel, podemos empezar a introducir alguna información en el. En este punto podemos empezar introduciendo datos en sus celdas, lo cual, podemos hacer de dos maneras: O bien introduciendo directamente la referencia a la celda en cuestión, o bien indicando numéricamente su posición por fila y columna:

A su vez, mientras estemos trabajando con nuestro excel, siempre tendremos la posibilidad de acceder desde nuestro código a la información ya introducida: Para esto podremos utilizar las dos modalidades de referencia a las celdas que vimos a la hora de escribir:

Otra interesante posibilidad es la de poder aplicar un formato determinado a una celda. Cosa que haremos con ‘.font‘ antes de guardar los cambios realizados:

Una vez que hayamos guardado los cambios (con la función ‘save()‘ ya vista) podremos comprobar como en nuestro archivo excel, se encuentra la información que hemos ido introduciendo:

Pero continuemos trabajando sobre nuestro archivo. Para ello deberemos acceder a el nuevamente usando el método ‘load_workbook()‘ para a continuación agregar una formula a la celda ‘C1‘:

A su vez, podemos proceder a la creación de una nueva hoja para nuestro documento excel (mediante la función ‘create_sheet()’) y utilizar un bucle ‘for‘ para copiar los datos de nuestra primera hoja a la nueva para finalmente guardar los cambios antes de poder abrirlo para ver su contenido:

CONCLUSION:

En conclusión, la biblioteca ‘openpyxl‘ de Python emerge como una herramienta esencial para manipular hojas de cálculo Excel de manera eficiente y programática. Su interfaz amigable y su amplia gama de funciones permiten a los desarrolladores trabajar con documentos Excel de una manera intuitiva, desde la creación de libros y hojas hasta la modificación y formateo de celdas. La capacidad de leer y escribir en archivos Excel, así como la compatibilidad con características avanzadas, como gráficos y formatos condicionales, hacen que ‘openpyxl‘ sea una elección de gran utilidad para aquellos que buscan automatizar tareas relacionadas con hojas de cálculo en Python. Además, la comunidad activa y el continuo desarrollo respaldan su fiabilidad y versatilidad, consolidando ‘openpyxl‘ como una herramienta valiosa para profesionales y entusiastas que desean incorporar la manipulación de Excel en sus proyectos.

Saludos.

ALGORITMOS DE ORDENACIÓN EN PYTHON: ORDENACIÓN POR ARBOL BINARIO DE BUSQUEDA.

Destacado

Continuamos hoy con nuestra serie de artículos acerca de los principales algoritmos existentes para la ordenación de elementos de una lista y su implementación usando el lenguaje Python. En la presente ocasión hablaremos de la ordenación por ‘Arbol Binario de Busqueda‘ (‘BST‘ por sus siglas en inglés), donde combinaremos la estructura de árbol binario con la propiedad de búsqueda de datos, ofreciendo un enfoque efectivo para organizar y recuperar información. Tras ello, mostraremos un sencillo ejemplo de implementación en Python.

QUE ES UN ARBOL BINARIO DE BUSQUEDA:

Un Árbol Binario de Búsqueda (‘BST‘ en adelante) es una estructura de datos jerárquica en la que cada nodo tiene, a lo sumo, dos nodos secundarios: Un nodo izquierdo, cuyo valor es menor y un nodo derecho, cuyo valor es superior al nodo principal. Siendo este principio de organización el que facilita la búsqueda y ordenación de datos de manera eficiente:

Para ordenar elementos en un árbol binario de búsqueda, se siguen reglas simples. Al insertar un nuevo elemento, se compara con el nodo actual. Si es menor, se inserta a la izquierda; si es mayor, a la derecha. Este proceso se repite recursivamente hasta encontrar un nodo sin hijo en la dirección adecuada, donde se inserta el nuevo elemento.

IMPLEMENTACIÓN EN PYTHON:

A continuación pasaremos a ver un sencillo ejemplo de implementación de este algoritmo, en Python, en la que empezaremos definiendo una clase (a la que llamaremos ‘Nodo‘), la cual, representará un nodo en nuestro ‘BST‘, en donde cada nodo tendrá un valor, así como referencias a sus respectivos nodos secundarios izquierdo (‘self.izquierdo‘) y derecho (‘self.derecho‘), que inicialmente no tendrán ninguno:

A continuación, definiremos la función ‘insertar()‘ que se encargará de insertar un nuevo nodo al árbol. De modo que si la variable ‘raiz‘ es ‘None‘, significará que estamos insertando el primer nodo, creándose un nuevo nodo con el valor proporcionado. Por su parte, si la raíz ya existe, se comparará el valor a insertar con el valor de la raíz. Así, dependiendo de si es menor o mayor, se llamará recursivamente a la función ‘insertar()‘ en el subárbol izquierdo o derecho, devolviéndose finalmente la raíz actualizada del árbol:

Por último, definiremos la función ‘inorden()‘, la cual, realiza un recorrido por los elementos del árbol. Recorriendo primero el subárbol izquierdo, luego la raíz y finalmente el subárbol derecho. En este caso, se utiliza para imprimir los elementos del árbol en orden ascendente:

Una vez definida la clase y sendas funciones, definiremos la lista de elementos a ordenar, la cual iremos recorriendo, utilizando la función ‘insertar()‘ para ir incluyéndolos en el árbol, para, finalmente, proceder a su ordenación mediante el la función ‘inorden()‘:

OUTPUT:

CONCLUSIÓNES:

Las ventajas de utilizar un árbol binario de búsqueda (‘BST‘) radican en su eficiencia y simplicidad conceptual. Permite la rápida búsqueda y ordenación de elementos, con operaciones como inserción y eliminación. Además, la estructura jerárquica facilita la comprensión y manipulación de datos ordenados. Además, se puede adaptar para aplicaciones específicas, como árboles ‘AVL‘ o árboles ‘rojo-negro‘, para mantener un equilibrio y mejorar aún más la eficiencia.

No obstante, existen desventajas importantes. La eficiencia está sujeta a la estructura del árbol, y si este degenera en una lista enlazada, las operaciones pueden volverse lineales, perdiendo la ventaja logarítmica. Además, la complejidad en la gestión de memoria y la necesidad de mantener la propiedad de búsqueda pueden complicar la implementación. Además, en comparación con otras estructuras de datos, como las tablas hash, la búsqueda puede volverse menos eficiente en ciertos casos.

En resumen, aunque los árboles binarios de búsqueda ofrecen una solución eficaz para ciertos escenarios, su rendimiento óptimo depende de la gestión de su estructura y su implementación precisa.

Saludos.