Untitled

From Burly Macaw, 2 Months ago, written in Plain Text, viewed 74 times.
URL http://codebin.org/view/b1023c9b Embed
Download Paste or View Raw
  1. # функция для визуализации удержания
  2.  
  3. def plot_retention(retention, retention_history, horizon, window=7):
  4.  
  5.     # задаём размер сетки для графиков
  6.     plt.figure(figsize=(15, 10))
  7.  
  8.     # исключаем размеры когорт и удержание первого дня
  9.     retention = retention.drop(columns=['cohort_size', 0])
  10.     # в таблице динамики оставляем только нужный лайфтайм
  11.     retention_history = retention_history.drop(columns=['cohort_size'])[
  12.         [horizon - 1]
  13.     ]
  14.  
  15.     # если в индексах таблицы удержания только payer,
  16.     # добавляем второй признак — cohort
  17.     if retention.index.nlevels == 1:
  18.         retention['cohort'] = 'All users'
  19.         retention = retention.reset_index().set_index(['cohort', 'payer'])
  20.  
  21.     # в таблице графиков — два столбца и две строки, четыре ячейки
  22.     # в первой строим кривые удержания платящих пользователей
  23.     ax1 = plt.subplot(2, 2, 1)
  24.     retention.query('payer == True').droplevel('payer').T.plot(
  25.         grid=True, ax=ax1
  26.     )
  27.     plt.legend()
  28.     plt.xlabel('Лайфтайм')
  29.     plt.title('Удержание платящих пользователей')
  30.  
  31.     # во второй ячейке строим кривые удержания неплатящих
  32.     # вертикальная ось — от графика из первой ячейки
  33.     ax2 = plt.subplot(2, 2, 2, sharey=ax1)
  34.     retention.query('payer == False').droplevel('payer').T.plot(
  35.         grid=True, ax=ax2
  36.     )
  37.     plt.legend()
  38.     plt.xlabel('Лайфтайм')
  39.     plt.title('Удержание неплатящих пользователей')
  40.  
  41.     # в третьей ячейке — динамика удержания платящих
  42.     ax3 = plt.subplot(2, 2, 3)
  43.     # получаем названия столбцов для сводной таблицы
  44.     columns = [
  45.         name
  46.         for name in retention_history.index.names
  47.         if name not in ['dt', 'payer']
  48.     ]
  49.     # фильтруем данные и строим график
  50.     filtered_data = retention_history.query('payer == True').pivot_table(
  51.         index='dt', columns=columns, values=horizon - 1, aggfunc='mean'
  52.     )
  53.     filter_data(filtered_data, window).plot(grid=True, ax=ax3)
  54.     plt.xlabel('Дата привлечения')
  55.     plt.title(
  56.         'Динамика удержания платящих пользователей на {}-й день'.format(
  57.             horizon
  58.         )
  59.     )
  60.  
  61.     # в чётвертой ячейке — динамика удержания неплатящих
  62.     ax4 = plt.subplot(2, 2, 4, sharey=ax3)
  63.     # фильтруем данные и строим график
  64.     filtered_data = retention_history.query('payer == False').pivot_table(
  65.         index='dt', columns=columns, values=horizon - 1, aggfunc='mean'
  66.     )
  67.     filter_data(filtered_data, window).plot(grid=True, ax=ax4)
  68.     plt.xlabel('Дата привлечения')
  69.     plt.title(
  70.         'Динамика удержания неплатящих пользователей на {}-й день'.format(
  71.             horizon
  72.         )
  73.     )
  74.    
  75.     plt.tight_layout()
  76.     plt.show()

Reply to "Untitled"

Here you can reply to the paste above