Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
acemu:proyectos:linux:procesamiento_datos [2010/03/30 15:41] kenneth |
acemu:proyectos:linux:procesamiento_datos [2011/02/27 15:20] (actual) luis |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ===== 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 **'' | ||
- | |||
- | < | ||
- | # head data.csv | ||
- | " | ||
- | " | ||
- | "" | ||
- | -4.8828E-01, | ||
- | -4.6875E-01, | ||
- | -4.6875E-01, | ||
- | -4.8828E-01, | ||
- | -4.8828E-01, | ||
- | -4.8828E-01, | ||
- | </ | ||
- | |||
- | 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, 3 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, | ||
- | |||
- | 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 lineas | ||
- | - por cada linea 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 " | ||
- | |||
- | < | ||
- | awk -F"," | ||
- | BEGIN {c=0; | ||
- | {c=c+1; print c, | ||
- | </ | ||
- | |||
- | 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, 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 //" | ||
- | |||
- | < | ||
- | awk -F"," | ||
- | BEGIN {c=0; | ||
- | {c=c+1; print c/ | ||
- | </ | ||
- | |||
- | 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, | ||
- | |||
- | < | ||
- | awk -F"," | ||
- | BEGIN {c=0; | ||
- | {c=c+1; printf "%-10f %-10f\n", | ||
- | </ | ||
- | |||
- | Ahora el archivo datos.xy contiene: | ||
- | |||
- | < | ||
- | head datos.xy | ||
- | |||
- | 0.016667 | ||
- | 0.033333 | ||
- | 0.050000 | ||
- | 0.066667 | ||
- | 0.083333 | ||
- | 0.100000 | ||
- | 0.116667 | ||
- | 0.133333 | ||
- | 0.150000 | ||
- | 0.166667 | ||
- | </ | ||
- | |||
- | 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, | ||
- | |||
- | |||
- | Lo único que nos está faltando es generar una gráfica para ver el resultado del ensayo de motor. | ||
- | |||
- | ===== Graficando los datos ===== | ||
- | |||
- | |||
- | Referencias: | ||
- | |||
- | * [[http:// | ||
- | |||
- | Para generar una gráfica de datos adecuada para insertar en un reporte de ensayo hay muchas alternativas, | ||
- | |||
- | Incluso con esa limitación existen una infinidad de herramientas que nos pueden servir: asymptote, epix1, jgraph, pyxplot, etc... (aclaración: | ||
- | |||
- | En nuestro caso elegimos **pyxplot**, | ||
- | |||
- | **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 haga 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 " | ||
- | </ | ||
- | |||
- | 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 par poterior inclusión del gráfico en alguna publicación, | ||
- | |||
- | Para especificar otros formatos de salida (pdf, jpg, gif, etc.), debe invocarse el comando '' | ||
- | |||
- | Otra posibilidad interesante, | ||
- | |||
- | {{: | ||
- | |||
- | Si queremos ponerle otro nombre al archivo de salida, usaremos el comando '' | ||
- | |||
- | En el ejemplo mostrado vemos que pyxplot elije por defecto muchos parámetros: | ||
- | |||
- | < | ||
- | set terminal X11 | ||
- | set width 20 | ||
- | set size 10 | ||
- | set nodisplay | ||
- | set nokey | ||
- | set grid x1y1 | ||
- | plot ' | ||
- | set display | ||
- | refresh | ||
- | </ | ||
- | |||
- | Si salvamos este script a un archivo, digamos '' | ||
- | |||
- | pyxplot script.pyx | ||
- | | ||
- | |||
- | produce la siguiente salida en pantalla: | ||
- | |||
- | {{: | ||
- | |||
- | Un " | ||
- | |||
- | // | ||
- | |||
- | 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 " | ||
- | |||
- | 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 " | ||
- | |||
- | < | ||
- | set terminal X11 | ||
- | set width 20 | ||
- | set size 10 | ||
- | set nodisplay | ||
- | set title ' | ||
- | set xlabel ' | ||
- | set ylabel ' | ||
- | set nokey | ||
- | set grid x1y1 | ||
- | spline f() ' | ||
- | 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: | ||
- | |||
- | {{: | ||
- | |||
- | Si en lugar de sacar el resultado por pantalla, quisiéramos generar una salida **pdf** a un archivo **acemumx001.pdf**, | ||
- | |||
- | < | ||
- | set terminal pdf | ||
- | set output ' | ||
- | </ | ||
- | |||
- | 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. | ||