2016-11-15 4 views
1
from math import * 
import sqlite3 
ages=sqlite3.connect('person.sqlite3') 

def main(): 
    ageslist=ages.execute("SELECT age from person") 
#average age 
    for row in ageslist: 
     row[0] 
    average = (sum(row[0]))/len(row[0]) 
#subtracts average x from x or opposite and square, depending on n  
    for n in range(len(ageslist) - 1): 
     if numbers[n] > average: 
      numbers.append((ageslist[n] - average)**2) 
     if numbers[n] < average: 
      numbers.append((average - ageslist[n])**2) 
#takes square rt of the sum of all these numbers and divides by n-1 
    Stdv = math.sqrt(sum(ageslist))/(len(ageslist)-1) 
    end=time() 
    print(Stdv) 

main() 

Я пытаюсь найти стандартное отклонение возрастов от SQLITE3 db. Тем не менее, я получаю текущую ошибку: средний = (сумма (строка [0]))/LEN (строка [0]) TypeError: 'INT' объект не итерациюКод Python для стандартного отклонения с данными SQLITE3

Как я могу это исправить?

ответ

1

Запрос, отправленный в соединение с базой данных, возвращает итератор. Вы можете передать этот итератор только до того, как он будет удален из памяти. Вот некоторая поправка к вашему коду, чтобы делать то, что вы просите.

conn = sqlite3.connect('person.sqlite3') 

def main(): 
    ages_iterator = conn.execute("SELECT age from person") 
    # this turns the iterator into an actual list, which you need for stdev 
    age_list = [a[0] for a in ages_iterator] 

    # average age 
    average = (sum(age_list))/len(age_list) 

    # subtracts average x from x square 
    # because you are squaring the difference, the it does not matter if it is 
    # greater or less than the average 
    numbers = [(age-average)**2 for age in age_list] 

    #takes square rt of the sum of all these numbers and divides by n-1 
    Stdv = math.sqrt(sum(numbers))/float(len(numbers)-1) 
    end=time() 
    print(Stdv) 

main() 
+0

Благодарим за помощь в расчетах по математике! Это сделало его намного менее сложным. эти изменения теперь дают мне ошибку TypeError: неподдерживаемый тип операндов для +: 'int' и 'str' при вычислении среднего значения. –

+0

Добро пожаловать. Пожалуйста, отметьте вопрос как ответ, если вы чувствуете, что это так. – James

0

Некоторые быстрые комментарии в коде ..

for row in ageslist: 
    row[0] # This statement does nothing 
average = (sum(row[0]))/len(row[0]) # This statement will not have a row value to reference because your rows in ageslist will have been iterated through 

При выполнении ageslist=ages.execute("SELECT age from person") вашей ageslist переменного теперь итератор объект. Как только вы перейдете через него, вы больше не сможете ссылаться на значения в нем, не выполняя команду базы данных еще раз.

Поэтому я считаю, что у вас должна быть переменная, суммирующая возраст во время каждой итерации строк в цикле for, а также еще одну переменную, которая хранит количество записей в базе данных. Это можно сделать и в цикле for. Хотя я уверен, что существует более «питонический» способ достичь этого.

Смежные вопросы