Herramientas de usuario

Herramientas del sitio


acemu:articulos:articulos_tecnicos:adquisicion_y_procesamiento_de_datos:procesamiento_datos

¡Esta es una revisión vieja del documento!


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

En el artículo anterior vimos como acondicionar el archivo generado por la salida del DataQ, obteniendo el archivo datos.csv, cuyo contenido podemos listar parcialmente con el comando head:

# 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

Para el procesamiento de los datos vamos a usar otra de las herramientas básicas de procesamiento de datos de Linux: awk

El nombre de awk proviene de las iniciales de sus autores: Alfred Aho, Peter Weinberger y Brian Kernighan, tres de los principales desarrolladores del sistema Unix. Es una poderosísima herramienta para el procesamiento de datos por lotes. No es lugar para explicar el funcionamiento y capacidad de esta herramienta, baste decir que el principio en que se basa en muy simple y efectivo: buscar un patrón de texto y hacer algo cada vez que se lo encuentra. El awk es un intérprete de órdenes o comandos escritos en un lenguaje propio y tiene una capacidad y flexibilidad enorme a la hora de procesar archivos de texto. Se pueden buscar diversos patrones simultáneamente y por cada patrón se pueden programar diferentes acciones.

Dejamos como ejercicio al lector el averiguar lo que hace el script que escribiremos en awk para procesar los datos de este archivo.

Simplemente daremos como pista lo que queremos hacer:

  1. Saltearse las primeras 3 líneas.
  2. Por cada línea que contiene una lectura de datos, tomar únicamente los datos de la primera columna e imprimirlos en un nuevo archivo acompañados por un valor “adecuado” de x, para formar un archivo de pares de valores (x,y).
awk -F"," '
BEGIN {c=0;getline; getline; getline;}
{c=c+1; print c,$1;}' datos.csv >datos.xy

Acabamos de crear el archivo datos.xy, si miramos su contenido:

head datos.xy

1 -4.8828E-01
2 -4.6875E-01
3 -4.6875E-01
4 -4.8828E-01
5 -4.8828E-01
6 -4.8828E-01
7 -4.8828E-01
8 -4.6875E-01
9 -4.6875E-01
10 -4.8828E-01

Teniendo en cuenta que en realidad la toma de datos corresponde a una frecuencia de 60 datos por segundo (60Hz de frecuencia de muestreo), podríamos mejorar nuestro script de awk para tener en cuenta ese hecho y tener valores de x que realmente corespondan al intervalo temporal. Esto lo podemos hacer pasándole el “sampling rate” como una variable s y dividiendo el contador c por el valor de s:

awk -F"," '
BEGIN {c=0;getline; getline; getline;}
{c=c+1; print c/s,$1;}' s=60 datos.csv >datos.xy

Ahora, si miramos el contenido del archivo datos.xy:

head datos.xy

0.0166667 -4.8828E-01
0.0333333 -4.6875E-01
0.05 -4.6875E-01
0.0666667 -4.8828E-01
0.0833333 -4.8828E-01
0.1 -4.8828E-01
0.116667 -4.8828E-01
0.133333 -4.6875E-01
0.15 -4.6875E-01
0.166667 -4.8828E-01

El formato de salida podría mejorarse considerablemente, para eso en lugar de hacer un simple print, usaremos la función printf (imprimir con formato):

awk -F"," '
BEGIN {c=0;getline; getline; getline;}
{c=c+1; printf "%-10f %-10f\n", c/s,$1;}' s=60 datos.csv >datos.xy

Ahora el archivo datos.xy contiene:

head datos.xy

0.016667   -0.488280
0.033333   -0.468750
0.050000   -0.468750
0.066667   -0.488280
0.083333   -0.488280
0.100000   -0.488280
0.116667   -0.488280
0.133333   -0.468750
0.150000   -0.468750
0.166667   -0.488280

Ahora sí, se parece a algo. Ni que hablar que podríamos continuar mejorando el script, incluso para tomar el dato de la frecuencia de sampleo y no tener necesidad de dárselo explícitamente, o tomar el título para incorporarlo al reporte posterior. Pero eso queda como ejercicio para el amable lector :-)

Lo único que nos está faltando es generar una gráfica para ver el resultado del ensayo de motor.

Graficando los datos

Referencias:

Para generar una gráfica de datos adecuada para insertar en un reporte de ensayo hay muchas alternativas, tanto en el entorno gráfico como de consola de Linux, pero hemos elegido limitarnos al entorno de consola o emulador de terminal.

Incluso con esa limitación existen una infinidad de herramientas que nos pueden servir: asymptote, epix1, jgraph, pyxplot, etc… (aclaración: etc no es un comando de Linux, es simplemente la forma abreviada de etcétera, para indicar que la lista podría continuar indefinidamente).

En nuestro caso elegimos pyxplot, simplemente porque es una herramienta simple que tenemos a mano, pero podría ser cualquiera de los otros. Cada una de estas herramientas ofrece diferentes ventajas respecto a las demás y conviene darles una vichada para saber que existen, en qué son mejores que las otras y en qué caso pueden servirnos.

Pyxplot tiene además la ventaja de formar parte de un paquete de programas y bibliotecas de cálculo numérico o científico (Numpy, Scipy), programadas en lenguaje Python.

Al igual que en los casos anteriores, no ahondaremos aquí en detalles de cómo funciona pyxplot. Nos limitaremos a presentar algunos scripts que hagan lo básico: una gráfica adecuada de los datos.

Lo más sencillo que le podemos pedir a pyxplot es que simplemente tome los datos del archivo de texto y genere una gráfica a partir de los mismos. pyxplot generalmente lee los comandos a ejecutar desde un archivo, pero como se trata de un único comando, podemos pasárselo por entrada estándar (stardard input), simplemente usando el comando echo y poniendo un pipe (tubería) para ligar la salida estándar de echo con la entrada estándar de pyxplot:

echo "plot  'datos.xy'" | pyxplot

Eso produce el archivo pyxplot.eps. Por defecto, si no le indicamos nada, pyxlplot genera una salida en formato EPS (Encapsulated Postscript, un lenguaje de descripción de página, orientado a impresoras, predecesor del PDF). Este formato suele ser adecuado para la posterior inclusión del gráfico en alguna publicación, ya sea hecha con LaTeX, OpenOffice u otro procesador de texto o programa de publicación.

Para especificar otros formatos de salida (pdf, jpg, gif, etc.), debe invocarse el comando set terminal, por ej.: set terminal pdf, con lo cual se genera el archivo pyxplot.pdf.

Otra posibilidad interesante, si estamos trabajando bajo el entorno gráfico de Linux (el sistema X11 de ventanas), es definir set terminal X11_singlewindow. Eso provoca que la salida de pyxplot aparezca en una ventana gráfica empleando el comando gv (GhostView). Eso produce una salida como la siguiente:

Gráfico datos crudos

Si queremos ponerle otro nombre al archivo de salida, usaremos el comando set output 'nombre.eps'. De esa manera generará el archivo nombre.eps en lugar del nombre que genera por defecto: pyxplot.eps.

En el ejemplo mostrado vemos que pyxplot elije por defecto muchos parámetros: tamaño y tipo de salida, rango de los ejes, estilo de gráfico, color, etc. Obviamente todos estos parámetros pueden ser especificados por el usuario. Vamos a escribir un script de pyxplot que mejore un poco nuestro salida:

set terminal X11
set width 20
set size 10
set nodisplay
set nokey
set grid x1y1
plot  'datos.xy' using 1:2 w l
set display
refresh

Si salvamos este script a un archivo, digamos script.pyx y lo ejecutamos así:

pyxplot script.pyx

produce la siguiente salida en pantalla:

Gráfico lineal

Un “problema” que representa el gráfico obtenido es que estamos simplemente graficando los datos crudos: voltajes leidos con el DataQ, que no tienen un sentido en sí mismo. Sabemos que esos voltajes corresponden en realidad a empuje (medido como masa) del motor, y que la ecuación de conversión es:

y=19.198x -0.1311

donde los valores de x corresponden al voltaje leido y los valores de y al empuje.

A su vez, los datos obtenidos adolecen del defecto de no haber sido ajustados a cero. No hay problema, a ojo de buen cubero podemos decir que si a los datos le sumamos 0.488, habremos ajustado aproximadamente el cero. Podríamos ser más exactos pero con esto por el momento alcanza.

Además de transformar los datos a algo que tenga sentido, podemos ajustar los datos a una curva de spline de manera de “alisar” (smoothing) la curva y evitar el efecto del ruido de la señal.

Podemos continuar mejorando el gráfico, agregándole etiquetas a los ejes, un título adecuado y eligiendo un color para el trazo del gráfico. Agregando todas estas y otras “mejoras” a nuestro script, llegamos a:

set terminal X11
set width 20
set size 10
set nodisplay
set title 'Ensayo Motor MX001'
set xlabel 'tiempo (s)'
set ylabel 'Empuje (kg)'
set nokey
set grid x1y1
spline f()  'datos.xy' using 1:2  smooth 0.05
g(x)=(f(x)+0.488)*19.198-0.1311
plot [0.5:2.5] g(x)
set display
refresh

Al ejecutar este programa con pyxplot esto produce la siguiente salida en pantalla:

Gráfico final

Si en lugar de sacar el resultado por pantalla, quisiéramos generar una salida pdf a un archivo acemumx001.pdf, sustituiríamos la primer linea por:

set terminal pdf
set output 'acemumx001.pdf'

Este artículo apenas roza la potencialidad de los comandos y herramientas descritos, y es apenas una sombra de toda la flexibilidad y potencia que se encuentra en la punta de los dedos de un usuario de Linux. La intención del mismo es la de estimular la curiosidad del lector aficionado a las computadoras y se anime a explorar estas y otras posibilidades que ofrece el entorno de trabajo Linux.

Volver al artículo principal

acemu/articulos/articulos_tecnicos/adquisicion_y_procesamiento_de_datos/procesamiento_datos.1571273091.txt.gz · Última modificación: 2019/10/16 17:44 por kenneth