1

このコードは機能します。しかし、特に「オフセット」の部分がハックだと感じずにはいられません。そうしないと、del 操作を行うたびに削除のすべてのインデックス値が 1 つシフトされるためです。

    # remove outliers > devs # of std deviations
    devs = 1
    deletes = []
    for num, duration in enumerate(durations):
        if (duration > (mean_duration + (devs * std_dev_one_test))) or \
            (duration < (mean_duration - (devs * std_dev_one_test))):
            deletes.append(num)
    offset = 0
    for delete in deletes:
        del durations[delete - offset]
        del dates[delete - offset]
        offset += 1

それをより良くする方法についてのアイデアはありますか?

4

4 に答える 4

4

リストを繰り返し処理しながら、キーパーのリストを作成します。

def isKeeper( duration ):
    if (duration > (mean_duration + (devs * std_dev_one_test))) or \
            (duration < (mean_duration - (devs * std_dev_one_test))):
        return False
    return True

durations = [duration for duration in durations if isKeeper(duration)]
于 2012-07-07T00:58:22.470 に答える
3

多分このようなもの:

import numpy as np        

myList = [1,2,3,4,5,6,7,3,4,5,3,5,99] 

mean_duration  = np.mean(myList)
std_dev_one_test = np.std(myList)     

def drop_outliers(x):
    if abs(x - mean_duration) <= std_dev_one_test:
        return x

myList = filter(drop_outliers, myList)

結果:

>>> myList
[1, 2, 3, 4, 5, 6, 7, 3, 4, 5, 3, 5]
于 2012-07-07T00:52:08.790 に答える
1

リストからアイテムを削除していて、インデックスがシフトし、オフセットで補正しているという問題はありますか?

その場合は、後ろから前に削除するだけで、アイテムを削除してもリストの残りの部分には影響しません。

したがって、最後の項目からリストの先頭まで反復を開始します。

これらのSOの質問は興味深いかもしれませんリストの多くの要素を削除します(python)およびPython:リストを繰り返しながらリスト要素を削除します

もう 1 つの適切な SO の議論はここにあります:反復中にリストから項目を削除します(コメントによる提案については @PaulMcGuire に感謝します)。

于 2012-07-07T00:13:18.400 に答える
0

データセットが小さい場合は、ロジックを逆にして、値を削除する代わりに保持できます。

# keep value outliers < devs # of std deviations
devs = 1
keeps = []
for duration in durations:
    if (duration <= (mean_duration + (devs * std_dev_one_test))) and \
        (duration >= (mean_duration - (devs * std_dev_one_test))):
        keeps.append(duration)
于 2012-07-07T00:19:22.810 に答える