рассчитать рост месячных продаж по стране в процентах по данному датафрейму

Прошу помощи с решением интересной задачи, к которой мне не удается найти решение. Если кратко переходить к сути, то задача следующая:

  • Некое предприятие продает товары покупающим из различных стран. Выяснить, в какой из них был самый большой процентный рост месячных продаж. Выяснить, сколько процентов составляет данный рост. В расчет следует брать именно те страны, в которых были ненулевые продажи в обоих этих месяцах.

Датафрейм выглядит соответственно: ( берутся два месяца - 9 и 3 месяца 2011 года )

InvoiceNo StockCode Quantity InvoiceDate UnitPrice CustomerID Country Price Year Month
536365 85123A 6 2010-12-01 08:26:00 2.55 17850 United Kingdom 15.30 2011 9
536365 71053 6 2010-12-01 08:26:00 3.39 17850 United Kingdom 20.34 2011 9
581587 23254 4 2011-12-09 12:50:00 4.15 12860 France 16.60 2011 9
... ... ... ... ... ... ... ... ... ...
581587 23255 4 2011-12-09 12:50:00 4.15 12860 France 16.60 2011 3
581587 22138 3 2011-12-09 12:50:00 4.95 12860 France 14.85 2011 3
581588 22380 9 2011-12-09 12:52:00 2.10 12594 Italy 18.90 2011 3
581588 22381 9 2011-12-09 12:52:00 2.10 12594 Italy 18.90 2011 3

Примерное решение данной задачи в моей голове примерно такое - по каждой из стран рассчитать количество покупок в одном из каждых месяцев и затем просчитать, насколько за эти месяца увеличилось или уменьшилось количество покупок, т.е. измерить в процентах. ( к примеру, в 3 месяце в стране Norway было совершено 10 покупок, а в 9 месяце уже 100, прирост составил 400 и так посчитать к каждой стране и вывести страну с самым большим приростом )

Возможно, мое решение к данной задаче неверно, и так же я не знаю как превратить это решение в код, поэтому я прошу вашей помощи с решением данной задачи.

мой код к задаче неверен:

months_march = purchases.loc[(purchases['Year'] == 2011) & (purchases['Month'] == 3)]
months_september = purchases.loc[(purchases['Year'] == 2011) & (purchases['Month'] == 9)]
months = months_september.append(months_march)
months['Percent'] = months['Price'].pct_change().mul(100).round(0).map(lambda x: '{0:g}'.format(x) if x==x else x)
first = months.sort_values('Percent', ascending=False)[['Country', 'Percent']]
first = first.values.tolist()
first[0]

как ответ, должно получиться что то в роде этого:

Norway, 586

датафрейм выглядит вот так


Ответы (1 шт):

Автор решения: SergFSM

попробуйте примерно так (это решение не тестировалось):

(df.groupby(['Country','Year','Month'])
     .agg({'Price':'sum'})
     .reset_index()
     .groupby(['Country','Year'])
     .apply(
         lambda x: x['Price']
         .pct_change()
         .mul(100)
         .round()
         .max()
     ).sort_values(ascending=False)
     .head(1))
→ Ссылка