web-dev-qa-db-fra.com

Comment trouver la médiane

J'ai des données comme ça.

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

Quel est le moyen le plus rapide d’affiner la "médiane" à partir des données ci-dessus . Mon résultat devrait être quelque chose comme ...

Médiane = 1/2 (n + 1), où n est le nombre de valeurs de données dans l’échantillon.

Test 500
Sam 700
Ram 800
17
user1335606

Python 3.4 inclut statistics integrated, vous pouvez donc utiliser la méthode statistics.median :

>>> from statistics import median
>>> median([1, 3, 5])
 3
39
jabaldonedo

Utilisez la fonction médiane de numpy .

35
KurzedMetal

Il est un peu difficile de savoir comment vos données sont réellement représentées. J'ai donc supposé qu'il s'agissait d'une liste de n-uplets:

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 fonction median renvoie la médiane à partir d'une liste. S'il y a un nombre pair d'entrées, il prend la valeur médiane des deux entrées médianes (standard).

J'ai utilisé defaultdict pour créer un dict contenant vos données et leurs valeurs, ce qui est une représentation plus utile de vos données.

30
fraxel

Regarde ça:

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)

Remarque:

sorted(lst) produit une copie triée de lst;

sum([1]) == 1;

4
ffunenga

Meilleure façon d'obtenir la médiane d'une liste avec des données entières:

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

J'ai commencé avec la réponse de user3100512 et j'ai rapidement réalisé que cela ne fonctionnait pas pour un nombre pair d'éléments. J'y ai ajouté des conditions pour calculer la médiane.

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

devrait retourner 5,5

0
Ben