«Индекс вне диапазона» для функции стандартного отклонения

avatar
Onika69
9 августа 2021 в 01:33
37
3
-1

Итак, я создал эту функцию, которая может вычислять стандартное отклонение из списка данных для моего класса статистики:

from math import *

data = [35, 27, 24, 42, 25, 31, 41, 34, 32, 46, 29, 44, 29, 35, 39, 27, 41, 63, 52, 31, 38, 46, 39, 27, 58, 32, 33, 47, 36, 28, 65, 53, 40, 32, 39, 44, 48, 59, 46, 62, 22, 39, 35, 29, 36, 66, 33, 45, 50, 62, 27, 27, 41, 33, 54, 44, 26, 31, 45, 33, 42, 63, 51, 70, 42, 53, 38, 28, 35, 49, 47, 54, 44, 40, 39, 62, 30, 35, 38, 26, 34, 61, 19, 30, 34, 26, 41, 35, 26, 54, 28, 32, 50, 27, 31, 35, 38, 26, 47, 30, 28, 62, 57, 56, 30, 32, 31, 36, 32, 42, 33, 51, 35, 30, 28, 20, 23, 27, 33, 36, 35, 42, 43, 28, 36, 44, 58, 41, 36, 37, 49, 34, 23, 39, 34, 37, 62, 23, 28, 26, 29, 30, 37, 46, 43, 56, 53, 31, 36, 44, 39, 51, 21, 51, 34, 30, 25, 31, 38, 52, 49, 43, 50, 31, 36, 32, 28, 44, 61, 57, 24, 63, 28, 31, 32, 26, 28]


def stand_dev(list_n):
       sum_num = 0
       for x in list_n:                  # Calculate the mean of the list
           sum_num += list_n[x]
       sum_of_n = sum_num
       mean = float(sum_of_n / len(list_n))
       float(mean)

       e = 0.0
       for i in list_n:                   # Take the values from the list, subtract it by the computed mean, square the result, and then add them with e to compound the answer
           subtract_then_square = (list_n[i] - mean)**2
           e += subtract_then_square
       result1 = e
       new_mean = result1 / len(list_n)            # Finding the mean again by using the new sum
       final_result = float(sqrt(new_mean))         # square root mean
       return final_result
print(stand_dev(data))

Код хорошо работает для больших данных, подобных приведенному выше, но почему-то не работает для меньших данных Пример: [1, 2, 3, 4], и компилятор на самом деле выводит ошибку, которая гласит: «Индекс вне диапазона". Кто-нибудь знает, почему это происходит или почему это не работает?

Источник
Tim Roberts
9 августа 2021 в 01:41
0

Код хорошо работает с большими данными -- на самом деле он вообще не работает. Это дает вам ответ, но ответ - мусор.

Daniel Hao
9 августа 2021 в 01:46
1

Почему бы не использовать stdev из модуля статистики?

Ответы (3)

avatar
Tim Roberts
9 августа 2021 в 01:42
0
def stand_dev(list_n):
       sum_of_n = sum(list_n)
       mean = float(sum_of_n / len(list_n))

       result1 = 0.0
       for i in list_n:                   # Take the values from the list, subtract it by the computed mean, square the result, and then add them with e to compound the answer
           result1 += (i - mean)**2
       new_mean = result1 / len(list_n)            # Finding the mean again by using the new sum
       return sqrt(new_mean)         # square root mean
avatar
AlexanderK1987
9 августа 2021 в 01:39
-1

Это ваш цикл for.

Если вы хотите использовать числовую индексацию.

Вы должны использовать for i in range(len(list_n)) вместо for x in list_n

Tim Roberts
9 августа 2021 в 01:40
2

На самом деле он должен оставить for x in list_n: и исправить добавление на sum_num += x. Или еще лучше, пропустите цикл и введите sum_num = sum(x).

avatar
xtryingx
9 августа 2021 в 01:39
0

Это неправильно:

for i in list_n:
   # list_n[i] is the incorrect syntax
   subtract_then_square = (list_n[i] - mean)**2

   e += subtract_then_square

Если вы хотите проиндексировать list_n, вам нужно будет изменить цикл на:

for i in range(len(list_n)):

Если у вас есть for i in list_n: для цикла, используйте просто i. Вот как это будет выглядеть:

   for i in list_n:
       subtract_then_square = (i - mean)**2
       e += subtract_then_square