仅解析数据集的四分位数

时间:2017-06-13 16:21:08

标签: c#

假设我有一个名为DataTable的{​​{1}},如下所示:

a

我想要做的只是以某种方式仅根据上面的|DateTimeSec|value| |-----------|-----| |14569980000|8 | |14570050000|54 | |14570900000|928 | |14571250000|67 | |14571260000|124 | |14572230000|32 | |14573980000|211 | |14574120000|202 | |-----------|-----| 列改变,例如将10添加到四分位数范围内的值。这将导致仅改变54,67,124和202。我希望在保持value排序的同时执行此操作。

我在想这样的事情:

首先,我从数据库中获取DataTable并按DateTimeSec对其进行排序,然后:

value

我的问题是,我如何使用这个四分位数DataTable?对此有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:0)

  

对此有更优雅的解决方案吗?

是。 Wikipedia page具有帮助您计算百分位数的公式。

使用此函数计算给定百分位数的值:

private static double GetValueAtPercentile(double[] sequence, double percentile)
{
    if (percentile > 1)
        percentile = percentile * 0.01;

    if (Math.Abs(percentile) > 1)
        throw new ArgumentOutOfRangeException("cannot do calculate greater than 1 perc");

    Array.Sort(sequence);
    var N = sequence.Length;
    var n = (N - 1) * percentile + 1;

    if (n == 1d) return sequence[0];
    else if (n == N) return sequence[N - 1];
    else
    {
        var k = (int)n;
        var d = n - k;
        return sequence[k - 1] + d * (sequence[k] - sequence[k - 1]);
    }
}

现在在表中使用它:

var sequence = table.AsEnumerable().Select(s => s.Field<double>("value"));
var firstQuartile = GetValueAtPercentile(sequence.ToArray(), 25);
var thirdQuartile = GetValueAtPercentile(sequence.ToArray(), 75);

foreach(DataRow row in table.Rows)
{
    var rowValue = row.Field<double>("value");
    if(rowValue >= firstQuartile && rowValue <= thirdQuartile)
    {
        // Do things
    }
}