Python Pandas Dataframe вечный cumprod - PullRequest
       3

Python Pandas Dataframe вечный cumprod

0 голосов
/ 14 сентября 2018

У меня есть следующий образец Dataframe (строки заполнения 100k +):

In:

    official        delta
    0               0.000201567           
    0               0.000194400            
    0               0.000151906            
    62.94957331     0.000144387            
    64.06471633     0.000125152            
    64.51335098     0.000133459            
    64.4101024      0.000120795            
    0               0.000146456

, но я получаю следующий вывод:

official        delta               result
0               0.000201567         0
0               0.0001944           0 
0               0.000151906         0
62.94957331     0.000144387         0
64.06471633     0.000125152         0
64.51335098     0.000133459         0
64.4101024      0.000120795         0
0               0.000146456         0

DesiredРешение:

official     delta          result
0            0.000201567    0
0            0.0001944      0
0            0.000151906    0
62.94957331  0.000144387    62.94957331
64.06471633  0.000125152    64.06471633
64.51335098  0.000133459    64.51335098
64.4101024   0.000120795    64.4101024
0            0.000146456    63.76600137

Я попробовал следующий код, хотя кажется, что он работает неправильно.Я не понимаю, почему это дает результат ошибки.Когда я выполняю его в демонстрационном фрейме данных, все в порядке.

Код должен выбрать «официальный» элемент, когда маска имеет значение True, в противном случае умножить его предыдущий элемент на 0,99.Проблема здесь в том, что когда маска имеет значение True, код не выбирает «официальный» элемент.

mask = (df['official']<51) & (df['delta']>0)

df['result'] = df['official'].where(mask,0.99).groupby(~mask.cumsum()).cumprod()

1 Ответ

0 голосов
/ 14 сентября 2018
mask = ~((df['official'] < 51) & (df['delta'] > 0))    
df['result1'] = df['official'].where(mask, 0.99*df['official'].shift(1)).fillna(0.0)

Добавьте унарный оператор к mask с ~. Если элемент mask равен True, в противном случае этот элемент сдвинет «official» вниз на одну строку и умножит на 0,99. Заполните первый элемент, который будет NaN вызван сдвигом.

Результат:

    official     delta     result    result1
0   0.000000  0.000202   0.000000   0.000000
1   0.000000  0.000194   0.000000   0.000000
2   0.000000  0.000152   0.000000   0.000000
3  62.949573  0.000144  62.949573  62.949573
4  64.064716  0.000125  64.064716  64.064716
5  64.513351  0.000133  64.513351  64.513351
6  64.410102  0.000121  64.410102  64.410102
7   0.000000  0.000146  63.766001  63.766001
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...