Untitled

From Anorexic Camel, 11 Months ago, written in Plain Text, viewed 504 times.
URL http://codebin.org/view/f04bbe91 Embed
Download Paste or View Raw
  1. import pandas as pd
  2. from datetime import datetime, timedelta
  3. import seaborn as sns
  4. from matplotlib import pyplot as plt
  5.  
  6.  
  7. def get_retention(
  8.     profiles,
  9.     sessions,
  10.     observation_date,
  11.     horizon_days,
  12.     dimensions=[],
  13.     ignore_horizon=False,
  14. ):
  15.  
  16.     # добавляем столбец payer в передаваемый dimensions список
  17.     dimensions = ['payer'] + dimensions
  18.  
  19.     # исключаем пользователей, не «доживших» до горизонта анализа
  20.     last_suitable_acquisition_date = observation_date
  21.     if not ignore_horizon:
  22.         last_suitable_acquisition_date = observation_date - timedelta(
  23.             days=horizon_days - 1
  24.         )
  25.     result_raw = profiles.query('dt <= @last_suitable_acquisition_date')
  26.  
  27.     # собираем «сырые» данные для расчёта удержания
  28.     result_raw = result_raw.merge(
  29.         sessions[['user_id', 'session_start']], on='user_id', how='left'
  30.     )
  31.     result_raw['lifetime'] = (
  32.         result_raw['session_start'] - result_raw['first_ts']
  33.     ).dt.days
  34.  
  35.     # рассчитываем удержание
  36.     result_grouped = result_raw.pivot_table(
  37.         index=dimensions,
  38.         columns='lifetime',
  39.         values='user_id',
  40.         aggfunc='nunique',
  41.     )
  42.     cohort_sizes = (
  43.         result_raw.groupby(dimensions)
  44.         .agg({'user_id': 'nunique'})
  45.         .rename(columns={'user_id': 'cohort_size'})
  46.     )
  47.     result_grouped = cohort_sizes.merge(
  48.         result_grouped, on=dimensions, how='left'
  49.     ).fillna(0)
  50.     result_grouped = result_grouped.div(result_grouped['cohort_size'], axis=0)
  51.  
  52.     # исключаем все лайфтаймы, превышающие горизонт анализа
  53.     result_grouped = result_grouped[
  54.         ['cohort_size'] + list(range(horizon_days))
  55.     ]
  56.  
  57.     # восстанавливаем столбец с размерами когорт
  58.     result_grouped['cohort_size'] = cohort_sizes
  59.  
  60.     # возвращаем таблицу удержания и сырые данные
  61.     return result_raw, result_grouped
  62.  
  63.  
  64. # загружаем данные
  65. users = pd.read_csv('ch02_problems02_users.csv')  # профили
  66. visits = pd.read_csv('ch02_problems02_visits.csv')  # журнал сессий
  67.  
  68. # преобразование данных о времени
  69. users['dt'] = pd.to_datetime(users['dt']).dt.date
  70. users['first_ts'] = pd.to_datetime(users['first_ts'])
  71. visits['session_start'] = pd.to_datetime(visits['session_start'])
  72.  
  73. observation_date = users['dt'].max()  # момент анализа
  74.  
  75. # задайте горизонт анализа
  76. analysis_horizon = 14
  77. # получите сырые данные и таблицу удержания
  78.  
  79.  
  80. retention_raw, retention = get_retention(
  81.     users, visits, observation_date, analysis_horizon, dimensions=['channel'] )
  82. # исключите размеры когорт и удержание первого дня
  83. report = retention.drop(columns=['cohort_size', 0])
  84. report.T.plot(grid=True, xticks=list(report.columns.values))
  85.  
  86.  
  87. # постройте кривые удержания
  88. plt.xlabel('Лайфтайм')
  89. plt.title('Кривые удержания с разбивкой по совершению покупок')
  90. plt.show()

Reply to "Untitled"

Here you can reply to the paste above