Ferramenta de linha de comando para calcular estatísticas básicas para fluxo de valores [fechado]


27

Existe alguma ferramenta de linha de comando que aceite o fluxo de números (no formato ascii) da entrada padrão e forneça as estatísticas descritivas básicas para esse fluxo, como min, max, média, mediana, RMS, quantis, etc? A saída é bem-vinda para ser analisável pelo próximo comando na cadeia de linha de comando. O ambiente de trabalho é o Linux, mas outras opções são bem-vindas.


1
Eu recomendaria dar uma olhada no | STAT . Esse é um software bastante antigo, mas é muito conveniente para essas coisas. Há também pyp e várias outras ferramentas Un * x.
chl

@chl Link ISTAT quebrado. Pode atualizá-lo ou responder, por favor?
Léo Léopold Hertz ·

1
@Masi Yup, parece que a página não existe mais. Aqui está um link atualizado .
chl

Respostas:


22

Você pode fazer isso com o R , que pode ser um pouco exagerado ...

EDIÇÃO 2: [OOPS, parece que alguém bateu com o Rscript enquanto eu estava redigitando isso.] Encontrei uma maneira mais fácil. Instalado com o R deve ser o Rscript, que serve para fazer o que você está tentando fazer. Por exemplo, se eu tiver um arquivo barque tenha uma lista de números, um por linha:

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

Irá canalizar esses números para R e executar o summarycomando de R nas linhas, retornando algo como:

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

Você também pode fazer algo como:

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

para obter quantis. E você poderia obviamente cortar a primeira linha de saída (que contém etiquetas) com algo como:

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

Eu recomendo fazer o que você deseja no R interativo primeiro, para garantir que você tenha o comando correto. Ao tentar isso, deixei de fora os parênteses de fechamento e o Rscript não retorna nada - nenhuma mensagem de erro, nenhum resultado, apenas nada.

(Para o registro, a barra de arquivos contém:

1
2
3
4
5
6

Então, eu devo acrescentar meu fluxo com esses Rcomandos?
mbaitoff

@mbaitoff: Sim. Para o meu teste, criei um arquivo fooque continha a summary (as.numeric (readLines()))primeira linha e, em seguida, um item de dados numéricos por linha para o restante do arquivo. O readLines()é apenas a leitura de stdin (que é tudo o que se segue, até o final do arquivo).
21312 Wayne

Parece que nos apegamos seriamente às Rduas respostas, e parece ser uma ferramenta enorme para uma pequena tarefa. Bem, as respostas funcionam, mas de qualquer maneira, há algo mais, exceto R?
precisa saber é

2
@mbaitoff: Você pode usar o Python scipy, especialmente se você já usa o Python. Se você usa / gosta do Clojure (lisp baseado na JVM, clojure.org ), existe o ambiente estatístico Incanter( incanter.org ) construído sobre isso. Você também pode tentar o gnu Octave.
21312 Wayne

21

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

Você também pode ver o resumo de cinco números:

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

Você pode baixá-lo aqui:

https://github.com/nferraz/st

(AVISO LEGAL: Eu escrevi esta ferramenta :))


Bem-vindo ao site, @ user2747481. Você se importaria de elaborar um pouco essa resposta? Gostaríamos que nossas respostas fossem em sua maioria independentes. Como você é novato aqui, leia nossa página sobre , que contém informações para novos usuários.
gung - Restabelece Monica

Obrigado! A partir de 2019 stestá disponível via Homebrewbrew install st
Noah Sussman

Cuidado que sttambém pode fazer referência simple terminal.
Skippy le Grand Gourou

10

R fornece um comando chamado Rscript . Se você possui apenas alguns números que podem colar na linha de comando, use este liner:

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

o que resulta em

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

Se você deseja ler a partir da entrada padrão, use este:

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

Se o número na entrada padrão for separado por retornos de carro (ou seja, um número por linha), use

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

Pode-se criar aliases para estes 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: Desculpe, encontrei o Rscript e editei minha resposta para incluir isso. Por isso, acabamos com uma resposta semelhante. Sua read.tableideia é uma ótima maneira de contornar um item por linha.
Wayne

Ok, obrigado pelo reconhecimento e pelo +1.
Arnaud A

3

datamash é outra ótima opção. É do Projeto GNU.

Se você possui homebrew / linuxbrew, pode fazer:

brew install datamash


2

Há também simple-r, que pode fazer quase tudo o que R, mas com menos pressionamentos de tecla:

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

Para calcular estatísticas descritivas básicas, seria necessário digitar um dos seguintes:

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

Não existe um simples-R!


2

Há sta, que é uma variável c ++ de st, também referenciada nesses comentários.

Sendo escrito em c ++, é rápido e pode lidar com grandes conjuntos de dados. É simples de usar, inclui a escolha de estimadores imparciais ou tendenciosos e pode gerar informações mais detalhadas, como erro padrão.

Você pode fazer o download do sta no github .

Disclaimer: Eu sou o autor de sta .


1

Apenas no caso, há datastat

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

um programa simples para Linux que calcula estatísticas simples a partir da linha de comando. Por exemplo,

cat file.dat | datastat

produzirá o valor médio em todas as linhas para cada coluna de file.dat. Se você precisar conhecer o desvio padrão, min, max, poderá adicionar as opções --dev, --min e --max, respectivamente.

O datastat tem a possibilidade de agregar linhas com base no valor de uma ou mais colunas "principais".

É escrito em C ++, roda rápido e com pouca ocupação de memória e pode ser canalizado com outras ferramentas, como cut, grep, sed, sort, awk, etc.


1

Você também pode considerar o uso de clistats . É uma ferramenta de interface de linha de comando altamente configurável para calcular estatísticas para um fluxo de números de entrada delimitados.

Opções de E / S

  • Os dados de entrada podem ser de um arquivo, entrada padrão ou canal
  • A saída pode ser gravada em um arquivo, saída padrão ou canal
  • A saída usa cabeçalhos que começam com "#" para permitir que a tubulação gnuplot

Opções de análise

  • Detecção baseada em sinal, final de arquivo ou linha em branco para interromper o processamento
  • O caractere de comentário e delimitador pode ser definido
  • As colunas podem ser filtradas do processamento
  • As linhas podem ser filtradas do processamento com base na restrição numérica
  • As linhas podem ser filtradas do processamento com base na restrição de string
  • Linhas de cabeçalho inicial podem ser ignoradas
  • Número fixo de linhas pode ser processado
  • Delimitadores duplicados podem ser ignorados
  • Linhas podem ser remodeladas em colunas
  • Impor rigorosamente que apenas linhas do mesmo tamanho são processadas
  • Uma linha contendo títulos de colunas pode ser usada para titular estatísticas de saída

Opções de estatísticas

  • Estatísticas resumidas (contagem, mínimo, média, máximo, desvio padrão)
  • Covariância
  • Correlação
  • Deslocamento dos mínimos quadrados
  • Inclinação dos mínimos quadrados
  • Histograma
  • Dados brutos após a filtragem

NOTA: Eu sou o autor.


1

A ferramenta Ya, que poderia ser usada para calcular estatísticas e visualizar a distribuição no modo ASCII, é ministat . É uma ferramenta do FreeBSD, mas também empacotada para distribuição Linux popular como o Debian / Ubuntu.

Exemplo 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

x¯n=(n1)x¯n1+xnn
sn2=Snn1
Sn=Sn1+(xnx¯n1)(xnx¯n).

x¯0=S0=0


xiFLOAT_MAX-1.0xixi+1xixi1

Na verdade, é isso que o clistats faz (consulte a resposta para obter detalhes e outros recursos).
dpmcmlxxvi

0

Tropecei nesse fio antigo procurando algo mais. Queria a mesma coisa, não conseguiu encontrar nada simples, o mesmo aconteceu em perl, bastante trivial, mas use-o várias vezes ao dia: http://moo.nac.uci.edu/~hjm/stats

exemplo:

 $ 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 é uma versão mais lenta, mas sem dúvida mais fácil de cortar): http://moo.nac.uci.edu/~hjm/scut descrito: http://moo.nac.uci.edu/~hjm/scut_cols_HOWTO. html


0

Outra ferramenta: tsv-resume dos TSV Utilities do eBay . Oferece suporte a muitas das estatísticas de resumo básicas, como min, max, média, mediana, quantis, desvio padrão, MAD e mais algumas. Ele é destinado a grandes conjuntos de dados e suporta vários campos e agrupamentos por chave. A saída é separada por tabulação. Um exemplo para a sequência dos números 1 a 1000, um por linha:

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

Os cabeçalhos são normalmente gerados a partir de uma linha de cabeçalho na entrada. Se a entrada não tiver um cabeçalho, poderá ser adicionado usando o -wswitch:

$ 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: Eu sou o autor.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.