Carga y manipulación de datos con pandas

pandas es una biblioteca de análisis de datos en Python que nos provee de las estructuras de datos y herramientas para realizar análisis de manera rápida. Se articula sobre la biblioteca NumPy y nos permite enfrentarnos a situaciones en las que tenemos que manejar datos reales que requieren seguir un proceso de carga, limpieza, filtrado, reduccióń y análisis.

En esta clase veremos como cargar y guardar datos, las características de las pricipales estructuras de pandas y las aplicaremos a algunos problemas.

Se trata de una biblioteca muy extensa y que sigue evolucionando, por lo que lleva tiempo conocer todas las posibilidades que ofrece. La mejor forma de aprender pandas es usándolo, por lo que ¡nos ahorraremos la introducción e iremos directos al grano!


In [ ]:
# Importamos pandas

Cargando los datos y explorándolos

Trabajaremos sobre un fichero de datos metereológicos de la Consejeria Agricultura Pesca y Desarrollo Rural Andalucía.


In [ ]:


In [ ]:
# Vemos qué pinta tiene el fichero
# (esto es un comando de la terminal, no de python
# y solo funcionará en Linux o MAC)

Vemos que los datos no están en formato CSV, sino que la delimitación son espacios. Si intentamos cargarlos con pandas no tendremos mucho éxito:


In [ ]:
# Tratamos de cargarlo en pandas

Tenemos que hacer los siguientes cambios:

  • Separar los campos por un número arbitrario de espacios en blanco.
  • Saltar las primeras líneas.
  • Dar nombres nuevos a las columnas.
  • Descartar la columna del día del año (podemos calcularla luego).
  • Parsear las fechas en el formato correcto.

La aproximación clásica a este tipo de problemas es hacer una lectura línea a línea en la que vayamos "parseando" los datos del fichero, de acuerdo al formato que esperamos recibir y nos protejamos cuando, no se cumpla la estructura.

Sin embargo, gracias a pandas podremos reducir nuestro esfuerzo drásticamente, dando a la función read_csv algunas indicaciones sobre el formato de nuestros datos


In [ ]:
#     date_parser=lambda x: pd.datetime.strptime(x, '%d-%m-%y'),  # Parseo manual
# Ordenando de más antigua a más moderna
# Mostrando sólo las primeras o las últimas líneas

Las fechas también se pueden parsear de manera manual con el argumento:

date_parser=lambda x: pd.datetime.strptime(x, '%d-%m-%y'),  # Parseo manual
Para acordarnos de cómo parsear las fechas: http://strftime.org/

In [ ]:
# Comprobamos los tipos de datos de la columnas

In [ ]:
# Pedomos información general del dataset

En una dataframe pueden convivir datos de tipo diferente en diferentes columnas: en nuestro caso, fechas (en el índice) y (flotantes en las columnas). El que un dato sea de tipo fecha y no un string u otra cosa, nos permite obtener información como el día de la semana de manera directa:


In [ ]:

Una vez hemos cargado los datos, estamos preparados para analizarlos utilizando toda la artillería de pandas. Por ejemplo, puede que queramos una descripción estadística rápida:


In [ ]:
# Descripción estadística

Accediendo a los datos

Columnas

Tenemos dos formas de acceder a las columnas: por nombre o por atributo (si no contienen espacios ni caracteres especiales).


In [ ]:
# Accediendo como clave

In [ ]:
# Accediendo como atributo

In [ ]:
# Accediendo a varias columnas a la vez

Del mismo modo que accedmos, podemos operar con ellos:


In [ ]:
# Modificando valores de columnas

e introducirlos en funciones:


In [ ]:
# Aplicando una función a una columna entera (ej. media numpy)

In [ ]:
# Calculando la media con pandas

Filas

Para acceder a las filas tenemos dos métodos: .loc (basado en etiquetas), .iloc (basado en posiciones enteras) y .ix (que combina ambos) (.ix ha desaparecido en la versión 0.20).


In [ ]:
# Accediendo a una fila por índice

In [ ]:
# Accediendo a una fila por etiqueta

Puedo incluso hacer secciones basadas en fechas:


In [ ]:

Filtrando los datos

También puedo indexar utilizando arrays de valores booleanos, por ejemplo procedentes de la comprobación de una condición:


In [ ]:
# Comprobando que registros carecen de datos válidos

In [ ]:
# Accediendo a los registros que cumplen una condición

In [ ]:
# Valores de precipitación por encima de la media:

Funciones "rolling"

Por último, pandas proporciona métodos para calcular magnitudes como medias móviles usando el método rolling:


In [ ]:
# Calcular la media de la columna TMAX

In [ ]:
# Media trimensual centrada

Creación de nuevas columnas


In [ ]:
# Agruparemos por año y día: creemos dos columnas nuevas

Creando agrupaciones

En muchas ocasiones queremos realizar agrupaciones de datos en base a determinados valores como son fechas, o etiquetas (por ejemplo, datos que pertenecen a un mismo ensayo o lugar)

Podemos agrupar nuestros datos utilizando groupby:


In [ ]:
# Creamos la agrupación

In [ ]:
# Podemos ver los grupos que se han creado

Con estos grupos podemos hacer hacer varias cosas:

  • Acceder a sus datos individualmente (por ejemplo, comprobar qué pasó cada día de marzo de 2016)
  • Realizar una reducción de datos, para comparar diversos grupos (por, ejemplo caracterizar el tiempo de cada mes a lo largo de los años)

In [ ]:
# Accedemos a un grupo

In [ ]:
# Hhacemos una agregación de los datos:

Creando agrupaciones

En ocasiones podemos querer ver nuestros datos de forma diferente o necesitamos organizarlos así para utilizar determinadas funciones de pandas. Una necesidad típica es la de pivotar una tabla.

Imagina que queremos acceder a los mismos datos que en el caso anterior, pero que ahora queremos ver los años en las filas y para cada variable (TMAX, TMED...) los calores de cada mes en una columna. ¿Cómo lo harías?

In [ ]:
# Dejar los años como índices y ver la media mensual en cada columna

La línea anterior no es sencilla y no se escribe de una sola vez sin errores (sobre todo si estás empezando). Esto es una ejemplo de que pandas es una librería potente, pero que lleva tiempo aprender. Pasarás muchas horas peleando contra problemas de este tipo, pero afortunadamente mucha gente lo ha pasado mal antes y su experiencia ha quedado plasmada en cientos de preguntas de stack overflow y en la documentación de pandas

Plotting

Líneas


In [ ]:
# Pintar la temperatura máx, min, med

Cajas


In [ ]:

Pintando los datos de un "típíco día d del mes m del año a

Pintando la temperatura máxima de las máximas, mínima de las mínimas, media de las medias para cada día del año de los años disponnibles


In [ ]:


In [ ]:

Visualizaciones especiales


In [ ]:
# scatter_matrix


¡Síguenos en Twitter!




<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Curso de introducción a Python: procesamiento y análisis de datos</span> por <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Juan Luis Cano Rodriguez, Alejandro Sáez Mollejo y Francisco J. Navarro Brull</span> se distribuye bajo una Licencia Creative Commons Atribución 4.0 Internacional.
La mayor parte de material de este curso es un resumen adaptado del magnífico Curso de AeroPython realizado por: Juan Luis Cano y Álex Sáez