大家好,
我目前正在努力進行一些數據可視化。 我有一張巨大的桌子,裡面有數千個被捕獲的事件,包括。不同位置上不同事件的開始和結束時間(這些顯示為文本),格式如下,我成功轉換為時間:
開始時間: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>