Advertisement
Vitaliy_Novichikhin

Анализ БП Задача 9.2 как сделать?

Jul 26th, 2022
5,388
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.80 KB | None | 0 0
  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, sessions, observation_date, horizon_days, ignore_horizon=False
  9. ):
  10.  
  11.     # исключаем пользователей, не «доживших» до горизонта анализа
  12.     last_suitable_acquisition_date = observation_date
  13.     if not ignore_horizon:
  14.         last_suitable_acquisition_date = observation_date - timedelta(
  15.             days=horizon_days - 1
  16.         )
  17.     result_raw = profiles.query('dt <= @last_suitable_acquisition_date')
  18.  
  19.     # собираем «сырые» данные для расчёта удержания
  20.     result_raw = result_raw.merge(
  21.         sessions[['user_id', 'session_start']], on='user_id', how='left'
  22.     )
  23.     result_raw['lifetime'] = (
  24.         result_raw['session_start'] - result_raw['first_ts']
  25.     ).dt.days
  26.  
  27.     # рассчитываем удержание
  28.     result_grouped = result_raw.pivot_table(
  29.         index=['dt'], columns='lifetime', values='user_id', aggfunc='nunique'
  30.     )
  31.     cohort_sizes = (
  32.         result_raw.groupby('dt')
  33.         .agg({'user_id': 'nunique'})
  34.         .rename(columns={'user_id': 'cohort_size'})
  35.     )
  36.     result_grouped = cohort_sizes.merge(
  37.         result_grouped, on='dt', how='left'
  38.     ).fillna(0)
  39.     result_grouped = result_grouped.div(result_grouped['cohort_size'], axis=0)
  40.  
  41.     # исключаем все лайфтаймы, превышающие горизонт анализа
  42.     result_grouped = result_grouped[
  43.         ['cohort_size'] + list(range(horizon_days))
  44.     ]
  45.  
  46.     # восстанавливаем столбец с размерами когорт
  47.     result_grouped['cohort_size'] = cohort_sizes
  48.  
  49.     # возвращаем таблицу удержания и сырые данные
  50.     return result_raw, result_grouped
  51.  
  52.  
  53. users = pd.read_csv('ch02_problems01_users.csv')  # профили
  54. visits = pd.read_csv('ch02_problems01_visits.csv')  # сессии
  55.  
  56. # преобразование данных о времени
  57. users['dt'] = pd.to_datetime(users['dt']).dt.date
  58. users['first_ts'] = pd.to_datetime(users['first_ts'])
  59. visits['session_start'] = pd.to_datetime(visits['session_start'])
  60.  
  61. # доступный интервал привлечения пользователей
  62. min_analysis_date = users['dt'].min()
  63. observation_date = users['dt'].max()  # момент анализа
  64.  
  65. # горизонт анализа
  66. analysis_horizon = 14
  67.  
  68. retention_raw, retention = get_retention(
  69.     users, visits, observation_date, analysis_horizon
  70. )
  71. # ЛИЧНЫЙ КОД НАЧАЛО
  72. report.T.plot(
  73.     grid=True,  # добавляем сетку
  74.     xticks=list(report.columns.values),  # отметки на оси X — названия колонок
  75.     figsize=(15, 5),  # размер графика
  76. )
  77. plt.xlabel('Лайфтайм')  # название оси X
  78. plt.title('Кривые удержания по дням привлечения')  # название графика
  79. plt.show()
  80. #ЛИЧНЫЙ КОД ОКОНЧАНИЕ, подсказка от практикума с 81 строки
  81. # постройте график истории изменений для 7-го и 14-го дней
  82. # добавьте на график сетку, задав параметр grid
  83. # установите размер графика 15 на 5, задав параметр figsize
  84.  
  85. plt.title('Динамика удержания пользователей на первую и вторую недели «жизни»')
  86. plt.xlabel('Дата привлечения')
  87. plt.xticks(rotation = 45)
  88. plt.ylabel('Доля удержанных пользователей')
  89. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement