Вид з банкету на Міжнародній виставці в Нью-Йорку. Фото: Tasnim та Kawsar
Таблиця: Spending
+-------------+---------+
| Назва колонки | Тип |
+-------------+---------+
| user_id | int |
| spend_date | date |
| platform | str |
| amount | int |
+-------------+---------+
Ця таблиця фіксує історію витрат користувачів, які здійснюють покупки на
онлайн-магазині, що має десктопну та мобільну версії.
( user_id, spend_date, platform ) — це первинний ключ (комбінація колонок
з унікальними значеннями) цієї таблиці.
Колонка platform має тип str (категорія) з можливими значеннями ('desktop', 'mobile').
Напишіть рішення для знаходження загальної кількості користувачів і загальної суми витрат для мобільних лише, десктопних лише та для обох платформ разом, для кожної дати. Поверніть результат у будь-якому порядку. Формат результату — як в прикладі нижче.
Приклад 1:
Вхідні дані:
Таблиця Spending:
+---------+------------+----------+--------+
| user_id | spend_date | platform | amount |
+---------+------------+----------+--------+
| 1 | 2019-07-01 | mobile | 100 |
| 1 | 2019-07-01 | desktop | 100 |
| 2 | 2019-07-01 | mobile | 100 |
| 2 | 2019-07-02 | mobile | 100 |
| 3 | 2019-07-01 | desktop | 100 |
| 3 | 2019-07-02 | desktop | 100 |
+---------+------------+----------+--------+
Вихід:
+------------+----------+--------------+-------------+
| spend_date | platform | total_amount | total_users |
+------------+----------+--------------+-------------+
| 2019-07-01 | desktop | 100 | 1 |
| 2019-07-01 | mobile | 100 | 1 |
| 2019-07-01 | both | 200 | 1 |
| 2019-07-02 | desktop | 100 | 1 |
| 2019-07-02 | mobile | 100 | 1 |
| 2019-07-02 | both | 0 | 0 |
+------------+----------+--------------+-------------+
Пояснення:
1 липня 2019 року, користувач 1 зробив покупку за допомогою і мобільного, і десктопу,
користувач 2 купував лише через мобільний, а користувач 3 — тільки через десктоп.
![pic](https://drive.javascript.org.ua/6c06a36cdc1_AKEQpHfAJZddzRD7sFI7VA_png)
_Вид з банкету на Міжнародній виставці в Нью-Йорку. Фото: Tasnim та Kawsar_
Крок 1: Групуємо за spenddate та userid для агрегування платформ і сум
df = spending.groupby(['spend_date', 'user_id']).agg({
'platform': lambda x: set(x),
'amount': 'sum'
}).reset_index()
display(df)
Крок 2: Категоризуємо кожного користувача залежно від використаних платформ
def categorize_platform(platforms):
if platforms == {'mobile'}:
return 'mobile'
elif platforms == {'desktop'}:
return 'desktop'
elif platforms == {'mobile', 'desktop'}:
return 'both'
else:
return 'other' # Для будь-яких непередбачуваних випадків
df['platform'] = df['platform'].apply(categorize_platform)
display(df)
Крок 3: Агрегуємо totalamount і totalusers для кожного spenddate і platformcategory
df = df.groupby(['spend_date', 'platform']).agg(
total_amount=('amount', 'sum'),
total_users=('user_id', 'nunique')
).reset_index()
display(df)
Крок 4: Переконуємось, що всі комбінації spend_date та платформ присутні
# Визначаємо всі можливі категорії
categories = ['mobile', 'desktop', 'both']
# Створюємо датафрейм з усіма комбінаціями spend_date та platform
all_combinations = pd.MultiIndex.from_product(
[spending['spend_date'].unique(), categories],
names=['spend_date', 'platform']
).to_frame(index=False)
display(all_combinations)
Крок 5: Об’єднуємо з df, щоб додати відсутні комбінації з дефолтними значеннями
df = all_combinations.merge(
df,
on=['spend_date', 'platform'],
how='left'
).fillna({'total_amount': 0, 'total_users': 0})
# Перетворюємо total_amount і total_users на тип integer
df['total_amount'] = df['total_amount'].astype(int)
df['total_users'] = df['total_users'].astype(int)
# Необов'язково: сортуємо для кращої зручності
df = df.sort_values(by=['spend_date', 'platform']).reset_index(drop=True)
# Показуємо фінальний результат
display(df)
Щасливого навчання! Слідкуйте за мною: LinkedIn Instagram Профіль на Medium або підписуйтесь на мою email-розсилку для останніх блогів, та натискайте на кнопку аплодисментів для підтримки написаного. Не соромтесь ставити питання у коментарях. І не забувайте поділитись посиланням на блог з друзями або контактами у LinkedIn.
Перекладено з: User Purchase Platform: Leetcode Pandas Hard