Herramienta de línea de comandos para calcular estadísticas básicas para flujo de valores [cerrado]


27

¿Existe alguna herramienta de línea de comandos que acepte el flujo de números (en formato ascii) de la entrada estándar y proporcione las estadísticas descriptivas básicas para este flujo, como min, max, average, median, RMS, quantiles, etc. La salida se puede analizar con el siguiente comando en la cadena de línea de comandos. El entorno de trabajo es Linux, pero otras opciones son bienvenidas.


1
Recomendaría echar un vistazo a | STAT . Es un software bastante antiguo, pero es muy conveniente para tales cosas. También hay pyp , y varias otras herramientas de Un * x.
chl

@chl Enlace ISTAT roto. ¿Puede actualizarlo o responderlo, por favor?
Léo Léopold Hertz 준영

1
@ Masi Sí, parece que la página ya no existe. Aquí hay un enlace actualizado .
chl

Respuestas:


22

Puedes hacer esto con R , que puede ser un poco exagerado ...

EDIT 2: [OOPS, parece que alguien más golpeó con Rscript mientras estaba volviendo a escribir esto.] Encontré una manera más fácil. Instalado con R debe estar Rscript, que está destinado a hacer lo que está tratando de hacer. Por ejemplo, si tengo un archivo barque tiene una lista de números, uno por línea:

cat bar | Rscript -e 'summary (as.numeric (readLines ("stdin")))'

Canalizará esos números en R y ejecutará el summarycomando de R en las líneas, devolviendo algo como:

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    2.25    3.50    3.50    4.75    6.00 

También podrías hacer algo como:

script -e 'quantile (as.numeric (readLines ("stdin")), probs=c(0.025, 0.5, 0.975))'

para obtener cuantiles. Y, obviamente, podría cortar la primera línea de salida (que contiene etiquetas) con algo como:

cat bar | Rscript -e 'summary (as.numeric (readLines ("stdin")))' | tail -n +2

Recomiendo encarecidamente hacer lo que quiera en R interactivo primero, para asegurarse de que tiene el comando correcto. Al intentar esto, omití el paréntesis de cierre y Rscript no devuelve nada: ningún mensaje de error, ningún resultado, simplemente nada.

(Para el registro, la barra de archivos contiene:

1
2
3
4
5
6

Entonces, ¿debería anteponer mi flujo con esos Rcomandos?
mbaitoff

@mbaitoff: sí. Para mi prueba, creé un archivo fooque contenía el summary (as.numeric (readLines()))como su primera línea, luego un elemento de datos numéricos por línea para el resto del archivo. El readLines()solo está leyendo desde stdin (que es todo lo que sigue, hasta el final del archivo).
Wayne

Parece que nos aferramos seriamente a Rambas respuestas, y parece ser una gran herramienta para una tarea pequeña. Bueno, las respuestas funcionan, pero de todos modos, ¿hay algo más excepto R?
mbaitoff

2
@mbaitoff: podría usar Python con scipy, especialmente si ya usa Python. Si usa / like Clojure (lisp basado en JVM, clojure.org ), existe el entorno estadístico Incanter( incanter.org ) construido sobre eso. También puedes probar gnu Octave.
Wayne

21

Prueba "st":

$ seq 1 10 | st
N   min   max   sum   mean  stddev
10  1     10    55    5.5   3.02765

$ seq 1 10 | st --transpose
N       10
min     1
max     10
sum     55
mean    5.5
stddev  3.02765

También puede ver el resumen de cinco números:

$ seq 1 10 | st --summary
min  q1    median   q3    max
1    3.5   5.5      7.5   10

Puedes descargarlo aquí:

https://github.com/nferraz/st

(RENUNCIA: Escribí esta herramienta :))


Bienvenido al sitio, @ user2747481. ¿Te importaría dar un poco de respuesta a esta respuesta? Nos gustaría que nuestras respuestas sean en su mayoría independientes. Como es nuevo aquí, puede leer nuestra página acerca de , que contiene información para nuevos usuarios.
gung - Restablece a Monica

¡Gracias! A partir de 2019 stestá disponible a través de Homebrewbrew install st
Noah Sussman

Cuidado con que sttambién puede hacer referencia a simple terminal.
Skippy le Grand Gourou

10

R proporciona un comando llamado Rscript . Si solo tiene unos pocos números que puede pegar en la línea de comando, use este único delineador:

Rscript -e 'summary(as.numeric(commandArgs(TRUE)))' 3 4 5 9 7

lo que resulta en

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
3.0     4.0     5.0     5.6     7.0     9.0 

Si desea leer desde la entrada estándar, use esto:

echo 3 4 5 9 7 | Rscript -e 'summary(as.numeric(read.table(file("stdin"))))'

Si el número en la entrada estándar está separado por retornos de carro (es decir, un número por línea), use

Rscript -e 'summary(as.numeric(read.table(file("stdin"))[,1]))'

Se pueden crear alias para estos comandos:

alias summary='Rscript -e "summary(as.numeric(read.table(file(\"stdin\"))[,1]))"'
du -s /usr/bin/* | cut -f1 | summary
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.0     8.0    20.0    93.6    44.0  6528.0

+1: Lo siento, acabo de encontrar Rscript y edité mi respuesta para incluir esto, así que terminamos con una respuesta similar. Su read.tableidea es una buena manera de moverse por un artículo por línea.
Wayne

Ok, gracias por el reconocimiento y el +1.
Arnaud A

3

Datamash es otra gran opción. Es del Proyecto GNU.

Si tienes homebrew / linuxbrew puedes hacer:

brew install datamash


2

También hay simple-r, que puede hacer casi todo lo que R puede, pero con menos pulsaciones de teclas:

https://code.google.com/p/simple-r/

Para calcular estadísticas descriptivas básicas, uno tendría que escribir uno de:

r summary file.txt
r summary - < file.txt
cat file.txt | r summary -

¡No tiene ningún R simple!


2

Hay sta, que es una varianza c ++ de st, también mencionada en estos comentarios.

Al estar escrito en c ++, es rápido y puede manejar grandes conjuntos de datos. Es fácil de usar, incluye la elección de estimadores imparciales o sesgados, y puede generar información más detallada, como un error estándar.

Puedes descargar sta en github .

Descargo de responsabilidad: soy el autor de sta .


1

Por si acaso, hay datastat

https://sourceforge.net/p/datastat/code/

Un programa simple para Linux que computa estadísticas simples desde la línea de comandos. Por ejemplo,

cat file.dat | datastat

generará el valor promedio en todas las filas para cada columna de file.dat. Si necesita conocer la desviación estándar, min, max, puede agregar las opciones --dev, --min y --max, respectivamente.

datastat tiene la posibilidad de agregar filas en función del valor de una o más columnas "clave".

Está escrito en C ++, se ejecuta rápido y con poca ocupación de memoria, y se puede canalizar muy bien con otras herramientas como cortar, grep, sed, sort, awk, etc.


1

También podría considerar usar clistats . Es una herramienta de interfaz de línea de comandos altamente configurable para calcular estadísticas para una secuencia de números de entrada delimitados.

Opciones de E / S

  • Los datos de entrada pueden ser de un archivo, entrada estándar o una tubería
  • La salida se puede escribir en un archivo, salida estándar o una tubería
  • La salida utiliza encabezados que comienzan con "#" para habilitar la canalización a gnuplot

Opciones de análisis

  • Detección basada en señal, fin de archivo o línea en blanco para detener el procesamiento
  • Se pueden establecer caracteres de comentario y delimitador
  • Las columnas se pueden filtrar del procesamiento
  • Las filas se pueden filtrar del procesamiento según la restricción numérica
  • Las filas se pueden filtrar del procesamiento según la restricción de cadena
  • Las filas iniciales de encabezado se pueden omitir
  • Se puede procesar un número fijo de filas
  • Delimitadores duplicados pueden ser ignorados
  • Las filas se pueden remodelar en columnas
  • Hacer cumplir estrictamente que solo se procesen las filas del mismo tamaño
  • Se puede usar una fila que contenga títulos de columna para titular las estadísticas de salida

Opciones de estadísticas

  • Resumen de estadísticas (recuento, mínimo, promedio, máximo, desviación estándar)
  • Covarianza
  • Correlación
  • Desplazamiento de mínimos cuadrados
  • Pendiente de mínimos cuadrados
  • Histograma
  • Datos sin procesar después del filtrado

NOTA: soy el autor.


1

Una herramienta que podría usarse para calcular estadísticas y ver la distribución en modo ASCII es ministat . Es una herramienta de FreeBSD, pero también está empaquetada para una distribución popular de Linux como Debian / Ubuntu.

Ejemplo de uso:

$ cat test.log 
Handled 1000000 packets.Time elapsed: 7.575278
Handled 1000000 packets.Time elapsed: 7.569267
Handled 1000000 packets.Time elapsed: 7.540344
Handled 1000000 packets.Time elapsed: 7.547680
Handled 1000000 packets.Time elapsed: 7.692373
Handled 1000000 packets.Time elapsed: 7.390200
Handled 1000000 packets.Time elapsed: 7.391308
Handled 1000000 packets.Time elapsed: 7.388075

$ cat test.log| awk '{print $5}' | ministat -w 74
x <stdin>
+--------------------------------------------------------------------------+
| x                                                                        |
|xx                                   xx    x x                           x|
|   |__________________________A_______M_________________|                 |
+--------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x   8      7.388075      7.692373       7.54768     7.5118156    0.11126122

0

Demasiada memoria y potencia de procesador, amigos. Usar R para algo como esto es más o menos como conseguir un mazo para matar un mosquito. Use su idioma favorito e implemente un algoritmo de medios provisionales. Por el medio:

X¯norte=(norte-1)X¯norte-1+Xnortenorte
; y para la varianza:
snorte2=Snortenorte-1
Snorte=Snorte-1+(Xnorte-X¯norte-1)(Xnorte-X¯norte).

Tomar X¯0 0=S0 0=0 0como valores iniciales Las modificaciones están disponibles para análisis ponderados. Puede hacer los cálculos con dos reales de doble precisión y un contador.


Pruébalo con algunos Xyoequivalente FLOAT_MAX-1.0ao conXyo-Xyo+1 muy pequeño pero Xyo-Xyo-1muy grande.
mbaitoff

En realidad, esto es lo que hacen los clistats (consulte la respuesta para obtener detalles y otras características).
dpmcmlxxvi

0

Tropecé con este viejo hilo buscando algo más. Quería lo mismo, no podía encontrar nada simple, así que lo hice en perl, bastante trivial, pero úsalo varias veces al día: http://moo.nac.uci.edu/~hjm/stats

ejemplo:

 $ ls -l | scut -f=4 | stats                
Sum       9702066453
Number    501
Mean      19365402.1017964
Median    4451
Mode      4096  
NModes    15
Min       0
Max       2019645440
Range     2019645440
Variance  1.96315423371944e+16
Std_Dev   140112605.91822
SEM       6259769.58393047
Skew      10.2405932543676
Std_Skew  93.5768354979843
Kurtosis  117.69005473429

(Scut es una versión más lenta, pero posiblemente más fácil de cortar): http://moo.nac.uci.edu/~hjm/scut describe: http://moo.nac.uci.edu/~hjm/scut_cols_HOWTO. html


0

Otra herramienta: tsv-summary de de TSV Utilities eBay . Admite muchas de las estadísticas de resumen básicas, como mín., Máx., Media, mediana, cuantiles, desviación estándar, MAD y algunas más. Está destinado a grandes conjuntos de datos y admite múltiples campos y agrupaciones por clave. La salida está separada por tabuladores. Un ejemplo para la secuencia de números del 1 al 1000, uno por línea:

$ seq 1000 | tsv-summarize --min 1 --max 1 --median 1 --sum 1
1   1000    500.5   500500

Los encabezados normalmente se generan a partir de una línea de encabezado en la entrada. Si la entrada no tiene encabezado, se puede agregar uno usando-w interruptor:

$ seq 1000 | tsv-summarize -w --min 1 --max 1 --median 1 --sum 1
field1_min  field1_max  field1_median   field1_sum
1   1000    500.5   500500

Descargo de responsabilidad: soy el autor.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.