J'ai un ensemble de données dans lequel 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érer 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'y parvenir 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. Jetez un œil à l’explication lorsque vous aurez le temps :
- Utilisez Col Max(Row(), :Date) pour obtenir la dernière ligne pour chaque date
- Vérifiez avec l'instruction if avec Row() 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 les valeurs de ces numéros de ligne
J'ai joint un datatable dans lequel la formule est divisée en parties

Merci pour la suggestion, en particulier celle que je pourrais facilement comprendre.Je devrai approfondir davantage la suggestion de jthi, car la solution ne m'est pas aussi intuitive que la vôtre.
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 ce faire
If( :Date != :Date[Row() + 1] | Row() == N Rows( Current Data Table() ),
Mean( :Data[Row()], :Data[Row() - 1], :Data[Row() - 2] )
)