fórmula de suma acumulada finalTengo lo que probablemente sea una necesidad de fórmula muy fácil. Tengo un conjunto de datos de temperatura y necesito calcular una suma acumulativa final durante los últimos 120 días (conocida como "semanas de calentamiento de grados" ya que convertiré esta suma en semanas dividiéndola por 7). Sé cómo obtener un promedio final y sé cómo obtener una suma acumulativa, pero ¿es posible obtener una suma acumulativa de 120 días? En este caso, cuando la temperatura supera los 31,3 °C, se da una "puntuación" de 0,25 (consulte la columna "DH-6 horas" para ver la fórmula). Básicamente, quiero la suma acumulada de estos valores de 0,25 en una ventana de 120 días, pero solo sé cómo particionar por fecha/mes/año, etc. (consulte el script "#DHWs", por ejemplo), no por una ventana real de tiempo. ¡Estoy seguro de que esto debe ser factible!
AnalíticaTabla de datossecuencias de comandosRe: fórmula de suma acumulada finalA continuación se muestra una nueva fórmula que puede utilizar para la depuración.Creará la tabla de datos para cualquier número de fila que coloque en la instrucción If() al final.Si no desea crear una tabla de datos, simplemente cambie el número de fila que está tratando de encontrar a -1.Nunca habrá una fila -1, por lo que no se creará una tabla.De todos modos, vea si puede ver qué está pasando y dónde está ocurriendo un error.
Asegúrese de que la tabla esté ordenada correctamente y que las filas que no desea que se procesen se eliminen de la tabla.El script no respeta las filas excluidas.
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: fórmula de suma acumulativa finalSi agregas lo siguiente a la fórmula
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;
y simplemente reemplace el ???? con el número de fila donde cree que los datos se están volviendo extraños, verá una tabla de datos con todos los valores que se agregaron al valor y las fechas de las que se recopilaron los valores.Eso podría darte una pista de lo que está pasando.
Re: fórmula de suma acumulativa final¡Gracias por tu perseverancia! De hecho, eso parecía ser un problema, y ahora los datos tienen más sentido. Todavía hay un problema entre octubre de 2018 y junio de 2019: a pesar de que la temperatura nunca supera los 31,3 °C, el valor nunca cae a 0, incluso en junio de 2019 (mucho más de 120 días). ¿Puedes decir qué puede estar pasando allí?
Re: fórmula de suma acumulada finalDescubrí un problema con la fórmula anterior.Los valores faltantes estaban causando un problema.Además, los datos deben estar en orden de fecha de asignación.Por lo tanto, ordene la tabla antes de aplicar la fórmula.
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: fórmula de suma acumulativa finalTodavía está pasando algo extraño. Si observa esta tabla de datos, encontrará su fórmula (aunque ligeramente modificada) en la columna "#DHWs (últimos 120 días)". Hay algunos tramos de 4 a 6 meses sin temperaturas superiores a 31,3 ° C, pero el valor nunca disminuye (como de octubre de 2014 a mayo de 2015). Si no hay temperaturas superiores a 31,3C durante 120 días, el "#ACS" debería descender a 0. Siento que su fórmula DEBE hacer esto. Me pregunto si es un problema que surge de atravesar de un año a otro. ¿Tal vez podría recodificar el "Día" del 1 al 20,000?
Re: fórmula de suma acumulada finalSi solo quieres la suma, entonces no dividas la suma por nada
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: fórmula de suma acumulativa finalJim, gracias por mirar mi pregunta nuevamente, aunque parece que los valores resultantes de su nueva fórmula son demasiado bajos (a pesar de que la fórmula parece tener sentido). Pero tal vez debería haber expresado mi necesidad de otra manera, en cuyo caso puede haber una solución más simple (o al menos más directa): quiero saber la cantidad total de HORAS en un período de 120 días en el que la temperatura fue SUPERIOR 31.3C. Esto generalmente equivale a bloques de 3 horas, ya que la temperatura solo se mide cada tres horas (en la mayoría de los casos), por lo que es básicamente una serie de sumas de 3 (consulte la columna "DHH" en la tabla adjunta). Por lo tanto, los valores podrían estar en los cientos para los meses más cálidos. Entonces, básicamente, necesito una suma final de 120 días de la columna DHH, ¡pero es complicado dado el problema de las diferentes cantidades de mediciones por día!
Re: fórmula de suma acumulativa finalNo estoy exactamente seguro de qué divisor está buscando usar, pero usé la cantidad de horas en el rango de la matriz de datos.Aquí está la fórmula que se me ocurrió.
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: fórmula de suma acumulativa finalTengo una pregunta que surge de una peculiaridad molesta en el conjunto de datos: necesito evaluar la suma acumulada en horas (no semanas, como mencioné antes) durante el período final de 120 días. Sin embargo, los intervalos de tiempo son inconsistentes (ver tabla adjunta). En la MAYORÍA de los casos, hay 8 mediciones/día, pero a veces es menos. Básicamente, cada vez que la temperatura es >31,3, quiero agregar la diferencia horaria a la columna. Esto es bastante fácil usando la función "dif". Sin embargo, donde lucho es cómo agregar los "120 días" a la fórmula de matriz. Entonces, en la tabla adjunta, quiero hacer la suma acumulada de los "DHH" durante el período final de 120 días. En lugar de tener el número de "filas" en la fórmula, lo necesito para realizar un seguimiento de la fecha. ¿Es eso posible?
Re: fórmula de suma acumulativa final¡Excelente! Eso hizo el truco. Simplemente lo modifiqué para reflejar el hecho de que había ocho tiempos de medición por día (es decir, cada fila no es un día único, así que multipliqué 121 x 8 = 968 en la evaluación). Los datos tienen sentido porque el valor alcanza el máximo anual que había calculado antes, antes de dejarlo. Muchas gracias. Desearía que hubiera una suma acumulativa final en el editor de fórmulas que tuviera entradas similares a las del promedio móvil de la columna (que uso TODO el tiempo): peso y N antes. Quizás lo añada a la lista de deseos.
Re: fórmula de suma acumulativa finalSi estoy interpretando correctamente lo que quiere, creo que la fórmula a continuación calculará una suma acumulativa final de 120
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;