Strumento da riga di comando per calcolare le statistiche di base per il flusso di valori [chiuso]


27

Esiste uno strumento da riga di comando che accetta il flusso di numeri (in formato ASCII) dall'input standard e fornisce le statistiche descrittive di base per questo flusso, come min, max, media, mediana, RMS, quantili ecc.? L'output è benvenuto per essere analizzabile dal comando successivo nella catena della riga di comando. L'ambiente di lavoro è Linux, ma altre opzioni sono benvenute.


1
Consiglierei di dare un'occhiata a | STAT . È un software piuttosto vecchio, ma è molto conveniente per queste cose. C'è anche pyp e molti altri strumenti Un * x.
chl

@chl Link ISTAT rotto. Puoi aggiornarlo o renderlo una risposta, per favore?
Léo Léopold Hertz 준영

1
@Masi Yup, sembra che la pagina non esista più. Ecco un link aggiornato .
chl

Risposte:


22

Puoi farlo con R , che potrebbe essere un po 'eccessivo ...

EDIT 2: [OOPS, sembra che qualcun altro abbia colpito Rscript mentre lo riscrivo.] Ho trovato un modo più semplice. Installato con R dovrebbe essere Rscript, che ha lo scopo di fare ciò che stai cercando di fare. Ad esempio, se ho un file barcon un elenco di numeri, uno per riga:

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

Inoltrerà quei numeri in R ed eseguirà il summarycomando di R sulle linee, restituendo qualcosa del tipo:

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

Puoi anche fare qualcosa del tipo:

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

per ottenere quantili. E puoi ovviamente tagliare la prima riga di output (che contiene etichette) con qualcosa del tipo:

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

Consiglio vivamente di fare prima quello che vuoi in R interattivo, per assicurarti di avere il comando corretto. Nel provare questo, ho lasciato fuori la parentesi di chiusura e Rscript non restituisce nulla - nessun messaggio di errore, nessun risultato, proprio niente.

(Per la cronaca, la barra dei file contiene:

1
2
3
4
5
6

Quindi, dovrei anteporre il mio flusso a questi Rcomandi?
mbaitoff,

@mbaitoff: Sì. Per il mio test, ho creato un file fooche conteneva la summary (as.numeric (readLines()))prima riga, quindi un elemento di dati numerici per riga per il resto del file. Il readLines()è solo la lettura da stdin (che è tutto di ciò che segue, fino alla fine del file).
Wayne,

Sembra che ci siamo attenuti seriamente a Rentrambe le risposte, e sembra essere uno strumento enorme per un compito minuscolo. Bene, le risposte funzionano, ma comunque c'è qualcos'altro se non R?
mbaitoff,

2
@mbaitoff: puoi usare Python con scipy, specialmente se usi già Python. Se usi / mi piace Clojure (lisp basato su JVM, clojure.org ), c'è l' ambiente statistico Incanter( incanter.org ) basato su quello. Potresti anche provare Gnu Octave.
Wayne,

21

Prova "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

Puoi anche vedere il riepilogo dei cinque numeri:

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

Potete scaricarlo qui:

https://github.com/nferraz/st

(NOTA BENE: ho scritto questo strumento :))


Benvenuto nel sito, @ user2747481. Ti dispiacerebbe dare una risposta a questa risposta? Vorremmo che le nostre risposte fossero per lo più autosufficienti. Dato che sei nuovo qui, potresti voler leggere la nostra pagina di informazioni , che contiene informazioni per i nuovi utenti.
gung - Ripristina Monica

Grazie! A partire dal 2019 stè disponibile via Homebrewbrew install st
Noah Sussman il

Attenzione che stpuò anche fare riferimento a simple terminal.
Skippy le Grand Gourou,

10

R fornisce un comando chiamato Rscript . Se hai solo pochi numeri che puoi incollare sulla riga di comando, usa questa riga:

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

che risulta in

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

Se vuoi leggere dallo standard input usa questo:

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

Se il numero sull'input standard è separato dai ritorni a capo (ovvero un numero per riga), utilizzare

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

È possibile creare alias per questi comandi:

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: Mi dispiace che ho appena trovato Rscript e modificato la mia risposta per includerla, quindi abbiamo finito con una risposta simile. La tua read.tableidea è un bel modo per aggirare un oggetto per riga.
Wayne,

Ok, grazie per il riconoscimento e il +1.
Arnaud A

3

datamash è un'altra ottima opzione. Viene dal progetto GNU.

Se hai homebrew / linuxbrew puoi fare:

brew install datamash


2

C'è anche simple-r, che può fare quasi tutto ciò che R può fare, ma con meno tasti:

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

Per calcolare le statistiche descrittive di base, si dovrebbe digitare uno di:

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

Non ottiene alcun semplice-R!


2

C'è sta, che è una variante c ++ di st, a cui fa riferimento anche in questi commenti.

Essendo scritto in c ++, è veloce e può gestire grandi set di dati. È semplice da usare, include la scelta di stimatori imparziali o distorti e può produrre informazioni più dettagliate come l'errore standard.

Puoi scaricare sta presso github .

Disclaimer: sono l'autore di sta .


1

Per ogni evenienza, c'è datastat

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

un semplice programma per Linux che calcola semplici statistiche dalla riga di comando. Per esempio,

cat file.dat | datastat

genererà il valore medio su tutte le righe per ogni colonna di file.dat. Se devi conoscere la deviazione standard, min, max, puoi aggiungere rispettivamente le opzioni --dev, --min e --max.

datastat ha la possibilità di aggregare le righe in base al valore di una o più colonne "chiave".

È scritto in C ++, funziona veloce e con una piccola occupazione di memoria e può essere convogliato bene con altri strumenti come cut, grep, sed, sort, awk, ecc.


1

Potresti anche considerare l'uso di clistat . È uno strumento di interfaccia della riga di comando altamente configurabile per calcolare le statistiche per un flusso di numeri di input delimitati.

Opzioni I / O

  • I dati di input possono provenire da un file, input standard o pipe
  • L'output può essere scritto in un file, output standard o pipe
  • L'output utilizza le intestazioni che iniziano con "#" per abilitare il piping su gnuplot

Opzioni di analisi

  • Rilevamento basato su segnale, fine file o riga vuota per interrompere l'elaborazione
  • È possibile impostare il carattere di commento e delimitatore
  • Le colonne possono essere filtrate dall'elaborazione
  • Le righe possono essere filtrate dall'elaborazione in base al vincolo numerico
  • Le righe possono essere filtrate dall'elaborazione in base al vincolo di stringa
  • Le righe di intestazione iniziali possono essere ignorate
  • È possibile elaborare un numero fisso di righe
  • I delimitatori duplicati possono essere ignorati
  • Le righe possono essere rimodellate in colonne
  • Applicare rigorosamente che vengano elaborate solo le righe della stessa dimensione
  • Una riga contenente i titoli delle colonne può essere utilizzata per assegnare un titolo alle statistiche

Opzioni statistiche

  • Statistiche riassuntive (conteggio, minimo, medio, massimo, deviazione standard)
  • covarianza
  • Correlazione
  • Offset dei minimi quadrati
  • Pendenza dei minimi quadrati
  • Istogramma
  • Dati non elaborati dopo il filtraggio

NOTA: sono l'autore.


1

Il tuo strumento che potrebbe essere utilizzato per calcolare le statistiche e visualizzare la distribuzione in modalità ASCII è ministat . È uno strumento di FreeBSD, ma anche confezionato per la popolare distribuzione Linux come Debian / Ubuntu.

Esempio di utilizzo:

$ 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

X¯n=(n-1)X¯n-1+Xnn
Sn2=Snn-1
Sn=Sn-1+(Xn-X¯n-1)(Xn-X¯n).

X¯0=S0=0


XioFLOAT_MAX-1.0Xio-Xio+1Xio-Xio-1

Questo è in realtà ciò che fanno i clistat (vedi risposta per dettagli e altre caratteristiche).
dpmcmlxxvi,

0

Ci siamo imbattuti in questo vecchio thread alla ricerca di qualcos'altro. Volevo la stessa cosa, non riuscivo a trovare nulla di semplice, così lo fece in perl, abbastanza banale, ma usalo più volte al giorno: http://moo.nac.uci.edu/~hjm/stats

esempio:

 $ 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 è una versione più lenta, ma probabilmente più facile da tagliare): http://moo.nac.uci.edu/~hjm/scut descritto: http://moo.nac.uci.edu/~hjm/scut_cols_HOWTO. html


0

Un altro strumento: tsv-riassumere dalle Utilità TSV di eBay . Supporta molte delle statistiche di riepilogo di base, come min, max, media, mediana, quantile, deviazione standard, MAD e alcune altre. È destinato a set di dati di grandi dimensioni e supporta più campi e raggruppamenti per chiave. L'output è separato da tabulazione. Un esempio per la sequenza di numeri da 1 a 1000, uno per riga:

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

Le intestazioni vengono normalmente generate da una riga di intestazione nell'input. Se l'input non ha intestazione, è possibile aggiungerne uno usando l' -winterruttore:

$ 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

Disclaimer: sono l'autore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.