86

IPython magics commands

Estudiando para tratar de ser mejor en la carrera de ciencia de datos me tope con el libro de “Data Science handbook” que toma todo el crédito por este pequeño post y que recomiendo leer a continuacion comparto un tema bastante util para aquellos que utilizamos jupyter notebooks.

Las llamadas magias o comandos magicos en IPython / Jupyter notebooks son shortcuts que nos permite realizar acciones sobre nuestro sistema operativo mayormente e interactuar con nuestro shell o notebook, existen dos tipos de magias, y estas se invocan usando el carácter “%”, los magic commands se dividen en dos tipos:

  • %line_magic (afectan una sola linea de codigo)
  • %% cell_magic (afectan una celda)

Ejemplo 1

%run: ejecuta un script o un notebook desde nuestro entorno de trabajo actual.

Paso 1: En tu directorio actual crear el archivo myscript.py y copia el contenido el primer bloque de código.

# file: myscript.py archiguardado en nuestro mismo directoriodefsquare(x):"""square a number"""return x ** 2for N in range(1, 4):
		print(N, "squared is", square(N))

En la misma ruta abre Ipython en la terminal o un Jupyter notebook y en la primer celda copia lo siguiente y ejecuta el siguiente comando

# Input
%run myscript.py
# Output
1 squared is 1
2 squared is 4
3 squared is 9

Observa que ejecutamos el script que creamos al inicio, esto es bastante útil ya que podemos aumentar la mantenibilidad de nuestro código al separar bloques de código que realicen alguna función determinada.

Ejemplo 2

%timeit: permite saber el Timing Code Execution de nuestro script o snippet (o fragmento de codigo)

# Creacion de una lista usando un list comprenhension
%timeit L = [n ** 2for n in range(1000)]

# el output resultate es:1000 loops, best of 3: 325 μs per loop

Ejemplo 3

%% cell magics retomando el ejemplo anterior usando un for loop

%%timeit
...: L = []
...: for n in range(1000):
...: L.append(n ** 2)
...:
1000 loops, best of 3: 373 μs per loop

Cuantos magic commands existen? Excelente pregunta! Ve al interprete y ejecuta %magic para obtener la lista completa o %lsmagic para obtener el listado de comandos soportados junto con su documentación (interesante no?). Como te habrás dado cuenta dentro de los magic commands identificamos comandos de la terminal unix/cmd `%cat, %cp, %env, %ls, %man, %mkdir, %more, %mv, %pwd, %rm, and %rmdir`` algo interesante es que estos comandos también pueden ser utilizados sin el operador %, estos reciben el nombre de automagics y puedes combinarlos junto con python para extender la utilidad de la terminal.

Por ejemplo para cambiar de directorio a otra ruta usamos el magic command %cd

%cd ..
/home/rb/rojects/

Pero tambien podemos hacer lo mismo sin “%” al ser un automagic command

cd ..
/home/rb/projects

Magics para hacer Debug

Existen dos herramientas muy buenas para este tema, la primera es %xmode que nos permite extender la forma en que el traceback de python nos entrega la información de los errores.

Controlling Exceptions: %xmode

Posee tres modos

  • Plain (forma reducida del traceback)
  • Context (por defecto)
  • Verbose (forma extendida de traceback)

Estos tres comandos se agregan como primer argumento a %xmode dependiendo loe extenso que sea nuestro requerimiento, este comando además lo podemos combinar con PDB de la siguiente manera.

%xmode Plain
%pdb on

deffunc1(a, b):return a / b

deffunc2(x):
	a = x
	b = x - 1return func1(a, b)

func2(1)

Exception reporting mode: Plain
Automatic pdb calling has been turned ON

Traceback (most recent call last):

  File "<ipython-input-2-7cb498ea7ed1>", line 1, in <module>
    func2(1)

File "<ipython-input-1-da236cd1aa14>", line 5, in func1
    return a / b

ZeroDivisionError: division by zero

> <ipython-input-1-da236cd1aa14>(5)func1()
      3 
      4 def func1(a, b):
----> 5         return a / b
      6 
      7 def func2(x):

ipdb>

Profiling and Timing Code

En el proceso de desarrollo de código siempre existirán esos “trade-offs” entre simplicidad y rendimiento, aunque es recomendable que nuestro código tenga una funcionalidad de 100% antes de pensar siquiera en optimizar algún proceso o función del mismo, si, y solo si nuestro código funciona comencemos el proceso de optimización revisando algunas cosas para poder encontrar los cuellos de botella.

Aquí algunos de los comandos:

  • %time Mide el tiempo de ejecicion de una sentencia
  • %timeit Mide repetidamente el tiempo ejecución de una sola sentencia para mayor precisión
  • %prun Corre el código con el profiler
  • %lprun Corre el código línea por línea con el profiler
  • %memit Mide el uso de memoria de una sola sentencia
  • %mprun Corre el codigo linea por linea usando el memory profiler

Aunque para las ultimas 4 magic commands debes instalar (conda o pip) las extensiones line_profiler y memory_profiler para el detalle particular de cada comando es importante revisar la documentacion de IPython, no si eres nuevo en python tenlo en mente revisalo y continua aprendiendo si eres mas avanzado espero compartas algun ejemplo en los comentarios con una aplicacion sencilla y como utilizaste el profiler.

Este es el primer articulo de varios en forma de tutorial que espero escribir en las siguientes semanas derivado de lo aprendido en las clases de la Escuela de Ciencia de Datos de Platzi y que en su momento me quede con cara de what?, que espero les ayude a complementar lo que vamos aprendiendo y sea un de mucha utilidad para aquellos que no somos tan experimentados o tan versados en las herramientas del data science.

Escribe tu comentario
+ 2
Ordenar por:
13
35816Puntos
5 años

Si les agrado el post, dejen su like (ya me siento como youtuber barato) y diganme que en que tema de la carrera de ciencia de datos han tenido dificultades, juntos hacemos platzi, y juntos seremos científicos de datos o ingenieros en ML

2
32507Puntos
3 años

Compañero una duda, por que algunos comandos de consola se ejecutan con ! ? como por ejemplo Touch y como podria consultar todos los que se ejecutan con !??

2
27828Puntos
4 años

El libro que mencionas solo esta disponible en ingles?
Excelente post

1
35816Puntos
4 años

me temo que si, pero si tienes dudas contactame por @rusbelbermudez en twitter

2
6239Puntos
4 años

Me gustó bastante este aporte. No sabía de la funcionalidad de estos magic commands!

2
9284Puntos
4 años

Que buen aporte, muchas gracias.

Existe alguna diferencia con el ! que he visto algunas personas usan en !wget?

2

hola rusbel,

Muy buen artículo, felicitaciones.

Tengo 2 inquietudes a ver como me orientas

  1. cuando instale colaboratory no genero la carpeta “colab notebooks”, sin embargo, dessintale y reinstale e igual no la genero.
  2. Contunue con el curso en el video5, donde hay que importar la libreria: from google.con import drive drive.mpunt(’/content/drive’)
    tardaba mucho tiempo luego de varios intentos lo realizo (presionando ctrl + enter), pero me quedaron expuestas todas mis carpetas personales google.drive, como puedo reversarlo?
0
35816Puntos
4 años

disculpa la demora, al hacer eso del punto dos si basicamente estas cargando todo tu root de google drive, pero tranquilo solo tu puedes verlo aun cuando lo compartas gracias al access token que se require para autenticarte te recomiendo agregarle a tu ruta de aprendizaje docker y backend

2
22146Puntos
5 años

Muy buen aporte y muy útil!!!

Hay muchas cosas de aquí que no sabía y de ahora en adelante voy a aplicar

Saludos!