Перезапустите накопленную сумму в панде. - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь начать накопительную сумму в кадре данных pandas, перезапуская каждый раз, когда абсолютное значение превышает 0,009.Могу дать вам выдержку из моих попыток, но я предполагаю, что они просто отвлекут вас.Перепробовал несколько вещей с np.where, но в определенный момент они начинают перекрываться, и это устраняет неправильные вещи.

Требуемый выходной столбец b.

df = pd.DataFrame({'values':(49.925,49.928,49.945,49.928,49.925,49.935,49.938,49.942,49.931,49.952)})
df['a']=df.diff()

 values      a      b
0  49.925    NaN  0.000
1  49.928  0.003  0.003
2  49.945  0.017  0.020 (restart cumsum next row)
3  49.928 -0.017 -0.017 (restart cumsum next row)
4  49.925 -0.003 -0.003
5  49.935  0.010  0.007
6  49.938  0.003  0.010 (restart cumsum next row)
7  49.942  0.004  0.004
8  49.931 -0.011 -0.007
9  49.952  0.021  0.014 (restart cumsum next row)

Таким образом, фактическая цель состоит в том, чтобы python понял, что я хочу перезапустить накопленную сумму, когда она превышает абсолютнуюзначение 0,009

1 Ответ

2 голосов
/ 10 мая 2019

Я не могу решить это в векторизованном виде, однако применение функции с сохранением состояния работает.

import pandas as pd
from pandas.compat import StringIO
print(pd.__version__)

df = pd.DataFrame({'values':(49.925,49.928,49.945,49.928,49.925,49.935,49.938,49.942,49.931,49.952)})
df['a']=df.diff()

accumulator = 0.0
reset = False
def myfunc(x):
    global accumulator, reset
    if(reset):
        accumulator = 0.0
        reset = False
    accumulator += x 
    if abs(accumulator) > .009: 
        reset = True
    return accumulator

df['a'].fillna(value=0, inplace=True)
df['b'] = df['a'].apply(myfunc)
print(df)

Производит

0.24.2
   values      a      b
0  49.925  0.000  0.000
1  49.928  0.003  0.003
2  49.945  0.017  0.020
3  49.928 -0.017 -0.017
4  49.925 -0.003 -0.003
5  49.935  0.010  0.007
6  49.938  0.003  0.010
7  49.942  0.004  0.004
8  49.931 -0.011 -0.007
9  49.952  0.021  0.014

...