2017-04-13 67 views
1

確定值給出一個字典:該伸出

data = {'18': [3.89, 1.28], '20': [1.39, 3.15], '15': [1.42, 3.10]} 

我要挑出來,明確從休息的不同,如18項目。理想情況下,我將指定ALLOWED_DISCREPANCY,將其設置爲0.5進行演示,這是一個閾值,用於分類什麼和不會伸出(與其餘值相比較)。

183.89顯然是在這裏下車,因爲大多數具有值1.4左右(比較無論是從每個列表值就足以得出結論)和差(abs(3.89 - 1.4))比0.5(允許的上限)大。

+0

是否所有列表*保證*具有相同的長度? –

+0

是的,總是2-elem列表。 –

+0

所以要清楚,你想要找到比所有值的均值更遠的值而不是指定的閾值?如果是這樣,你是否只需要存儲值的值或字典鍵呢? – timgeb

回答

1

計算值的平均值。

>>> from numpy import mean 
>>> data = {'18': [3.89, 1.28], '20': [1.39, 3.15], '15': [1.42, 3.10]} 
>>> avg = mean([x for sublist in data.values() for x in sublist]) 
>>> avg 
2.3716666666666666 

設置閾值並構建一個新的字典,將原始鍵映射到與您的約束匹配的值列表。這裏有兩個例子:

>>> thresh = 0.5 
>>> {k:[x for x in v if abs(x-avg) > thresh] for k, v in data.items()} 
{'18': [3.89, 1.28], '15': [1.42, 3.1], '20': [1.39, 3.15]} 
>>> 
>>> thresh = 1 
>>> {k:[x for x in v if abs(x-avg) > thresh] for k, v in data.items()} 
{'18': [3.89, 1.28], '15': [], '20': []} 

編輯:考慮到只有一個位置

>>> pos = 0 
>>> {k:v[pos] for k, v in data.items() if abs(v[pos]-avg) > thresh} 
{'18': 3.89} 
>>> 
>>> pos = 1 
>>> {k:v[pos] for k, v in data.items() if abs(v[pos]-avg) > thresh} 
{'18': 1.28} 
+0

對不起,我在評論中誤導了你。當鑑別異常值時,我只考慮每個列表中的一個值,即'3.89,1.39,1.42'(位置'[0]'處的項目'或'1.28,3.15,3.1'(位置'[1]'處的項目) (如果你在pos [0]或pos [1]處使用項目,但需要保持一致,則無關緊要)。你能夠更新答案嗎? –

+0

@rojas當然,我可以在回家時解決它(幾個小時) – timgeb

+0

謝謝。只是想詳細說明一下:我認爲與平均值相比並不會真正削減它(在開啓線程之前嘗試過),因爲每次都會出現異常值。例如:'avg = np.mean([3.89,1.39,1.42])#2.23',現在不存在異常值,平均值會有很大的不同1.405。 –

2

如果你想更統計方法來尋找異常值,你可以做這樣的事情:

data = {'18': [3.89, 1.28], '20': [1.39, 3.15], '15': [1.42, 3.10]} 

avg = np.mean([x for sublist in data.values() for x in sublist]) 
stddev = np.std([x for sublist in data.values() for x in sublist]) 

對於一個標準偏差:

n_stddevs = 1 

{k: [x for x in v if x >= avg-stddev*n_stddevs and x <= avg+stddev*n_stddevs] for k, v in data.items()} 

# {'15': [1.42, 3.1], '18': [], '20': [1.39, 3.15]} 

爲2:

n_stddevs = 2 

{k: [x for x in v if x >= avg-stddev*n_stddevs and x <= avg+stddev*n_stddevs] for k, v in data.items()} 

#{'15': [1.42, 3.1], '18': [3.89, 1.28], '20': [1.39, 3.15]} 

0.5:

n_stddevs = 0.5 

{k: [x for x in v if x >= avg-stddev*n_stddevs and x <= avg+stddev*n_stddevs] for k, v in data.items()} 

# {'15': [], '18': [], '20': []}