2016-11-15 21 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からの年齢の標準偏差を求めようとしています。しかし、私は、現在のエラーを取得しています: は平均=(SUM(行[0]))/ LEN(行[0]) はTypeError:「int型のオブジェクトが反復可能ではありません標準偏差のためのPythonコードSQLite3のデータ

は、どのように私はこれを修正することができますか?あなたがageslist=ages.execute("SELECT age from person") あなたageslist変数を実行

答えて

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 

は今反復可能なオブジェクトです。一度反復すると、databaseコマンドを再度実行しなくても、その値を参照できなくなります。

私はあなたがforループのすべての行の反復中に年齢を合計する変数を持つべきだと思っています。また、データベースのエントリ数をカウントする別の変数もあります。これはforループでも行うことができます。私は確信していますが、これを達成するためのより「ピジョンソニック」な方法があります。