【问题标题】:Percentiles formulas yield different results百分位数公式产生不同的结果
【发布时间】:2022-07-29 21:32:10
【问题描述】:

我正在尝试计算加权百分位数。解决方案_1 创建准确的结果,但如果数据集很大,则速度很慢且效率不高。我通过使用我发现的加权百分位数公式尝试了一种不同的方法,但它产生了不同的结果。我希望有人可以帮助我弄清楚如何以不同的方式复制 solution_1 的结果。我是社区的新手,所以如果我没有提供足够的信息,或者有什么不清楚的地方,请告诉我,我会尽快更新。

def modify_data():
    data = {'num': [1, 4, 11, 14, 45, 56, 67, 88, 99, np.nan],
            'n_obs': [13, 34, 52, 33, 31, 14, 55, 73, 12, 34],
            "perc": [10, 20, 30, 40, 50, 60, 70, 80, 90, 10]}
    df = pd.DataFrame(data=data)
    # solution 1 - correct results
    weighted_values = pd.DataFrame(df["num"].values.repeat(df["n_obs"], axis=0))
    solution_1 = []
    for i in np.arange(0, 100, 10):
        output = np.nanpercentile(weighted_values, i)
        solution_1.append(output)
    df['solution_1'] = np.array(solution_1).tolist()

    # solution 2 - results are off
    solution_2 = []
    exclude_nans = df[df["num"].notnull()]
    cdf = (np.cumsum(exclude_nans["n_obs"]) - 0.5 * exclude_nans["n_obs"]) / np.sum(exclude_nans["n_obs"])  # 'like' a CDF function
    for i in np.arange(0, 1, 0.1):
        abc = np.interp(i, cdf, exclude_nans["num"])
        solution_2.append(abc)
    df["solution_2"] = np.array(solution_2).tolist()
    return df

输出:

    num  n_obs  perc  solution_1  solution_2
0   1.0     13    10         1.0    1.000000
1   4.0     34    20         4.0    4.276744
2  11.0     52    30        11.0    9.437209
3  14.0     33    40        11.0   12.560000
4  45.0     31    50        14.0   24.946875
5  56.0     14    60        45.0   50.377778
6  67.0     55    70        67.0   62.440580
7  88.0     73    80        67.0   72.709375
8  99.0     12    90        88.0   83.110938
9   NaN     34    100       88.0   92.348235

【问题讨论】:

  • 顺便说一句,这是一个写得很好的问题,因为代码是可运行的并且包含要测试的数据。很棒的第一篇文章!

标签: python pandas dataframe numpy


【解决方案1】:

np.nanpercentile 为 q parameter 采用 array_like。所以你可以去

np.nanpercentile(weighted_values, np.arange(0, 100, 10))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 2020-07-16
    • 2021-05-10
    • 1970-01-01
    • 2011-08-22
    • 2021-09-28
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多