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

2024-05-23 13:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我觉得我的问题的答案可能是显而易见的,但我不太明白。我想知道在python中设置数值变量阈值的最佳方法(或任何好方法),以使高于该阈值的值的平均值(在我的例子中,它恰好高于,但也可能很容易低于)等于特定的给定数字。我很乐意使用numpy或pandas提供任何有效或高效的ish解决方案

从熊猫系列(或1D numpy阵列)开始,例如:

[0.1, 0.2, 0.3, 0.4, 0.5]

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

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

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


Tags: 方法答案numpypandas情况序列阈值数字
1条回答
网友
1楼 · 发布于 2024-05-23 13:34:24

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

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万只需要不到一秒钟的时间。如果你有几十亿,你可以做一个二进制搜索或者其他什么,因为阈值和应该是单调的

相关问题 更多 >