Объединить панды данных на основе диапазона дат и соответствия значений - PullRequest
0 голосов
/ 18 июня 2019

Я хочу автоматизировать сверку банковских операций. Есть 2 таблицы, банковская таблица и системная таблица, в результате чего транзакции в системной таблице задерживаются на несколько дней. Таблицы различаются по длине и не имеют соответствия 1: 1 для транзакций.

Проблема состоит в том, чтобы найти последовательный метод для идентификации и группировки согласованных и несогласованных транзакций в обоих направлениях. Первая проблема, с которой я столкнулся, состоит в объединении / объединении таблиц на основе диапазона дат и суммы. Pandas.merge_asof подходит для присоединения на основе диапазона дат, но оно ограничено 1 столбцовым объединением.

См. Примеры таблиц ниже:

bankdf = pd.DataFrame({'BankDate': pd.date_range('2018-12-28', periods=10, freq='3D'), 'Amount': np.array([140,107,132,188,75,152,88,159,132,107])})
systemdf = pd.DataFrame({'SystemCreditDate': pd.date_range('2019-01-04', periods=9, freq='3D'), 'Amount': np.array([107,132,190,75,152,88,110,132,132])})

bankdf
Out[119]: 
   Amount   BankDate
0     140 2018-12-28
1     107 2018-12-31
2     132 2019-01-03
3     188 2019-01-06
4      75 2019-01-09
5     152 2019-01-12
6      88 2019-01-15
7     159 2019-01-18
8     132 2019-01-21
9     107 2019-01-24

systemdf
Out[120]: 
   Amount SystemCreditDate
0     107       2019-01-04
1     132       2019-01-07
2     190       2019-01-10
3      75       2019-01-13
4     152       2019-01-16
5      88       2019-01-19
6     110       2019-01-22
7     132       2019-01-25
8     132       2019-01-28

2 таблицы необходимо объединить в зависимости от того, где «Сумма» соответствует И разность дат составляет менее 6 дней (SystemCreditDate - BankDate) <6). </p>

Окончательный результат должен выглядеть примерно так:

   Amount   BankDate SystemCreditDate
1     107 2018-12-31 2019-01-04
2     132 2019-01-03 2019-01-07
3      75 2019-01-09 2019-01-13
4     152 2019-01-12 2019-01-16
5      88 2019-01-15 2019-01-19
6     132 2019-01-21 2019-01-25

1 Ответ

0 голосов
/ 18 июня 2019

Используйте DataFrame.merge и удалите строки, которые не соответствуют правилу:

df = bankdf.merge(systemdf)
mask = (df['SystemCreditDate']-df['BankDate']).abs().dt.days<6
df = df.loc[mask, :]

print(df)

     BankDate  Amount SystemCreditDate
0  2018-12-31     107       2019-01-04
2  2019-01-03     132       2019-01-07
6  2019-01-21     132       2019-01-25
8  2019-01-09      75       2019-01-13
9  2019-01-12     152       2019-01-16
10 2019-01-15      88       2019-01-19

ИЛИ, чтобы удалить отрицательные дни:

df = bankdf.merge(systemdf)
mask = (df['SystemCreditDate']-df['BankDate']).dt.days
mask = mask.le(6) & ~mask.lt(0)
df = df.loc[mask, :]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...