Déplacement des quarts de travail/changementsBonjour ...
Revenons à mon sujet préféré sur ce forum.
J'ai besoin d'aide pour construire la logique suivante.
Dans une fenêtre mobile de taille constante à travers des données (Y) classées chronologiquement par rapport à un paramètre datetime
1-Besoin de trouver Y minimum = min
2-Besoin de trouver Y maximum = max
3-Calcul du décalage = max - min (si max a été identifié chronologiquement après l'enregistrement de min)
ou sinon
shift = min-max (si max a été identifié chronologiquement avant l'enregistrement de min)
Je peux faire 1 et 2 dans une formule mais je n'ai trouvé aucune astuce pour calculer le décalage
la solution de formule est préférée, mais sinon, un script fonctionnerait également. (surtout si le script peut fonctionner dans la fenêtre de formule)
remarque : j'ai une certaine urgence à les calculer demain (02/09/2020), toute aide serait appréciée.
Merci ...
Études de consommation et de marchéRe : Déplacement d'équipes/changementsJ'ai toujours trouvé qu'un code fonctionnel devait être loué et non critiqué, donc s'il fonctionne... utilisez-le.
Re : Déplacement d'équipes/changementsJim
Je crois que j'en ai fini avec ma logique avec le formulaire suivant (qui n'est pas aussi compact que le vôtre).
Mon Y est une fonction pondérée exponentielle, donc le premier terme est vide, ce qui est mon besoin de "+1" dans
AssetRecordNumber == Numéro de colonne ( :Name( "Y" ), :ASSET ) + 1
merci pour votre grand soutien dans ce domaine. faites-moi savoir si vous voyez quelque chose qui ne va pas, mais je l'ai testé et cela semble fonctionner dans les 3 scénarios.
-------------------------------------------------- --------------------
If( Col Number( :Name( "Y" ), :ASSET ) >= :detection_window & :AssetRecordNumber >= :detection_window,
Si( :AssetRecordNumber == :detection_window,
conSize = :detection_window;
allVals = :Name( "Y" ) << obtenir les valeurs ;
);
start = Row() - (:detection_window - 1);
subMat = allVals[Index( début, Row() )];
minVal = Min( sousMat );
maxVal = Max( sousMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
Si( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
le passage;
,
If( Numéro de col( :Nom( "Y" ), :ASSET ) >= :window_min & :AssetRecordNumber == Numéro de col( :Nom( "Y" ), :ASSET ) + 1,
(conSize = Col Number( :Name( "Y" ), :ASSET ) ; allVals = :Name( "Y" ) << obtenir les valeurs);
start = Row() - (Col Number( :Name( "Y" ), :ASSET ) - 1);
subMat = allVals[Index( début, Row() )];
minVal = Min( sousMat );
maxVal = Max( sousMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
Si( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
le passage;
,
.
)
)
Re : Déplacement d'équipes/changementsJim, encore une demande à ce sujet.
Mon analyse a commencé comme une fenêtre glissante constante, mais je dois ensuite prendre en compte certains actifs qui n'ont pas le nombre d'enregistrements ciblé (comme dans détection_window), je dois donc assouplir ma contrainte pour eux en insérant une deuxième variable de table window_min (taille minimale de la fenêtre déroulante).
donc à titre d'exemple, si ma détection_window = 30 et window_min=15, cela signifie
1) tous les actifs ayant plus de 30 enregistrements auront une fenêtre glissante de taille 30
2) tous les actifs contenant des enregistrements compris entre 30 et 15 auront une seule fenêtre de leur longueur maximale
3) tous les autres actifs inférieurs à 15 n'auront rien
pourriez-vous s'il vous plaît faire une recommandation de modification à partir de votre solution d'origine ?
merci ...
Re : Déplacement d'équipes/changementsJim,
Merci encore pour votre soutien rapide (comme cela a toujours été le cas)
J'ai fait 2 modifications...
1) Detection_window est ma variable de table définissant la longueur de la fenêtre déroulante
2) Je pense que start devrait être Detection_window -1 (en deuxième ligne)
Plus important encore, ma colonne Y doit également être extraite (autour de l'étape "obtenir les valeurs") par une deuxième variable d'actif Z
(c'est-à-dire que Y et Z sont deux colonnes, il est nécessaire de calculer le décalage calculé min max en fonction de l'actif Z. )
Maintenant, j'ai tracé cela par rapport à un actif Z spécifique et les résultats sont corrects.
J'ai une instruction IF au début qui démarre le calcul lorsque nous avons nombre de lignes = détection_window indépendamment pour chaque actif Z... Je pense que c'est pour ça que ça marche.
[row()- (detection_window -1) ] commence au début correct pour chaque actif.
start =1 m'a un peu dérouté .. j'espère que cela ne démarre pas la fenêtre à partir de la ligne n°1.
Apprécier ton aide.
Si(Ligne() == 1,
conSize = :detection_window;
allVals = Y << obtenir les valeurs ;
);
Si( Row() <= conSize,
début = 1,
start = Row() - (:detection_window - 1)
);
subMat = allVals[Index( début, Row() )];
minVal = Min( sousMat );
maxVal = Max( sousMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
Si( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
le passage;
Re : Déplacement d'équipes/changementsJe pense que cela vous donnera la valeur de décalage.Changez simplement la valeur de taille constante (conSize) et le nom de la colonne Y (Y) dans la formule et je pense qu'il calculera ce que vous voulez
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;