Antes de nada, el contexto, para esta serie de entradas se va a usar lo siguiente:

 
Y sin más preámbulos seguimos con esta segunda parte de la serie.
Leyendo y escribiendo datos (IO)
Una de las cosas que más me gusta de Pandas es la potencia que aporta a lo hora de leer y/o escribir ficheros de datos. Pandas es capaz de leer datos de ficheros csv, excel, HDF5, sql, json, html,…
Si trabajáis con datos de terceros, que pueden provenir de muy diversas fuentes, una de las partes más tediosas del trabajo será tener los datos listos para empezar a trabajar. Limpiar huecos, poner fechas en formato usable, saltarse cabeceros,…
Sin duda, una de las funciones que usaréis más será read_csv() que permite una gran flexibilidad a la hora de leer un fichero de texto plano.
Veamos la documentación:

 
Vamos a inventarnos un fichero de datos… (la siguiente pieza de código es específica de IPython y, por tanto, funciona solo en IPython)
[code language=”Python”]
%%writefile dummy.data
cabecero estúpido
901001 0000 7.54 -11.67 1.07 4.27
901001 0600 19.61 -2.74 27.87 -8.96
901001 1200 -4.34 0.73 -6.58 0.17
901001 1800 -4.99 3.24 10.62 -6.13
901002 0000 -3.54 10.39 -12.05 -13.35
901002 0600 12.55 3.80 4.92 -8.18
901002 1200 1.06 23.75 -8.03 -8.67
901002 1800 -1.12 1.82 7.09 -6.06
901003 0600 -5.90 2.38 19.33 6.84
901003 1200 -9.51 -2.72 -7.13 -0.35
901003 1800 6.49 -12.01 -13.62 -0.93
[/code]
 
Vamos a leer con Pandas el fichero que acabamos de crear:
[code language=”Python”]
data = pd.read_csv(‘dummy.data’, sep = ‘s*’,
names = [‘fecha’, ‘hora’, ‘rec1’, ‘rec2’, ‘rec3’, ‘rec4’],
skiprows = 1, parse_dates = [[0, 1]], index_col = 0)
[/code]
 
Veamos lo que acabamos de leer:
[code language=”Python”]
print(data)
[/code]
Y lo que nos mostrará será:

 
Como veis, hemos usado:

  • una expresión regular en sep permitiéndonos mucha libertad a la hora de definir como están separados los datos. Si los delimitadores de los datos en cada fila son espacios o tabulaciones podríamos usar delim_whitespace, que es muchísimo más eficiente que usar expresiones regulares (AVISO: esto no aparece en la ayuda de la función read_csv).
  • names sirve para indicar qué nombres hay que poner a cada una de las columnas. Si no ponemos ningún nombre las nombrará con números empezando con el 0.
  • parse_dates es otra de las cosas realmente útiles cuando trabajamos con registros temporales. Ahí le indicamos qué columnas tiene que considerar como fechas y las ‘parsea’ para convertirlo en un tipo interno de fechas. Si os fijáis, he puesto las columnas 0 y 1 dentro de una lista, de esa forma las unirá en una sola columna de fechas con la que será más cómodo trabajar. Si automágicamente no es capaz de leer los formatos de las fechas le podemos indicar como las debe parsear (ver date_parser).
  • El último parámetro que le hemos pasado es index_col, le indicamos que la columna de índices será la 0, que será la unión de las columnas 0 y 1 de fechas.

Muy poderoso, ¿eh?
Escribir el resultado final en un fichero csv, por ejemplo, es algo tan sencillo como:
[code language=”Python”]
data.to_csv(‘dummy.csv’)
[/code]
Si queréis ver el resultado del fichero final creado y estáis en IPython podéis escribir lo siguiente:
[code language=”Python”]
%load dummy.csv
[/code]
Y en pantalla veréis el siguiente texto:

 
Otra tarea que se realiza habitualmente sería la de trabajar con información de una base de datos SQL. No lo vamos a ver aquí pero podéis ver este notebook donde se explica como leer y/o escribir datos de una BBDD SQL (SQLite, PostgreSQL o MySQL). Una vez que se han leído, el tratamiento es el mismo que si los hubiésemos leído de otro origen.
Es suficiente por hoy. Esta entrada ha sido cortita pero en breve dejaremos una tercera parte con más enjundia… ¡¡Estad atentos!!

5 pensamientos sobre “Pandas (II)”

  1. Interesantísimo, gracias. ¿Existe la posibilidad de utilizar móduflos de Panda de manera independiente? Por ejemplo utilizar solo este módulo de IO sin tener que instalar todo Panda.
    Y otra pregunta, ¿va bien en Windows?
    Un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

one + eight =