Отслеживать операцию в Dataframe - PullRequest
3 голосов
/ 08 июля 2019

Мои фреймы данных

df1:

Index                 Amount               
01.01.2018 08:00:00   23.25
01.01.2018 08:10:00   25.50
01.01.2018 08:20:00   26.30
01.01.2018 08:30:00   25.00
01.01.2018 08:40:00   20.00
01.01.2018 08:50:00   21.20
01.01.2018 09:00:00   21.20
01.01.2018 09:10:00   31.20

df2:

Index       Operation
01.01.2018  -5.00
01.01.2018  10.00

Я бы хотелотслеживать операции с df2 в моем df1.

Поэтому в основном проверьте Operations в df2 и найдите, где это событие произошло в df1.Напримересть -5,00, и это событие произошло здесь:

01.01.2018 08:30:00   25.00
01.01.2018 08:40:00   20.00

Мой ожидаемый результат:

df:

Index                 Amount  Operation_T/F  Amount_Operation              
01.01.2018 08:00:00   23.25   0              0
01.01.2018 08:10:00   25.50   0              0
01.01.2018 08:20:00   26.30   0              0
01.01.2018 08:30:00   25.00   0              0
01.01.2018 08:40:00   20.00   1              -5.0
01.01.2018 08:50:00   21.20   0              0
01.01.2018 09:00:00   21.20   0              0
01.01.2018 09:10:00   31.20   1              10.0

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

Были некоторые проблемы с записью значения True или False для операции, if in row или row + 1.Моя идея решить эту проблему состояла в том, чтобы создать ячейки для двух строк, а затем отследить, произошло ли событие операции в этой ячейке.Как вы думаете?

Заранее спасибо :)

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

IIUC, вы хотите объединить разницу суммы и даты:

df1['date'] = df1.index.floor('D')
df1['Amount_Operation'] = df1.Amount.diff()


df = (df1.reset_index()
         .merge(df2.reset_index(), 
              left_on=['date', 'Amount_Operation'],
              right_on=['Index','Operation'],
              left_index=True,
              suffixes=['','_y'],
              how='left')
         .drop(['Index_y', 'date'], axis=1)
     )

df['Operation_T/F'] = df.Operation.isna()
df['Amount_Operation'] = df.Operation.fillna(0)

Вывод:

                Index  Amount  Amount_Operation  Operation  Operation_T/F
1 2018-01-01 08:00:00   23.25               0.0        NaN           True
1 2018-01-01 08:10:00   25.50               0.0        NaN           True
1 2018-01-01 08:20:00   26.30               0.0        NaN           True
1 2018-01-01 08:30:00   25.00               0.0        NaN           True
0 2018-01-01 08:40:00   20.00              -5.0       -5.0          False
1 2018-01-01 08:50:00   21.20               0.0        NaN           True
1 2018-01-01 09:00:00   21.20               0.0        NaN           True
1 2018-01-01 09:10:00   31.20              10.0       10.0          False
2 голосов
/ 08 июля 2019

Вот один подход, использующий diff для проверки, где первые различия в df2.Operation равны df2.Operation, и использование широковещания :

m = df1.Amount.diff().values == df2.Operation.values[:,None]
df1['Operation_T/F'] = m.sum(0)
df1['Amount_Operation'] = (m * df2.Operation.values[:,None]).sum(0)

         Index         Amount         Operation_T/F  Amount_Operation
0 2018-01-01 08:00:00   23.25              0               0.0
1 2018-01-01 08:10:00   25.50              0               0.0
2 2018-01-01 08:20:00   26.30              0               0.0
3 2018-01-01 08:30:00   25.00              0               0.0
4 2018-01-01 08:40:00   20.00              1              -5.0
5 2018-01-01 08:50:00   21.20              0               0.0
6 2018-01-01 09:00:00   21.20              0               0.0
7 2018-01-01 09:10:00   31.20              1              10.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...