- def get_profiles(sessions, orders, ad_costs):
- # Шаг 1. Передадим в функцию расчета профиля данные о рекламных затратах (фрейм ad_costs)
- # сортируем сессии по id пользователя и дате для того,чтобы работал first
- # находим первые значения для параметров пользователя - будем считать их основными
- profiles = (sessions.sort_values(by = ['user_id', 'session_start'])
- .groupby('user_id').agg({'session_start' : 'first',
- 'channel': 'first',
- 'device': 'first',
- 'region': 'first'})
- .rename(columns = {'session_start' : 'first_ts'})
- .reset_index() # вернем все данные из индекса в колонки
- )
- # определим дату первого посещеня
- # и начало месяца первого посещения - они понадобятся нам при когортном анализе
- profiles['dt'] = profiles['first_ts'].dt.date
- profiles['month'] = profiles['first_ts'].astype('datetime64[M]')
- # добавляем признак платящих пользователей
- profiles['payer'] = profiles['user_id'].isin(orders['user_id'].unique())
- # Шаг 2. К данным о рекламных затратах добавим количества привлеченных пользователей
- new_users = profiles.groupby(['dt', 'channel']).agg({'user_id': 'nunique'}).rename(columns = {'user_id': 'unique_users'}).reset_index()
- ad_costs = ad_costs.merge(new_users, on = ['dt', 'channel'], how = 'left')
- # Шаг 3. Найдем среднюю стоимость привлечения пользователя
- ad_costs['acquisition_cost'] = ad_costs['costs'] / ad_costs['unique_users']
- # Шаг 4. Присоединим данные к профилям пользователей информацию о средней стоимости привлечения в день привлечения пользователя из нужного источника
- profiles = profiles.merge(ad_costs[['dt', 'channel', 'acquisition_cost']], on = ['dt', 'channel'], how = 'left')
- profiles['acquisition_cost'] = profiles['acquisition_cost'].fillna(0) # органические пользователи будут стоить 0
- return profiles