#!/usr/bin/env python # coding: utf-8 # # Python - Librerías esenciales para el analisis de datos # *Esta notebook fue creada originalmente como un blog post por [Raúl E. López Briega](http://relopezbriega.com.ar/) en [Mi blog sobre Python](http://relopezbriega.github.io). El contenido esta bajo la licencia BSD.* # En mi [artículo anterior](http://relopezbriega.github.io/blog/2014/05/25/mi-python-blog-introduccion-a-python/) hice una breve introducción al mundo de [Python](http://python.org/), hoy voy a detallar algunas de las librerías que son esenciales para trabajar con [Python](http://python.org/) en la comunidad científica o en el análisis de datos. # # Una de las grandes ventajas que ofrece [Python](http://python.org/) sobre otros lenguajes de programación, además de que es que es mucho más fácil de aprender; es lo grande y prolifera que es la comunidad de desarrolladores que lo rodean; comunidad que ha contribuido con una gran variedad de librerías de primer nivel que extienden la funcionalidades del lenguaje. Vamos a poder encontrar una librería en [Python](http://python.org/) para prácticamente cualquier cosa que se nos ocurra. # # Algunas de las librerías que se han vuelto esenciales y ya forman casi parte del lenguaje en sí mismo son las siguientes: # ## Numpy # [Numpy](http://www.numpy.org/), abreviatura de Numerical [Python](http://python.org/) , es el paquete fundamental para la computación científica en [Python](http://python.org/). Dispone, entre otras cosas de: # # * Un objeto matriz multidimensional *ndarray*,rápido y eficiente. # * Funciones para realizar cálculos elemento a elemento u otras operaciones matemáticas con matrices. # * Herramientas para la lectura y escritura de los conjuntos de datos basados matrices. # * Operaciones de [álgebra lineal](http://es.wikipedia.org/wiki/%C3%81lgebra_lineal), [transformaciones de Fourier](http://es.wikipedia.org/wiki/Transformada_de_Fourier), y generación de números aleatorios. # * Herramientas de integración para conectar [C](http://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n), [C++](http://es.wikipedia.org/wiki/C%2B%2B) y [Fortran](http://es.wikipedia.org/wiki/Fortran) con [Python](http://python.org/) # # Más allá de las capacidades de procesamiento rápido de matrices que [Numpy](http://www.numpy.org/) añade a [Python](http://python.org/), uno de sus # propósitos principales con respecto al análisis de datos es la utilización de sus [estructuras de datos](http://es.wikipedia.org/wiki/Estructura_de_datos) como contenedores para transmitir los datos entre diferentes algoritmos. Para datos numéricos , las matrices de [Numpy](http://www.numpy.org/) son una forma mucho más eficiente de almacenar y manipular datos que cualquier otra de las [estructuras de datos](http://es.wikipedia.org/wiki/Estructura_de_datos) estándar incorporadas en [Python](http://python.org/). Asimismo, librerías escritas en un lenguaje de bajo nivel, como [C](http://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n) o [Fortran](http://es.wikipedia.org/wiki/Fortran), pueden operar en los datos almacenados en matrices de [Numpy](http://www.numpy.org/) sin necesidad de copiar o modificar ningún dato. # # Como nomenclatura general, cuando importamos la librería [Numpy](http://www.numpy.org/) en nuestro programa [Python](http://python.org/) se suele utilizar la siguiente: # In[1]: import numpy as np # ### Creando matrices en Numpy # Existen varias maneras de crear matrices en Numpy, por ejemplo desde: # # * Una *lista* o *tuple* de [Python](http://python.org/) # * Funciones específicas para crear matrices como `arange`, `linspace`, etc. # * Archivos planos con datos, como por ejemplo archivos .csv # # En [Numpy](http://www.numpy.org/) tanto los vectores como las matrices se crean utilizando el objeto `ndarray` # In[2]: #Creando un vector desde una lista de Python vector = np.array([1, 2, 3, 4]) vector # In[3]: #Para crear una matriz, simplemente le pasamos una lista anidada al objeto array de Numpy matriz = np.array([[1, 2], [3, 4]]) matriz # In[4]: #El tipo de objeto de tanto de los vectores como de las matrices es ndarray type(vector), type(matriz) # In[5]: #Los objetos ndarray de Numpy cuentan con las propiedades shape y size que nos muestran sus dimensiones. print vector.shape, vector.size print matriz.shape, matriz.size # #### Utilizando funciones para crear matrices # In[6]: #arange #La funcion arange nos facilita la creación de matrices x = np.arange(1, 11, 1) # argumentos: start, stop, step x # In[7]: #linspace #linspace nos devuelve un vector con la cantidad de muestras que le ingresemos y separados uniformamente entre sí. np.linspace(1, 25, 25) # argumentos: start, stop, samples # In[8]: #mgrid #Con mgrid podemos crear arrays multimensionales. x, y = np.mgrid[0:5, 0:5] x # In[9]: y # In[10]: #zeros y ones #Estas funciones nos permiten crear matrices de ceros o de unos. np.zeros((3,3)) # In[11]: np.ones((3,3)) # In[12]: #random.randn #Esta funcion nos permite generar una matriz con una distribución estándar de números. np.random.randn(5,5) # In[13]: #diag #Nos permite crear una matriz con la diagonal de números que le ingresemos. np.diag([1,1,1]) # ## Matplotlib # [Matplotlib](http://matplotlib.org/) es la librería más popular en [Python](http://python.org/) para visualizaciones y gráficos. [Matplotlib](http://matplotlib.org/) puede producir gráficos de alta calidad dignos de cualquier publicación científica. # # Algunas de las muchas ventajas que nos ofrece [Matplotlib](http://matplotlib.org/), incluyen: # # * Es fácil de aprender. # * Soporta texto, títulos y etiquetas en formato $\LaTeX$. # * Proporciona un gran control sobre cada uno de los elementos de las figuras, como ser su tamaño, el trazado de sus líneas, etc. # * Nos permite crear gráficos y figuras de gran calidad que pueden ser guardados en varios formatos, como ser: PNG, PDF, SVG, EPS, y PGF. # # [Matplotlib](http://matplotlib.org/) se integra de maravilla con [IPython](http://ipython.org/) (ver más abajo), lo que nos proporciona un ambiente confortable para las visualizaciones y la exploración de datos interactiva. # # # ### Algunos gráficos con Matplotlib # In[14]: #Generalmente se suele importar matplotlib de la siguiente forma. import matplotlib.pyplot as plt # Ahora vamos a graficar la siguiente función. # # $$f(x) = e^{-x^2}$$ # In[15]: # Definimos nuestra función. def f(x): return np.exp(-x ** 2) # In[16]: #Creamos un vector con los puntos que le pasaremos a la funcion previamente creada. x = np.linspace(-1, 5, num=30) # In[17]: #Representeamos la función utilizando el objeto plt de matplotlib plt.xlabel("Eje $x$") plt.ylabel("$f(x)$") plt.legend() plt.title("Funcion $f(x)$") plt.grid(True) fig = plt.plot(x, f(x), label="Función f(x)") # In[18]: #Grafico de puntos con matplotlib N = 100 x1 = np.random.randn(N) #creando vector x y1 = np.random.randn(N) #creando vector x s = 50 + 50 * np.random.randn(N) #variable para modificar el tamaño(size) c = np.random.randn(N) #variable para modificar el color(color) plt.scatter(x1, y1, s=s, c=c, cmap=plt.cm.Blues) plt.grid(True) plt.colorbar() fig = plt.scatter(x1, y1) # ### Interfase orientada a objetos de matplotlib # La idea principal con la [programación orientada a objetos](http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos) es que a los objetos que se pueden aplicar funciones y acciones, y ningún objeto debería tener un estado global (como en el caso de la interfase con plt que acabamos de utilizar). La verdadera ventaja de este enfoque se hace evidente cuando se crean más de una figura, o cuando una figura contiene más de una trama secundaria. # # Para utilizar la [API](http://es.wikipedia.org/wiki/API) [orientada a objetos](http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos) comenzamos de forma similar al ejemplo anterior, pero en lugar de crear una nueva instancia global de `plt`, almacenamos una referencia a la recientemente creada figura en la variable `fig`, y a partir de ella creamos un nuevo eje `ejes` usando el método `add_axes` de la instancia `Figure`: # # In[19]: x = linspace(0, 5, 10) # Conjunto de puntos y = x ** 2 # Funcion fig = plt.figure() axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # Eje principal axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # Eje secundario # Figura principal axes1.plot(x, y, 'r') axes1.set_xlabel('x') axes1.set_ylabel('y') axes1.set_title('Ej OOP') # Insertada axes2.plot(y, x, 'g') axes2.set_xlabel('y') axes2.set_ylabel('x') axes2.set_title('insertado'); # In[20]: # Ejemplo con más de una figura. fig, axes = plt.subplots(nrows=1, ncols=2) for ax in axes: ax.plot(x, y, 'r') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_title('titulo') fig.tight_layout() # ## IPython # [IPython](http://ipython.org/) promueve un ambiente de trabajo de *ejecutar-explorar* en contraposición al tradicional modelo de desarrollo de software de *editar-compilar-ejecutar*. Es decir, que el problema computacional a resolver es más visto como todo un proceso de ejecucion de tareas, en lugar del tradicional modelo de producir una respuesta(`output`) a una pregunta(`input`). [IPython](http://ipython.org/) también provee una estrecha integración con nuestro sistema operativo, permitiendo acceder fácilmente a todos nuestros archivos desde la misma herramienta. # # Algunas de las características sobresalientes de [IPython](http://ipython.org/) son: # # * Su poderoso shell interactivo. # * [Notebook](http://ipython.org/notebook.html), su interfase web con soporte para código, texto, expresiones matemáticas, gráficos en línea y multimedia. # * Su soporte para poder realizar visualizaciones de datos en forma interactiva. [IPython](http://ipython.org/) esta totalmente integrado con [matplotlib](http://matplotlib.org/). # * Su simple y flexible interfase para trabajar con la [computación paralela](http://es.wikipedia.org/wiki/Computaci%C3%B3n_paralela). # # [IPython](http://ipython.org/) es mucho más que una librería, es todo un ambiente de trabajo que nos facilita enormemente trabajar con [Python](http://python.org/); las mismas páginas de este blog están desarrolladas con la ayuda del fantástico [Notebook](http://ipython.org/notebook.html) de [IPython](http://ipython.org/). (para ver el [Notebook](http://ipython.org/notebook.html) en el que se basa este artículo, visiten el siguiente [enlace](http://nbviewer.ipython.org/github/relopezbriega/relopezbriega.github.io/blob/master/downloads/Python-Librerias-esenciales.ipynb).) # # Para más información sobre [IPython](http://ipython.org/) y algunas de sus funciones los invito también a visitar el [artículo](http://relopezbriega.com.ar/2014/python/ipython-y-la-computacion-interactiva/) que escribí en mi otro [blog](http://relopezbriega.com.ar/). # ## Pandas # [Pandas](http://pandas.pydata.org/) es una librería [open source](http://es.wikipedia.org/wiki/C%C3%B3digo_abierto) que aporta a [Python](http://python.org/) unas estructuras de datos fáciles de user y de alta performance, junto con un gran número de funciones esenciales para el análisis de datos. Con la ayuda de [Pandas](http://pandas.pydata.org/) podemos trabajar con *datos estructurados* de una forma más rápida y expresiva. # # Algunas de las cosas sobresalientes que nos aporta [Pandas](http://pandas.pydata.org/) son: # # * Un rápido y eficiente objeto **`DataFrame`** para manipular datos con indexación integrada; # * herramientas para la **lectura y escritura de datos** entre estructuras de datos rápidas y eficientes manejadas en memoria, como el `DataFrame`, con la mayoría de los formatos conocidos para el manejo de datos, como ser: CSV y archivos de texto, archivos Microsoft Excel, bases de datos [SQL](http://es.wikipedia.org/wiki/SQL), y el formato científico HDF5. # * Proporciona una **alineación inteligente de datos** y un manejo integrado de los datos faltantes; con estas funciones podemos obtener una ganancia de performace en los cálculos entre `DataFrames` y una fácil manipulación y ordenamiento de los datos de nuestro `data set`; # * Flexibilidad para **manipular y redimensionar** nuestro `data set`, facilidad para construir [tablas pivote](http://es.wikipedia.org/wiki/Tabla_pivote); # * La posibilidad de **filtrar los datos, agregar o eliminar columnas** de una forma sumamente expresiva; # * Operaciones de ***merge* y *join*** altamente eficientes sobre nuestros conjuntos de datos; # * **Indexación jerárquica** que proporciona una forma intuitiva de trabajar con datos de alta dimensión en una estructura de datos de menor dimensión ; # * Posibilidad de realizar cálculos agregados o transformaciones de datos con el poderoso motor **`group by`** que nos permite dividir-aplicar-combinar nuestros conjuntos de datos; # * combina las **características de las matrices de alto rendimiento de [Numpy](http://www.numpy.org/) con las flexibles capacidades de manipulación de datos de las hojas de cálculo** y bases de datos relacionales (tales como [SQL](http://es.wikipedia.org/wiki/SQL)); # * Gran número de funcionalidades para el manejo de **[series de tiempo](http://es.wikipedia.org/wiki/Serie_temporal)** ideales para el análisis financiero; # * Todas sus funciones y estructuras de datos están **optimizadas para el alto rendimiento**, con las partes críticas del código escritas en [Cython](http://www.cython.org/) o [C](http://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n); # ### Estructuras de datos de Pandas # In[21]: # Importando pandas import pandas as pd # #### Series # In[22]: # Las series son matrices de una sola dimension similares a los vectores, pero con su propio indice. # Creando una Serie serie = pd.Series([2, 4, -8, 3]) serie # In[23]: # podemos ver tantos los índices como los valores de las Series. print serie.values print serie.index # In[24]: # Creando Series con nuestros propios índices. serie2 = pd.Series([2, 4, -8, 3], index=['d', 'b', 'a', 'c']) serie2 # In[25]: # Accediendo a los datos a través de los índices print serie2['a'] print serie2[['b', 'c', 'd']] print serie2[serie2 > 0] # #### DataFrame # In[26]: # El DataFrame es una estructura de datos tabular similar a las hojas de cálculo de Excel. # Posee tanto indices de columnas como de filas. # Creando un DataFrame. data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year' : [2000, 2001, 2002, 2001, 2002], 'pop' : [1.5, 1.7, 3.6, 2.4, 2.9]} frame = pd.DataFrame(data) # Creando un DataFrame desde un diccionario frame # In[27]: # Creando un DataFrame desde un archivo. get_ipython().system("cat 'dataset.csv' # ejemplo archivo csv.") # In[28]: # Leyendo el archivo dataset.csv para crear el DataFrame frame2 = pd.read_csv('dataset.csv', header=0) frame2 # In[29]: # Seleccionando una columna como una Serie frame['state'] # In[30]: # Seleccionando una línea como una Serie. frame.ix[1] # In[31]: # Verificando las columnas frame.columns # In[32]: # Verificando los índices. frame.index # ## Otras librerías dignas de mencion # Otras librerías que también son muy importantes para el análisis de datos con [Python](http://python.org/) son: # ### SciPy # [SciPy](http://www.scipy.org/) es un conjunto de paquetes donde cada uno ellos ataca un problema distinto dentro de la computación científica y el análisis numérico. Algunos de los paquetes que incluye, son: # # * **`scipy.integrate`**: que proporciona diferentes funciones para resolver problemas de integración numérica. # * **`scipy.linalg`**: que proporciona funciones para resolver problemas de álgebra lineal. # * **`scipy.optimize`**: para los problemas de optimización y minimización. # * **`scipy.signal`**: para el análisis y procesamiento de señales. # * **`scipy.sparse`**: para matrices dispersas y solucionar sistemas lineales dispersos # * **`scipy.stats`**: para el análisis de estadística y probabilidades. # # ### Scikit-learn # [Scikit-learn](http://scikit-learn.org/stable/) es una librería especializada en algoritmos para [data mining](http://es.wikipedia.org/wiki/Miner%C3%ADa_de_datos) y [machine learning](http://es.wikipedia.org/wiki/Machine_learning). # # Algunos de los problemas que podemos resolver utilizando las herramientas de [Scikit-learn](http://scikit-learn.org/stable/), son: # # * Clasificaciones: Identificar las categorías a que cada observación del conjunto de datos pertenece. # * Regresiones: Predecire el valor continuo para cada nuevo ejemplo. # * Agrupaciones: Agrupación automática de objetos similares en un conjunto. # * Reducción de dimensiones: Reducir el número de variables aleatorias a considerar. # * Selección de Modelos: Comparar, validar y elegir parámetros y modelos. # * Preprocesamiento: Extracción de características a analizar y normalización de datos.