Uso de property en Python

logo python

Este post estará dedicado a otro decorador. Veremos el uso de property en Python, que bastante común para los desarrolladores.

Property nos permite trabajar con funciones como si fueran variables, y esta su magia dotándonos de una ventaja adicional al programar.

Como todo decorador, se escribe con la @ delante, o sea asi:

@property

Los decoradores classmethod y staticmethod

Veamos su uso en este ejemplo:

class boxeador(object):
    def __init__(self, color):
        self.color = color
    
    @property
    def esquina(self):
        print("Bienvenido, tu color es {}".format(self.color))
    
def main():
    a = boxeador('rojo')
    e = a.esquina
    
if __name__ == '__main__':
    main()

Output:

Bienvenido, tu color es rojo

Si eliminamos el decorador, no obtendríamos nada.

Y hasta aquí.

Espero que esto haya servido de ayuda a alguien.

Muchas gracias

Los hijos van al psicólogo a  pagar, para que le digan las mismas cosas que los padres llevan diciéndole años, gratis

Y

Listar un directorio en Python con walk() de forma recursiva.

logo python

En este articulo mostraré como listar un directorio en python con walk. En este link podrás ver también, como acceder a directorios con scandir

El método walk() pertenece al módulo os , y recibe como parámetro la ruta del contenido que recorreremos.

Como lo que hace el método es crear un iterador, que en cada iteración, devuelve tres valores: el nombre de la ruta completa del directorio, la lista de directorios que lo componen y la lista de ficheros de ese directorio.

El recorrido que hace el metodo por defecto es descendente, por lo que primero listará el contenido del directorio actual, y luego  ira descendiendo por nivel listando los directorios correspondientes.

 Cuando no se especifica la ruta,  walk() toma como referencia el directorio actual.

import os
dir = "/Users/blackmaster/Downloads/"

for nombre_directorio,carpetas,archivos in os.walk(dir):
    print('\n A')
    print(nombre_directorio)
    print('\n B')
    print(carpetas)
    print('\n C')
    print(archivos)

El resultado del script anterior irá devolviendo recursivamente, o sea por niveles los componentes de una ruta en este caso, separados por un salto de línea con los subtitulos A, B y C.

Te invito a que lo pruebes, para que lo comprendas mejor.

Si al método walk() le pasamos el argumento topdown=False:, mostrará  primero el contenido de los directorios más profundos.

Como por defecto, walk() no sigue los enlaces simbólicos que encuentra en un directorio, hay que pasar el argumento followlinks=True, para que lo haga.

import os
dir = "/Users/blackmaster/Downloads/"

for nombre_directorio,carpetas,archivos in os.walk(dir, topdown=False,followlinks=True):
    print('\n A')
    print(nombre_directorio)
    print('\n B')
    print(carpetas)
    print('\n C')
    print(archivos)

Y hasta aquí.

Espero modestamente, que este post ayude a alguien.

La clave para todo es la determinación

D.

AttributeError en Python

python error

El AttributeError, es un error común que aparece en Python por algunas razones que veremos a continuación.

La más común de ellas, es que obtengas este error, debido a qué has empleado una sangría errónea, como por ejemplo mezclar tabulaciones y espacios.

La otra causa que conozco, en Python 3+, es que esto ocurra si usas variables privadas que comienzan con doble subrayado.

Puedes leer sobre otros errores de Python en mi blog.

El aire hincha la vela, pero la deshilacha, y hay tantas velas rotas en el fondo del mar.

J.A. Buesa

AttributeError: ‘AxesSubplot’ object has no attribute ‘set_axis_labels’

seaborn error

Si estas recibiendo el error ‘AxesSubplot’ object has no attribute ‘set_axis_labels’; te daré una explicación de a que se debe.

Seaborn, no devuelve una figura que es lo que esperas obtener, sino un objeto  de ejes(axis-object)

La solución es importar matplotlib que será la encargada de dibujar el gráfico en el lugar indicado.

Puedes verlo en el ejemplo, que sigue.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

trim= pd.DataFrame({'mes': ['ene', 'feb', 'mar'], 'val': [100, 200, 300]})
barplot(x = 'mes', y = 'val', 
trim = meses,
color = 'blue')
ax.set(xlabel='common xlabel', ylabel='common ylabel')
plt.show()

Puedes contactar conmigo acá:

Por que la vida es eso sembrar, sembrar, sembrar

J. A. Buesa

Comparar fechas con Python

logo python

Una necesidad que puede surgir al programar, es tener que comparar fechas en Python.
Implementar las comparaciones no es algo complejo y para ello emplearemos operadores de comparación de uso común como <, >, <=, >=, !=  y otros, dentro del modulo datetime().

import datetime
  
# fecha in yyyy/mm/dd format
fecha_1 = datetime.datetime(2020, 4, 6)
fecha_2 = datetime.datetime(2019, 12, 30)
fecha_3 = datetime.datetime(2019, 1, 1) 

# la comparacion devolvera verdadero o falso

print("La fecha_1 es mas nueva que la fecha_3 : ", fecha_1 > fecha_3)
print("La fecha_2 es mas vieja que la fecha_3 : ", fecha_2 < fecha_3)
print("La fecha_3 es igual a la fecha_1 : ", fecha_3 == fecha_1)
print("La fecha_1 no es la misma que la fecha_2 : ", fecha_1 != fecha_2)

La salida que obtenemos es :
La fecha_1 es mas nueva que la fecha_3 :  True
La fecha_2 es mas vieja que la fecha_3 :  False
La fecha_3 es igual a la fecha_1 :  False
La fecha_1 no es la misma que la fecha_2 :  True

Sumar y restar días en Python

En este otro ejemplo comparamos varias fechas que entramos por teclado.​

# Entramos por teclado las fechas

dia_1, mes_1, año_1 = [int(x) for x in input("Introduzca fecha del primer envio"
        "(YYYY/MM/DD) : ").split('/')]
  
primera = date(dia_1, mes_1, año_1)
  

dia_2, mes_2, año_2 = [int(x) for x in input("Introduzca fecha del segundo envio"
        "(YYYY/MM/DD) : ").split('/')]
  
segunda = date(dia_2, mes_2, año_2)

dia_3, mes_3, año_3 = [int(x) for x in input("Introduzca fecha del tercer envio"
        "(YYYY/MM/DD) : ").split('/')]
  
tercera = date(dia_3, mes_3, año_3)
  
# Check the dates
if primera == segunda:
    print("Es raro que ambas se hicieran en mismo dia")
      
elif tercera > primera:
    print("es correcto")
      
else:
    print("Debe analizarse")

Y esto es todo, espero sinceramente que este post, sirva a alguien.

No discutas nunca con un imbécil, te llevará a su terreno y allí te ganará por experiencia

D.

Fusionar dos diccionarios en Python 3.5

logo python

Fusionar dos diccionarios en Python 3.5, es algo que puede resultar común en nuestra aplicación.

El procedimiento varia según la versión de Python que usemos, en nuestro caso es la 3.5 , siguiendo las indicaciones de las convenciones PEP 448

Lo que obtenemos es un nuevo diccionario t , con todos los valores, donde están sobreescritos los valores del segundo diccionario (b), por los del primero (a)

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

Gracias

“….El amor siempre empieza soñando y termina en insomnio“

JArjona

Uso de staticmethod en Python

logo python

En otros artículos he hablado de decoradores, en este, me referiré al uso de staticmethod en Python y sus características.

Todos sabemos que Python está orientado a objetos y que las clases son la base de su programación, por eso el uso de decoradores es una ayuda importante en el manejo de estas.

staticmethod es un decorador que nos permite usar una funcion dentro de una clase sin que esta reciba argumentos.

Otros artículos sobre decoradores

Su forma de escribirlo, es colocando una arroba delante

@staticmethod

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

Veamos un ejemplo, que ya he empleado al hablar de decoradores antes:

class boxeador(object):
    def __init__(self):
        pass
    @staticmethod
    def esquina():
        print("Has tenido suerte, tu esquina aun no tiene color")

def main():
    b = boxeador()
    b = b.esquina()
    

if __name__ == '__main__':
    main()

Como ven hemos podido llamar a esquina() sin que esta tenga ningún parámetro.

 Si eliminamos el decorador recibiríamos este error:

TypeError                                 Traceback (most recent call last)
<ipython-input-22-0a10128b3e82> in <module>
     12 
     13 if __name__ == '__main__':
---> 14     main()

<ipython-input-22-0a10128b3e82> in main()
      8 def main():
      9     b = boxeador()
---> 10     b = b.esquina()
     11 
     12 

TypeError: esquina() takes 0 positional arguments but 1 was given
'

Esto nos está indicando un error de tipo, que nos dice que a pesar de que la función esquina no tiene argumentos (parámetros),  la hemos llamado como si lo tuviera.

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

Un saludo

Entrena duro y en silencio, que el éxito sea tu grito

D

Cambiar el nombre a una columna con Pandas

logo python

Las vías que conozco,  para cambiar el nombre a una columna son tres . Podemos hacerlo con el método rename(), el cual puede aplicarse directamente a la columna, o pasarlo a través de una funcion lambda.

Ojo, es posible que haya más posibilidades, me refiero a las que uso y conozco.

Cambiar el nombre a una columna con Pandas

El método rename(),  se utiliza justo para modificar la etiqueta de los ejes, al aplicarlo nos devolverá un nuevo dataframe con los valores aplicados. Su sintaxis es:

dataframe.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='ignore')

maper: Ya sea un diccionario o una función , indica las transformación a aplicar  al eje dado. Este parámetro y el eje se emplean para indicar que valores y ejes recibirán el cambio.

index: Nos permite establecer el eje. Si empleamos maper, index =0 , es lo mismo que maper = index

columns: Indica las columnas, si su valor es cero o se ignora, significa que es el mismo que maper.

axis: tiene por defecto el valor 0, que indica el índice, el valor 1 indica columnas. Pueden emplearse colocando el nombre del eje(índice, columnas), o el numero (0,1). El valor que recibe por defecto es el del índice.

copy: Su valor determinado es True, y esto garantiza copiar también los datos subyacentes.

inplace: valor por defecto False, si se convierte a True, al devolver el nuevo dataframe la copia anterior se ignora.

level: valor por defecto None, indica el numero o nombre del nivel. Si existen índices multiples solo modificara en el nivel indicado.

error: acepta raise o ignore, y ese último es su valor por defecto. Ignora el error del tipo keyerror, cuando index o columns contienen etiquetas que no existen.

Tenemos el siguiente dataframe:

Aplicándolo directamente seria algo asi:

Renombramos varias columnas usando mapping en las columnas Unnamed: 0 e Ischaemic heart disease, para ello pasamos los valores nuevos, en forma de diccionario.

Renombremos ahora los indices

Esto también podría lograrse escribiendo

data_df.rename({0: 'Año1', 1: 'Año1', 2: 'Año3'}, axis='index')

Incluso podemos cambiar el estilo :

A través de una función lambda:

Y 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….

Y

Cambiar de lugar la leyenda de un gráfico, en Matplotlib

matplotlib

Si necesitas cambiar de lugar la leyenda en Matplotlib, puedes hacerlo directamente en la librería.

import matplotlib.pyplot as plt
sns.set(style="whitegrid")

grafico = sns.load_dataset("titanic")

g = sns.factorplot("class", "survived", "sex",
                   data=grafico, kind="bar",
                   size=6, palette="muted",
                   )
g.despine(left=True)
plt.legend(loc='upper left') 			#colocando la leyenda arriba a la izquierda
g.set_ylabels("survival probability")

… siempre habrá poesía

G.A. Becquer

Errores en Python

python error

En Python se dan dos tipos de errores principales. Los errores de sintaxis  y las excepciones

Los errores de sintaxis o interpretación, son muy comunes.

Su estructura suele ser la que aparece en el ejemplo siguiente:

>>> while True print('Hello world')
  File "<stdin>", line 1
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax

En este caso el intérprete de Python, reproduce la línea responsable del error y muestra una “flecha” que apunta al primer lugar donde se detectó este.

En el ejemplo, el error se detecta en la función print(), ya que faltan dos puntos (‘:’) antes del mismo.

El error ha sido provocado (o al menos detectado) en el elemento que precede a la flecha. Dentro de la declaración del error se muestran el nombre del archivo y el número de línea, lo cual te permitirá localizar con facilidad su ubicación exacta.  

Excepciones

Se llama excepciones a errores detectados durante la ejecución del código que no son incondicionalmente fatales.

Esto quiere decir que pueden ser resueltos con una condición y por ello Python nos ofrece condiciones para manejarlos.

Cuando no son gestionadas por el código, resultan en en mensajes de error:

Veamos algunos ejemplos.

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

Explicando un poco el ejemplo vemos que estrutura tiene.

En Python existen diferentes tipos de excepciones y el tipo a que corresponde se imprime como parte del mensaje.

En el ejemplo los tipos son: ZeroDivisionErrorNameError y TypeError.

La cadena mostrada como tipo de la excepción es el nombre de la excepción predefinida que ha ocurrido.

Esta convención es válida para todas las excepciones predefinidas del intérprete, y aunque no tiene por que ser así para excepciones definidas por el usuario, se recomienda su uso.

La parte anterior del mensaje de error muestra el contexto donde ocurrió la excepción, en forma de seguimiento de pila.

En general, contiene un seguimiento de pila que enumera las líneas de origen; sin embargo, no mostrará las líneas leídas desde la entrada estándar.

El resto del mensaje provee información basado en el tipo de la excepción y qué la causó.

La última línea de los mensajes de error indica qué ha sucedido.

Por último debemos saber que los nombres de las excepciones estándar son identificadores incorporados al intérprete (no son palabras clave reservadas).

En otro articulo hablare de como capturar las excepciones

Translate »