Untitled

From Sludgy Pintail, 2 Months ago, written in Plain Text, viewed 56 times.
URL http://codebin.org/view/0c000da6 Embed
Download Paste or View Raw
  1.  
  2. # функция для расчёта конверсии
  3.  
  4. def get_conversion(
  5.     profiles,
  6.     purchases,
  7.     observation_date,
  8.     horizon_days,
  9.     dimensions=[],
  10.     ignore_horizon=False,
  11. ):
  12.  
  13.     # исключаем пользователей, не «доживших» до горизонта анализа
  14.     last_suitable_acquisition_date = observation_date
  15.     if not ignore_horizon:
  16.         last_suitable_acquisition_date = observation_date - timedelta(
  17.             days=horizon_days - 1
  18.         )
  19.     result_raw = profiles.query('dt <= @last_suitable_acquisition_date')
  20.  
  21.     # определяем дату и время первой покупки для каждого пользователя
  22.     first_purchases = (
  23.         purchases.sort_values(by=['user_id', 'event_dt'])
  24.         .groupby('user_id')
  25.         .agg({'event_dt': 'first'})
  26.         .reset_index()
  27.     )
  28.  
  29.     # добавляем данные о покупках в профили
  30.     result_raw = result_raw.merge(
  31.         first_purchases[['user_id', 'event_dt']], on='user_id', how='left'
  32.     )
  33.  
  34.     # рассчитываем лайфтайм для каждой покупки
  35.     result_raw['lifetime'] = (
  36.         result_raw['event_dt'] - result_raw['first_ts']
  37.     ).dt.days
  38.  
  39.     # группируем по cohort, если в dimensions ничего нет
  40.     if len(dimensions) == 0:
  41.         result_raw['cohort'] = 'All users'
  42.         dimensions = dimensions + ['cohort']
  43.  
  44.     # функция для группировки таблицы по желаемым признакам
  45.     def group_by_dimensions(df, dims, horizon_days):
  46.         result = df.pivot_table(
  47.             index=dims, columns='lifetime', values='user_id', aggfunc='nunique'
  48.         )
  49.         result = result.fillna(0).cumsum(axis = 1)
  50.         cohort_sizes = (
  51.             df.groupby(dims)
  52.             .agg({'user_id': 'nunique'})
  53.             .rename(columns={'user_id': 'cohort_size'})
  54.         )
  55.         result = cohort_sizes.merge(result, on=dims, how='left').fillna(0)
  56.         # делим каждую «ячейку» в строке на размер когорты
  57.         # и получаем conversion rate
  58.         result = result.div(result['cohort_size'], axis=0)
  59.         result = result[['cohort_size'] + list(range(horizon_days))]
  60.         result['cohort_size'] = cohort_sizes
  61.         return result
  62.  
  63.     # получаем таблицу конверсии
  64.     result_grouped = group_by_dimensions(result_raw, dimensions, horizon_days)
  65.  
  66.     # для таблицы динамики конверсии убираем 'cohort' из dimensions
  67.     if 'cohort' in dimensions:
  68.         dimensions = []
  69.  
  70.     # получаем таблицу динамики конверсии
  71.     result_in_time = group_by_dimensions(
  72.         result_raw, dimensions + ['dt'], horizon_days
  73.     )
  74.  
  75.     # возвращаем обе таблицы и сырые данные
  76.     return result_raw, result_grouped, result_in_time

Reply to "Untitled"

Here you can reply to the paste above