2012-05-07 14 views
17

Tengo datos como este.Cómo encontrar Median

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

¿Cuál es la forma más corta de ajustar la "mediana" de los datos anteriores? Mi resultado debe ser algo así como ...

Mediana = 1/2 (n + 1), donde n es el número de valores de datos en la muestra.

Test 500 
Sam 700 
Ram 800 
+0

Si sólo está buscando algoritmos tratan mediana [éste] (http://stackoverflow.com/questions/7578689/median-code-explanation) –

Respuesta

30

Es un poco claro cómo sus datos son en realidad representada, por lo que he asumido que es una lista de tuplas:

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 

La función median devuelve la mediana de una lista. Si hay un número par de entradas, toma el valor medio de las dos entradas del medio (esto es estándar).

He utilizado defaultdict para crear un dict codificado por sus datos y sus valores, que es una representación más útil de sus datos.

+1

Tal vez la función Sería un poco más claro si factoriza 'n = len (ordena)' –

+0

median() cuelga en listas vacías, es posible que desee agregar 'if not mylist: return 0' al comienzo. – OlivierBlanvillain

+7

@OlivierBlanvillain no se bloquea, pero genera una excepción, que puede detectar. este es el comportamiento correcto, ya que la mediana de una lista vacía es * undefined * y definitivamente no "0" (que es la mediana de algo así como '[2, -1,0]') –

0

La manera más fácil de conseguir la mediana de una lista con los datos de número entero:

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

Para cualquiera a punto de buscarlo: // significa truncar la división (al igual que la división normal en python 2.x) – Bemmu

+5

Esto es por supuesto correcto, ya que no funciona para un número par de elementos. –

4

mira esto:

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) 

Nota:

sorted(lst) produce una copia ordenada de lst;

sum([1]) == 1;

0

empecé con la respuesta de user3100512 y rápidamente se dio cuenta de que no funciona para un número par de artículos. Añadí algunos condicionales para calcular la mediana.

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]) 

debe devolver 5,5