假设我有一个名为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?对此有更优雅的解决方案吗?
答案 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
}
}