具有相同值的阵列中的多个元素将获得不同的百分位数

时间:2017-01-02 03:33:12

标签: php arrays

我正在计算属于特定百分位数的数字。但是,我的等式的问题是,如果数组中的多个元素具有相同的值,则此代码将为每个元素分配不同的百分位数。

5-1
10-1
15-1
20-1
25-2
30-2
35-3
40-4
45-4
50-5
55-6
60-7
65-9
70-11
75-14
80-17
85-23
90-32
95-53

例如,第一列是百分位数,第二列是分数。你可以看到同一秒获得不同的百分位数,但事实上它应该是相同的。

我该如何避免这种情况?

source = NewsSource.objects.get(name=name)
html,screenshot = get_url(source.url)
save_screenshot(source,screenshot)
source.save()

1 个答案:

答案 0 :(得分:0)

要计算第k百分位数,您应该:

  1. 将数据集中的所有值从最小值排序到最大值。
  2. 将k%乘以值的总数n。
    • 此号码称为索引。
  3. 如果在步骤2中获取的索引不是整数,则将其四舍五入到最接近的整数,然后转到步骤4.如果在步骤2中获得的索引是整数,请转到步骤5.
  4. 从左到右(从最小值到最大值)计算数据集中的值,直到达到步骤3指示的数字。 数据集中的相应值是第k个百分位数
  5. 从左到右计算数据集中的值,直到达到步骤2指示的数字。 第k个百分位数是数据集中相应值的平均值以及直接跟随它的值。
  6. (来自here

    转换为PHP:

    $sData = sort($data);
    $percentile = 50/100;
    $index = ceil($percentile * count($sData));
    $value = $sData[$index-1];
    

    或更短:

    $sData = sort($data);
    $value = $sData[ceil((50/100) * count($sData)) - 1]
    

    然而,在一个小数据集中,有时百分位数最终会相同。例如,以下代码生成以下输出。

    <强>代码

    $data = array(74, 15, 25, 62, 45,  9, 16, 63, 60, 76,  7, 20, 67, 30, 12);
    sort($data);
    for($i=5;$i<100;$i+=5){
        echo $i . " - " . $data[ceil(($i/100) * count($data)) - 1];
        echo PHP_EOL;
    }
    

    <强>输出

    5 - 7
    10 - 9
    15 - 12
    20 - 12 //same as aboce
    25 - 15
    30 - 16
    35 - 20
    40 - 20 //same as above
    45 - 25
    50 - 30
    55 - 45
    60 - 45 //same as above
    65 - 60
    70 - 62
    75 - 63
    80 - 63 //same as above
    85 - 67
    90 - 74
    95 - 76