Помесячная статистика транзакций по стране с условной агрегацией
transactions(id, country, state, amount, trans_date), где state — 'approved' или 'declined'. Для каждой пары (месяц, страна) верните четыре столбца: trans_count (все), approved_count, trans_total_amount (все), approved_total_amount. Месяц — это YYYY-MM из trans_date.
import pandas as pd
def monthly_transactions(transactions: pd.DataFrame) -> pd.DataFrame:
# ваш код здесь
Напишите реализацию.
Строят ключ месяца и вспомогательные столбцы для approved, затем группируют. Задают month = trans_date.dt.strftime('%Y-%m'), добавляют is_approved = (state == 'approved') и approved_amount = amount.where(state == 'approved', 0).
- ✗Удалять declined-строки, ломая итоги по всем транзакциям
- ✗Считать approved-показатели равными итогам
- ✗Группировать по неверным измерениям
- →Зачем amount.where(...) вместо фильтрации фрейма?
- →Как добавить declined_count без второго прохода?
Compute the approved figures with helper columns so all four aggregates come from one grouping over every row.
import pandas as pd
def monthly_transactions(transactions: pd.DataFrame) -> pd.DataFrame:
t = transactions.copy()
t['month'] = t['trans_date'].dt.strftime('%Y-%m')
t['is_approved'] = (t['state'] == 'approved').astype(int)
t['approved_amount'] = t['amount'].where(t['state'] == 'approved', 0)
return (t.groupby(['month', 'country'])
.agg(trans_count=('id', 'count'),
approved_count=('is_approved', 'sum'),
trans_total_amount=('amount', 'sum'),
approved_total_amount=('approved_amount', 'sum'))
.reset_index())
Filtering to approved rows first would lose the all-transactions counts and amounts. Keeping every row and using where / a 0/1 flag lets a single grouping produce both the totals and the approved-only figures.