Untitled

From Obese Plover, 2 Months ago, written in Plain Text, viewed 47 times.
URL http://codebin.org/view/5b115f9e Embed
Download Paste or View Raw
  1. # функция для расчёта удержания
  2.  
  3. def get_retention(
  4.     profiles,
  5.     sessions,
  6.     observation_date,
  7.     horizon_days,
  8.     dimensions=[],
  9.     ignore_horizon=False,
  10. ):
  11.  
  12.     # добавляем столбец payer в передаваемый dimensions список
  13.     dimensions = ['payer'] + dimensions
  14.  
  15.     # исключаем пользователей, не «доживших» до горизонта анализа
  16.     last_suitable_acquisition_date = observation_date
  17.     if not ignore_horizon:
  18.         last_suitable_acquisition_date = observation_date - timedelta(
  19.             days=horizon_days - 1
  20.         )
  21.     result_raw = profiles.query('dt <= @last_suitable_acquisition_date')
  22.  
  23.     # собираем «сырые» данные для расчёта удержания
  24.     result_raw = result_raw.merge(
  25.         sessions[['user_id', 'session_start']], on='user_id', how='left'
  26.     )
  27.     result_raw['lifetime'] = (
  28.         result_raw['session_start'] - result_raw['first_ts']
  29.     ).dt.days
  30.  
  31.     # функция для группировки таблицы по желаемым признакам
  32.     def group_by_dimensions(df, dims, horizon_days):
  33.         result = df.pivot_table(
  34.             index=dims, columns='lifetime', values='user_id', aggfunc='nunique'
  35.         )
  36.         cohort_sizes = (
  37.             df.groupby(dims)
  38.             .agg({'user_id': 'nunique'})
  39.             .rename(columns={'user_id': 'cohort_size'})
  40.         )
  41.         result = cohort_sizes.merge(result, on=dims, how='left').fillna(0)
  42.         result = result.div(result['cohort_size'], axis=0)
  43.         result = result[['cohort_size'] + list(range(horizon_days))]
  44.         result['cohort_size'] = cohort_sizes
  45.         return result
  46.  
  47.     # получаем таблицу удержания
  48.     result_grouped = group_by_dimensions(result_raw, dimensions, horizon_days)
  49.  
  50.     # получаем таблицу динамики удержания
  51.     result_in_time = group_by_dimensions(
  52.         result_raw, dimensions + ['dt'], horizon_days
  53.     )
  54.  
  55.     # возвращаем обе таблицы и сырые данные
  56.     return result_raw, result_grouped, result_in_time

Reply to "Untitled"

Here you can reply to the paste above