ryan doucette ryan doucette - 2 years ago 78
Python Question

Writing a standard deviation function

I have a dictionary of words as keys and ints as value. It outputs as such:

print (word_ratings_dict)
{'hate': [1, 2, 2, 1, 1, 3, 0, 2, 3, 2, 0, 4, 1, 1], 'joy': [3, 4, 3, 3, 2, 4, 1]}

For each key word in the dictionary, I need to calculate its standard deviation WITHOUT using the statistics module.

Heres what I have so far:

def menu_validate(prompt, min_val, max_val):
""" produces a prompt, gets input, validates the input and returns a value. """
while True:
menu = int(input(prompt))
if menu >= min_val and menu <= max_val:
return menu
elif menu.lower == "quit" or menu.lower == "q":
print("You must enter a number value from {} to {}.".format(min_val, max_val))
except ValueError:
print("You must enter a number value from {} to {}.".format(min_val, max_val))

def open_file(prompt):
""" opens a file """
while True:
file_name = str(input(prompt))
if ".txt" in file_name:
input_file = open(file_name, 'r')
return input_file
input_file = open(file_name+".txt", 'r')
return input_file
except FileNotFoundError:
print("You must enter a valid file name. Make sure the file you would like to open is in this programs root folder.")

def make_list(file):
lst = []
for line in file:
lst2 = line.split(' ')
del lst2[-1]
return lst

def rating_list(lst):
'''iterates through a list of lists and appends the first value in each list to a second list'''
rating_list = []
for list in lst:
return rating_list

def word_cnt(lst, word : str):
cnt = 0
for list in lst:
for word in list:
cnt += 1
return cnt

def words_list(file):
lst = []
for word in file:
return lst

def word_rating(word, ratings_lst):
'''finds ratings for a word and appends them to a dictionary of words'''
lst = []
for line in ratings_lst:
line = line.split()
if word in line:
rating = line[0]
return lst
cnt_list = []
while True:
menu = menu_validate("1. Get sentiment for all words in a file? \nQ. Quit \n", 1, 1)
if menu == True:
ratings_file = open("sample.txt")
ratings_list = make_list(ratings_file)
word_ratings_dict = {}
word_avg_dict = {}
std_dev_dict = {}
word_file = open_file("Enter the name of the file with words to score \n")
word_list = words_list(word_file)

for word in word_list:
#counts the words
cnt = word_cnt(ratings_list, word)

cnt_dict[word] = cnt

word_ratings_dict[word] = word_rating(word, ratings_list)

total_rating = 0

for i in range (0, cnt):
total_rating += word_ratings_dict[word][i]

word_avg_dict[word] = total_rating/cnt

std_dev_dict[word] =

Answer Source

These will do the job nicely:

def mean(data):
    return float(sum(data) / len(data))

def variance(data):
    mu = mean(data)
    return mean([(x - mu) ** 2 for x in data])

def stddev(data):
    return sqrt(variance(data))
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download