Uso de classmethod en Python

logo python

En este post  intentaré explicar de forma sencilla el uso de classmethod en Python y las ventajas que nos ofrece dentro de la programación orientada a objetos.

Classmethod es lo que se llama en Ptyhon un decorador.

Los decoradores en Python son funciones que nos permiten o facilitan determinadas acciones, alteran, modelan o decoran, de ahí su nombre como se comportan otras funciones cuando van precedidas por ellos.

Los decoradores se escriben colocando una arroba delante, por lo que en nuestro caso seria algo asi:

@classmethod

Este decorador permite llamar a una clase, aunque esta aun no haya sido convertida en un objeto.

Veamos un ejemplo sencillo:

class boxeador(object):
    def __init__(self):
        pass
    @classmethod #nos permite usar esta funcion sin que la clase haya sido atribuida a un objeto
    def esquina(cls, color):
        print("Has tenido suerte, tu esquina es de color {}".format(color))

def main():
    color = input('El color que deseas es:')
    boxeador.esquina(color) #llamado de la funcion

if __name__ == '__main__':
    main()

Como ven hemos podido llamar a esquina() sin que esta haya sido atribuida a un objeto especifico.

Otros posts sobre Python

 Si eliminamos el decorador recibiríamos este error:

TypeError                                 Traceback (most recent call last)
<ipython-input-19-6d278ca6f532> in <module>
     11 
     12 if __name__ == '__main__':
---> 13     main()

<ipython-input-19-6d278ca6f532> in main()
      8 def main():
      9     color = input('El color que deseas es:')
---> 10     boxeador.esquina(color) #llamado de la funcion
     11 
     12 if __name__ == '__main__':

TypeError: esquina() missing 1 required positional argument: 'color'

O sea nos da un error de tipo, indicando que falta un argumento de posición llamado color, que no hemos asignado a ningún objeto.

Y hasta aquí, y como siempre espero que sirva de ayuda a alguien.

Un saludo

…Y todo, como el diamante, antes de luz , fue carbón

J. Martí

Encontrar la intersección en dos diccionarios en Python 3

logo python

Podemos  trabajar con intersección en dos diccionarios en Python 3, empleando el método keys.

La forma de expresarlo seria algo como esto

un_dict.keys () & otro_dict.keys 

Lo cual devolverá las claves comunes de los dos diccionarios como un conjunto.

Esta funcionalidad existía desde  Python 2.7, usando el método dict.viewkeys ().

La forma de usar  el list comprehension sería:

[key for key in some_dict if key in another_dict]

Pueden existir otras formas, una que conozco es  emplear el  contains(), pero considero estas menos recomendable.

Su forma es esta

filter (another_dict.__contains__, some_dict.keys())

Espero que sirva de ayuda a alguien.

Más sobre Python en mi blog

Muchas gracias

….un sueño es casi todo  y más que  nada, más que todo al soñarlo, casi nada después……

J.A. Buesa

NameError: name ‘raw_input’ is not defined

python error

El mensaje de error «NameError: name ‘raw_input’ is not defined», nos dice que estamos haciendo referencia a un valor que no existe.

La explicación es sencilla, debido a que estamos usando Python 3.x para ejecutar nuestro programa, raw_input() no existe.

El error «NameError: name raw_input is not defined«, se genera cuando intentamos usar el método raw_input () en Python 3.

Para corregir este error, reemplaza todas las instancias de raw_input() con la función input() en tu código.

Otros errores de Python

Una solución que técnicamente funciona, pero que no recomiendo, es asignar el valor de raw_input() a la función input().

Podemos hacer esto, usando la asignación de variables y esto técnicamente permitirá usar raw_input () en Python 3.

Seria algo como esto:

raw_input =  input

Esta declaración, le dice a Python que el valor de raw_input() debe ser igual a input().

No se recomienda

Aunque este técnicamente probada, esta no es una buena solución, y esto es porque otros desarrolladores que lean el código pueden confundirse si ven raw_input() en una base de código de Python 3, teniendo en cuenta que en la documentación oficial de Python 3  se eliminó el nombre raw_input() a favor de input().

Espero que esto sirva de ayuda a alguien

Muchas gracias.

No podía despreciarlo, era el ultimo brindis de un bohemio por una reina

Error UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xe1 in position …….

python error

 La solución más rápida al error, «Error UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xe1 in position…» es emplear Sublime Text .

Abrimos nuestro archivo con sublime text y en la opción guardar con encoding guardarlo como UTF 8

Existen otras opciones, veamoslas

Codificar al leer el archivo

Hacer el encoding a UTF-8 al hacer el csv_read(), pasando en el parámetro encoding() la codificación que esperamos.

Importar   chardet y  codificar en la lectura del archivo.

import chardet
with open('data/atp-tour/data.csv', 'rb') as f: result = chardet.detect(f.read())
result['encoding']
Output: 'Windows-1252'

Si lanza un warning de LOW MEMORY se deberá principalmente a los tipos de adivinación por columna, están empleando mucha memoria.

Esto sucede en esencia, porque Pandas solo puede determinar qué tipo de dato tiene cada columna, solamente una vez que lee todo el archivo.

Puede ayudar especificar el tipo de archivo, indicándolo en el parámetro dtype , con la sintaxis.

dtype = {'user_id': int}

Esto es solo recomendable, si sabemos que no encontraremos otro tipo de dato en esa columna, si no cumplimos este precepto, complicaremos la situación , porque se bloqueará la carga.

Hay un poco mas sobre esto en este link

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

Puedo absorber tus pecados, pero no vivir tu vida.

Y

Error. cannot convert non-finite values (NA or inf) to integer. Pandas

python error

Si recibes el error cannot convert non-finite values (NA or inf) to integer, lo más probable es que en tu dataset, existan datos vacíos que no ves.

Sobre todo si trabajas con Pandas y has estado convirtiendo valores en Excel y posees un archivo de datos grandes, puede aparecer este error, al intentar convertir tus datos a enteros.

Solución:

Aplica al dataframe el método fillna(0), estarás llenando esos valores con valor 0, con esta sintáxis

data_df= data_df.fillna(0)

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

“El amor es dos en uno que al final no son ninguno y se acostumbran a mentir”

R.Arjona

Usando hashlib en Python

logo python

Cuando hablamos de encriptado a usar, una de las herramientas es librería hashlib en Python, que nos va a permitir trabajar con un tipo de encriptado conocido como SHA

Python nos ofrece multiples librerías con valor incalculable para todo el tema de criptografía, pero hashlib es una de las mas usadas.

Su nombre proviene del inglés, ( Secure Hash Algorithms ), y su labor consiste en crear estructuras seguras, mediante funciones de encriptado, que puedan ser utilizados por diferentes lenguajes de modo transversal.

Los algoritmos o funciones SHA con que trabaja haslib, son varios(‘sha256', 'sha384', 'sha224', 'sha512', 'sha1'), con diferentes tamaños de bloque

hashlib, posee dos funciones asociadas, que usaremos al aplicar las transformaciones:

  • encode() : Convierte las cadenas en bytes, para que la funcion hash pueda procesarla.
  • hexdigest() : Devuelve el dato codificado en formato hexadecimal.

Haremos una pequeña demostración de su uso:

Introduciremos un cadena  y la convertiremos a su equivalencia en bytes utilizando la funcion enconde(),  para que la funcion SHA  pueda manipularla, esta la codifica con hexdigest(), e imprimimos la cadena resultante

import hashlib 
import hashlib 
   
 # valor de entrada 
 str = "el comienzo de todo"
   
 result = hashlib.sha256(str.encode()) 
  
 # Imprimiendo el valor hexadecimal. 
 print("El resultado es: ") 
 print(result.hexdigest()) 
 print ("\r") 
  
 # salida: El resultado es: 
 9f78aef8f9e252913e43156c570568592f014cb0175d52a6071a5eed8959e183
    
   
 # valor de entrada 
 str = " el comienzo de todo "
  
 result = hashlib.MD5(str.encode()) 
   
 # Imprimiendo el valor hexadecimal. 
 print("El resultado es: ") 
 print(result.hexdigest())
 # salida: El resultado es: 3455ed58e2999e23fc7385207e4fb999 

Y listo esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

…. hay que levantarse cada mañana con una esperanza y dormirse cada noche con una meta….

Programación lineal. Conceptos básicos.

Este post se titula Programación lineal. Conceptos básicos, y eso es porque hablaremos de los elementos mas importantes sobre el tema, con la limitación de espacio propia de un blog, como este.

Haciendo un ligero esbozo histórico, diré que la programación lineal, es una técnica que surgió en el primer tercio del siglo XX, y fue desarrollada, aplicándola a situaciones reales  para resolver problemas relacionados, con la programación, el transporte, y logística en los años, de la segunda guerra mundial.

Su creador fue el matemático ruso L. Kantorovich, y su aplicación inicial tuvo que ver con una optimización de los programas de  fabricación.

Sin embargo su aceptación, se extendió rápidamente a la economía y para 1950  el matemático estadounidense George Dantzig creó el primer algoritmo.

La programación lineal en esencia, es una función compleja que intenta determinar a partir de un conjunto de variables conocida, su influencia optima en determinados resultados.

Componentes de un problema de programación lineal

Las variables de decisión:

Son las cantidades, volúmenes o comportamientos, que se intentan estimar, como resultado.

La función objetivo:

Es la expresión matemática que intenta optimizar (maximizar o minimizar), algún valor numérico que representa ganancias, costos, cantidad de producción, volumen de inversión, etc;

Su razón de ser es evaluar, en qué medida cada variable de decisión contribuye al valor neto de una actividad económica especifica.

Coeficiente de la función:

Expresa la cantidad en la que el valor de la función objetivo cambiaría cuando se modifica una unidad de una variable de decisión, viene dada por el coeficiente de función objetivo correspondiente.

Restricciones:

Las restricciones son ecuaciones que limitan o definen la cantidad total de un recurso particular, que es necesario o requerido para llevar a cabo las actividades que decidirían el nivel de optimización de las variables de decisión.

Restricciones no negativas.

Una condición obligatoria de este tipo de restricciones, es que tienen que ser positivas con independencia, de que el objetivo de la función sea maximizar o minimizar el valor.

La solución óptima de un problema de programación lineal, es aquella que satisfaga mejor las restricciones.

Esto quiere decir que de todas las soluciones factibles.

será óptima aquella que en el caso de una necesidad de maximización, el valor de la función objetivo sea el mayor posible, o sea el máximo.

Por el contrario, si nos encontramos ante un problema de minímización , la solución más adecuada será aquella donde la función objetivo ofrezca el mínimo.

Recursos disponibles

Constituyen los materiales, recursos, o elementos que participan en la ecuación y sobre los que se aplica la misma

Coeficientes tecnológicos

Cuando intentamos prever el futuro a través de la programación lineal, es importante considerar las limitaciones técnicas que nos impone la realidad objetiva y el entorno.

Los coeficientes tecnológicos, son elementos de referencia que conocemos y sobre los que se mueve el fenómeno que necesitamos estimar.  

La estructura de un problema de programación lineal debería ser algo como esto

Maximize  20* vd1 + 18*vd2; subject to
0.25*vd1 + 1*vd2  ≤60
1.40*vd1  + 0.5*vd2 ≤ 90 where vd1 & vd2 ≥ 0

Aquí podemos identificar los diferentes componentes:

vd1 y vd2 son las variables de decisión

Maximize  20* vd1 + 18*vd2 es la función objetivo

20* vd1  y  18*vd2 son los coeficientes de la función

0.25*vd1 + 1*vd2  ≤  60 la primera restricción

1.40*vd1  + 0.5*vd2  ≤  90 segunda restricción

vd1 & vd2  ≥ 0 restricción negativa

0.25, 1, 1.40, 0.5 son los coeficientes tecnológicos

65, 90 es la disponibilidad de recursos

Elementos importantes de la Programación lineal

Potenciación

Partimos de considerar que las variables de decisión, siempre tienen una potencia de uno.

La condición critica

Para poder aplicar un problema  de programación lineal, es necesario tener definidas: la función objetivo, la disponibilidad de recursos y las variables de decisión positivas relacionadas entre sí.

Dualidad

Todo problema de programación lineal, puede convertirse a  su par correspondiente,  capaz de dar la misma solución factible de la función objetivo.

Esto lo puede hacer de modo automático el programa con el que trabajemos, pero conocer su esencia es importante.

Cuando se trata, por ejemplo de un problema de maximización, por lógica todas las restricciones asociadas con su función objetivo serán del tipo «menor que igual a» la disponibilidad de recursos dada, (podría ser solo «igual a», en el caso de una   restricción en particular restringida)

Si eso no sucediese y alguna restricción fuera del tipo «mayor que igual a» lo recomendable es convertir la solución a una forma canónica (multiplicar por un «menos») para que la restricción del problema de maximización se transforme en «menor que igual a» .

Por oposición si fuera un problema de minimización, entonces todas las restricciones asociadas con la función objetivo deben tener restricciones «mayor que igual a» a la disponibilidad de recursos considerada, a menos que exista alguna restricción que particularmente no esté restringida (tipo «igual a»), lo adecuado es multiplicar por -1, para convertirlas. 

Antes de la dualidad

Antes de proceder con un ejercicio de dualidad es necesario que las variables de decisión sean igual  mayor que cero, de no ser asi necesitan ser transformadas de forma canonical.

En Python, podemos trabajar los problemas de programación lineal con Ipsolve.

Por ultimo, decir que la programación lineal, se basa en la creación de modelos cuando el problema que necesitamos resolver tiene solo funciones lineales, esto es :

Tenemos variables de decisión conocidas y queremos saber que influyen en un problema dado.

Dicho de otro modo: el concepto programación lineal  no se enmarca dentro de la programación de computadoras, sino que se refiere a escoger una vía de solución cuando el modelo matemático del problema contiene solo funciones lineales

Este articulo, pretende solo ser un esbozo de los conceptos más básicos de la solución a problemas de programación lineal.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

«… y yo tenia respuesta a todas sus preguntas, incluso a las que aún no se ha hecho.»

Y

TypeError: argument of type ‘NoneType’ is not iterable. Python

python error

El error, TypeError: argument of type ‘NoneType’ is not iterable, que Python lanza, obedece, según mi experiencia, a casos en que una función con una declaración  condicional (if, else, case, etc) no devuelve un resultado o lo  devuelve vacío.

Si esto sucede, Python devuelve un valor por defecto que es None, el cual no es iterable, por tanto en la próxima iteración lanzara un error.

La solución a esto, es detener la iteración en casos donde pueda haber un valor vacío (por ejemplo utilizando break), o añadiendo acciones (por ejemplo con while), de modo que se solucione o detenga la iteración.

«Puedo absorber tus pecados, pero no vivir tu vida.»

Y

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

Open para abrir archivos en Python

logo python

Normalmente empleamos open para abrir archivos en Python, y aunque tenemos diferentes formas, la más común es open(),.

Intentaré explicar en este post, su uso. 

Python nos ofrece open(), que es una función que devuelve un objeto del tipo file.

La sintaxis de la función open() es:

open(file, mode)

El parámetro file, ofrece la ubicación del archivo que intentamos abrir, ya sea una url o una uri.

mode nos permite definir que haremos con ese objeto.

'r'    Read: nos permite leer el documento. Viene dado como parámetro por defecto, abre el file o nos lanza un error si este no existe

'a'   Append: Abre el archivo para añadirlo y lo crea si este no existe.

'w'  Write: Abre el archivo para escribir sobre el, y al igual que a crea el archivo si este no existe.

'x'   Create: Crea el archivo indicado y devolverá un error si este no existe.

't'   Text: nos permite indicar que usaremos el archivo en modo texto, y es el valor por defecto de la función.

'b'   Binary: Nos permite manejar el archivo en modo binario, por ejemplo para trabajar con imágenes.

El formato más común de apertura utilizando open() es:

variable = open('archivo_prueba.txt')

Como los valores 'r' y 't' del parámetro mode, están establecidos por defecto, el ejemplo anterior, sería lo mismo que escribir:

variable = open('archivo_prueba.txt', 'rt')

Si pudiera detenerme a ver pasar el tiempo,… pues no sabría que hacer con el

Y

Diferencias entre apply, map y applymap

logo python

Les invito a conocer en este post, las diferencias entre apply, map y applymap, y en consecuencia cuando aplicar cada una.

El uso de estas funciones, para multiples labores en Python, nos permiten obtener resultados de un modo que nos arreglan bastante la vida.

Muchas de estas veces nos apoyamos para ello en funciones lambda, por su simplicidad, veamos un poco, de que hablo.

Funciones lambda

Otro modo de aplicar redondeo es utilizar una función  lambda en un array de una dimensión, o sea para una columna o fila.

Las funciones lambdas, son una poderosa herramienta de Python, que nos permite escribir un tipo de función, que se ejecuta en un línea.

Hablo un poco sobre la funciones lambda en este articulo que escribi hace un tiempo.

Apoyándonos en ellas,  podemos redondear, utilizando diferentes funciones que trabajan a partir de elementos.

Recordemos que en Python todo son objetos, las funciones map  y applymap, se  basan ambas en este concepto.

La diferencia entre ellos es que applymap es un función basada en elementos que trabaja en el dataframe, mientras map lo hace en las series, o sea una columna o una fila.

En el ejemplo verán la aplicación de map() en una columna y applymap() en todo el dataframe, en ambos casos se combina su uso con la función format, y  una función lambda para determinar los términos del redondeo.

Existe una buena explicación de la diferencia entre estas funciones en este link


Map

Applymap

Como hemos ya modificado una columna volvemos a importar nuestro dataset y aplicamos applymap()

Diferencias entre Map, applymap, y apply

map() es una función basada en elementos que solo se aplica a series, acepta dict, series o callables.

Está diseñada para mapear valores de un dominio a otro, por lo que está optimizada para el rendimiento.

Su construcción, como vimos antes es del tipo :

df['A'].map({1:'a', 2:'b', 3:'c'}))

applymap(), es una función también basada en elementos, que  solo se aplica a Dataframes, y únicamente acepta callables.

applymap() es perfecto, para transformar de elementos en varias filas / columnas, sin que sea necesario utilizar apply()

df[['A', 'B', 'C']].applymap(str.strip))

apply(), se basa también, en elementos, pero puede tener otras complejidades y su compartamiento y resultado, depende de la función.

Se aplica, tanto a series como dataframes , y solo acepta callables

Es importante saber que se usa cuando en cualquier función que no puede ser vectorizada

Otros elementos a tener en cuenta son:

map() cuando se le pasa un diccionario o serie mapeará elementos basados ​​en sus claves Los valores faltantes se registrarán como NaN en la salida.

applymap() puede funcionar un poco más rápido que apply en algunos casos.  

map() está optimizado para mapeos y transformaciones por elementos. Las operaciones que involucran diccionarios o series permitirán a  Pandas usar rutas de código más rápidas para un mejor rendimiento.

apply() devuelve un escalar para agregar operaciones, también tiene rutas rápidas cuando se llama con ciertas funciones NumPy como mean, sum, etc.

… también en el infierno llueve sobre mojado, lo se porque he pasado, más de una noche allí…

J.Sabina
Translate »