Repaso a PyData 2013

Unos días después de la PyConUS 2013 se celebró la primera PyData del año (creo que serán semestrales de forma regular aunque el tiempo dirá). Entre las charlas había algunas introductorias, otras más avanzadas y otras enseñando aplicaciones prácticas.

Entre las charlas introductorias destacaremos:

Introducción a Numpy por Bryan Van De Ven: si no conoces absolutamente nada de Numpy esta es tu charla. Da un repaso por las cosas más frecuentes del uso de Numpy sin meterse en cosas muy esotéricas. Puedes sacar la libreta e ir apuntando las cosas que creas que te puedan resultar útiles para tus análisis.

Pandas por Wes McKinney: Es una charla introductoria. El problema que veo es que Pandas no es algo tan centrado como Numpy con su ndarray, las posibilidades de uso son múltiples y, quizá, hacer algo introductorio en vídeo sobre Pandas no resulte tan sencillo como  hacerlo con Numpy. En general, la documentación de Pandas es aceptable (aunque incompleta en algunos momentos) y la veo como un buen punto de partida antes de empezar a ver vídeos sobre Pandas. Creo que lo mejor para empezar con Pandas es echarle un ojo al tour de 10 minutos en vídeo o en texto) y luego empezar a trastear con la librería y con la documentación para empezar a entenderlo. Por nuestra parte, estamos preparando nuestro tutorial cuyos primeros capítulos estaran disponibles en breve, stay tuned!!!! En esta conferencia ha habido más vídeos sobre Pandas pero son más avanzados (primero para marujear con datos de forma productiva, segundo (con numpy y statsmodels) para análisis de series temporales) .

Aprendiendo Python por Peter Norvig: Otro tutorial más para empezar con Python!!

Hacer bonitos gráficos con MatPlotLib por Mike Müller: Otro más avanzado muestra como hacer MatPlotLib más interactivo gracias al gran Jake Vanderplas. Os dejamos aquí nuestro tutorial de matplotlib por si alguno no lo conoce aún (#autobombo).

Visualización de datos con NodeBox por Lynn Cherny: Librería para hacer gráficos más 'artísticos'. Yo tengo sentimientos encontrados con algunos enfoques de este tipo de gráficos (NodeBox, D3,...) por lo que te recomiendo mejor verlo y, si alguien quiere, lo discutimos en los comentarios.

Scikit-image por Davin Potts: Creo que esta librería es una de las grandes desconocidas y ofrece unas posibilidades muy interesantes. Si no la conoces deberías echarle un ojo al vídeo.

Entre las que hablan sobre cosas más prácticas y no específicamente de librerías destacaría (alguna no porque me haya gustado especialmente):

Análisis de redes sociales por Katherine Chuang: Estas están muy de moda (teoría de grafos) y están empezando a ser aburridas si no muestran algo excepcional o no sacan conclusiones **medibles** de todo el análisis chachiguay que hacen. Usa NetworkX, también muy de moda.

Plataforma de datos espacio temporales para el océano por André Karpistsenko: Esta me ha parecido interesante ya que muestra todo el pifostio de tecnologías y trabajo que hay detrás de muchas webs a las que voy a descargarme datos para mis análisis.

Hay más charlas avanzadas que hablan de HDF5 ([1]), Machine Learning ([1], [2], [3]), Blaze (el futuro de Numpy), IPython y más cosas del Big Data y herramientas Python para lidiar con ello.

Si le echáis un ojo a algún vídeo, por favor, dejad algún comentario más abajo para saber lo que os ha parecido.

Saludos y espero veros pronto entre esa gran cantidad de datos :-P

Creando una animación con matplotlib y ffmpeg

En esta nueva entrada vamos a ver una revisión rápida al módulo animation en matplotlib, disponible desde la versión 1.1 de matplotlib.

[Para esta entrada se ha usado matplotlib 1.1.1, numpy 1.6.1, ipython 0.13 sobre python 2.7.3 y ffmpeg como librería externa que usará matplotlib para crear el video de la animación (aunque también puede usar mencoder)] todo ello corriendo en linux. Puede que los usuarios de windows tengan problemas al guardar el video si ffmpeg no está instalado y/o correctamente configurado para que matplotlib pueda trabajar con ffmpeg.

Hay varias formas de hacer una animación usando FuncAnimation, ArtistAnimation y/o TimedAnimation. Las dos primeras formas son clases que heredan de la tercera mientras que la tercera hereda de la clase base Animation.

Para este ejemplo de como hacer una animación con matplotlib y ffmpeg vamos a usar FuncAnimation y vamos a representar la evolución de un atractor de Lorenz en 3D.

Continue reading

El notebook de IPython

Introducción

Ya hablamos en su momento de IPython, un intérprete de Python con multitud de características avanzadas que lo hacían indispensable para ejecutar sesiones interactivas. Hoy vamos a continuar con lo que habíamos dejado a medias, y vamos a dedicar un artículo al notebook de IPython, una herramienta que está verdaderamente revolucionando la manera en que se utiliza Python en ámbitos científicos y conferencias sobre el lenguaje, como se ha demostrado en la reciente PyData NYC 2012 que se ha celebrado en Nueva York (recuerda que en Pybonacci hemos seleccionado un resumen de charlas de la PyData NYC 2012).

https://twitter.com/dfm/status/262245974334918656

Aquí incluimos un vídeo que hemos grabado para mostrar las características fundamentales de IPython, porque ya se sabe que un vídeo vale más que mil imágenes ;) No olvides suscribirte a nuestro canal en YouTube para futuras creaciones.

El notebook de IPython

El notebook de IPython es una interfaz web para IPython, inspirada en los notebooks de Mathematica y Sage. Como puedes leer en esta retrospectiva histórica escrita por Fernando Pérez, la idea de crear una interfaz de este tipo ya existía desde los inicios del proyecto IPython, allá por 2001, y después de muchos años, varios intentos fallidos y habiendo aprendido de la experiencia del propio notebook de Sage, que surgió antes pero estaba mucho menos pulido, fue finalmente presentado en la conferencia EuroSciPy 2011.

Continue reading

La importancia de inspeccionar los datos

Muchas veces, cuando analizo datos, se me cuelan datos erróneos que me llevan a dolores de cabeza posteriores. Para evitar o minimizar esto, una buena práctica consiste en realizar una representación previa de esos datos para ver si los resultados posteriores son coherentes. Un buen ejercicio para entender la importancia de esto es echarle un ojo al cuartero de Anscombe. En el siguiente script se representa el cuarteto de Anscombe y sus principales estadísticos:

import numpy as np
import matplotlib.pyplot as plt
plt.ion()
ans_x_I = np.array([10.0, 8.0, 13.0, 9.0, 11.0,
                    14.0, 6.0, 4.0, 12.0, 7.0, 5.0])
ans_y_I = np.array([8.04, 6.95, 7.58, 8.81, 8.33,
                    9.96, 7.24, 4.26, 10.84, 4.82, 5.68])
ans_x_II = np.array([10.0, 8.0, 13.0, 9.0, 11.0,
                     14.0, 6.0, 4.0, 12.0, 7.0, 5.0])
ans_y_II = np.array([9.14, 8.14, 8.74, 8.77, 9.26,
                     8.10, 6.13, 3.10, 9.13, 7.26, 4.74])
ans_x_III = np.array([10.0, 8.0, 13.0, 9.0, 11.0,
                      14.0, 6.0, 4.0, 12.0, 7.0, 5.0])
ans_y_III = np.array([7.46, 6.77, 12.74, 7.11, 7.81,
                      8.84, 6.08, 5.39, 8.15, 6.42, 5.73])
ans_x_IV = np.array([8.0, 8.0, 8.0, 8.0, 8.0,
                     8.0, 8.0, 19.0, 8.0, 8.0, 8.0])
ans_y_IV = np.array([6.58, 5.76, 7.71, 8.84, 8.47,
                     7.04, 5.25, 12.50, 5.56, 7.91, 6.89])
x = [ans_x_I, ans_x_II, ans_x_III, ans_x_IV]
y = [ans_y_I, ans_y_II, ans_y_III, ans_y_IV]
def pinta(x, y, grupo, pos):
    plt.subplot(pos)
    minimo = np.min([x, y])
    maximo = np.max([x, y])
    plt.xlim(minimo - 1, maximo + 1)
    plt.ylim(minimo - 1, maximo + 1)
    plt.plot(x[grupo], y[grupo], 'yo')
    a1, a0 = np.polyfit(x[grupo], y[grupo], 1)
    plt.plot(x[grupo], a0 + a1 * x[grupo], 'b')
    plt.text(minimo, maximo - 0.5, 'y=%5.3f+%5.3fx' % (a0, a1))
    plt.text(minimo, maximo - 2.0, 'r=%5.3f' % np.corrcoef(x[grupo], y[grupo])[0,1])
    plt.text(minimo, maximo - 3.5, 'x media=%5.3f' % np.mean(x[grupo]))
    plt.text(minimo, maximo - 5, 'y media=%5.3f' % np.mean(y[grupo]))
    plt.text(minimo, maximo - 6.5, 'x std=%5.3f' % np.var(x[grupo]))
    plt.text(minimo, maximo - 8.0, 'y std=%5.3f' % np.var(y[grupo]))
pinta(x, y, 0, 221)
pinta(x, y, 1, 222)
pinta(x, y, 2, 223)
pinta(x, y, 3, 224)

Cuyo resultado sería el siguiente:

Se observa que los estadísticos representados son similares. Mismo ajuste lineal, coeficiente de correlación, media de los valores de x, media de los valores de y, varianza de los valores de x y varianza de los valores de y. Sin embargo, viendo los datos representados vemos que en el segundo no deberíamos usar un ajuste lineal para relacionar los valores de x y de y, en el tercer y cuarto grupos vemos que tenemos un dato que podría representar un dato erróneo (una mala medida, por ejemplo) y que en el tercer caso, al no haberlo filtrado correctamente, obtenemos un ajuste que nos llevaría a errores apreciables en el ajuste de los datos y en el cuarto caso nos llevaría a errores muy grandes en el ajuste de los datos mostrando una relación lineal que no parece existir.

Gracias a este plagio que acabo de hacer del artículo de la Wikipedia (traducido a python :-)) vemos la importancia de tratar nuestros datos con mimo, de realizar exploraciones iterativas y de refinar el conjunto final de datos 'limpios de impurezas' para hacer un análisis correcto de la 'realidad'. También vemos la importancia de compartir los datos base de los experimentos así como el código usado para el análisis de los mismos para que otros puedan reproducir los resultados y comprobar la veracidad de los mismos o poder corregir el análisis en caso necesario.

Finalmente os dejo un delirante vídeo de una charla TED de Hans Rosling donde se muestra la necesidad de mostrar de forma creativa los datos para poder llegar a un mejor entendimiento del universo que nos rodea.

P.D.: Sirva esta entrada para volver a homenajear a John Hunter y darle las gracias por permitirnos, mediante matplotlib, separarnos de los árboles para poder ver el bosque.

P.D.2: ¡¡¡¡¡No dejéis de ver el vídeo!!!!!