Es una poderosa herramienta para la computación científica interactiva y exploratoria.
(ipython_dev)damian@damian-Inspiron-1110:~$ ipython notebook
2013-05-10 12:11:26.912 [NotebookApp] Using existing profile dir: u'/home/damian/.config/ipython/profile_default'
2013-05-10 12:11:26.937 [NotebookApp] Using MathJax from CDN: http://cdn.mathjax.org/mathjax/latest/MathJax.js
2013-05-10 12:11:26.984 [NotebookApp] The port 8888 is already in use, trying another random port.
2013-05-10 12:11:26.985 [NotebookApp] Serving notebooks from local directory: /home/damian
2013-05-10 12:11:26.985 [NotebookApp] The IPython Notebook is running at: http://127.0.0.1:8888/
2013-05-10 12:11:26.986 [NotebookApp] Use Control-C to stop this server and shut down all kernels.
Se ha abierto una nueva ventana en la sesión actual del navegador.
y ejecutando un hola mundo:
print "Hola HCC 2013"
Hola HCC 2013
a = 1
a
1
La representación de los objetos es más legible:
from numpy.random import randn
data = {i : randn() for i in range(7)}
data
{0: 0.9428841525856904, 1: 1.165063252749645, 2: 1.308665792696693, 3: -0.8000502965205039, 4: 0.4853678668880446, 5: 0.03887308359359395, 6: 1.9373711669042895}
>>> from numpy.random import randn
>>> data = {i : randn() for i in range(7)}
>>> print data # pequeña trampa para verlo como se vería en consola
{0: 0.6512988528977837, 1: 0.5240925908050613, 2: -0.8488047039989695, 3: 0.5773754635792333, 4: 0.13304051330295186, 5: -0.50229331002119, 6: -1.4593748753264693}
Facundo = 1
Facultad = 8
Fa = 4
Busqueda de variables en el espacio de nombres: variable_de_interés<TAB>
:
Fa
Acceso a métodos y atributos, por ejemplo, objeto_de_interés.<TAB>
:
lista = [1, 2, 3, 4, 5]
lista.
Lo mismo para los módulos, por ejemplo, modulo_de_interés.<TAB>
:
import datetime
datetime.
datetime._
Incluso para directorios, por ejemplo, carpeta_de_interés/<TAB>
:
!ls # pequeño truco para pasar comandos a consola...
1_Python_Cientifico_Intro.ipynb README.md 6_Herramientas_avanzadas.ipynb SciPyConAr_IPython.ipynb images SciPyConAr_Matplotlib.ipynb PairsTrading_0.1_Damian.ipynb SciPyConAr_NumPy.ipynb PairsTrading_0.1_etf.ipynb SciPyConAr_SciPy.ipynb random-matrix.csv scripts random-matrix.npy stockholm_td_adj.dat
scripts/
!ls scripts/
hola_mundo.py
lista?
Apliquemoslo a una función propia:
def suma(a, b):
"""
Demo de una función que suma cosas...
"""
return a + b
suma?
suma??
El "?" También puede servirnos para la busqueda en el espacio de nombres de IPython:
import numpy as np
np.*lin*?
Con el comando %run
podemos ejecutar cualquier archivo .py
en un espacio de nombres limpio, sin imports
ni variables
definidas (a menos que corramos %run -i
).
Demo:
!mkdir temporal/
!touch temporal/mi_programa.py
!ls temporal/
!cat temporal/mi_programa.py
%%bash
mkdir temporal/
touch temporal/mi_programa.py
ls temporal/
mi_programa.py
!cat temporal/mi_programa.py
# archivo vacio
%%writefile temporal/mi_programa.py
def mi_funcion(x, y):
"""
Demo
"""
return x / y
x = 4
y = 2
resultado = mi_funcion(x, y)
Overwriting temporal/mi_programa.py
!cat temporal/mi_programa.py
def mi_funcion(x, y): """ Demo """ return x / y x = 4 y = 2 resultado = mi_funcion(x, y)
%run temporal/mi_programa.py
resultado
2
%%writefile temporal/mi_programa.py
def mi_funcion(x, y):
"""
Demo
"""
return x / y
x = 4
y = 0
resultado = mi_funcion(x, y)
Overwriting temporal/mi_programa.py
%run temporal/mi_programa.py
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) /home/damian/.virtualenvs/blog/local/lib/python2.7/site-packages/IPython/utils/py3compat.pyc in execfile(fname, *where) 202 else: 203 filename = fname --> 204 __builtin__.execfile(filename, *where) /media/datos/Presentacion/SciPyConAr_Python_Cientifico/temporal/mi_programa.py in <module>() 8 y = 0 9 ---> 10 resultado = mi_funcion(x, y) /media/datos/Presentacion/SciPyConAr_Python_Cientifico/temporal/mi_programa.py in mi_funcion(x, y) 3 Demo 4 """ ----> 5 return x / y 6 7 x = 4 ZeroDivisionError: integer division or modulo by zero
Los magics son comandos que facilitan las tareas más comunes y/o permiten interaccionar y controlar IPython.
Se reconocen por estar precedidos por %
(line-magics) o %%
(cell-magics).
Explicación detallada, tenemos un magic para ello: %magic
:
%magic
%lsmagic # si queremos listar todas las magics disponibles
Available line magics: %alias %alias_magic %autocall %automagic %autosave %bookmark %cd %clear %colors %config %connect_info %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %less %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %lsmagic %macro %magic %man %matplotlib %more %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %run %save %sc %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode Available cell magics: %%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile Automagic is ON, % prefix IS NOT needed for line magics.
%quickref # referencia rápida
quickref # si %automagic está ON
OK, usemos una magic (%timeit
) a modo de ejemplo:
%timeit?
m = np.random.randn(100, 100) # matriz de números aleatorios de 100 x 100
m
array([[ 0.64201774, -0.38347844, -0.7890974 , ..., -0.46518725, -0.47730066, 0.59527553], [-1.72622707, 0.74743633, -0.85308879, ..., 1.42442569, -1.65892221, -0.16731257], [-0.51145336, -2.38426458, 0.07501939, ..., -0.5910769 , 0.51592869, -1.57094979], ..., [-0.73568139, 1.45216464, 0.06415584, ..., -1.76705521, -0.60617697, -2.12174131], [ 1.72783127, 0.94125702, -0.72083119, ..., 1.295081 , -0.3173796 , -0.32551457], [ 0.61688356, -2.44552169, 1.78567795, ..., 1.06696316, -0.60935242, -0.26821413]])
%timeit np.dot(m, m) # multiplicación vectorial de matrices
1000 loops, best of 3: 1.82 ms per loop
%timeit -n 100 -r 10 np.dot(m, m) # las magics aceptan parámetros
100 loops, best of 10: 1.82 ms per loop
Algunas magics
de uso frecuente que aun no hemos comentado:
%who
Fa Facultad Facundo a data datetime lista m mi_funcion np randn resultado suma x y
%who_ls
['Fa', 'Facultad', 'Facundo', 'a', 'data', 'datetime', 'lista', 'm', 'mi_funcion', 'np', 'randn', 'resultado', 'suma', 'x', 'y']
%whos
Variable Type Data/Info ---------------------------------------------------- Fa int 4 Facultad int 8 Facundo int 1 a int 1 data dict n=7 datetime module <module 'datetime' from '<...>ime.x86_64-linux-gnu.so'> lista list n=5 m ndarray 100x100: 10000 elems, type `float64`, 80000 bytes mi_funcion function <function mi_funcion at 0x2a9ac80> np module <module 'numpy' from '/ho<...>ages/numpy/__init__.pyc'> randn builtin_function_or_method <built-in method randn of<...>object at 0x7fc7bda98678> resultado int 2 suma function <function suma at 0x2a9a500> x int 4 y int 0
%xdel resultado
%who
Fa Facultad Facundo a data datetime lista m mi_funcion np randn suma x y
%reset
Once deleted, variables cannot be recovered. Proceed (y/[n])? y
m
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-45-69b64623f86d> in <module>() ----> 1 m NameError: name 'm' is not defined
Nota: %paste
y %cpaste
son magics
con uso frecuente en la consola de IPython.
magics
muy útiles.¶%qtconsole
%matplotlib
Using matplotlib backend: agg
Inputs
y Outputs
:
2**4
16
_
16
foo = "bar"
foo
'bar'
_i50
u'foo = "bar"\nfoo'
_50
'bar'
foo = "baz"
foo
'baz'
exec _i50
foo
'bar'
Note: Logging magics
(%logstart
, %logstate
, %logstop
, %logon
y %logoff
) son útiles en la consola de IPython.
Usamos el signo de exclamación (!
) para enviar el comando a la consola del sistema:
!pwd
/media/datos/Presentacion/SciPyConAr_Python_Cientifico
Incluso podemos capturar el output en una variable (en forma de una lista)
mes = !cal
este_mes = mes[0]
este_mes
' Septiembre 2013 '
Pueden utilizarse variables definidas en el espacio de nombres actual, precediéndolas con el signo $
:
ipy_notebooks = '*.ipynb'
!ls
1_Python_Cientifico_Intro.ipynb SciPyConAr_IPython.ipynb 6_Herramientas_avanzadas.ipynb SciPyConAr_Matplotlib.ipynb images SciPyConAr_NumPy.ipynb PairsTrading_0.1_Damian.ipynb SciPyConAr_SciPy.ipynb PairsTrading_0.1_etf.ipynb scripts random-matrix.csv stockholm_td_adj.dat random-matrix.npy temporal README.md
!ls $ipy_notebooks
1_Python_Cientifico_Intro.ipynb SciPyConAr_IPython.ipynb 6_Herramientas_avanzadas.ipynb SciPyConAr_Matplotlib.ipynb PairsTrading_0.1_Damian.ipynb SciPyConAr_NumPy.ipynb PairsTrading_0.1_etf.ipynb SciPyConAr_SciPy.ipynb
Asimismo puedo establecer "apodos" o %alias
de la siguiente forma:
%alias ld ls -l
ld
total 7772 -rw-rw-r-- 1 damian damian 22666 sep 20 13:00 1_Python_Cientifico_Intro.ipynb -rw-rw-r-- 1 damian damian 682829 sep 20 12:43 6_Herramientas_avanzadas.ipynb drwxrwxr-x 2 damian damian 4096 sep 19 15:20 images/ -rw-rw-r-- 1 damian damian 931205 sep 20 01:42 PairsTrading_0.1_Damian.ipynb -rw-rw-r-- 1 damian damian 668205 sep 19 17:41 PairsTrading_0.1_etf.ipynb -rw-rw-r-- 1 damian damian 72 sep 20 11:44 random-matrix.csv -rw-rw-r-- 1 damian damian 152 sep 20 11:44 random-matrix.npy -rw-rw-r-- 1 damian damian 782 sep 19 15:20 README.md -rw-rw-r-- 1 damian damian 43277 sep 20 13:07 SciPyConAr_IPython.ipynb -rw-rw-r-- 1 damian damian 1516905 sep 20 12:01 SciPyConAr_Matplotlib.ipynb -rw-rw-r-- 1 damian damian 66539 sep 20 12:03 SciPyConAr_NumPy.ipynb -rw-rw-r-- 1 damian damian 1107362 sep 20 12:23 SciPyConAr_SciPy.ipynb drwxrwxr-x 2 damian damian 4096 sep 19 15:20 scripts/ -rw-rw-r-- 1 damian damian 2864946 sep 19 15:20 stockholm_td_adj.dat drwxrwxr-x 2 damian damian 4096 sep 20 13:05 temporal/
El %alias
puede incluso contener varios comandos separados por (;
):
%alias l_datos (cd /media/datos; ls)
l_datos
Desarrollos Documentos Imágenes Música Programas virtualenvs Descargas Ejemplos lost+found Presentacion Vídeos
Puedo usar marcadores para directorios de uso recurrente:
%bookmark datos /media/datos
%cd datos
(bookmark:datos) -> /media/datos /media/datos
!ls
Desarrollos Documentos Imágenes Música Programas virtualenvs Descargas Ejemplos lost+found Presentacion Vídeos
%debug
(post-mortem debugger, lo inicializás después de la aparición de una excepción).%pdb
(inicializa el debugger después de cada excepción).%prun
o %run -p
(profiling en general).%lprun
(profiling por linea, necesita de line-profiler).