Python 识别突出的价值观

Python 识别突出的价值观,python,Python,给出一条格言: data = {'18': [3.89, 1.28], '20': [1.39, 3.15], '15': [1.42, 3.10]} 我想挑选与其他项目明显不同的项目,如18。理想情况下,我会指定ALLOWED\u difference,将其设置为演示的0.5,这是一个阈值,用于分类哪些内容突出哪些内容不突出(与其他值相比) 带有3.89的18在这里显然是不正确的,因为大多数的值都在1.4左右(比较每个列表中的任何一个值就足以得出结论),并且差值(abs(3.89-1.4))

给出一条格言:

data = {'18': [3.89, 1.28], '20': [1.39, 3.15], '15': [1.42, 3.10]}
我想挑选与其他项目明显不同的项目,如
18
。理想情况下,我会指定
ALLOWED\u difference
,将其设置为演示的
0.5
,这是一个阈值,用于分类哪些内容突出哪些内容不突出(与其他值相比)


带有
3.89
18
在这里显然是不正确的,因为大多数的值都在1.4左右(比较每个列表中的任何一个值就足以得出结论),并且差值(
abs(3.89-1.4)
)大于
0.5
(允许的最大值)。

计算值的平均值

>>> 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}

如果您想要一种更具统计性的方法来发现异常值,您可以这样做:

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]}
n\u stddevs=1

{k:[x代表x in v如果x>=avg stddev*n_stddevs和x=avg stddev*n_stddevs和x=avg stddev*n_stddevs和x是保证具有相同长度的所有列表吗?是的,始终是2元素列表。因此,为了明确起见,您希望找到比指定阈值更远离所有值平均值的值?如果是,您只需要r存储值的dict键?正如你所说的。我实际上需要这些键。你真的想使用硬编码阈值,还是想检测所有统计异常值?对不起,我在评论中误导了你。在识别异常值时,我只考虑每个列表中的一个值,即
3.89,1.39,1.42
(位置
[0]
)或
1.28,3.15,3.1
(位置
[1]
)的项目(无论您是在位置[0]还是位置[1]获取项目,但需要保持一致)。您能够更新答案吗?@rojas当然,我可以在回家后(几个小时)修复它谢谢。请详细说明一下:我认为与平均值相比并不能真正减少它(在打开线程之前尝试过),因为异常值每次都会扭曲平均值。例如:
avg=np.mean([3.89,1.39,1.42])#2.23
,如果没有异常值,平均值会非常不同。
1.405
@rojas在计算平均值时,您只能从数据的某些四分位数获取值,或者只能从与中值有一定距离的值,或者只能从1,2,3,…标准偏差范围内获取值。目前,您的问题是未指定,因为您甚至不知道自己想要什么。我会删除我的答案,但无法删除已接受的答案。
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]}
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': []}