Restablecer cumsum si sobrepasa el límite (python)

El siguiente fragmento de código devolverá una sum de la matriz de entrada, que se restablece cada vez que se encuentra un NaN.

v = np.array([1., 1., 1., np.nan, 1., 1., 1., 1., np.nan, 1.]) n = np.isnan(v) a = ~n c = np.cumsum(a) d = np.diff(np.concatenate(([0.], c[n]))) v[n] = -d result = np.cumsum(v) 

De manera similar, ¿cómo puedo calcular un cúmulo que se restablece si el cúmulo está por encima de algún valor utilizando pandas vectorizadas o operaciones de números?

Por ejemplo, para límite = 5, en = [1,1,1,1,1,1,1,1,1,1], out = [1,2,3,4,5,1,2,3,4] , 5]

Si los números en su matriz son todos positivos, es probable que sea más sencillo usar cumsum() y luego el operador de módulo:

 >>> a = np.array([1,1,1,1,1,1,1,1,1,1]) >>> limit = 5 >>> x = a.cumsum() % limit >>> x array([1, 2, 3, 4, 0, 1, 2, 3, 4, 0]) 

Luego, puede establecer cualquier valor de cero en el límite para obtener la matriz deseada:

 >>> x[x == 0] = limit >>> x array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5]) 

Aquí hay una posible solución general utilizando el método de expanding_apply Pandas. (No lo he probado extensivamente …)

Primero defina una función cumsum modificada:

 import pandas as pd def cumsum_limit(x): q = np.sum(x[:-1]) if q > 0: q = q%5 r = x[-1] if q+r <= 5: return q+r elif (q+r)%5 == 0: return 5 else: return (q+r)%5 a = np.array([1,1,1,1,1,1,1,1,1,1]) # your example array 

Aplicar la función a la matriz de esta manera:

 >>> pd.expanding_apply(a, lambda x: cumsum_limit(x)) array([ 1., 2., 3., 4., 5., 1., 2., 3., 4., 5.]) 

Aquí está la función aplicada a otra serie más interesante:

 >>> s = pd.Series([3, -8, 4, 5, -3, 501, 7, -100, 98, 3]) >>> pd.expanding_apply(s, lambda x: cumsum_limit(x)) 0 3 1 -5 2 -1 3 4 4 1 5 2 6 4 7 -96 8 2 9 5 dtype: float64