0

スクリプトを動作させるのに問題があり、見落としている単純なものがあると思われます。同様のデータ セットに対して同じタイプのエラーを生成する簡略化されたスクリプトを以下に貼り付けました。

以下のスクリプトは、各行が特定の状態のポーリング データを表す csv を取得するためのものです。州のリストを使用して、csv データを反復処理して各州の最新の世論調査を見つけ、その州の属性の 1 つを要約したリストのリストを生成したいと思います (この例では民主党候補の投票率) )。csv ファイルの「行」が特定の順序でなく、一部の「状態」が csv にデータを持たない可能性を考慮する必要があります。

このサンプル スクリプトは、最初の州 (「アラバマ」) の正しい出力を生成しますが、州リスト内の他の州のデータを見つけることができません。なんで?

注 1 - スクリプトは csv ファイルをフェッチします 注 2 - csv ファイルをフェッチする代わりに、ポーリング データをリストのリストとして提供すると、スクリプトは期待どおりに動作します

ご協力いただきありがとうございます。

import csv, httplib2, cStringIO

h = httplib2.Http('.cache')
url = 'http://www.electoral-vote.com/evp2012/Pres/pres_polls.csv'
headers, data = h.request(url)

states = [
            "Alabama", 
            "Alaska", 
            "Arizona", 
            "Arkansas", 
            "California", 
            "Colorado", 
            "Connecticut",
            "Delaware",
            "Florida",
            "Georgia",
            "Hawaii",
            "Idaho",
            "Illinois",
            "Indiana",
            "Iowa",
            "Kansas",
            "Kentucky",
            "Louisiana",
            "Maine",
            "Maryland",
            "Massachusetts",
            "Michigan",
            "Minnesota",
            "Mississippi",
            "Missouri",
            "Montana",
            "Nebraska",
            "Nevada",
            "New Hampshire",
            "New Jersey",
            "New Mexico",
            "New York",
            "North Carolina",
            "North Dakota",
            "Ohio",
            "Oklahoma",
            "Oregon",
            "Pennsylvania",
            "Rhode Island",
            "South Carolina",
            "South Dakota",
            "Tennessee",
            "Texas",
            "Utah",
            "Vermont",
            "Virginia",
            "Washington",
            "West Virginia",
            "Wisconsin",
            "Wyoming"
            ]

csv_input = cStringIO.StringIO(data)
csv_output = csv.reader(csv_input)

# sample row => 
#['Day', 'Len', 'State', 'EV', 'Dem', 'GOP', 'Ind', 'Date', '', '', '', '', '', '', '', 'Pollster']
#['  1.0', '1', 'Wyoming', '3', '33', '65', '', 'Jan 01', '', '', '', '', '', '', '', 'Election 2008-1'] 

percent_dem_by_state = []

for state in states:
    poll_day = 0
    percent_dem_for_this_state = [state, None]
    for row in csv_output:
        if (state == row[2]) and (float(row[0]) > poll_day):
            percent_dem_for_this_state = [state, int(row[4])]
            poll_day = float(row[0])
    percent_dem_by_state.append(percent_dem_for_this_state)

for elem in percent_dem_by_state:
    print elem
4

1 に答える 1

1

CSVファイルを読み取るループは「それを使い果たします」。外側のループで毎回リセットされるわけではありません。

とにかく、より良い戦略は、他のことをする前に CSV ファイルを一度読んで、データをメモリにロードし、それをループすることです。毎回 1 つの状態に相当するデータを選択するだけで、各状態の CSV ファイル全体を読み取るという現在意図されているロジックは、必要以上に遅くなります (約 50 倍遅くなります)。

メモリ内のデータ構造については、リストのリストが機能することを既に確認しました。キーが状態である辞書を使用すると、さらに優れたサービスが提供されます。次に、状態ごとに全体をループする必要はありません。

于 2012-08-24T20:29:09.253 に答える