确定数据集中高于特定值的时间百分比
Determining % of time above a certain value in a dataset
我有一个电压数据集(每 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
假设读数之间的转换是线性的(即:250ms = 1.35v),我将如何计算读数高于或等于 1.3v 的总时间百分比?
我最初打算只获取 >= 1.3v 的值的百分比(IE:示例数组中的 6/8),但是这仅在点之间的角度为 45 度时才有效。我假设我必须做一些事情,比如从点 1 到点 2 创建一条线,并找到与基线 (1.3v) 的截距。然后对点 2 和点 3 执行相同的操作并找到两个交叉点之间的距离(比如 700 毫秒)然后对所有点重复并获得总采样时间的百分比。
编辑
可能我一开始问的时候不清楚。我需要帮助来确定如何执行这些计算,IE:objects/classes,我可以使用它来帮助我虚拟绘制这些线并执行这些计算或任何可能提供这些功能的第 3 方数学包。
重要的部分不是考虑数据点,而是考虑时间间隔。每个间隔(例如 0-500、500-1000、...)是三种情况之一(以浮点变量 above
和 below
均为 0 开头):
- 琐碎:起点和终点均低于您的阈值 -
below += 1
- 平凡:起点和终点都在您的阈值之上 -
above += 1
- 有趣:一分低于你的门槛,一分高于你的门槛。我们称较小的值
min
和较大的值 max
。现在我们做 above += (max-threshold)/(max-min)
和 below += (threshold-min)/(max-min)
,所以我们在两个状态之间线性分布这个间隔。
最后通过将 above
和 below
除以间隔数来归一化结果。这将为您提供一对代表分数的数字,即加起来为 1 模舍入误差。当然乘以 100 就是百分比。
编辑
@phoog 在评论中指出,我没有提到 "equal" 案例。这是设计使然,因为您的问题已经包含:您选择 >=
作为比较,所以我肯定会在这里使用相同的比较。
如果我对问题的理解正确,您可以像这样使用 class 来保存每个条目:
public class DataEntry
{
public DataEntry(int time, double reading)
{
Time = time;
Reading = reading;
}
public int Time { get; set; }
public double Reading { get; set; }
}
然后执行以下 link 语句以获取高于 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));
这应该会为您提供保持在 1.3 以上的 500 毫秒片段。
我有一个电压数据集(每 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
假设读数之间的转换是线性的(即:250ms = 1.35v),我将如何计算读数高于或等于 1.3v 的总时间百分比?
我最初打算只获取 >= 1.3v 的值的百分比(IE:示例数组中的 6/8),但是这仅在点之间的角度为 45 度时才有效。我假设我必须做一些事情,比如从点 1 到点 2 创建一条线,并找到与基线 (1.3v) 的截距。然后对点 2 和点 3 执行相同的操作并找到两个交叉点之间的距离(比如 700 毫秒)然后对所有点重复并获得总采样时间的百分比。
编辑
可能我一开始问的时候不清楚。我需要帮助来确定如何执行这些计算,IE:objects/classes,我可以使用它来帮助我虚拟绘制这些线并执行这些计算或任何可能提供这些功能的第 3 方数学包。
重要的部分不是考虑数据点,而是考虑时间间隔。每个间隔(例如 0-500、500-1000、...)是三种情况之一(以浮点变量 above
和 below
均为 0 开头):
- 琐碎:起点和终点均低于您的阈值 -
below += 1
- 平凡:起点和终点都在您的阈值之上 -
above += 1
- 有趣:一分低于你的门槛,一分高于你的门槛。我们称较小的值
min
和较大的值max
。现在我们做above += (max-threshold)/(max-min)
和below += (threshold-min)/(max-min)
,所以我们在两个状态之间线性分布这个间隔。
最后通过将 above
和 below
除以间隔数来归一化结果。这将为您提供一对代表分数的数字,即加起来为 1 模舍入误差。当然乘以 100 就是百分比。
编辑
@phoog 在评论中指出,我没有提到 "equal" 案例。这是设计使然,因为您的问题已经包含:您选择 >=
作为比较,所以我肯定会在这里使用相同的比较。
如果我对问题的理解正确,您可以像这样使用 class 来保存每个条目:
public class DataEntry
{
public DataEntry(int time, double reading)
{
Time = time;
Reading = reading;
}
public int Time { get; set; }
public double Reading { get; set; }
}
然后执行以下 link 语句以获取高于 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));
这应该会为您提供保持在 1.3 以上的 500 毫秒片段。