web-dev-qa-db-fra.com

Python: Variance d'une liste de nombres définis

J'essaie de créer une fonction qui affiche la variance d'une liste de nombres définis:

grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5]

Jusqu'à présent, j'ai essayé de procéder à la création de ces trois fonctions:

def grades_sum(my_list):
    total = 0
    for grade in my_list: 
        total += grade
    return total

def grades_average(my_list):
    sum_of_grades = grades_sum(my_list)
    average = sum_of_grades / len(my_list)
    return average

def grades_variance(my_list, average):
    variance = 0
    for i in my_list:
        variance += (average - my_list[i]) ** 2
    return variance / len(my_list)

Cependant, lorsque j'essaie d'exécuter le code, l'erreur suivante apparaît à la ligne suivante:

Line: variance += (average - my_list[i]) ** 2
Error: list index out of range

Toutes mes excuses si mes connaissances actuelles en Python sont limitées, mais je suis toujours en train d’apprendre. Je vous en prie, si vous souhaitez aider à résoudre ce problème, essayez de ne pas suggérer de méthodes extrêmement compliquées pour le résoudre. Merci beaucoup. 

7
GiamPy

Tout d'abord, je suggérerais d'utiliser la méthode sum intégrée de Python pour remplacer votre première méthode personnalisée. grades_average devient alors:

def grades_average(my_list):
    sum_of_grades = sum(my_list)
    average = sum_of_grades / len(my_list)
    return average

Deuxièmement, je recommanderais vivement de regarder dans la bibliothèque NumPy , car ces méthodes sont intégrées. numpy.mean() et numpy.std() couvriraient ces deux cas.

Si vous souhaitez d'abord écrire le code pour vous-même, c'est très bien aussi. En ce qui concerne votre erreur spécifique, je crois que @gnibbler ci-dessus l’a cloué. Si vous voulez utiliser un index en boucle, vous pouvez restructurer la ligne dans grades_variance pour qu'elle soit:

for i in range(0, len(my_list)):

Comme Lattyware noté, la boucle par index n'est pas particulièrement "Pythonic"; la façon dont vous le faites actuellement est généralement supérieure. Ceci est juste pour votre référence.

10
Magsol

Essayez numpy .

import numpy as np
variance = np.var(grades)
17
robinfang

Quand tu dis

 for i in my_list:

i n'est pas le index de l'élément. i is l'élément

for i in my_list:
    variance += (average - i) ** 2
6
John La Rooy

Bien que gnibbler ait résolu le problème avec votre code , vous pouvez y parvenir beaucoup plus facilement en utilisant fonctions intégrées et un expression génératrice :

average = sum(grades) / len(grades)
varience = sum((average - value) ** 2 for value in grades) / len(grades)

Cela peut paraître un peu effrayant au début, mais si vous regardez la vidéo, vous trouverez un lien vers la compréhension des listes et les expressions de générateur - elles sont en réalité très simples et utiles.

5
Gareth Latty

python 3.4 a une bibliothèque de statistiques qui le fait.

   import statistics
   grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5]
   statistics.pvariance(grades)
=> 334.07100591715977

https://docs.python.org/3/library/statistics.html#statistics.pvariance

4
zengr

Je suppose que vous souhaiteriez la variance de l’échantillon, c’est-à-dire l’estimateur sans biais de la variance. Je pense que cette fonction pourrait faire le travail. Il imprimera la variance et la moyenne d'un vecteur n.

n = [5, 3, 1, 2, 4]

def variance1337(n):
    var1 = []
    mean1 = sum(n)/len(n)
    for xs in n:
        var1.append((xs - mean1) ** 2)
    print(sum(var1)/(len(n) - 1))
    print(mean1)
0
Don Juan