Remuestreo causal: sum sobre la última X

Digamos que tengo los siguientes valores:

money_spent time 2014-10-06 17:59:40.016000-04:00 1.832128 2014-10-06 17:59:41.771000-04:00 2.671048 2014-10-06 17:59:43.001000-04:00 2.019434 2014-10-06 17:59:44.792000-04:00 1.294051 2014-10-06 17:59:48.741000-04:00 0.867856 

Espero medir mucho dinero gastado cada 2 segundos. Más específicamente, para cada marca de tiempo en la salida, necesito ver el dinero gastado en los últimos 2 segundos .

Cuando lo hago:

 df.resample('2S', how='last') 

Yo obtengo:

  money_spent time 2014-10-06 17:59:40-04:00 2.671048 2014-10-06 17:59:42-04:00 2.019434 2014-10-06 17:59:44-04:00 1.294051 2014-10-06 17:59:46-04:00 NaN 2014-10-06 17:59:48-04:00 0.867856 

que no es lo que yo esperaría. Para empezar, tenga en cuenta que la primera entrada en el df remuestreado es 2.671048 , pero eso es a las 17:59:40 , aunque, según el dataframe original, no se ha gastado dinero todavía . ¿Cómo es eso posible?

intenta usar how=np.sum :

 df.resample('2S', how=np.sum, closed='left', label='right') 

Editar :

En cuanto a closed y label :

Significa: desde el intervalo cerrado a la izquierda, y etiquetado con la fecha desde el extremo derecho del intervalo. (de 2 segundos, por ejemplo, [1, 1.2, 1.5, 1.9, 2)). Y a partir de la documentación :

closed: {‘right’, ‘left’} Que lado del intervalo de bin está cerrado

etiqueta: {‘derecha’, ‘izquierda’} con qué borde de bandeja para etiquetar el cubo con

Puede agregar eventos al marco, de la forma en que cada dólar gastado dejará el sistema dos segundos después; Entonces todo lo que necesitas es una sum acumulativa;

Existe la posibilidad de que dos eventos se superpongan; en ese caso, después del último paso, necesita .drop_duplicate índices de tiempo, tomando el último valor de money_spent para cada valor duplicado de time :

 >>> df money_spent time 2014-10-06 21:59:40.016000 1.832 2014-10-06 21:59:41.771000 2.671 2014-10-06 21:59:43.001000 2.019 2014-10-06 21:59:44.792000 1.294 2014-10-06 21:59:48.741000 0.868 >>> xdf = df.copy() # make a copy of the original frame >>> xdf['money_spent'] *= -1 # negate the value of `money_spent` >>> xdf.index += np.timedelta64(2, 's') # move the time span 2 seconds 

ahora, concat con el marco original, sort_index y encuentre la sum acumulada:

 >>> pd.concat([df, xdf]).sort_index().cumsum() money_spent 2014-10-06 21:59:40.016000 1.832e+00 2014-10-06 21:59:41.771000 4.503e+00 2014-10-06 21:59:42.016000 2.671e+00 2014-10-06 21:59:43.001000 4.690e+00 2014-10-06 21:59:43.771000 2.019e+00 2014-10-06 21:59:44.792000 3.313e+00 2014-10-06 21:59:45.001000 1.294e+00 2014-10-06 21:59:46.792000 -4.441e-16 2014-10-06 21:59:48.741000 8.679e-01 2014-10-06 21:59:50.741000 -4.441e-16 

Hay un error de precisión de punto flotante que aparece como valores muy pequeños como -4.441e-16 , de lo contrario los números me parecen correctos:

 >>> _['money_spent'].round(15) 2014-10-06 21:59:40.016000 1.832 2014-10-06 21:59:41.771000 4.503 2014-10-06 21:59:42.016000 2.671 2014-10-06 21:59:43.001000 4.690 2014-10-06 21:59:43.771000 2.019 2014-10-06 21:59:44.792000 3.313 2014-10-06 21:59:45.001000 1.294 2014-10-06 21:59:46.792000 -0.000 2014-10-06 21:59:48.741000 0.868 2014-10-06 21:59:50.741000 -0.000 Name: money_spent, dtype: float64 

La razón por la que el primer elemento en su matriz de devolución es de 2.67 es que está utilizando el last método para volver a muestrear sus datos. Si desea cambiar a donde el primer punto remuestreado leerá 1.832128 , use el 1.832128 how='first' .