Hola,
Tengo una columna A (alrededor de 15,000 filas) que tiene números y muchos valores nulos (quizás 70-80% nulo).
Me gustaría construir una columna B que en la fila i sea igual a la media de: los *últimos 10 valores no nulos de A*
--> esto significa tomar A[row i-1] , A[row i-2], ... y retroceder hasta que tenga 10 valores no nulos (o si llega a la fila 1, tome cualquier número <= 10 de valores no nulos que obtienes)
También me gustaría hacer además de la media, una mediana y también una moda, pero una versión suavizada de la moda donde:
Primero hago un suavizado gaussiano de los 10 valores no nulos... y tomo el argmax (modo) de esas distribuciones.
¡Gracias por cualquier idea o sugerencia!
***
Ideas de solución: un pensamiento que tuve fue porque quiero hacer varios cálculos diferentes con los últimos 10 valores no nulos, primero debería construir una columna C cuyas entradas sean matrices iguales a esos últimos 10 valores no nulos ... luego puede hacer 3 fórmulas que operan en la columna C para producir B1 (media), B2 (medial), B3 (modo suavizado).
Aquí hay algunos fragmentos de código que avanzan hacia la construcción de esta columna C de matrices:
//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