2012-05-07 13 views
17

Mam takie dane.Jak znaleźć medianę

Ram,500 
Sam,400 
Test,100 
Ram,800 
Sam,700 
Test,300 
Ram,900 
Sam,800 
Test,400 

Jaki jest najkrótszy sposób na wyrównywanie "mediany" z powyższych danych. Mój wynik powinien być podobny do ...

Mediana = 1/2 (n + 1), gdzie n to liczba wartości danych w próbce.

Test 500 
Sam 700 
Ram 800 
+0

Jeśli jesteś po prostu patrząc na algorytmach mediana spróbować [ten] (http://stackoverflow.com/questions/7578689/median-code-explanation) –

Odpowiedz

30

Jest trochę niejasne w jaki sposób dane są właściwie reprezentowane, więc mam założyć, że jest to lista krotek:

data = [('Ram',500), ('Sam',400), ('Test',100), ('Ram',800), ('Sam',700), 
     ('Test',300), ('Ram',900), ('Sam',800), ('Test',400)] 

from collections import defaultdict 

def median(mylist): 
    sorts = sorted(mylist) 
    length = len(sorts) 
    if not length % 2: 
     return (sorts[length/2] + sorts[length/2 - 1])/2.0 
    return sorts[length/2] 

data_dict = defaultdict(list) 
for el in data: 
    data_dict[el[0]].append(el[1]) 

print [(key,median(val)) for key, val in data_dict.items()] 
print median([5,2,4,3,1]) 
print median([5,2,4,3,1,6]) 
#output: 
[('Test', 300), ('Ram', 800), ('Sam', 700)] 
3 
3.5 

Funkcja median zwraca medianę z listy. Jeśli istnieje parzysta liczba wpisów, przyjmuje średnią wartość środkowych dwóch pozycji (jest to standard).

Użyłem defaultdict aby utworzyć dict wprowadzonego przez swoich danych i ich wartości, która jest bardziej przydatna reprezentacja danych.

+1

Może funkcja byłby nieco jaśniejszy, gdybyś pomógł 'n = len (sorts)' –

+0

median() wywala na pustych listach, możesz chcieć dodać 'if not mylist: return 0' na początku. – OlivierBlanvillain

+7

@OlivierBlanvillain to nie ulega awarii, ale podnosi wyjątek, który można złapać. to jest poprawne zachowanie, ponieważ mediana pustej listy jest * niezdefiniowana * i zdecydowanie nie jest "0" (co jest medianą czegoś w rodzaju '[2, -1,0]') –

0

Najłatwiej dostać medianę listy z danymi integer:

x = [1,3,2] 
print "The median of x is:",sorted(x)[len(x)//2] 
+2

Dla każdego, kto ma zamiar to sprawdzić: // oznacza obcięcie podziału (tak jak normalny podział w pythonie 2.x) – Bemmu

+5

Jest to oczywiście poprawne, ponieważ nie działa dla parzystej liczby elementów. –

4

to sprawdzić:

def median(lst): 
    even = (0 if len(lst) % 2 else 1) + 1 
    half = (len(lst) - 1)/2 
    return sum(sorted(lst)[half:half + even])/float(even) 

Uwaga:

sorted(lst) produkuje posortowaną kopię lst;

sum([1]) == 1;

0

Zacząłem odpowiedź user3100512 i szybko zdali sobie sprawę, że nie działa dla parzystej liczby elementów. Dodałem kilka warunków, aby obliczyć medianę.

def median(x): 
    if len(x)%2 != 0: 
     return sorted(x)[len(x)/2] 
    else: 
     midavg = (sorted(x)[len(x)/2] + sorted(x)[len(x)/2-1])/2.0 
     return midavg 

    median([4,5,6,7]) 

powinien powrócić 5.5