阈值—基于高于该阈值的值的平均值的变量



我觉得我的问题的答案可能很明显,但我不太明白。我想知道最好的方法(或任何好的方法(,在python中,对一个数字变量进行阈值设置,使高于该阈值的值的平均值(在我的情况下,它恰好高于,但也可能很容易低于(等于一个特定的给定数。我对任何使用numpy或panda的高效或高效的ish解决方案都很满意。

从pandas系列(或1D numpy数组(开始,例如:

[0.1, 0.2, 0.3, 0.4, 0.5]

(在实践中,序列或数组可能非常长(。例如,假设给定的数字,即目标平均值,是0.35。在这种情况下,我们可以注意到,所需阈值必须是大于或等于0.1但小于0.2的任何数字,因为0.2、0.3、0.4和0.5(均高于阈值(的平均值等于0.35。(特别是,答案并不是唯一的。(

此外,与上面的玩具示例不同,在某些情况下,可能不可能与给定的数字完全匹配。但我仍然想求解一个阈值,使所有高于该阈值的值的平均值尽可能接近给定的数字。

任何关于如何在Python中实现这一点的建议都将不胜感激。特别是,如果有numpy或pandas方法可以做到这一点,请告诉我。如果我的问题需要进一步澄清,请告诉我。非常感谢。

您可以计算原始数组中每个元素的阈值平均值:

import numpy as np
import pandas as pd
x = np.sort(np.random.random(20))
n = np.arange(1, len(x) + 1, 1)
# cumulative sum of x in reverse order / num elements gives threshold means:
threshold_means = np.cumsum(x[::-1])/n
df = pd.DataFrame(dict(threshold=x[::-1], threshold_means=threshold_means))
df = df.sort_values("threshold").reset_index(drop=True)

输出:

threshold  threshold_means
0    0.036453         0.474160
1    0.057774         0.497197
2    0.060959         0.521609
3    0.095344         0.548706
4    0.218508         0.577042
5    0.229380         0.600944
6    0.281243         0.627484
7    0.298807         0.654118
8    0.340491         0.683727
9    0.374211         0.714931
10   0.514332         0.749003
11   0.554557         0.775077
12   0.590041         0.802642
13   0.672917         0.833014
14   0.788553         0.859697
15   0.800751         0.873925
16   0.863758         0.892219
17   0.870211         0.901706
18   0.874873         0.917453
19   0.960032         0.960032

这很有表演性;len(x(=100万只需要不到一秒钟的时间。如果你有几十亿,你可以做一个二进制搜索或其他什么,因为阈值和应该是单调的。

最新更新