Используя Numpy, где размещать условия на Pandas DataFrame, принимая кумулятивную сумму - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь поместить условие в один из столбцов в Пандасе, и исходя из этого условия, я хочу взять кумулятивную сумму другого столбца в Фрейме данных.Чтобы быть более понятным, вот пример: предположим, что мой DataFrame df как:

+-----------+--------------+-----+-------------+
|   Date    | daily_return | dir | size_return |
+-----------+--------------+-----+-------------+
| 2/25/2015 |    -0.000681 |  -1 |   -0.000681 |
| 2/26/2015 |      -0.0015 |  -1 |    -0.00218 |
| 2/27/2015 |    -0.003022 |  -1 |   -0.005203 |
| 3/2/2015  |     0.005776 |   1 |    0.005776 |
| 3/3/2015  |    -0.003772 |  -1 |   -0.003772 |
| 3/4/2015  |     -0.00436 |  -1 |    -0.00755 |
+-----------+--------------+-----+-------------+

Я поместил условие в столбец dir, пока значение в dir равноdir.shift(1) Я хочу взять кумулятивную сумму столбца daily_return, пока dir не станет равным dir.shift(1), а когда они не будут равны, я хочу, чтобы daily_return равнялся size_return.Код, который я использовал для генерации таблицы выше, выглядит следующим образом:

df['size_return'] = np.where(df.dir == df.dir.shift(1), 
                             df.daily_return.cumsum(axis=0), df.daily_return)

Проблема с таблицей выше состоит в том, что я не могу понять, почему в последних двух строках суммируется с использованиемВыше строки кода daily_return результат -0.00755, я должен получить -0.00813 (-0.003772 + -0.00436).

В моей логике, написанной в приведенном выше коде, должна быть ошибка, яне могу понять мою ошибку?

Во-вторых, я не хочу, чтобы значение в каждой строке size_return было только последней строкой отфильтрованного фрейма данных на основе условия.Чтобы быть более понятным, вот как должен выглядеть финальный стол:

+-----------+--------------+-----+-------------+
|   Date    | daily_return | dir | size_return |
+-----------+--------------+-----+-------------+
| 2/25/2015 |    -0.000681 |  -1 |             |
| 2/26/2015 |      -0.0015 |  -1 |             |
| 2/27/2015 |    -0.003022 |  -1 |   -0.005203 |
| 3/2/2015  |     0.005776 |   1 |    0.005776 |
| 3/3/2015  |    -0.003772 |  -1 |             |
| 3/4/2015  |     -0.00436 |  -1 |   -0.008132 |
+-----------+--------------+-----+-------------+

1 Ответ

2 голосов
/ 16 марта 2019

Проверьте с помощью groupby и cumsum

df.groupby((df.dir==df.dir.shift()).eq(0).cumsum()).daily_return.cumsum()
0   -0.000681
1   -0.002181
2   -0.005203
3    0.005776
4   -0.003772
5   -0.008132
Name: daily_return, dtype: float64

Если оставить только последний, используйте duplicated

s=(df.dir==df.dir.shift()).eq(0).cumsum()
df['New']=df.groupby(s).daily_return.cumsum().mask(s.duplicated(keep='last'),'')
df
        Date  daily_return  dir  size_return       New
0  2/25/2015     -0.000681   -1    -0.000681          
1  2/26/2015     -0.001500   -1    -0.002180          
2  2/27/2015     -0.003022   -1    -0.005203 -0.005203
3   3/2/2015      0.005776    1     0.005776  0.005776
4   3/3/2015     -0.003772   -1    -0.003772          
5   3/4/2015     -0.004360   -1    -0.007550 -0.008132
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...