确定数据集中某个值以上的时间百分比

时间:2015-02-19 00:07:14

标签: c# wpf graph

我有一个电压数据集(每500毫秒采样一次)。让我们说它看起来像这样(在数组中):

0ms      -> 1.4v
500ms    -> 1.3v
1000ms   -> 1.2v
1500ms   -> 1.5v
2000ms   -> 1.3v
2500ms   -> 1.3v
3000ms   -> 1.2v
3500ms   -> 1.3v

假设读数之间的转换是线性的(IE:250ms = 1.35v),我将如何计算读数高于或等于1.3v的总时间百分比?

我最初只得到%> = 1.3v的值(IE:样本数组中的6/8),但这只有在点之间的角度为45度时才有效。我假设我必须做一些事情,比如从第1点到第2点创建一条线,并找到基线(1.3v)的截距。然后对点2和点3进行相同的操作,找到两个相交点之间的距离(说700毫秒),然后对所有点重复,得到总采样时间的百分比。

修改

当我最初问起时,也许我不清楚。我需要帮助确定如何执行这些计算,IE:我可以用来帮助我虚拟绘制这些行并执行这些计算的对象/类或可能提供这些功能的任何第三方数学包。

2 个答案:

答案 0 :(得分:1)

重要的部分不是在数据点上思考,而是在间隔中思考。每个间隔(例如0-500,500-1000,...)是三种情况之一(从浮点变量abovebelow开始都是0):

  • 琐碎:开始和结束点都低于您的阈值 - below += 1
  • 琐碎:起点和终点都高于您的门槛 - above += 1
  • 有趣:一点低于,一点高于你的门槛。让我们调用较小的值min和较高的值max。现在我们执行above += (max-threshold)/(max-min)below += (threshold-min)/(max-min),因此我们在两个州之间线性分配此间隔。

最后,将abovebelow除以间隔数,将结果标准化。这将为您提供一对数字,表示分数,即最多加1个模数舍入误差。当然乘以100会给出百分比。

修改

@phoog在评论中指出,我没有提到"等于"案件。这是设计的,因为您的问题已经包含:您选择>=作为比较,所以我绝对会在这里使用相同的比较。

答案 1 :(得分:1)

如果我已正确理解问题,您可以使用这样的类来保存每个条目:

    public class DataEntry
    {
        public DataEntry(int time, double reading)
        {
            Time = time;
            Reading = reading;
        }

        public int Time { get; set; }
        public double Reading { get; set; }
    }

然后使用以下链接语句来获得高于1.3的段:

        var entries = new List<DataEntry>()
        {
            new DataEntry(0, 1.4),
            new DataEntry(500, 1.3),
            new DataEntry(1000, 1.2),
            new DataEntry(1500, 1.5),
            new DataEntry(2000, 1.3),
            new DataEntry(2500, 1.3),
            new DataEntry(3000, 1.2),
            new DataEntry(3500, 1.3)
        };

        double totalTime = entries
            .OrderBy(e => e.Time)
            .Take(entries.Count - 1)
            .Where((t, i) => t.Reading >= 1.3 && entries[i + 1].Reading >= 1.3)
            .Sum(t => 500);

        var perct = (totalTime / entries.Max(e => e.Time));

这应该会给你500ms以上的段保持在1.3以上。