Помесячная выручка по странам, считая только оплаченные заказы
В df столбцы country, order_ts, amount, status. Посчитайте помесячную выручку по странам, суммируя amount только для строк со status == 'paid' — одним groupby, без предварительной фильтрации фрейма.
import pandas as pd
def monthly_paid_revenue(df: pd.DataFrame) -> pd.DataFrame:
# ваш код здесь
Напишите реализацию.
Обнуляют неоплаченное через where, затем один groupby. Строят paid = df['amount'].where(df['status'].eq('paid'), 0), берут месяц из order_ts и суммируют: df.assign(paid=paid, m=df['order_ts'].dt.to_period('M')).groupby(['country','m'])['paid'].sum(). where хранит все строки, покрывая все месяцы.
- ✗Фильтровать оплаченные строки, из-за чего месяцы без оплат исчезают из вывода
- ✗Забыть вывести период месяца из order_ts перед группировкой
- ✗Считать строки вместо суммирования столбца amount
- →Как оставить в результате месяцы с нулевой оплаченной выручкой?
- →Чем маскирование через where лучше фильтрации строк до groupby?
Превращают условие в маскированный столбец, затем одна групповая сумма. where заменяет неоплаченные суммы на 0, но сохраняет каждую строку — ни один месяц не пропадёт.
import pandas as pd
def monthly_paid_revenue(df: pd.DataFrame) -> pd.DataFrame:
paid = df['amount'].where(df['status'].eq('paid'), 0)
m = df['order_ts'].dt.to_period('M')
return (df.assign(paid=paid, m=m)
.groupby(['country', 'm'])['paid']
.sum()
.reset_index(name='revenue'))
Предфильтр df[df.status == 'paid'] даёт те же числа, но теряет любую пару страна-месяц с нулём оплат — маскирование оставляет такие строки в 0.