こんにちは、みんな、
私は現在、いくつかのデータの視覚化に苦労しています。 私は、キャプチャされた何千ものイベントを含む巨大なテーブルを持っています。さまざまな場所でのさまざまなイベントの開始時刻と終了時刻(これらはテキストとして表示されます)は、次の形式で、時刻として認識されるように正常に変換されました。
開始:2022-01-28T22:26:13
終了:2022-01-28T23:10:56
ここで、並列イベントの数を視覚化/カウントします。つまり、結果のすべての期間をオーバーレイし、さまざまな場所での並列イベントの最大数を確認します。 開始時間と終了時間の差として利用可能な期間もあるので、これが必要な場合に備えて...。
多分私を助けることができますか?
乾杯!
JMP16
やあ@ubpk 、
おそらく、テーブルに小さなサンプルを入れていただければ、試してみることができます。
ガントチャートアドインをダウンロードすることをお勧めします。それはあなたのイベントを表示するための素晴らしい方法を提供します。

txnelson、
ヒントをありがとう、それはかなり使いやすいように見えるので、アドインをダウンロードします。 しかし、私の場合、私が持っている場所の数が原因で、y軸が過負荷になりすぎます。
これはたった2日で縮小されたデータセットですが、それでうまくいくはずです。 必ずしもグラフィカルビューは必要ありませんが、デバッグには、並列イベントの数が適切かどうかを何らかの方法で制御できると便利です。
前もって感謝します!!
ウルフ
場所のオーバーラップの最大量のみを取得するというアイデアの場合は、最初に開始時刻と終了時刻をマトリックスに追加してから、終了と開始を追跡しながらソートすることで、すべてのオーバーラップを計算できます。 次に、各開始と終了のペアの間に収まる値の数を計算できます。
たぶん、このようなものが機能するでしょう(重複した値でいくつかの問題があるかもしれません):
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))
)
);

Time、TypeOfTime(start、end)、元の行番号の3つの列を持つ新しいデータテーブルを作成することで、JMPでもほぼインタラクティブにこれを実行できるはずです。 次に、昇順で並べ替え、数式を記述して重複をチェックします(Lag()を使用できますが、Col Min(Row()、:Row)とCol Max(Row()、:Row())とそれらの違いを使用しました) 。 最後に、要約テーブルを作成して最大値を取得し、行番号に基づいて元のテーブルに結合します。

要約(ここに最大値を追加しませんでした):

2つの方法にはわずかな違いがあるように思われるので、どちらかが間違っている可能性があります。 重複した値が原因である可能性があります(インタラクティブな方法から欠落している値も削除しました)

データテーブルがあると、起こりうる問題を探すのがはるかに簡単になります。

また、インタラクティブなメソッドは、JMP16の拡張ログを使用して非常に簡単にスクリプト化できます。
編集:これには次の問題がある可能性があります:1。1つの時間がチェックされた開始時間の前に開始し、チェックされた終了時間の後に終了する場合、それは計算されません。2.時間がチェックされた時間の間に開始および終了する場合、2回計算されます。 。 2つ目はかなり簡単に修正できるはずですが、1つ目はもう少し必要になります。
2の例。 OriginalRowOrderは、OriginalRowOrder 10内で開始および終了し、2回計算されます。

1の例。 OriginalRowOrder 13は、14の外部で開始および終了します。

Edit2:インタラクティブにそれらを処理する方法をわざわざ理解しなかったので、私はかなり迅速に2つの数式を作成しました(うまくいけば、それらは正しいです...)。 これらを使用する前に、欠落している値を削除/再コーディングする必要があります。 追加の最適化を行わずに数式を使用すると、OverlapsOutsideが少し遅くなる可能性があります。
OverlapsInside(problem2を解決する必要があります):
N Items(Associative Array(:OriginalRowOrder[Index(:MinRowForRow, :MaxRowForRow)])) - 1
OverlapsOutside(problem1を解決する必要があります):
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>