중복/동일 시점의 기간 수안녕하세요 여러분,
현재 일부 데이터 시각화에 어려움을 겪고 있습니다. 다음을 포함하여 캡처된 수천 개의 이벤트가 포함된 거대한 테이블이 있습니다. 시간으로 인식되도록 성공적으로 변환한 다음 형식의 다양한 위치에서 다양한 이벤트의 시작 및 종료 시간(텍스트로 표시됨)을 입력합니다.
시작: 2022-01-28T22:26:13
종료: 2022-01-28T23:10:56
이제 병렬 이벤트 수를 시각화/계산하고 싶습니다. 즉, 모든 결과 기간을 오버레이하고 여러 위치에 대한 최대 병렬 이벤트 수를 확인하고 싶습니다. 또한 시작 시간과 종료 시간의 차이로 사용할 수 있는 기간도 있으므로 이것이 필요한 경우를 대비해....
누군가 나를 도와줄 수 있을까요?
건배!
JMP16
데이터 탐색 및 시각화대량 맞춤화윈도우Re: 중복/동일 시점의 기간 수이 방법에는 몇 가지 문제가 있지만(나중에 알아차렸습니다) 운 좋게도 대화형 방법이므로 데이터에서 쉽게 확인할 수 있습니다(몇 가지 예시 이미지를 추가했습니다). 계산 대상에 따라 이는 문제가 되지 않을 수도 있습니다.
1. 한 시간이 확인된 시작 시간 이전에 시작되어 확인된 종료 시간 이후에 종료되면 계산되지 않습니다.
2. 확인된 시간 사이에 시간이 시작하고 끝나는 경우 두 번 계산됩니다.
Re: 중복/동일 시점의 기간 수안녕,
귀하의 코드에 감사드립니다. 확인해 보니 다른 용도로 도움이 될 수도 있겠네요. 하지만: 당신의 생각은
" Time, TypeOfTime(start,end) 및 원래 행 번호라는 세 개의 열이 있는 새 데이터 테이블을 생성하면 JMP에서 거의 대화식으로 이 작업을 수행할 수 있습니다. 그런 다음 오름차순으로 정렬하고 겹침을 확인하는 수식을 작성합니다. (Lag()를 사용할 수도 있고 Col Min(Row(), :Row) 및 Col Max(Row(), :Row())와 그 차이점을 사용했습니다.) . 마지막으로 요약 테이블을 생성하여 최대 값을 얻거나 행 번호를 기반으로 원래 테이블에 다시 조인합니다."
~였다 간단하고 훌륭해요! 방금 스택하고 타임 스탬프별로 정렬하고 시작인지 끝인지에 따라 +1/-1을 반환하는 수식 채널을 구현한 다음 다른 채널에서 이를 합산합니다. 매력처럼 작동합니다!
Re: 중복/동일 시점의 기간 수안녕하세요 jthi 님,
우선 여러분의 노력에 감사드립니다! 최대한 빨리 해결방법을 확인하고 피드백 드리겠습니다!!
건배
울프
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) 및 원래 행 번호라는 세 개의 열이 있는 새 데이터 테이블을 생성하면 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는 중첩 계산 방법에 따라 충분할 수 있습니다. 둘 다 필요한 경우 해당 값의 합계를 얻으십시오.


Re: 중복/동일 시점의 기간 수여기에 이틀만 포함된 축소된 데이터 세트가 있지만 작업을 수행해야 합니다. 그래픽 보기가 반드시 필요한 것은 아니지만 디버깅을 위해 병렬 이벤트 수가 합리적인지 여부를 제어할 수 있는 기능이 있으면 좋을 것입니다.
미리 감사드립니다!!
울프
Re: 중복/동일 시점의 기간 수 텍사스 넬슨,
힌트를 주셔서 감사합니다. 꽤 유용해 보이는 추가 기능을 다운로드하겠습니다. 하지만 제 경우에는 위치가 너무 많아서 y축에 과부하가 걸릴 수 있습니다.
Re: 중복/동일 시점의 기간 수Gantt Chart Addin을 다운로드하는 것이 좋습니다.이는 귀하의 이벤트를 표시할 수 있는 좋은 방법을 제공할 것입니다.

Re: 중복/동일 시점의 기간 수안녕 @ubpk ,
아마도 당신이 우리에게 테이블에 있는 작은 샘플을 준다면 시도해 볼 수 있을 것입니다.
그렇지 않은 경우 첨부된 표와 이미지를 살펴보고 이것이 올바른 시작 방향인지 알려주세요. 데이터 테이블에서 스크립트를 실행하면 그래프가 표시됩니다.
모두 제일 좋다,
론
