Befehlszeilentool zum Berechnen grundlegender Statistiken für Werteströme [geschlossen]

27

Gibt es ein Befehlszeilentool, das den Zahlenfluss (im ASCII-Format) von der Standardeingabe akzeptiert und die grundlegenden deskriptiven Statistiken für diesen Fluss liefert, z. B. Min, Max, Durchschnitt, Median, RMS, Quantile usw.? Die Ausgabe kann mit dem nächsten Befehl in der Befehlszeilenkette analysiert werden. Die Arbeitsumgebung ist Linux, aber andere Optionen sind willkommen.

mbaitoff
quelle
1
Ich würde empfehlen, sich | STAT anzuschauen . Das ist eine ziemlich alte Software, aber für solche Dinge ist sie sehr praktisch. Es gibt auch pyp und mehrere andere Un * x-Tools.
Chl
@chl Link ISTAT kaputt. Können Sie es aktualisieren oder eine Antwort geben?
Léo Léopold Hertz 준영
1
@Masi Yup, es sieht so aus, als ob die Seite nicht mehr existiert. Hier ist ein aktualisierter Link .
Chl

Antworten:

22

Sie können dies mit R tun , was ein bisschen übertrieben sein kann ...

EDIT 2: [OOPS, sieht aus wie jemand anderes, der mit Rscript getroffen wurde, als ich das noch einmal tippte.] Ich habe einen einfacheren Weg gefunden. Mit R sollte Rscript installiert sein, das das tun soll, was Sie versuchen. Wenn ich zum Beispiel eine Datei barmit einer Liste von Zahlen habe, eine pro Zeile:

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

Pipe diese Zahlen in R und führe den summaryBefehl von R in den Zeilen aus und gebe so etwas zurück wie:

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

Sie könnten auch etwas tun wie:

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

Quantile zu bekommen. Und Sie könnten natürlich die erste Zeile der Ausgabe (die Labels enthält) mit etwas abhacken wie:

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

Ich empfehle dringend, zunächst in Interactive R das zu tun, was Sie wollen, um sicherzustellen, dass Sie den richtigen Befehl haben. Bei diesem Versuch habe ich die schließende Klammer weggelassen und Rscript gibt nichts zurück - keine Fehlermeldung, kein Ergebnis, nur nichts.

(Für den Datensatz enthält die Dateileiste:

1
2
3
4
5
6
Wayne
quelle
Also sollte ich meinem Flow diese RBefehle voranstellen ?
mbaitoff
@mbaitoff: Ja. Für meinen Test habe ich eine Datei erstellt foo, die summary (as.numeric (readLines()))als erste Zeile ein numerisches Datenelement und für den Rest der Datei ein numerisches Datenelement pro Zeile enthält. Das readLines()liest gerade von stdin (was alles ist, was folgt, bis zum Ende der Datei).
Wayne
Es sieht so aus, als hätten wir uns ernsthaft an Rbeide Antworten gehalten, und es scheint ein riesiges Werkzeug für eine winzige Aufgabe zu sein. Nun, die Antworten funktionieren, aber gibt es noch etwas anderes als R?
Mbaitoff
2
@mbaitoff: Sie könnten Python mit verwenden scipy, insbesondere wenn Sie bereits Python verwenden. Wenn Sie / like Clojure (lisp basiert auf JVM, clojure.org ) verwenden, gibt es die darauf aufbauende statistische Umgebung Incanter( incanter.org ). Sie könnten auch Gnu Octave ausprobieren.
Wayne
20

Versuchen Sie "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

Sie können auch die fünf Zahlenübersicht sehen:

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

Sie können es hier herunterladen:

https://github.com/nferraz/st

(HAFTUNGSAUSSCHLUSS: Ich habe dieses Tool geschrieben :))

user2747481
quelle
Willkommen auf der Site, @ user2747481. Würde es Ihnen etwas ausmachen, diese Antwort ein wenig zu verfeinern? Wir möchten, dass unsere Antworten weitgehend in sich geschlossen sind. Da Sie neu hier sind, können Sie unsere About-Seite lesen , die Informationen für neue Benutzer enthält.
gung - Wiedereinsetzung von Monica
Vielen Dank! Ab 2019 stist über Homebrew verfügbarbrew install st
Noah Sussman
Vorsicht, das stkann auch auf verweisen simple terminal.
Skippy le Grand Gourou
10

R stellt einen Befehl mit dem Namen Rscript bereit . Wenn Sie nur wenige Zahlen haben, die Sie in die Befehlszeile einfügen können, verwenden Sie diese eine Zeile:

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

was in ... endet

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

Wenn Sie von der Standardeingabe lesen möchten, verwenden Sie Folgendes:

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

Wenn die Nummern in der Standardeingabe durch Zeilenumbrüche getrennt sind (dh eine Nummer pro Zeile), verwenden Sie

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

Man kann Aliase für diese Befehle erstellen:

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
Arnaud A
quelle
+1: Entschuldigung, ich habe gerade Rscript gefunden und meine Antwort so bearbeitet, dass sie diese enthält. Wir haben also eine ähnliche Antwort erhalten. Ihre read.tableIdee ist ein guter Weg, um einen Artikel pro Zeile zu umgehen.
Wayne
Ok, danke für die Bestätigung und die +1.
Arnaud A
3

Datamash ist eine weitere großartige Option. Es ist aus dem GNU-Projekt.

Wenn Sie Homebrew / Linuxbrew haben, können Sie Folgendes tun:

brew install datamash

Owen
quelle
2

Es gibt auch simple-r, das fast alles kann, was R kann, aber mit weniger Tastenanschlägen:

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

Um grundlegende deskriptive Statistiken zu berechnen, müsste man Folgendes eingeben:

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

Bekommt kein einfaches R!

user30888
quelle
2

Es gibt sta, eine c ++ - Variante von st, auf die in diesen Kommentaren ebenfalls verwiesen wird.

Da es in c ++ geschrieben ist, ist es schnell und kann mit großen Datenmengen umgehen. Es ist einfach zu bedienen, umfasst die Auswahl von unvoreingenommenen oder voreingenommenen Schätzern und kann detailliertere Informationen wie Standardfehler ausgeben.

Sie können sta bei github herunterladen .

Disclaimer: Ich bin der Autor von sta .

Simon
quelle
1

Nur für den Fall, es gibt Datastat

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

Ein einfaches Programm für Linux, das einfache Statistiken über die Befehlszeile berechnet. Beispielsweise,

cat file.dat | datastat

gibt den Durchschnittswert über alle Zeilen für jede Spalte von file.dat aus. Wenn Sie die Standardabweichung (min, max) kennen müssen, können Sie die Optionen --dev, --min und --max hinzufügen.

datastat hat die Möglichkeit, Zeilen basierend auf dem Wert einer oder mehrerer "Schlüssel" -Spalten zu aggregieren.

Es ist in C ++ geschrieben, läuft schnell und mit geringem Speicherbedarf und kann problemlos mit anderen Tools wie cut, grep, sed, sort, awk usw. kombiniert werden.

Tommaso
quelle
1

Sie können auch Clistats verwenden . Es ist ein in hohem Maße konfigurierbares Tool für die Befehlszeilenschnittstelle zum Berechnen von Statistiken für einen Strom von durch Trennzeichen getrennten Eingabenummern.

E / A-Optionen

  • Eingabedaten können aus einer Datei, einer Standardeingabe oder einer Pipe stammen
  • Die Ausgabe kann in eine Datei, eine Standardausgabe oder eine Pipe geschrieben werden
  • Die Ausgabe verwendet Header, die mit "#" beginnen, um die Weiterleitung an den Gnuplot zu ermöglichen

Analyseoptionen

  • Signal-, Dateiende- oder Leerzeilenerkennung, um die Verarbeitung zu stoppen
  • Kommentar- und Trennzeichen können eingestellt werden
  • Spalten können aus der Verarbeitung herausgefiltert werden
  • Zeilen können basierend auf numerischen Einschränkungen aus der Verarbeitung herausgefiltert werden
  • Zeilen können basierend auf Zeichenfolgenbeschränkungen aus der Verarbeitung herausgefiltert werden
  • Anfangsüberschriftenzeilen können übersprungen werden
  • Eine feste Anzahl von Zeilen kann verarbeitet werden
  • Doppelte Trennzeichen können ignoriert werden
  • Zeilen können in Spalten umgewandelt werden
  • Stellen Sie sicher, dass nur Zeilen derselben Größe verarbeitet werden
  • Eine Zeile mit Spaltentiteln kann verwendet werden, um Ausgabestatistiken zu betiteln

Statistikoptionen

  • Zusammenfassende Statistik (Anzahl, Minimum, Mittelwert, Maximum, Standardabweichung)
  • Kovarianz
  • Korrelation
  • Offset der kleinsten Quadrate
  • Hang der kleinsten Quadrate
  • Histogramm
  • Rohdaten nach dem Filtern

HINWEIS: Ich bin der Autor.

dpmcmlxxvi
quelle
1

Ein Tool, das zur Berechnung von Statistiken und zur Ansichtsverteilung im ASCII-Modus verwendet werden kann, ist Ministat . Es ist ein Tool von FreeBSD, aber es ist auch für populäre Linux-Distributionen wie Debian / Ubuntu gepackt.

Anwendungsbeispiel:

$ 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
DR.
quelle
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

Dennis
quelle
xichFLOAT_MAX-1.0xich-xich+1xich-xich-1
Dies ist eigentlich, was Clistats tut (siehe Antwort für Details und andere Funktionen).
dpmcmlxxvi
0

Stolperte über diesen alten Faden auf der Suche nach etwas anderem. Wollte das Gleiche, konnte nichts Einfaches finden, tat es auch in Perl, ziemlich trivial, aber benutzte es mehrmals am Tag: http://moo.nac.uci.edu/~hjm/stats

Beispiel:

 $ 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 ist eine langsamere, aber wohl einfacher zu schneidende Version): http://moo.nac.uci.edu/~hjm/scut beschrieben: http://moo.nac.uci.edu/~hjm/scut_cols_HOWTO. html

Harry Mangalam
quelle
0

Ein weiteres Tool: tsv-summarize von eBay's TSV Utilities . Unterstützt viele der grundlegenden Zusammenfassungsstatistiken wie Min, Max, Mittelwert, Median, Quantile, Standardabweichung, MAD und einige mehr. Es ist für große Datenmengen gedacht und unterstützt mehrere Felder und die Gruppierung nach Schlüsseln. Die Ausgabe ist tabulatorgetrennt. Ein Beispiel für die Zahlenfolge 1 bis 1000, eine pro Zeile:

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

Überschriften werden normalerweise aus einer Überschriftenzeile in der Eingabe generiert. Wenn der Eingang keinen Header hat, kann einer mit dem -wSchalter hinzugefügt werden :

$ 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

Haftungsausschluss: Ich bin der Autor.

JonDeg
quelle