Leon
Leon

Reputation: 19

Finding standard deviation using loops in a list

I want to find the standard deviation for a specific window in a list. What I mean by this is for example:

num_list = [1, 2, 3, 4, 5]
window = 3

Thus, I would find the standard deviation for [1, 2, 3], [2, 3, 4] and [3, 4, 5].

How I approached this was as the following:

def mean(data):
        n = len(data)
        mean = sum(data) / n
        return mean

def standard_deviation(data):
        average = mean(data)
        deviations = [(x - average) ** 2 for x in data]
        variance = sum(deviations) / window
        standard_deviation=math.sqrt(variance)
        return standard_deviation

first_mean = mean(num_list[:window])
first_standard_deviation = standard_deviation(num_list[:window])
average_list = [first_mean]
standard_deviation_list=[first_standard_deviation]
for i in range(1, len(num_list)-window+1):
    first_mean -= num_list[i-1] / window
    first_mean += num_list[i+window-1] / window
    deviations=[(i-first_mean) **2 for i in num_list]
    first_standard_devaiation=math.sqrt(sum(deviations)/window)
    average_list.append(first_mean)
    standard_deviation_list.append(first_standard_deviation)

When testing out other numbers in the list, it appears that the standard deviation seems to be the same value as the first sub-list for the rest of the sub-lists which is not right. I am not sure which part I did wrong.

Upvotes: 1

Views: 47

Answers (1)

Andrej Kesely
Andrej Kesely

Reputation: 195438

You can simplify the code with help of statistics.pstdev:

from statistics import pstdev

num_list=[1,2,3,4,5]
window=3

for i in zip(*[num_list[i:] for i in range(window)]):
    print(pstdev(i))

Prints:

0.816496580927726
0.816496580927726
0.816496580927726

Upvotes: 2

Related Questions