Cómo acelerar tu código Python con numba

Introducción

En este artículo vamos a hacer un repaso exhaustivo de cómo acelerar sustancialmente tu código Python usando numba. Ya hablamos sobre la primera versión de numba en el blog, allá por 2012, pero ha habido importantes cambios desde entonces y la herramienta ha cambiado muchísimo. Recientemente Continuum publicó numba 0.17 con una nueva documentación mucho más fácil de seguir, pero aun así no siempre queda claro cuál es el camino para hacer que funcione, como quedó patente con el artículo sobre Cython de Kiko. Por ello, en este artículo voy a aclarar qué puede y qué no puede hacer numba, cómo sacarle partido y voy a detallar un par de ejemplos exitosos que he producido en los últimos meses.

Continue reading

“Introducción a Python para científicos e ingenieros”, 2ª edición, ¡ya disponible!

Curso Python online y gratuito de introducción al lenguaje de programación Python para científicos e ingenieros. Los vídeos de este curso online se dividen en dos ediciones: la primera recoge los fundamentos de Python científico y la segunda los últimos avances introducidos en el 2015 con IPython 3 (Jupyter).

Ambas ediciones son impartidas por Juan Luis Cano (http://pybonacci.org) y han sido posibles gracias a la financiación del Instituto Universitario de Ingeniería de Procesos Químicos y la Escuela Politécnica Superior (y su delegación de alumnos) dentro de la Universidad de Alicante. Los videotutoriales de este curso se han diseñado para que sea práctico, con ejemplos extraídos de asignaturas comunes en carreras científicas y de ingeniería.

Un año más, gracias a la impagabla colaboración de CAChemE y la Universidad de Alicante, tenemos una segunda tanda de vídeos disponibles, grabados durante la segunda edición de nuestro curso de Introducción a Python para científicos e ingenieros. Más horas de material actualizado a las ultimísimas versiones, incluyendo el flamante IPython 3.0, que a día de hoy ya podéis instalar en vuestros canales habituales 😉

Si queréis leer todos los detalles del curso no os perdáis la entrada en CAChemE:

http://cacheme.org/curso-online-python-cientifico-ingenieros/

Desde aquí no puedo más que agradecer que año tras año estos alicantinos me hagan sentir mejor que en casa. Cuando tengamos un momento para respirar en Pybonacci hablaremos de IPython 3.0, Jupyter, numba y muchas más cosas. Por el momento, ¡disfrutad de los vídeos y difundid! 😀

FEniCS: Resolución de ecuaciones diferenciales en Python

Introducción

En este artículo os voy a presentar el proyecto FEniCS, una colección de bibliotecas escritas con interfaz en Python para la resolución de ecuaciones diferenciales por el método de los elementos finitos. FEniCS proporciona un método muy inteligente para automatizar los procesos más laboriosos de la solución de este tipo de ecuaciones, de forma que podemos atacar cualquier problema que se nos ocurra. Las posibilidades son inmensas y la documentación es bastante exhaustiva, así que aquí veremos una introducción a cómo resolver ecuaciones en derivadas parciales con FEniCS.

Placa rectangular simplemente apoyada resuelta con FEniCS
Placa rectangular simplemente apoyada resuelta con FEniCS

Continue reading

Introducción a Machine Learning con Python (Parte 1)

Desde que escuché hablar de Kaggle por primera vez, precisamente a través de Pybonacci, me entró curiosidad por eso del data science y me propuse como un reto el participar en una de sus competiciones. Para aquel que no la conozca todavía, Kaggle es una plataforma que aloja competiciones de análisis de datos y modelado predictivo donde compañías e investigadores aportan sus datos mientras que estadistas e ingenieros de datos de todo el mundo compiten por crear los mejores modelos de predicción o clasificación.

Muchas y muy diferentes técnicas se pueden aplicar al procesado de datos para generar predicciones, estimaciones o clasificaciones. Desde técnicas de regresión logística hasta redes neuronales artificiales pasando por redes bayesianas, máquinas de vectores de soporte o árboles de decisión, en Kaggle no descartan ningún método, e incluso se fomenta la cooperación entre personas con experiencia en diferentes campos para obtener el mejor modelo posible. Varias de estas técnicas se encuadran dentro de lo que es el Machine Learning, o aprendizaje automático, que nos explica Jeremy Howard en el siguiente vídeo.

Sigue leyendo... >

Cursos #AeroPython: algunas conclusiones

La semana pasada clausuramos nuestro segundo curso de Python para aeronáuticos con unas más que exitosas PyCañas (¡lamentablemente sin testimonio gráfico!) y fue incluso más emocionante que la primera edición. Hemos pulido el material, hemos progresado como profesores y como programadores y nuestros alumnos han acabado muy contentos. Me gustaría compartir un par de reflexiones por vosotros.

AeroPython

Por un lado, ciñéndonos solamente a los resultados de la encuesta de satisfacción, hemos mejorado en todos los aspectos:

Continue reading

Palabras usadas en Python (palabras clave y builtins)

Hace poco estuve incluyendo autocompletado de código Python3 en un editor online (pyschool.net) destinado a la educación que se está desarrollando dentro del proyecto Brython.

El editor online que se usa es Ace (el notebook de IPython usa codemirror). El modo Python de Ace incluye palabras de Python2 y Brython implementa Python3 por lo que el resaltado de código y autocompletado oficial incluido con Ace no se ajusta a lo que se quería usar en pyschool.net. Para solventar esto creé el modo Python3 que se usa en el editor online (y que próximamente también podréis ver y usar en el editor oficial en Brython.info). Pero había que saber qué palabras incluir en el resaltado y autocompletado de Ace (ya estoy llegando a lo que quería mostrar). Y como Python es tan increible y tiene módulos para todo podéis hacer lo siguiente para obtener las palabras clave (keywords):

import keyword
print(keyword.kwlist)

Que dará como resultado:

['False', 'None', 'True', 'and', 'as', 'assert', 
'break', 'class', 'continue', 'def', 'del', 'elif', 
'else', 'except', 'finally', 'for', 'from', 'global', 
'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 
'not', 'or', 'pass', 'raise', 'return', 'try', 
'while', 'with', 'yield']

Y podéis obtener las funciones integradas (builtins) usando:

import builtins
print(dir(builtins))

Que dará como resultado:

['ArithmeticError', 'AssertionError', 'AttributeError', 
'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 
'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 
'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 
'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 
'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError',
'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 
'LookupError', 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 
'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 
'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 
'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 
'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 
'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', 
'__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', 
'__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 
'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 
'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 
'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 
'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 
'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 
'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 
'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

Limpio, fácil, rápido. Es tan eficiente que me ha sobrado tiempo para escribir esta entrada!!!

Espero que a alguien le sirva en algún momento.

Saludos.

P.D.: Si alguien quiere incluir el modo Python3 que hemos incluido en Ace dentro de Brython lo puede encontrar aquí.

Curso de Python en la ETSIAE: 2ª edición

Nota: Esta entrada se refiere a una edición pasada del curso. Puedes leer los detalles sobre la cuarta edición del curso de Python en el blog.

¡Tenemos el placer de anunciar la segunda edición de nuestro curso de Python para aeronáuticos! Como la primera, durará 18 horas y este es el temario:

  1. Introducción a la sintaxis de Python
  2. Uso del Notebook de IPython
  3. Arrays de NumPy
  4. Representación gráfica con matplotlib
  5. Análisis numérico con SciPy
  6. Cálculo simbólico con SymPy

El curso se desarrollará en las aulas de informática de la ETSI Aeronáutica y del Espacio a lo largo de tres semanas, con el siguiente horario:

  • Lunes 13 de octubre: aula B-106, 16:00-19:00
  • Jueves 16 de octubre: aula B-204, 16:00-19:00
  • Lunes 20 de octubre: aula B-106, 16:00-19:00
  • Jueves 23 de octubre: aula B-106aula B-204, 16:00-19:00
  • Martes 28Lunes 27 de octubre: aula B-106B-204, 16:00-19:00
  • Jueves 30Miércoles 29 de octubre: aula B-204, 16:00-19:00

Continue reading

Gráficas interactivas con Plotly

Podéis conseguir el notebook y los archivos asociados en GitHub.

En un artículo anterior ya vimos como pasar las gráficas creadas con matplotlib a plotly para obtener cierto nivel de interacción con los datos en la web. Ahora, lo que vamos a ver es cómo crear gráficas directamente con plotly. Para ello vamos a utilizar:

  • pandas 0.14.1, para trabajar con tablas de datos.
  • plotly 1.2.6, para crear las gráficas.

Importamos los paquetes de la manera habitual en cada caso.

import pandas as pd
import plotly.plotly as py
from plotly.graph_objs import *

En el caso de Plotly hemos importado además unos objetos graph_objs que nos serán de ayuda a la hora de crear las gráficas. Trabajar con la API de Plotly en Python se resume en trabajar con listas y diccionarios de Python. Los graph_objs de Plotly nos ayudarán a trabajar con estas listas y diccionarios proporcionando ayuda y validando los datos y parámetros introducidos.

Entre los objetos que importamos tenemos los bloques principales de trabajo:

  • Figure, diccionario que representa la figura a representar en plotly.
  • Data, lista para englobar todos los trazos a representar en una gráfica, ya sean tipo Scatter, Heatmap, Box, etc.
  • Layout, diccionario que define los detalles de la disposición de la figura.

Sigue leyendo

Liberado poliastro 0.2: Mecánica Orbital y Astrodinámica en Python

Después de meses de trabajo he liberado poliastro 0.2.0, una biblioteca Python y Fortran destinada a estudiar problemas de Mecánica Orbital y Astrodinámica en Python:

https://pybonacci.github.io/poliastro

La versión 0.1.0 nació en 2013 mientras estudiaba Orbital Mechanics en el Politecnico di Milano: tomé unas subrutinas escritas en Fortran por el profesor David A. Vallado para su libro "Fundamentals of Astrodynamics and Applications" y escribí una interfaz en Python para poder optimizar una transferencia entre la Tierra y Venus.

Sin embargo la biblioteca era muy engorrosa de utilizar y tuve muchos problemas a la hora de manejar cantidades con unidades. Inspirado por el paquete abandonado Plyades, decidí refactorizar drásticamente todo el código y el resultado es poliastro 0.2.

Gracias al módulo astropy.units es sencillo utilizar cantidades con unidades que se integran de manera casi transparente con NumPy. Además, he incluido un módulo para representar órbitas en dos dimensiones con matplotlib y he cambiado la forma en la que se usa la biblioteca.

Continue reading

Anunciado coLaboratory: IPython/Jupyter + Google

Google anunció ayer oficialmente el proyecto coLaboratory, una nueva herramienta para «hacer análisis de datos» que no es ni más ni menos que la integración del notebook de IPython/Jupyter y los productos de Google, especialmente Google Drive.

El ecosistema Python científico sigue avanzando a un ritmo frenético y el proyecto IPython (que ahora se llama Jupyter) va a la cabeza. Después de que Fernando Pérez anunciase en la última y épica SciPy celebrada en Austin, TX que iban a separar la parte del notebook que no depende del lenguaje para crear el proyecto Jupyter, ahora se ven los frutos de las nuevas alianzas que ha creado el equipo de desarrollo y que seguramente supondrán una revolución en el corto plazo.

Como explican desde Google, coLaboratory corre en Google Chrome gracias a su tecnología PNaCl y la aplicación para el navegador lleva incorporadas todas las bibliotecas de Python necesarias, de tal forma que es extremadamente fácil de instalar. Será posible editar notebooks como si fuesen documentos de Google Drive y colaborar entre varias personas.

Nuevo notebook
Nuevo notebook

Aunque sin duda lo más impactante es la posibilidad de crear componentes gráficos interactivos a partir de código. Como se ve en la imagen, en el código de una celda podemos añadir unos comentarios especiales que generan elementos como deslizadores, menús desplegables... y que el programador puede ocultar el código y mostrar solo esa parte gráfica, mejorando enormemente la experiencia del usuario no programador.

Las posibilidades de coLaboratory parecen infinitas. Yo al menos no lo probaré hasta después del verano, pero si alguien se atreve a instalar Chrome beta y a hacer sus primeros experimentos que no dude en contarnos sus experiencias e incluso mandarnos un artículo al blog 😉