이동 교대 / 변경안녕하세요 ...
이 게시판에서 제가 가장 좋아하는 주제로 돌아갑니다.
다음 논리를 구성하는 데 도움이 필요합니다.
일부 날짜/시간 매개변수에 대해 시간순으로 정렬된 데이터(Y)를 통해 일정한 크기의 이동 창 내에서
1-Y 최소값 = min을 찾아야 합니다.
2-Y 최대값 = 최대값을 찾아야 합니다.
3-계산 교대 = 최대 - 최소(최대가 최소의 기록 이후 시간순으로 식별된 경우)
그렇지 않으면
Shift = min- max (max가 min의 기록보다 시간순으로 식별된 경우)
수식 내에서 1과 2를 수행할 수 있지만 이동을 계산하는 트릭을 찾을 수 없습니다.
수식 솔루션이 선호되지만 그렇지 않은 경우 스크립트도 작동합니다. (특히 스크립트가 수식 창 내에서 작동할 수 있는 경우)
참고: 내일(2020년 9월 2일) 계산해야 할 긴급 상황이 있어서 도움을 주시면 감사하겠습니다.
고마워 ...
소비자 및 시장 조사Re: 교대근무/변경나는 항상 작동하는 코드는 비난하기보다는 칭찬해야 한다는 것을 알았습니다. 따라서 작동한다면.....사용하십시오.
Re: 교대근무/변경짐
나는 다음 형식을 사용하여 내 논리를 모두 완료했다고 믿습니다(귀하의 형식만큼 간단하지는 않습니다)..
내 Y는 지수 가중 함수이므로 첫 번째 항은 비어 있습니다. 즉, "+1"이 필요합니다.
AssetRecordNumber == 열 번호( :Name( "Y" ), :ASSET ) + 1
이에 대한 귀하의 큰 지원에 감사드립니다. 잘못된 점이 있으면 알려주세요. 하지만 테스트해 본 결과 3가지 시나리오 모두에서 작동하는 것 같습니다.
------------------------------------- -----------
If( 열 번호( :Name( "Y" ), :ASSET ) >= :Detection_window & :AssetRecordNumber >= :Detection_window,
If( :AssetRecordNumber == :Detection_window,
conSize = :Detection_window;
allVals = :Name( "Y" ) << 값 가져오기;
);
시작 = 행() - (:Detection_window - 1);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
교대;
,
If( 열 번호( :Name( "Y" ), :ASSET ) >= :window_min & :AssetRecordNumber == 열 번호( :Name( "Y" ), :ASSET ) + 1,
(conSize = Col Number( :Name( "Y" ), :ASSET ) ; allVals = :Name( "Y" ) << 값 가져오기);
start = Row() - (열 번호( :Name( "Y" ), :ASSET ) - 1);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
교대;
,
.
)
)
Re: 교대근무/변경짐, 이것에 대해 한 가지 더 요청합니다.
내 분석은 먼저 지속적인 롤링 윈도우로 시작되었지만 목표 레코드 수(Detection_window에서와 같이)가 없는 일부 자산을 고려해야 하므로 두 번째 테이블 변수 window_min을 삽입하여 이에 대한 제약 조건을 완화해야 합니다. (최소 롤링 창 크기).
예를 들어, 내 detector_window = 30이고 window_min=15이면 이는 다음을 의미합니다.
1) 30개보다 많은 레코드를 가진 모든 자산의 롤링 창 크기는 30입니다.
2) 30~15 사이의 레코드가 있는 모든 자산은 최대 길이의 단일 창을 갖습니다.
3) 15보다 작은 다른 모든 자산은 아무것도 갖지 않습니다.
원래 솔루션에서 수정 권장 사항을 제시해 주실 수 있나요?
감사해요 ...
Re: 교대근무/변경짐,
신속한 지원에 다시 한 번 감사드립니다(항상 그랬듯이).
2개를 변경했는데..
1) detector_window는 롤링 창 길이를 정의하는 테이블 변수입니다.
2) 시작은 detector_window -1(두 번째 줄)이어야 한다고 생각합니다.
더 중요한 것은 두 번째 자산 변수 Z마다 Y 열을 가져와야 한다는 것입니다("가치 가져오기" 단계 근처).
(예: Y와 Z는 두 개의 열이므로 자산 Z의 함수로 계산된 최소 최대 이동을 계산해야 합니다. )
이제 하나의 특정 Z 자산에 대해 이것을 플롯했는데 결과가 정확했습니다.
각 자산 Z에 대해 독립적으로 행 수 = detector_window가 있을 때 계산을 시작하는 IF 문이 처음에 있습니다. 나는 이것이 그것이 작동하는 이유라고 생각합니다.
[row()- (Detection_window -1) ]는 각 자산의 올바른 시작 부분부터 시작됩니다.
start =1이 좀 혼란스럽네요.. 행 #1에서 창이 시작되지 않기를 바랍니다.
당신의 도움을 주셔서 감사합니다.
If(행() == 1,
conSize = :Detection_window;
allVals = Y << 값을 얻습니다.
);
If( 행() <= conSize,
시작 = 1,
시작 = 행() - (:Detection_window - 1)
);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
교대;
Re: 교대근무/변경나는 이것이 당신에게 변화 가치를 줄 것이라고 생각합니다.수식에서 상수 크기(conSize) 값과 Y 열 이름(Y)을 변경하면 원하는 대로 계산될 것이라고 믿습니다.
If( Row() == 1,
conSize = 5;
allVals = :Y << get values;
);
If( Row() <= conSize,
start = 1,
start = Row() - conSize
);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
theShift;