안녕하세요 여러분,
현재 데이터 시각화에 어려움을 겪고 있습니다. 다음을 포함하여 캡처된 수천 개의 이벤트가 포함된 거대한 테이블이 있습니다. 다른 위치에서 다른 이벤트의 시작 및 종료 시간(텍스트로 표시됨)을 시간으로 인식하도록 성공적으로 변환한 다음 형식:
시작: 2022-01-28T22:26:13
종료: 2022-01-28T23:10:56
이제 병렬 이벤트 수를 시각화/계산하고 싶습니다. 즉, 모든 결과 기간을 오버레이하고 다른 위치에 대한 최대 병렬 이벤트 수를 확인합니다. 또한 시작 시간과 종료 시간의 차이로 사용할 수 있는 기간이 있으므로 필요한 경우를 대비하여....
누군가가 나를 도울 수 있습니까?
건배!
JMP16
안녕 @ubpk ,
아마도 당신이 우리에게 테이블에 있는 작은 샘플을 준다면 나는 그것을 시도해 볼 수 있습니다.
Gantt Chart Addin을 다운로드하는 것이 좋습니다.이벤트를 표시할 수 있는 좋은 방법을 제공합니다.

txnelson,
힌트를 주셔서 감사합니다. 꽤 유용해 보이므로 추가 기능을 다운로드합니다. 하지만 내 경우에는 내가 가진 위치의 양으로 인해 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))
)
);

Time, TypeOfTime(start,end) 및 원래 행 번호라는 세 개의 열이 있는 새 데이터 테이블을 생성하여 JMP에서 거의 대화식으로 이 작업을 수행할 수도 있습니다. 그런 다음 오름차순으로 정렬하고 겹침을 확인하는 수식을 작성합니다(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>