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
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:
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
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
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
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 [ ]:
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:
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
In [ ]:
# Agruparemos por año y día: creemos dos columnas nuevas
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:
In [ ]:
# Accedemos a un grupo
In [ ]:
# Hhacemos una agregación de los datos:
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
In [ ]:
# Pintar la temperatura máx, min, med
In [ ]:
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 [ ]:
In [ ]:
# scatter_matrix
Algunos enlaces: