【问题标题】:Threshold a variable based on the average of values above that threshold根据高于该阈值的值的平均值对变量设置阈值
【发布时间】:2020-09-12 01:02:57
【问题描述】:

我觉得我的问题的答案可能很明显,但我无法完全弄清楚。我想知道在python中最好的方法(或任何好的方法)来阈值一个数值变量,使得高于这个阈值的值的平均值(在我的例子中,它恰好高于,但它也可以很容易地下面)等于一个特定的给定数字。我会对任何使用 numpy 或 pandas 的高效或高效的解决方案感到满意。

从 pandas 系列(或一维 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 方法,请告诉我。如果我的问题需要进一步澄清,请告诉我。谢谢!

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

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

    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 万只需要不到一秒的时间。如果你有数十亿,你可以做一个二分搜索或其他东西,因为阈值总和应该是单调的。

    【讨论】:

    • 或者等不到 20 分钟 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2020-03-16
    • 2015-09-22
    • 1970-01-01
    • 2016-12-11
    • 2019-03-07
    相关资源
    最近更新 更多