formule de somme cumulée de finJ'ai ce qui est susceptible d'être un besoin de formule très simple. J'ai un ensemble de données de température et j'ai besoin de calculer une somme cumulée sur les 120 derniers jours (appelée "semaines de chauffage par degrés" puisque je convertirai cette somme en semaines en divisant par 7). Je sais comment obtenir une moyenne mobile et je sais comment obtenir une somme cumulée, mais est-il possible d'obtenir une somme cumulative sur 120 jours ? Dans ce cas, lorsque la température dépasse 31,3 °C, un "score" de 0,25 est attribué (voir la colonne "DH-6 hrs" pour la formule.). En gros, je veux la somme cumulée de ces 0,25 valeurs sur une fenêtre de 120 jours, mais je ne sais partitionner que par date/mois/année, etc. (voir script "#DHWs" par exemple), pas par fenêtre réelle de temps. Je suis convaincu que cela doit être faisable!
Modélisation statistique avancéeAutomatisation et scriptÉtudes de consommation et de marchéModélisation prédictive et apprentissage automatiqueIngénierie de la qualité et des procédésRe : formule de somme cumuléeVous trouverez ci-dessous une nouvelle formule que vous pouvez utiliser pour le débogage.Il créera la table de données pour le numéro de ligne que vous mettez dans l'instruction If() à la fin.Si vous ne souhaitez pas créer de table de données, modifiez simplement le numéro de ligne que vous essayez de trouver en -1.Il n'y aura jamais de ligne -1, donc une table ne sera pas créée.Quoi qu'il en soit, voyez si vous pouvez voir ce qui se passe et où une erreur se produit.
Assurez-vous que le tableau est trié correctement et que toutes les lignes que vous ne souhaitez pas traiter sont supprimées du tableau.Le script ne respecte pas les lignes exclues.
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
rowMatrix = [];
);
If( Is Missing( :Name( "Date Time (UTC)" ) ) == 0,
If(
Is Missing( :Name( " Sea Surface Temperature (deg C)" ) ) == 1, holdMatrix = holdMatrix || 0,
:Name( " Sea Surface Temperature (deg C)" ) > 31.3, holdMatrix = holdMatrix || :time difference 2,
:Name( " Sea Surface Temperature (deg C)" ) <= 31.3, holdMatrix = holdMatrix || 0
);
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
rowMatrix = rowMatrix || Row();
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
While(
dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ) & N Cols( holdMatrix ) > 0 &
N Cols( dateMatrix ) > 0,
dateMatrix[1] = [];
holdMatrix[1] = [];
rowMatrix[1] = [];
);
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
x = Sum( holdMatrix ),
x = .
);
,
x = .
);
,
x = .
);
If( Row() == 22159,
New Table( "row" || Char( Row() ),
New Column( "RowNum", set values( rowMatrix ) ),
New Column( "Values", set values( holdMatrix ) ),
New Column( "dates", set values( dateMatrix ), Format( "m/d/y" ) )
)
);
(x / 24) / 7;
Re : formule de somme cumuléeSi vous ajoutez ce qui suit à la formule
If( Row() == ????,
new table("row" || char(row()),new column("Values", set values(holdMatrix)),<BR /> new column("dates", set values(dateMatrix), format("m/d/y")));
);
(x / 24) / 7;
et remplacez simplement le ???? avec le numéro de ligne où vous pensez que les données deviennent amusantes, vous verrez alors un tableau de données avec toutes les valeurs qui ont été ajoutées à la valeur et les dates à partir desquelles les valeurs ont été collectées.Cela pourrait vous donner une idée de ce qui se passe.
Re : formule de somme cumuléeMerci pour votre persévérance ! Cela semblait en effet être un problème, et maintenant les données ont plus de sens. Il y a toujours un problème entre octobre 2018 et juin 2019 : bien que la température ne dépasse jamais 31,3 °C, la valeur ne tombe jamais à 0, même en juin 2019 (bien plus de 120 jours). Pouvez-vous dire ce qui peut s'y passer ?
Re : formule de somme cumuléeJ'ai découvert un problème avec la formule précédente.Les valeurs manquantes causaient un problème.De plus, les données doivent être dans l'ordre des dates d'attribution.Veuillez donc trier le tableau avant d'appliquer la formule
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( Is Missing( :Name( "Date Time (UTC)" ) ) == 0,
If(
Is Missing( :Name( " Sea Surface Temperature (deg C)" ) ) == 1, holdMatrix = holdMatrix || 0,
:Name( " Sea Surface Temperature (deg C)" ) > 31.3, holdMatrix = holdMatrix || :time difference 2,
:Name( " Sea Surface Temperature (deg C)" ) <= 31.3, holdMatrix = holdMatrix || 0
);
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ) & N Cols( holdMatrix ) > 0 & N Cols( dateMatrix ) > 0,
dateMatrix[1] = [];
holdMatrix[1] = [];
);
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
x = Sum( holdMatrix ),
x = .
);
,
x = .
);
,
x = .
);
(x / 24) / 7;
Re : formule de somme cumuléeIl se passe encore quelque chose d'étrange. Si vous regardez ce tableau de données, vous trouverez votre formule (quoique légèrement modifiée) dans la colonne "#DHWs (trailing 120 days)". Il y a des périodes de 4 à 6 mois sans températures supérieures à 31,3 °C, mais la valeur ne diminue jamais (comme d'octobre 2014 à mai 2015). S'il n'y a pas de températures supérieures à 31,3C pendant 120 jours, le "#ECS" devrait tomber à 0. J'ai l'impression que votre formule DEVRAIT le faire. Je me demande si c'est un problème lié au passage d'une année à l'autre ? Peut-être que je pourrais simplement recoder "Jour" de 1 à 20 000 ?
Re : formule de somme cumuléeSi vous voulez juste la somme, alors ne divisez pas la somme par quoi que ce soit
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || 0.25;
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
);
If( N Cols( dateMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ),
holdMatrix[1] = [];
dateMatrix[1] = [];
);
x = Sum( holdMatrix ) ;
,
x = .
);
x;
Re : formule de somme cumuléeJim, merci d'avoir examiné à nouveau ma question, bien qu'il semble que les valeurs résultant de votre nouvelle formule soient trop faibles (malgré que la formule ait apparemment du sens). Mais peut-être que j'aurais dû exprimer mon besoin différemment, auquel cas il peut y avoir une solution plus simple (ou du moins plus directe) : je veux connaître le nombre total d'HEURES sur une période de 120 jours au cours de laquelle la température était OVER 31.3C. Cela équivaut généralement à des blocs de 3 heures puisque la température n'est mesurée que toutes les trois heures (dans la plupart des cas), il s'agit donc essentiellement d'une série de sommes de 3 (voir la colonne "DHH" dans le tableau ci-joint). Par conséquent, les valeurs pourraient se chiffrer en centaines pour les mois les plus chauds. Donc, fondamentalement, j'ai besoin d'une somme de 120 jours de la colonne DHH, mais c'est délicat compte tenu du nombre différent de mesures/jour !
Re : formule de somme cumuléeJe ne sais pas exactement quel diviseur vous envisagez d'utiliser, mais j'ai utilisé le nombre d'heures sur la plage de la matrice de données.Voici la formule que j'ai trouvé
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || 0.25;
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
);
If( N Cols( dateMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ),
holdMatrix[1] = [];
dateMatrix[1] = [];
);
x = Sum( holdMatrix ) / ((dateMatrix[N Cols( dateMatrix )] - dateMatrix[1]) / In Hours( 1 ));
,
x = .
);
x;
Re : formule de somme cumuléeJ'ai une question qui découle d'une bizarrerie ennuyeuse dans l'ensemble de données : je dois évaluer la somme cumulée en heures (et non en semaines, comme je l'ai mentionné précédemment) sur la période de 120 jours. Cependant, les intervalles de temps sont incohérents (voir tableau ci-joint). Dans la plupart des cas, il y a 8 mesures/jour, mais parfois c'est moins. Fondamentalement, chaque fois que la température est> 31,3, je veux ajouter la différence de temps à la colonne. C'est assez facile en utilisant la fonction "dif". Cependant, là où je me bats, c'est comment ajouter les "120 jours" à la formule matricielle. Donc, dans le tableau ci-joint, je veux faire la somme cumulée des "DHH" sur la période de 120 jours. Plutôt que d'avoir le nombre de "lignes" dans la formule, j'en ai besoin pour suivre la date à la place. Est-ce possible?
Re : formule de somme cumuléeSuper! Cela a fait l'affaire. Je l'ai simplement modifié pour refléter le fait qu'il y avait huit fois de mesure par jour (c'est-à-dire que chaque ligne n'est pas un jour unique, j'ai donc multiplié 121 x 8 = 968 dans l'évaluation). Les données ont du sens car la valeur atteint le maximum annuel que j'avais calculé auparavant, avant de chuter. Merci beaucoup. J'aimerais qu'il y ait une somme cumulative de fin dans l'éditeur de formule qui ait des entrées similaires à la moyenne mobile de la colonne (que j'utilise TOUT le temps): poids et N avant. Je vais peut-être l'ajouter à la liste de souhaits.
Re : formule de somme cumuléeSi j'interprète correctement ce que vous voulez, je pense que la formule ci-dessous calculera une somme cumulée de 120 en cours
If( Row() == 1,
holdMatrix = []
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || Matrix( 0.25 ),
holdMatrix = holdMatrix || Matrix( . )
);
If( N Cols( holdMatrix ) == 121,
holdMatrix[1] = []
);
Sum( holdMatrix ) / 7;