J'ai un ensemble de données où j'aimerais calculer la moyenne des 3 dernières observations pour chaque date et que cette valeur soit dans sa propre colonne et associée à la dernière date, comme indiqué ci-dessous.
Names Default To Here( 1 );
// Create an example data table
dt = New Table( "Date",
Add Rows( 30 ),
New Column( "Date",
Numeric,
"Continuous",
Format( "m/d/y", 10 ),
Set Values( [3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600,
3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200,
3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800] )
),
New Column( "Data",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [2,4,6,8,10,12,14,16,18,20,2,4,6,8,10,12,14,26,28,30,2,4,6,8,10,12,14,36,38,40] )
),
New Column( "Desired Result",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [.,.,.,.,.,.,.,.,.,18,.,.,.,.,.,.,.,.,.,28,.,.,.,.,.,.,.,.,.,38] )
),
);
Bien que je puisse créer un tableau récapitulatif qui calcule la moyenne, puis réinsère la moyenne dans le tableau de données d'origine, je recherche une suggestion pour une méthode plus élégante et moins gourmande en processus.Toute suggestion sur la façon d'accomplir cela serait appréciée, soit sous forme de formule de colonne, soit via JSL (de préférence).
Je peux aussi ouvrir un peu ma solution car les fonctions Col peuvent être assez puissantes. Regarde l'explication quand tu as le temps :
- Utilisez Col Max(Row(), :Date) pour obtenir la dernière ligne pour chaque date
- Vérifiez avec l'instruction if avec Row () pour la dernière ligne pour la date
- Utilisez Moyenne pour calculer la moyenne des trois dernières lignes d'une date. Index(Row() - 2, Col Max(Row(), :Date) crée une matrice de numéros de ligne. Et puis avec:Data[Index] nous pouvons obtenir des valeurs pour ces numéros de ligne
J'ai joint une table de données dans laquelle la formule est divisée en plusieurs parties

Autre option avec une formule :
If(Row() == Col Max(Row(), :Date),
Mean(:Data[Index(Row() - 2, Col Max(Row(), :Date))])
)
Voici une façon d'écrire la formule pour le faire
If( :Date != :Date[Row() + 1] | Row() == N Rows( Current Data Table() ),
Mean( :Data[Row()], :Data[Row() - 1], :Data[Row() - 2] )
)