重複 / 同じ時点の期間の数こんにちは、みんな、
現在、データの視覚化に苦労しています。 キャプチャされたイベントを含む数千のイベントを含む巨大なテーブルがあります。さまざまな場所でのさまざまなイベントの開始時刻と終了時刻 (これらはテキストとして表示されます) を次の形式で時刻として認識できるように変換しました。
開始: 2022-01-28T22:26:13
終了: 2022-01-28T23:10:56
次に、並列イベントの数を視覚化/カウントしたいと思います。つまり、結果として得られるすべての期間を重ね合わせ、さまざまな場所での並列イベントの最大数を確認します。 開始時間と終了時間の差として利用可能な期間も用意されているので、これが必要な場合に備えて...
もしかしたら誰かが私を助けてくれるでしょうか?
乾杯!
JMP16
データの探索と視覚化マスカスタマイゼーションウィンドウズRe: オーバーラップ / 同じ時点の期間の数この方法には問題がほとんどありません (後で気づきました)。しかし幸いなことに、インタラクティブな方法であるため、データからそれらを簡単に確認できます (いくつかのサンプル画像を追加しました)。 計算内容によっては、これらも問題にならない場合があります。
1. ある時間がチェックされた開始時刻より前に開始され、チェックされた終了時刻より後に終了した場合、その時間は計算されません。
2. チェックした時間の間で開始と終了が発生した場合、2 回計算されます。
Re: オーバーラップ / 同じ時点の期間の数こんにちは、
コードをありがとうございます。 調べてみたところ、他の目的にも役立つかもしれません。 でも:あなたのアイデア
」 Time、TypeOfTime(start,end)、元の行番号の 3 つの列を持つ新しいデータテーブルを作成することで、JMP でこれをほぼ対話的に実行できるはずです。 次に、それを昇順で並べ替え、重複をチェックする数式を作成します(おそらく Lag() を使用できます。私は Col Min(Row(), :Row) と Col Max(Row(), :Row()) とその違いを使用しました) 。 最後に概要テーブルを作成して最大値を取得し、行番号に基づいて元のテーブルに結合し直します。」
だったシンプルで素晴らしい! スタックし、タイムスタンプで順序付けし、開始か終了に基づいて +1/-1 を返す数式チャネルを実装し、これらを別のチャネルで合計しました。 まるで魔法のように機能します!
Re: オーバーラップ / 同じ時点の期間の数こんにちは。
まず最初に、あなたの努力に感謝します! できるだけ早く解決策を確認し、フィードバックをお送りします。
乾杯
ウルフ
Re: オーバーラップ / 同じ時点の期間の数最初のアプローチにいくつかの問題があることに気づいたので、それが正しいことを祈りながら、再考して新しいスクリプトを作成しました。 これはおそらく行列計算のみを使用することで高速化できますが、ここではわざわざ実行しませんでした。 かなりの数のデータテーブルを意図的に開いたままにするので、値が正しいかどうかを確認しやすくなります。
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>Re: オーバーラップ / 同じ時点の期間の数位置の重複の最大量のみを取得することを目的としている場合は、まず開始時刻と終了時刻を行列に追加してすべての重複を計算し、次に終了時刻と開始時刻を追跡しながら並べ替えることができます。 次に、各開始点と終了点のペアの間に適合する値の数を計算できます。
おそらく次のようなものが機能するでしょう(値が重複すると問題が発生する可能性があります)。
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 番目の問題はかなり簡単に修正できるはずですが、最初の修正はもう少し時間がかかります。
2の例。 OriginalRowOrder は OriginalRowOrder 10 内で開始および終了し、2 回計算されます。

1の例。 OriginalRowOrder 13 は 14 の外側で始まり、14 の外側で終わります。

編集 2: これらを対話的に処理する方法を考えるのに苦労しなかったので、すぐに 2 つの数式を書きました (それらが正しいことを願っています...)。 欠損値は、使用する前に削除または再コード化する必要があります。 追加の最適化を行わずに数式を使用すると、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 で十分な場合があります。 両方が必要な場合は、それらの値の合計を取得するだけです。


Re: オーバーラップ / 同じ時点の期間の数ここにあるのは 2 日だけの縮小されたデータセットですが、十分に機能するはずです。 必ずしもグラフィカル ビューが必要というわけではありませんが、デバッグの場合、並列イベントの数が適切かどうかを何らかの制御できると便利です。
前もって感謝します!!
ウルフ
Re: オーバーラップ / 同じ時点の期間の数テキネルソン、
ヒントをありがとう。かなり使えそうなアドインをダウンロードします。 しかし、私の場合、場所の数が多いため、Y 軸に負荷がかかりすぎます。
Re: オーバーラップ / 同じ時点の期間の数ガント チャート アドインをダウンロードすることをお勧めします。イベントを表示する優れた方法を提供します。

Re: オーバーラップ / 同じ時点の期間の数こんにちは@ubpk 、
おそらく、表内の小さなサンプルを提供していただければ、試してみることができます。
それ以外の場合は、添付の表と画像を見て、これが開始する方向として正しいかどうかをお知らせください。データテーブルでスクリプトを実行すると、グラフが表示されます。
ではごきげんよう、
ロン
