大家好,
我目前正在与一些数据可视化作斗争。 我有一张巨大的桌子,里面有数千个被捕获的事件,包括。不同位置上不同事件的开始和结束时间(这些显示为文本),格式如下,我成功转换为时间:
开始时间:2022-01-28T22:26:13
结束:2022-01-28T23:10:56
我现在想可视化/计算并行事件的数量,即覆盖所有结果周期并查看不同位置的最大并行事件数。 我也有可用的持续时间作为开始时间和结束时间之间的差异,所以如果需要的话....
也许有人可以帮助我?
干杯!
JMP16
你好@ubpk ,
也许如果你在桌子上给我们一个小样本,我可以试一试。
我建议你下载甘特图插件。它将为您提供一种展示活动的好方法。

特克纳尔逊,
感谢您的提示,将下载插件,因为它看起来非常有用。 但在我的情况下,由于我拥有的位置数量,y 轴会过于过载。
这是一个只有两天的精简数据集,但它应该可以完成这项工作。 我不一定需要图形视图,但对于调试来说,对并行事件的数量是否合理进行某种控制会很棒。
提前致谢!!
乌尔夫
如果想法是只获得位置的最大重叠量,您可以首先通过将开始和结束时间添加到矩阵来计算所有重叠,然后对其进行排序,同时跟踪什么是结束和什么是开始。 然后,您可以计算每个起始端对之间适合多少个值。
也许这样的事情会起作用(重复值可能会有一些问题):
Names Default To Here(1);
dt = Current Data Table();
dt << New Column("Overlap", Numeric, Continuous);
dt << Sort(By(:"Start time (UTC)"n), Replace Table, Order(Ascending));
starts = dt[0, 1];
ends = dt[0, 2];
m = Sort Ascending(starts |/ ends);
For Each Row(dt,
start = :"Start time (UTC)"n;
end = :"End time (UTC)"n;
:Overlap = Loc(m, end)[1] - Loc(m, start)[1] - 1;
);
/*
dt << New Column("MaxOverlap", Numeric, Continuous, << Set Each Value(
Col Max(:Overlap, :Location)
));
*/
tab = dt << Tabulate(
Show Control Panel(0),
Add Table(
Column Table(Statistics(Min, Mean, Max), Analysis Columns(:Overlap)),
Row Table(Grouping Columns(:Location))
)
);

您应该能够在 JMP 中通过创建具有三列的新数据表几乎以交互方式执行此操作:时间、TypeOfTime(start,end) 和原始行号。 然后通过升序对其进行排序并编写一个公式来检查重叠(可以使用 Lag(),我使用 Col Min(Row(), :Row) 和 Col Max(Row(), :Row()) 以及它们的区别) . 最后创建汇总表以根据行号获取最大值/连接回原始表。

摘要(这里没有添加最大值):

两种方法之间似乎存在细微差别,因此可能其中一种方法是错误的。 可能是由重复值引起的(我也确实从交互方法中删除了缺失值)

当您有数据表时,查找可能的问题要容易得多:

此外,可以使用 JMP16 的增强日志非常轻松地编写交互式方法的脚本。
编辑:这很可能有以下问题:1.如果一个时间在检查开始时间之前开始并在检查结束时间之后结束,则不会计算2.如果时间在检查时间之间开始和结束,则会计算两次. 第二个应该很容易修复,但第一个需要更多。
2的例子。 OriginalRowOrder 在 OriginalRowOrder 10 内开始和结束,并被计算两次:

1的例子。 OriginalRowOrder 13 在 14 之外开始和结束:

Edit2:没有费心弄清楚如何以交互方式处理这些问题,所以我很快写了两个公式(希望它们是正确的......)。 在使用这些缺失值之前,必须删除/重新编码。 如果在没有任何额外优化的情况下使用公式完成,OverlapsOutside 可能会有点慢。
OverlapsInside(应该解决问题2):
N Items(Associative Array(:OriginalRowOrder[Index(:MinRowForRow, :MaxRowForRow)])) - 1
OverlapsOutside(应该解决问题1):
If(Row() == 1,
m = :OriginalRowOrder << Get As Matrix
);
Try(
starts = Associative Array(m[Index(1, :MinRowForRow - 1)]);
ends = Associative Array(m[Index(:MaxRowForRow + 1, N Rows())]);
starts << Intersect(ends);
N Items(starts);
,
.
);
OverlapsInside 可能就足够了,具体取决于您要如何计算重叠。 如果你需要两者,那么只需得到这些值的总和。


我注意到我最初的方法存在一些问题,所以我重新思考并编写了新脚本,希望它现在是正确的。 这很可能通过仅使用矩阵计算来加快速度,但我现在懒得这么做了。 它确实会故意打开很多数据表,因此更容易检查值是否正确
Names Default To Here(1);
dt = Current Data Table();
dt << Clear Select;
dt << Sort(By(:"Start time (UTC)"n), Replace Table, Order(Ascending));
dt << New Column("Overlap", Numeric, Continuous);
dt << New Column("OriginalRowOrder", Numeric, Continuous, <<SET each="" value=""> :MaxRowForRow);
inside + outside; // if you need only inside, then don't calculate outside overlaps and just return inside
)
);
dt_overlaps << Update(
With(dt),
Match Columns(:OriginalRowOrder = :OriginalRowOrder),
Add Columns from Update Table(
:"Start time (UTC)"n, :"End time (UTC)"n, :Location
)
);
dt_statistics = dt_overlaps << Summary(
Group(:Location),
Min(:Overlaps),
Max(:Overlaps),
Range(:Overlaps),
Mean(:Overlaps),
Median(:Overlaps),
Freq("None"),
Weight("None"),
statistics column name format("stat"),
Link to original data table(0),
output table name("Overlap statistics by location")
);
f = Function({a},
selected_rows = dt_overlaps << Get Selected Rows;
dt_stack << Select Where(Contains(dt_overlaps[selected_rows, "OriginalRowOrder"], :OriginalRowOrder))
);
rs = dt_overlaps << make row state handler(f);</SET>