Herramientas de usuario

Herramientas del sitio


acemu:articulos:articulos_tecnicos:adquisicion_y_procesamiento_de_datos:procesamiento_datos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
acemu:articulos:articulos_tecnicos:adquisicion_y_procesamiento_de_datos:procesamiento_datos [2011/02/27 10:28] – borrado luisacemu:articulos:articulos_tecnicos:adquisicion_y_procesamiento_de_datos:procesamiento_datos [2019/10/16 18:33] (actual) – [Graficando los datos] kenneth
Línea 1: Línea 1:
 +===== Procesamiento de los datos y generación de gráficos =====
 +
 +En el [[acemu:artículos:artículos técnicos:adquisicion y procesamiento de datos:preprocesamiento_datos|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''**:
 +
 +<code>
 +# 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
 +</code>
 +
 +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:
 +
 +  - Saltearse las primeras 3 líneas.
 +  - 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).
 +
 +<code>
 +awk -F"," '
 +BEGIN {c=0;getline; getline; getline;}
 +{c=c+1; print c,$1;}' datos.csv >datos.xy
 +</code>
 +
 +Acabamos de crear el archivo datos.xy, si miramos su contenido:
 +
 +<code>
 +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
 +</code>
 +
 +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**:
 +
 +<code>
 +awk -F"," '
 +BEGIN {c=0;getline; getline; getline;}
 +{c=c+1; print c/s,$1;}' s=60 datos.csv >datos.xy
 +</code>
 +
 +Ahora, si miramos el contenido del archivo datos.xy:
 +
 +<code>
 +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
 +</code>
 +
 +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):
 +
 +<code>
 +awk -F"," '
 +BEGIN {c=0;getline; getline; getline;}
 +{c=c+1; printf "%-10f %-10f\n", c/s,$1;}' s=60 datos.csv >datos.xy
 +</code>
 +
 +Ahora el archivo datos.xy contiene:
 +
 +<code>
 +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
 +</code>
 +
 +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: 
 +
 +  * [[http://www.pyxplot.org.uk/|PyxPlot Home Page]]
 +  * [[http://www.astro.caltech.edu/~tjp/pgplot/|PGPlot]]
 +  * [[https://savannah.nongnu.org/projects/epix|epix]]
 +  * [[https://www.gnu.org/software/plotutils/manual/en/plotutils.html|Plotutils]]
 +  * [[http://pgfplots.net/|PGFPlots (LaTeX)]]
 +
 +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''**:
 +
 +<code>
 +echo "plot  'datos.xy'" | pyxplot
 +</code>
 +
 +Eso produce el archivo **pyxplot.eps**. Por defecto, si no le indicamos nada, **''pyxlplot''** genera una salida en formato **EPS** ([[http://es.wikipedia.org/wiki/PostScript_encapsulado|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:
 +
 +{{ :acemu:tutoriales:dataq_di194rs:1_plot_basico.jpg?500 |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:
 +
 +<code>
 +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
 +</code>
 +
 +Si salvamos este script a un archivo, digamos ''script.pyx'' y lo ejecutamos así:
 +
 +  pyxplot script.pyx
 +  
 +
 +produce la siguiente salida en pantalla:
 +
 +{{  :acemu:tutoriales:dataq_di194rs:2_plot_basico_linea.jpg?500 |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:
 +
 +<code>
 +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
 +</code>
 +
 +Al ejecutar este programa con **pyxplot** esto produce la siguiente salida en pantalla:
 +
 +{{  :acemu:tutoriales:dataq_di194rs:3_plot_final.jpg?500 |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:
 +
 +<code>
 +set terminal pdf
 +set output 'acemumx001.pdf'
 +</code>
 +
 +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.
 +
 +[[ACEMU:Artículos:Artículos Técnicos:Adquisición y Procesamiento de Datos:dataq|Volver al artículo principal]]
  
acemu/articulos/articulos_tecnicos/adquisicion_y_procesamiento_de_datos/procesamiento_datos.1298831296.txt.gz · Última modificación: 2011/02/27 10:28 por luis