Preprocesamiento de los datos

Supongamos que recibimos un archivo con los datos recogidos de un ensayo de motor, por ejemplo, los datos del motor MX001 realizados en 21 de marzo del 2010. El archivo de datos se llama toma_de_datos_acemumx001.csv.

Nota: El lector debe asumir que todas las operaciones que estamos realizando se efectúan dentro de una consola Linux o puede ser también una aplicación de terminal.

Primero veamos en qué formato recibimos los datos. Más allá de que hayamos exportado los datos en un formato CSV (Comma Separated Values), pueden haber problemas adicionales por la manera que esos datos son almacenados bajo Windows.

Siempre que queramos saber con qué tipo de archivo estamos lidiando, podemos usar el comando file para ver cómo lo identifica Linux:

# file toma_de_datos_acemumx001.csv
toma_de_datos_acemumx001.csv: ASCII text, with CRLF, LF line terminators

Vemos que Linux reconoce el archivo como un archivo ASCII pero terminado en CRLF.

CRLF viene de Carriage Return - Line Feed: el viejo código **ASCII** para indicar a una impresora que termina una línea y debe ejecutarse la operación de retorno de carro y avance de línea.

Bajo DOS (y por extensión retrógrada, bajo Windows) todos los archivos ASCII (o de texto plano) tienen estos dos caracteres de control como fin de línea de texto. O sea que esto ocurre desde la década del 80 hasta nuestros días.

Bajo Linux (o Unix en general) se continúa con la tradición de emplear un simple LF (Line Feed) para señalar el fin de una línea de texto en un archivo de texto plano. Esto es así desde los principios de la década del 70, cuando se comenzó el desarrollo de las primeras versiones de Unix.

Si lo editamos con el procesador de texto vi, vemos lo siguiente:

"Samples per sec. = 60/1"^M

"Ensayo del motor ACEMU_MX#001"^M

""^M

-4.8828E-01,03-21-10,15:38:28^M

-4.6875E-01,03-21-10,15:38:28^M

donde los “^M” corresponden a los CRLF del DOS, y para peor, aparecen líneas en blanco entre línea y línea de datos. Empleando el comando od, podemos indagar un poco más en el formato del archivo:

# od -c toma_de_datos_acemumx001.csv|head

0000000   "   S   a   m   p   l   e   s       p   e   r       s   e   c
0000020   .       =       6   0   /   1   "  \r  \n  \n   "   E   n   s
0000040   a   y   o       d   e   l       m   o   t   o   r       A   C
0000060   E   M   U   _   M   X   #   0   0   1   "  \r  \n  \n   "   "
0000100  \r  \n  \n   -   4   .   8   8   2   8   E   -   0   1   ,   0
0000120   3   -   2   1   -   1   0   ,   1   5   :   3   8   :   2   8
0000140  \r  \n  \n   -   4   .   6   8   7   5   E   -   0   1   ,   0
0000160   3   -   2   1   -   1   0   ,   1   5   :   3   8   :   2   8
0000200  \r  \n  \n   -   4   .   6   8   7   5   E   -   0   1   ,   0
0000220   3   -   2   1   -   1   0   ,   1   5   :   3   8   :   2   8

El “|head” se pone para evitar que el archivo vuelque a pantalla todo el contenido del archivo y en su lugar se limite a desplegar las primeras líneas (de allí el nombre del comando: head, cabeza o cabecera).

Comparando con lo que vimos en el editor de textos, identificamos los comandos CRLF como la secuencia “\r\n” y a eso le sigue un “\n” (el LF que genera las líneas en blanco adicionales).

Evidentemente todos estos códigos deben ser eliminados y el archivo debe convertirse en un simple archivo de texto llano, versión Linux.

Para lograr eso primero usamos el comando dos2unix para convertir los CRLF en simples LF:

# dos2unix toma_de_datos_acemumx001.csv

¡Listo!

Ahora tenemos que eliminar las líneas en blanco adicionales, que vaya uno a saber por qué motivo están allí, pero molestan.

Para hacer eso podemos emplear una de las herramientas predilectas de los usuarios Linux: grep

El comando grep permite hacer búsquedas de texto o expresiones regulares en los archivos de texto y desplegar en pantalla el resultado de esa búsqueda. Éste es uno de los comandos que podríamos calificar como pertenciente al kit fundamental de herramientas de Linux, por la sencillez a la vez que potencia y flexibilidad que tiene.

En nuestro caso lo que queremos es eliminar todas las líneas en blanco, lo que equivale a listar todas las líneas que NO están en blanco. Para eso buscamos líneas en blanco y con la opción “-v” le pedimos el complemento (es decir las líneas que no están en blanco).

Una línea en blanco es una línea que comienza y termina y no contiene nada en su interior. Es el equivalente a la secuencia '\n\n', es decir dos LF seguidos.

Hay una manera especial de representar eso como una expresión regular: “^$”

El “^” representa comienzo de línea, el “$” representa fin de línea, y como no estamos poniendo nada entre medio, es obvio que estamos haciendo referencia a una línea que no contiene nada, una clásica línea en blanco (ojo, si hubieran espacios en blanco o tabuladores la historia es otra).

Así que ejecutamos el comando :

# grep -v "^$" toma_de_datos_acemumx001.csv >data.csv

El comando grep por defecto vuelca el resultado en la consola (salida estándar), para evitar eso y dirigir la salida a un archivo, le ponemos el operador redireccionamiento “>“ volcando el contenido al archivo data.csv.

Si ahora miramos el contenido de dat.csv con el comando head, observamos algo así:

# head data.csv
"Samples per sec. = 60/1"
"Ensayo del motor ACEMU_MX#001"
""
-4.8828E-01,03-21-10,15:38:28
-4.6875E-01,03-21-10,15:38:28
-4.6875E-01,03-21-10,15:38:28
-4.8828E-01,03-21-10,15:38:28
-4.8828E-01,03-21-10,15:38:28
-4.8828E-01,03-21-10,15:38:28

Vemos que el resultado de estas operaciones nos ha dado un archivo limpio que tiene el formato y los datos que esperamos encontrar en un archivo CSV. Observamos en particular que los datos en sí corresponden a 3 columnas: voltaje (en notación científica), fecha y hora (con una resolución de segundos, algo bastante patético), separados entre sí por comas (de allí el nombre del formato CSV).

Ahora tenemos el archivo en un formato adecuado para comenzar a procesar los datos propiamente dichos. Eso lo veremos en el siguiente artículo:

Procesamiento de los datos y generación de gráficos