【问题标题】:Percentile calculation百分位数计算
【发布时间】:2011-12-29 13:25:02
【问题描述】:

我想在C#(或一些伪代码)中模仿 Excel 等效的 PERCENTILE 函数。我怎样才能做到这一点?该函数应该有两个参数,第一个是值列表,第二个是函数应该计算的百分位数。

坦克!

编辑:如果我的问题是我自己没有尝试过的,我很抱歉。我只是无法理解 excel 函数是如何工作的(是的,我首先尝试了 wikipedia 和 wolfram),我想如果有人用代码呈现它,我会更好地理解它。 @CodeInChaos 给出的答案似乎是我所追求的。

【问题讨论】:

  • 能否给出一个函数用法、输入数据和预期输出结果的伪代码示例?

标签: c# algorithm math percentile


【解决方案1】:

我认为Wikipedia page 有您需要编写自己的函数的公式...
我试过这个:

public double Percentile(double[] sequence, double excelPercentile)
{
    Array.Sort(sequence);
    int N = sequence.Length;
    double n = (N - 1) * excelPercentile + 1;
    // Another method: double n = (N + 1) * excelPercentile;
    if (n == 1d) return sequence[0];
    else if (n == N) return sequence[N - 1];
    else
    {
         int k = (int)n;
         double d = n - k;
         return sequence[k - 1] + d * (sequence[k] - sequence[k - 1]);
    }
}

在 CodeInChaos 评论后编辑:
Excel 使用介于 0 和 1 之间的百分位值(因此我更改了代码以使用 Wikipedia 公式实现这一点)和另一种计算 n 的方法(因此我更改了注释的那个)。

【讨论】:

  • @picknick:我刚刚从维基百科页面编写了相应的函数。这应该是 Excel 使用的(根据 Wikipedia)。
  • 两个问题:1)Excel好像用的是(N-1)方法2)用0到1之间的数字表示百分位数。
  • @CodeInChaos:感谢您的评论。我不知道 Excel 是如何工作的,我刚刚用 C# 翻译了维基百科公式,假设与 Excel 相关的部分是正确的。你怎么看?那些错了吗?我认为 OP 需要 "a way" 来计算百分位数,即使有很多方法。无论如何,你的观点对我很重要。让我知道一些事情。谢谢! :)
  • @CodeInChaos:在验证 Excel 的功能后,我更改了代码以反映您的建议。非常感谢:)
  • @EdwardKarak:向我们展示您传递给函数的序列和百分位数,以便我们尝试帮助...
【解决方案2】:

试图重现结果:http://www.techonthenet.com/excel/formulas/percentile.php 我想出了:

public static double Percentile(IEnumerable<double> seq,double percentile)
{
    var elements=seq.ToArray();
    Array.Sort(elements);
    double realIndex=percentile*(elements.Length-1);
    int index=(int)realIndex;
    double frac=realIndex-index;
    if(index+1<elements.Length)
        return elements[index]*(1-frac)+elements[index+1]*frac;
    else
        return elements[index];
}

(不处理 NaN 和无穷大)。

几个测试用例:

Percentile(new double[]{1,2,3,4}, 0.8).Dump();// 3.4
Percentile(new double[]{7,8,9,20}, 0.35).Dump();// 8.05
Percentile(new double[]{1,2,3,4}, 0.3).Dump();// 1.9

【讨论】:

    【解决方案3】:

    将值添加到列表中,对该列表进行排序,并获取索引值 ceil(列表长度 * 百分位数)。

    【讨论】:

    • 这与 Excel 的百分位函数不匹配。它似乎在最接近的值之间使用线性插值。
    猜你喜欢
    • 2013-06-20
    • 2016-07-28
    • 2017-08-29
    • 2012-10-28
    • 2021-02-26
    • 2013-08-31
    • 2019-02-16
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多