Trabajar con datos en Python
Si eres un científico trabajas con datos. Citando a Mythbusters, the only difference between screwing around and science is writing it down. Existen millones de librerías para leer diferentes tipos de datos, desde imágenes y ficheros de audio a formatos súper específicos como discretizados de superficies y volúmenes (meshes).
Índice
numpy
numpy es un paquete de Python para manejar vectores o arrays en una o más dimensiones. Es una de las librerías más útiles y que más he usado.
Múltiples columnas, separados por espacios o tabuladores
El caso más sencillo es que el fichero contenga datos numéricos en forma de una matriz NxM, donde N
es el número de filas y M es el número de columnas. Si los datos están separados por espacios o
tabuladores, numpy es la forma más fácil de hacerlo:
Donde data01.dat es el fichero de datos. data es un objeto que contiene los datos como si fuera
una matriz. data.shape proporciona las dimensiones del array, en este caso 2D.
numpy permite hacer
operaciones entre columnas, por ejemplo:
Ignorar líneas
Muchos ficheros contienen comentarios o el nombre de las columnas. numpy no tiene la capacidad
de trabajar con los nombres de las columnas, con lo que lo apropiado es ignorar esas líneas:
Por defecto, numpy ignora las líneas que comienzan con la almohadilla (#)
Valores separados por comas
Si los valores están separados por comas, numpy permite especificar el delimitador de los campos
en el fichero:
Limitaciones
numpy.loadtxt tiene una serie de limitaciones:
-
Un array en
numpyno puede contener más de un tipo de variable. Por ejemplo, si la columna primera son enteros y el resto floats,numpyimporta todo como float. Es posible especificar el tipo de dato usando el modificadordtype. -
numpyno puede asociar nombres de columnas a los datos.
Para eso es necesario usar pandas.
pandas
pandas es un paquete de Python que extiende la capacidad de numpy para trabajar con dataframes. Los
tres motivos principales son para analizar ficheros donde las columnas mezclan diferentes tipos de
variables (strings, ints, floats, etc), cuando queremos preservar los nombres de las columnas, y
cuando cada fila tiene su propio nombre o índice.
pandas tiene varias particularidades:
- Tiende a asumir que la primera columna de un fichero contiene un índice. Esto puede ser más común cuando trabajas con dataframes, pero es muy poco común en ficheros con datos numéricos.
- Está diseñado para acceder a las columnas por nombre, hay forma de hacerlo por número pero no es evidente.
Datos separados por comas con títulos en las columnas
Supongamos el fichero data01.dat:
pandas permite acceder a los datos por columnas:
data['X'] es un objeto
de tipo Series.
Si consideramos ahora el siguiente fichero:
y corremos el siguiente código: El resultado es: La columna 'Ranking' es de tipoint64, mientras que 'Ciudad' es
de tipo object, que representa un objecto genérico en Python.
Si modificamos el fichero de manera que el Ranking de Sevilla
es 1.0:
el resultado es que la columna 'Ranking' es ahora de tipo float64.
Convertir el formato a un numpy array es trivial:
import pandas as pd
data = pd.read_csv("data03.dat")
data_np = data["Ranking"].to_numpy()
print(data_np, type(data_np))
Ficheros csv
Python viene con un módulo para leer ficheros separados por comas. Es una alternativa a tener que instalar pandas, pero requiere un poco más de esfuerzo. Un ejemplo de código para leer un fichero csv es el siguiente:
import csv
with open('fichero.csv', 'r') as fp:
reader = csv.reader(fp)
data = [row for row in reader]
csv.reader crea un iterator que permite leer el
fichero línea a línea. La última línea transforma el iterator en una lista.
Una diferencia entre usar csv y pandas es que csv no hace automáticamente la conversión
a valores numéricos.
Ficheros JSON
El formato JSON está muy extendido y es muy útil a la hora de compartir datos con estructura compleja, como por ejemplo ficheros de configuración. Más allá de las aplicaciones científicas, es un estándar muy utilizado para intercambiar datos en la web.
Python viene con un módulo capaz de leer ficheros JSON. Partiendo de un fichero con el contenido:
el módulo json permite leer y convertir el contenido en un objeto de Python: En este caso,data representa un diccionario con tres elementos: una lista y dos valores numéricos.