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.

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.

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.

ENTRENANDO MODELOS PARA CLASIFICACIÓN DE IMAGENES CON PYTHON Y ‘TensorFlow’.

Destacado

En el mundo de la inteligencia artificial y el aprendizaje automático, la clasificación de imágenes es una tarea fundamental. Clasificar imágenes puede implicar identificar objetos, reconocer patrones o incluso diagnosticar enfermedades basadas en imágenes médicas. En este artículo, exploraremos cómo utilizar Python junto con ‘TensorFlow‘, una de las bibliotecas de aprendizaje automático más populares, para entrenar modelos de clasificación de imágenes de manera efectiva. La explicación la dividiremos en cinco sencillos pasos:

INSTALACIÓN DE TENSOR FLOW:

Aunque para nuestro ejemplo vamos a utilizar la plataforma de ‘Google Colab‘ (en donde no es necesaria esta acción) conviene saber como podemos instalar la librería localmente en nuestro sistema. Para ello podremos utilizar el comando ‘pip‘ al que estamos acostumbrados:

PREPARACIÓN DE LOS DATOS:

El primer paso en el entrenamiento de un modelo de clasificación de imágenes es preparar los datos. Para este ejemplo, utilizaremos el conjunto de datos ‘MNIST‘, consistente en una colección de imágenes de dígitos escritos a mano. ‘TensorFlow‘ proporciona, aquí, funciones para cargar y pre-procesar dicho conjunto de datos:

Así, empezaremos a elaborar nuestro modelo, importando la librería ‘TensorFlow‘. Tras ello, cargamos los datos de imágenes MNIST utilizando la función ‘load_data()‘ para después normalizar estos dividiendo los valores de píxeles de las imágenes por 255 y así escalarlos en el rango [0, 1]:

CONSTRUCCIÓN DEL MODELO:

Una vez que los datos están preparados, podemos construir nuestro modelo de clasificación de imágenes. Para este ejemplo, utilizaremos una red neuronal convolucional (CNN), la cual constituye una arquitectura comúnmente utilizada para tareas de visión por computadora como la que pretendemos realizar:

En la construcción del modelo, primero definimos un modelo secuencial utilizando ‘tf.keras.models.Sequential([])‘, permitiéndonos agregar capas secuenciales una tras otra. Luego, agregamos capas de convolución 2D seguidas de capas de agrupación máxima para extraer características de las imágenes y reducir la dimensionalidad. Después de varias iteraciones, aplanamos las características en un vector unidimensional y las alimentamos a capas densas para la clasificación final.

Una vez que el modelo está construido, lo compilamos con ‘model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])‘. Aquí, especificamos el optimizador ‘adam‘, una función de pérdida adecuada para problemas de clasificación de múltiples clases, y las métricas que deseamos monitorear durante el entrenamiento, como la precisión. Este proceso de construcción y compilación establece los parámetros esenciales del modelo, preparándolo para el proceso de entrenamiento.

ENTRENAMIENTO DEL MODELO:

Una vez construido y compilado nuestro modelo, podemos entrenarlo utilizando los datos de entrenamiento que definimos con anterioridad:

El código para entrenar el modelo utiliza el método ‘fit()‘, donde proporcionamos los datos de entrenamiento (‘x_train‘) y sus correspondientes etiquetas de clase (‘y_train‘). A su vez, especificaremos el número de épocas (variable ‘epochs‘) de entrenamiento, que determina cuántas veces el modelo verá todo el conjunto de datos de entrenamiento. Además, utilizamos un conjunto de datos de validación (‘x_test‘ y ‘y_test‘) para evaluar el rendimiento del modelo después de cada época. Durante el entrenamiento, el modelo ajusta sus pesos para minimizar la función de pérdida, y al final de cada época, evalúa su desempeño en el conjunto de validación. Este proceso se repite durante el número especificado de épocas, preparando así el modelo para su evaluación final.

Proceso de entrenamiento del modelo.

EVALUACIÓN DEL MODELO:

Finalmente procederemos a la evaluación de nuestro modelo, obteniendo el valor de perdida en el conjunto de datos de prueba (‘test_loss‘) y la precisión (‘test_acc‘). Para ello utilizaremos el método ‘evaluate()‘ del TensorFlow:

CONCLUSIÓN:

En este artículo, hemos explorado cómo utilizar Python junto con TensorFlow para entrenar un modelo de clasificación de imágenes. Desde la preparación de los datos hasta la construcción, entrenamiento y evaluación del modelo, TensorFlow proporciona herramientas poderosas y fáciles de usar para trabajar con imágenes y realizar tareas de aprendizaje automático. Con este conocimiento, estás listo para comenzar a desarrollar tus propios modelos de clasificación de imágenes y explorar el emocionante campo de la visión por computadora.

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.

EJECUTANDO CÓDIGO ‘R’ EN PYTHON, CON ‘rpy2’.

Destacado

‘R’ es un lenguaje de programación, de código abierto, orientado al análisis estadístico, muy popular en la comunidad académica y de investigación, así como en la industria para el análisis de datos y la modelización estadística y que cuenta con una gran cantidad de paquetes y bibliotecas para una variedad de tareas analíticas. Pues bien, hoy vamos a ver un sencillo ejemplo de como utilizar este potente lenguaje dentro de nuestro código Python, haciendo uso de la librería ‘rpy2‘, creada para ser un puente de comunicación entre ambos lenguajes.

Ejemplo de código escrito en ‘R’.

Pero antes de continuar, deberemos asegurarnos de tener instalados todos lo recursos necesarios. Dado que, tal y como ya hemos señalado, ‘rpy2‘ es una librería que conecta nuestro código Python con los recursos y utilidades del lenguaje ‘R‘, tendremos que tener también instalado este último (al final del artículo dejaremos la dirección de la página desde la que realizar la descarga). Por lo que a la librería ‘rpy2‘ se refiere, haremos la instalación por el procedimiento habitual para las librerías de Python:

Instalación de ‘rpy2’ con ‘pip’.

EJEMPLO DE COMO USAR ‘R’ EN PYTHON:

Veamos ahora un sencillo ejemplo en el que nos proponemos realizar un análisis de regresión lineal simple sobre el conjunto de datos ‘mtcars‘ en ‘R‘ ajustando un modelo lineal que predice la eficiencia del combustible (‘mpg‘) en función del peso del automóvil (‘wt‘) visualizando el correspondiente gráfico de dispersión y línea de regresión mediante la librería ‘ggplot2‘ de ‘R‘.

Así, empezaremos creando un nuevo archivo Python en el que, naturalmente, empezaremos importando las librerías y recursos de los que vamos a hacer uso:

Tras ello, procederemos a activar la conversión automática entre ‘pandas‘ y ‘R‘ e instalar los paquetes de ‘R‘ que vamos a usar en el ejemplo. Entre el que se encuentra el paquete ‘base‘ que es el que nos proporciona la tabla de ejemplo ‘mtcars‘ de la extraeremos nuestra información:

Tras ello procederemos a cargar los datos de muestra correspondientes a cada uno de los modelos de vehículos cuya información se recoge en ‘mtcars‘. Para luego, aplicar el modelo de regresión lineal utilizando ‘mpg‘ y ‘wt‘ como variables dependiente e independiente, respectivamente. Esta operación la definiremos usando la sintaxis de ‘R‘ (‘ linear_model <- lm(mpg ~ wt, data = mtcars)‘). Aplicado el modelo, obtendremos los datos resumidos del mismo mediante la función ‘summary()‘ (también en ‘R‘):

Como se puede apreciar, una vez hecha la regresión, volveremos a convertir los datos obtenidos en un dataframe de pandas de modo que podamos imprimirlos en nuestro editor de Python mediante la función ‘print()‘:

Finalmente, pasaremos a mostrar la relación (inversa en este caso) entre ambas variables mediante un gráfico de dispersión al que incorporaremos la línea de regresión. Dicho grafico lo generaremos, usando nuevamente, la sintaxis de ‘R‘ y su librería para graficas ‘ggplot2‘:

OUTPUT:

Relación entre la eficacia del combustible (mpg) y el peso del vehículo (wt).

CONCLUSIÓN:

Para terminar, el uso de ‘R‘ en combinación con Python a través de la interfaz ‘rpy2‘ ofrece una herramienta de gran utilidad para el análisis de datos y su visualización. En este artículo, hemos demostrado cómo cargar datos, realizar un análisis de regresión lineal y generar gráficos de dispersión con líneas de regresión utilizando el conjunto de datos ‘mtcars‘. Por su parte, la capacidad de integrar funciones estadísticas y de visualización de ‘R‘ con la flexibilidad y facilidad de uso de Python abre un amplio abanico de posibilidades para investigadores y analistas de datos, permitiéndoles aprovechar lo mejor de ambos mundos para abordar sus problemas de análisis de datos de manera eficiente y efectiva.

Enlace a la pagina oficial de ‘R’:

https://www.r-project.org

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.

DETECCIÓN DE TEXTO EN IMAGENES EN PYTHON, CON ‘EasyOCR’.

Destacado

El Reconocimiento óptico de caracteres (‘ROC‘ u ‘OCR‘ por sus siglas en inglés), consiste en la extracción y detección de texto en imágenes. Se trata una tarea común en el campo de la visión por computadora que es ampliamente utilizada en aplicaciones tales como la captura y digitalización de documentos, traducción, detección de fraudes o reconocimiento de información en imágenes medicas. Así, esta semana vamos a aprender a extraer texto de una imagen, utilizando ‘EasyOCR‘ una librería en Python que nos permitirá realizar dicha tarea de una forma rápida y sencilla. Librería que deberemos instalar previamente en nuestro sistema, mediante el comando ‘pip install easyocr‘.

USO BASICO:

Una vez explicado el objetivo de nuestra practica, pasaremos a la extracción de texto de archivos de imagen. En esta ocasión usaremos el entorno de ‘Google Colab‘ en el que empezaremos realizando la instalación de ‘EasyOCR‘:

Tras ello pasaremos a importar la librería en cuestión, para a continuación, crear el objeto ‘reader‘ especificando el idioma (inglés en este caso) del texto que vamos a extraer:

Empezaremos extrayendo texto, en distintos tamaños, de una imagen en blanco y negro:

image.png

Para la lectura del texto en la imagen, usaremos aquí, la función «readtext()» pasando como argumento la ruta al archivo que contiene el texto que queremos obtener:

Esta función nos devolverá tres informaciones de cada línea de texto detectada: Las coordenadas de la imagen en las que se encuentra el área de texto (concebida como caja), el texto detectado y e nivel de confianza entendida como la probabilidad de que el texto detectado por el algoritmo ‘OCR‘ sea correcto. A su vez, podemos usar un bucle para acceder a estas tres informaciones de modo aislado:

Como se ve, el texto detectado en las líneas coincide con el presente en la imagen, lo que resulta coherente con los valores de probabilidad obtenidos.

A su vez, podemos usar «matplotlib» para mostrar el texto detectado en una etiqueta, para cada línea detectada en la imagen:

También podemos utilizar la información almacenada en la variable ‘bbox‘, para dibujar un recuadro que enmarque el área de la imagen ocupada por el texto:

Lo que hemos hecho sobre una imagen en blanco y negro, podremos hacerlo igualmente sobre una imagen a color como esta a la que hemos dado el nombre de «color_image.png«:

color_image.png

CONCLUSIÓN:

EasyOCR es una herramienta poderosa y fácil de usar para detectar texto en imágenes. Su capacidad para manejar múltiples idiomas, su precisión y su facilidad de integración lo hacen útil para una variedad de aplicaciones, desde la automatización de tareas hasta el procesamiento de documentos. En este artículo hemos visto, de un modo básico, como podemos usarle para extraer la información inherente al texto presente un un archivo de imagen y el modo en que podemos usar dicha información para mostrar gráficamente dicho texto en la imagen.

Saludos.

APLICANDO LA ‘TRANSFORMADA DE FOURIER’ EN PYTHON, CON ‘numpy’.

Destacado

La ‘Transformada de Fourier‘ (cuyo nombre proviene del matemático y físico francés Joseph Fourier) es un método matemático que descompone una señal en sus componentes de frecuencia. En otras palabras, toma una señal en el dominio del tiempo y la convierte en su representación en el dominio de la frecuencia. Esto es útil para analizar las frecuencias presentes en una señal, como ondas sonoras y señales eléctricas, entre otras.

Joseph Fourier (1768-1830)

En las siguientes líneas vamos a ver un sencillo ejemplo de aplicación de esta técnica sobre una serie de tiempo que definiremos nosotros.

Antes de continuar, deberemos asegurarnos de tener instaladas las librerías que vamos a necesitar: ‘numpy‘ para la aplicación de la transformada y ‘matplotlib‘ para las representaciones gráficas:

Una ves instaladas las librerías que vayamos a emplear, crearemos un archivo de nombre ‘fourier.py‘ en el que tras hacer las importaciones pertinentes, empezaremos definiendo la serie de tiempo sobre la que vamos a aplicar la transformada. Serie de tiempo que crearemos con ‘np.arange()‘ y que irá de 0 a 10, incrementándose 0.01 cada vez:

Lo que hará nuestro script es mostrar simultáneamente la gráfica de la señal original y la resultante, tras aplicarle la transformada. Por ello utilizaremos a continuación ‘matplotlib‘ para mostrar dicha señal en una ventana destinada también a mostrar la gráfica resultado:

Una vez definida la señal original y su representación gráfica, es el momento de aplicarle la ‘Transformada de Fourier‘ con ‘numpy‘. Para lo cual, usaremos la función ‘fft()‘ del módulo ‘np.fft‘ a la que pasaremos nuestra señal original, definiendo las frecuencias con la función ‘fftfreq()‘ con un intervalo de muestreo de 0.01:

Tras ello, volveremos a emplear las funciones de ‘matplotlib‘ para generar la gráfica de la serie transformada, la cual mostraremos junto a la original:

Así, con todo, nuestro sencillo script quedaría de la siguiente manera:

OUTPUT:

En este ejercicio nos hemos limitado a utilizar la función ‘fft()‘ para calcular la ‘Transformada de Fourier’ discreta de una secuencia unidimensional. Sin embargo, hemos de tener en cuenta que el módulo ‘np.fft‘ de ‘numpy‘ ofrece una gran variedad de funciones para trabajar con la ‘Transformada de Fourier’. A continuación os mostramos algunas de las más comunes:

1-‘np.fft.fft()‘: Calcula la Transformada de Fourier discreta de una secuencia unidimensional.

2-‘np.fft.ifft()’: Calcula las Transformada Inversa de Fourier discreta de una secuencia unidimensional.

3-‘np.fft.fft2()’: Calcula la Transformada de Fourier bidimensional de una matriz.

4-‘np.fft.ifft2()’: Calcula la Transformada Inversa de Fourier bidimensional de una matriz.

5-‘np.fft.fftfreq()’: Genera las frecuencias correspondientes a las salidas de ‘fft‘.

6-‘np.fft.shift()’: Cambia el dominio de frecuencia de salida para centrarlo alrededor de cero.

7-‘np.fft.ishift()’: Deshacer el cambio generados por la función ‘shift()‘.

8-‘np.fft.rfft()’: Calcula la Transformada de Fourier discreta de valores reales.

9-‘np.fft.irfft()’: Calcula la Transformada Inversa de Fourier discreta para valores reales.

Estos métodos son ampliamente utilizados para realizar cálculos de transformadas de Fourier en diferentes dimensiones y tipos de datos, desde datos unidimensionales hasta matrices bidimensionales y valores reales. Permiten realizar análisis frecuencial, filtrado de señales, entre otros procesamientos fundamentales en el procesamiento de señales y el análisis de datos.

Saludos.