2010-10-07 15 views
10

Nie mogłem znaleźć tej funkcji w żadnym ze standardowych pakietów, więc napisałem tę poniżej. Jednak zanim rzuci się go w stronę Cheeseshop, czy ktoś wie o już opublikowanej wersji? Alternatywnie, proszę zasugerować wszelkie ulepszenia. Dzięki.Tukey pięć podsumowań liczb w języku Python

def fivenum(v): 
    """Returns Tukey's five number summary (minimum, lower-hinge, median, upper-hinge, maximum) for the input vector, a list or array of numbers based on 1.5 times the interquartile distance""" 
    import numpy as np 
    from scipy.stats import scoreatpercentile 
    try: 
     np.sum(v) 
    except TypeError: 
     print('Error: you must provide a list or array of only numbers') 
    q1 = scoreatpercentile(v,25) 
    q3 = scoreatpercentile(v,75) 
    iqd = q3-q1 
    md = np.median(v) 
    whisker = 1.5*iqd 
    return np.min(v), md-whisker, md, md+whisker, np.max(v), 
+0

Na co warto, matplotlib na 'boxplot' http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.boxplot robi to skutecznie, choć nazywając go po prostu do obliczania parametrów byłby niezgrabny, co najmniej ... –

+0

Działka Matlab NIE obliczyła podsumowania 5 liczb. Q1 i dolny zawias są często identyczne, ale nie zawsze! Wykres na polu oblicza Q1 przy użyciu pewnej metody (jest ich zbyt wiele), ale nie ma gwarancji, że wyprodukuje niższy zawias Tukeya. – russellpierce

+0

Por. http: //stats.stackexchange.com/questions/51801/interpretowanie-dziwny-box-działka/51806? noredirect = 1 # comment101742_51806 – russellpierce

Odpowiedz

9

Chciałbym pozbyć się tych dwóch rzeczy:

import numpy as np 
from scipy.stats import scoreatpercentile 

Powinieneś imporcie na poziomie modułu. Oznacza to, że użytkownicy będą świadomi brakujących zależności od razu po zaimportowaniu modułu, a nie po wywołaniu funkcji.

try: 
    sum(v) 
except TypeError: 
    print('Error: you must provide a list or array of only numbers') 

kilka problemów z tym:

  1. Nie typ kontroli w Pythonie. Podaj, jaka jest funkcja.
  2. Skąd wiesz, że dzwoniący to zobaczą? Mogą nie działać na konsoli, a nawet jeśli są, mogą nie chcieć, aby komunikat o błędzie zakłócał ich wyniki.
  3. Nie wpisuj opcji Python.

Jeżeli chcesz podnieść jakiś wyjątek dla nieprawidłowych danych (nie rodzaj kontroli), albo pozwolić istniejący wyjątek propagują lub owinąć go w swoim rodzaju wyjątku.

+0

Dobre komentarze. Import jest tam jako symbol zastępczy, kiedy będzie modułem. Obsługa wyjątków również zajmuję się. Dzięki. –

+0

Masz już moduł (w pythonie, cały kod jest zawarty w module). Po prostu importuj swoje towary na najwyższym poziomie, poza funkcją. Nie tylko jest to prawdopodobnie "bardziej poprawne", ale jeśli/kiedy dodasz inną funkcję do pliku, nie będziesz musiał ponownie pisać instrukcji importu. –

+0

To nie do końca słuszne odwoływanie się do tego, co się dzieje jako sprawdzanie typu, tylko złe zgłaszanie błędów. Kod pozostawia kod klienta wolnym, aby wywołać go z 'v' równym cokolwiek, co można przekazać do' sum'. To całkowicie poprawne. – aaronasterling

5

Jeśli ktoś potrzebuje wersji, która współpracuje z danymi NaN, oto moja modyfikacja. Nie chciałem zmienić oryginalnej odpowiedzi na plakat, aby uniknąć nieporozumień.

import numpy as np 
from scipy.stats import scoreatpercentile 
from scipy.stats import nanmedian 

def fivenum(v): 
    """Returns Tukey's five number summary (minimum, lower-hinge, median, upper-hinge, maximum) for the input vector, a list or array of numbers based on 1.5 times the interquartile distance""" 
    try: 
     np.sum(v) 
    except TypeError: 
     print('Error: you must provide a list or array of only numbers') 
    q1 = scoreatpercentile(v[~np.isnan(v)],25) 
    q3 = scoreatpercentile(v[~np.isnan(v)],75) 
    iqd = q3-q1 
    md = nanmedian(v) 
    whisker = 1.5*iqd 
    return np.nanmin(v), md-whisker, md, md+whisker, np.nanmax(v), 
0

Jestem nowy języka, jednak powrót obliczono nieprawidłowe: powinna być max (min (V), Q1-wąsy) w dolnej granicy i min (max (v) q3 + wiskerów) dla górnej granicy. To jak to się robi w R (funkcja summary()), a to, co pojawia się na boxplots w matplotlib.pyplot i R.

26

pandasSeries i DataFrame mają describe sposób, który jest podobny do R „s summary:

In [3]: import numpy as np 

In [4]: import pandas as pd 

In [5]: s = pd.Series(np.random.rand(100)) 

In [6]: s.describe() 
Out[6]: 
count 100.000000 
mean  0.540376 
std  0.296250 
min  0.002514 
25%  0.268722 
50%  0.593436 
75%  0.831067 
max  0.991971 

NAN są obsługiwane prawidłowo.

+0

N.B. Może to dać ci inny rezultat, niż zamierzałeś. Opis może wykorzystywać inną metodę interpolacji niż wymagana dla kwartetów "niższych" i "górnych". Zobacz https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html –

0

Spróbuj tego:

import numpy as np 
import numpy.random 
from statstools import run 
from scipy.stats import scoreatpercentile 

data=np.random.randn(5) 

return (min(data), md-whisker, md, md+whisker, max(data)) 
0

Minimal, ale dostaje zadanie. :)

import numpy as np 
[round(np.percentile(results[:,4], i), 1) for i in [1, 2, 5, 10, 25, 50]]