Платформа покупок користувачів: Leetcode Pandas складний

pic

Вид з банкету на Міжнародній виставці в Нью-Йорку. Фото: 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)

pic

Крок 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)

pic

Крок 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)

pic

Крок 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)

pic

Крок 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)

pic

Щасливого навчання! Слідкуйте за мною: LinkedIn Instagram Профіль на Medium або підписуйтесь на мою email-розсилку для останніх блогів, та натискайте на кнопку аплодисментів для підтримки написаного. Не соромтесь ставити питання у коментарях. І не забувайте поділитись посиланням на блог з друзями або контактами у LinkedIn.

Перекладено з: User Purchase Platform: Leetcode Pandas Hard

Leave a Reply

Your email address will not be published. Required fields are marked *