2017-02-21 4 views
1

私は水が汚染されているかどうかを判断するためにコーディングプロジェクトに取り組んでいます。 1つのタイプの汚染では、5年のウインドウのサンプルの10%以上が所定の基準外である場合、水は汚染されているとみなされます。これに対処するために、私は次のコードカウンタを入れ子にした反復

def testLocationForConv(overDict): 
    impairedList=[] 
    for pollutant in overDict: 
      for date in dateList: 
      total=0 
      over=0 
      for compDate in dateList: 
       if int(date[0])+1825>int(compDate[0]) and int(date[0])-1825<int(compDate[0]): 
        total=total+1 
        if date[1]: 
         over=over+1 

      if total!=0: 
       if over/total>=.1: 
        if pollutant not in impairedList: 
         impairedList.append(pollutant) 
    return impairedList 

コードが辞書をとり、水体のための汚染物質のリストを生成しますを行いました。ディクショナリのキーは汚染物質名の文字列で、値はテストの日付が最初の項目であるdateListとタプルのリストで、2番目の値はその日に測定された値が上またはここ

許容値の下でコードを入力として取ること "overDict" の例である:

{ '大腸菌':[( '40283'、偽)、( '40317 ('40405 '、False)、(' 40408 '、True)、(' 40437 '、True)、(' 40465 '、False)、(' 40505 '、False) False)、(40671、False)、(40671、False)、(40647、False)、(40671、False)、 ( '40801'、True)、( '40822'、False)、( '40710'、False)、 ' ( '41011'、False)、( '41045'、False)、( '41067'、False)、( '41228'、False)、( '41388'、False)、( ' ( '41792'、False)、( '41710'、False)、( '41439'、False)、( '41466'、False) 、偽)、( '41773'、偽)、( '41802'、偽)、( '41834'、偽)]}

この例では、コードは、それがexcedanceであると言うが、それはいけませんテストの10%未満が「真」であり、すべてのテストが5年間で行われたためです。ここで間違っているのは何ですか?

アップデート: 私はoverDictとして、この辞書を使用すると、コードが11個の値のうちの40745 2を起動し、ウィンドウに制限

{'copper': [('38834', False), ('38867', False), ('38897', False), 
('40745', False), ('40764', False), ('40799', False), ('41024', True), 
('41047', False), ('41072', True), ('41200', False), ('41411', False), 
('41442', False), ('41477', False), ('41502', False)]} 

を超えているにもかかわらず、このデータは超過していないと考えていますトラブルシューティングのために、 "for tuple"と "for window"のコード行の下にsliding_windowsを表示しました。これは、それぞれ異なる開始日が一度使用されるリストの代わりにこれを取得しました。

[[38834, 0, 1]] 
[[38834, 0, 1]] 
[[38834, 0, 1]] 
[[38834, 0, 1]] 
[[38834, 0, 1]] 
[[38834, 0, 1]] 
[[38834, 0, 1]] 
+0

インデントがオフになっていますが、修正できますか? – TemporalWolf

+1

私たちは 'dateList'を持っておらず、インデントを修正する必要があります。 –

+0

コードを少しきれいにして読みやすくする良い機会です。たとえば、複合条件付きの長い行と繰り返しのマジック番号があります。ブール関数を呼び出すシンプルな条件に変換します。 –

答えて

0
results = {} 
range = 1825 
for name, value in overDict.items(): 
    sliding_windows = [] 
    good = True 
    for tuple in value: 
     # Add this take information to any windows it falls into 
     for window in sliding_windows: 
      if window[0] > int(tuple[0]) - range: 
       window[1] += tuple[1] 
       window[2] += 1 
     # start a new window with this date 
     sliding_windows.append([int(tuple[0]), tuple[1], 1]) 
    for window in sliding_windows: 
     if window[1]/float(window[2]) > .1: 
      good = False 
    results[name] = good 

これは、開始日sliding_windowsのリストを生成:

[[40283, 3, 35], [40317, 3, 34], [40350, 3, 33], [40374, 3, 32], 
[40408, 3, 31], [40437, 2, 30], [40465, 1, 29], [40505, 1, 28], 
[40521, 1, 27], [40569, 1, 26], [40597, 1, 25], [40619, 1, 24], 
[40647, 1, 23], [40681, 1, 22], [40710, 1, 21], [40738, 1, 20], 
[40772, 1, 19], [40801, 1, 18], [40822, 0, 17], [40980, 0, 16], 
[41011, 0, 15], [41045, 0, 14], [41067, 0, 13], [41228, 0, 12], 
[41388, 0, 11], [41409, 0, 10], [41438, 0, 9], [41466, 0, 8], 
[41557, 0, 7], [41592, 0, 6], [41710, 0, 5], [41743, 0, 4], 
[41773, 0, 3], [41802, 0, 2], [41834, False, 1]] 

をし、それが/オーバーの下にいた場合、辞書にTrue/Falseの帰国、各ウィンドウ率を計算します。この場合、最後の10回の測定におけるヒットが失敗としてカウントされるので、十分な時間に及ばないウィンドウを含まないことは価値があるかもしれません。私はおそらく、最後の測定を取って、5年未満のすべてのウィンドウを投げ捨てることになるでしょう(おそらく最初のものを除いて、5年間のデータが利用可能であれば部分的な結果を得ることができます):

cutoff = int(value[-1][0]) - range 
for tuple in value: 
    ... 
    if int(tuple[0]) < cutoff or len(sliding_windows) == 0: 
     sliding_windows.append([int(tuple[0]), tuple[1], 1]) 

は、次に生成します。

sliding_windows

[[40283, 3, 35]]

注、これはTrue良い場合、False悪い場合返します

{'Escherichia coli': True}

注:これは、暗黙のうちに一緒にwindow[1] += tuple[1]それらを添加することによって1/0True/Falseブール値に変換されます。これが最後のエントリが[41834, False, 1]である理由です。これは私たちの目的で[41834, 0, 1]に相当します。

+0

ありがとう!したがって、このコードでは、indctは元のコードのoverDictと同じですか? –

+0

また、あなたのコードは合計とカウンタを超えていますが、それらを使用することはありません。それには理由がありますか? –

+0

@AmeliaMcClureいいえ、それは私の元の試みからのホールドオーバーです。私はそれらを削除しました:) – TemporalWolf

0

このロジックは必要な機能を備えていますか?

def give5yrSlice(your_list, your_date): 
    return [(dat, val) for dat, val in your_list if your_date - 1825 < int(dat) < your_date + 1825] 


def testAllSingle5yrFrame(your_list): 
    five_years = [year1, year2, year3, year4, year5] 

    return all(testSingleSampleSet(give5yrSlice(your_list, d)) for d in five_years) 


def testSingleSampleSet(your_list): 
    all_passed_values = [passed for date, passed in your_list if passed] 

    return len(all_passed_values)/float(len(your_list)) > 0.1 


def testLocationForConv(overDict): 
    return all(testAllSingle5yrFrame(your_list) for your_list in overDict.values()) 

testLocationForConv(your_dict_with_data)と呼んでください。

+0

私は何をしようとしているのですか、これはすべての5年間のデータのサブセットでこれをしようとしていますが、これは一度にすべてを見ています。しかし、これは役に立つスタートです。 –

+0

私は解決策を更新しました。あなたはそれを少し微調整する必要があると私は考えている – Elmex80s

関連する問題