Ciao,
Ho una colonna A (circa 15.000 righe) che ha numeri e molti valori nulli (forse 70-80% null).
Vorrei costruire una colonna B che alla riga i, è uguale alla media di: gli *ultimi 10 valori non nulli da A*
--> questo significa prendere A[row i-1] , A[row i-2], ... e tornare indietro fino a quando non hai 10 valori non nulli (o se raggiungi la riga 1, prendi qualsiasi numero <= 10 di valori non nulli che ottieni)
Vorrei anche fare oltre a significare, una mediana e anche una modalità, ma una versione smussata della modalità in cui:
Per prima cosa eseguo un livellamento gaussiano dei 10 valori non nulli ... e prendo argmax (modalità) di quelle distribuzioni.
Grazie per qualsiasi pensiero o suggerimento!
***
Idee per la soluzione: un pensiero che avevo era perché voglio eseguire diversi calcoli con gli ultimi 10 valori non nulli, dovrei prima costruire una colonna C le cui voci sono matrici uguali a quegli ultimi 10 valori non nulli ... quindi io può fare 3 formule che operano sulla colonna C per produrre B1 (media), B2 (mediale), B3 (modalità livellata).
Ecco alcuni frammenti di codice che si muovono verso la costruzione di questa colonna C di array:
//step 1 grab the last say 50 entries (some fixed amount that will likely have 10 non-nulls)
For Each Row( dt_join,
to = Row();
If( to - 50 < 0,
from = 1,
from = to - 50); // Quantile( 0.5,
values = :away_1g_pull_seconds[Index( From, To )] < 50, Break());
);
//step 2 convert array to list, drop nulls, convert list of first 10 entries back to array ...
//I don't know how to assign this to a row of C
num_lag = 10;
values = dt_join:A[Index( From, To )] ;
MyList = Remove(as list(values)[1], as list(Loc(as list(values)[1], .)) ); //convert array to list and remove nulls
Mat = Number Col Box("", MyList[1:10]) << get as matrix; //hack convert to array