Re: Re: Re: Re: Re: Untitled

From Sweet Motmot, 3 Months ago, written in Plain Text, viewed 86 times. This paste is a reply to Re: Re: Re: Re: Untitled from Sole Agouti - view diff
URL http://codebin.org/view/df72386f 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, 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. report = retention[6,13]
  72. report.T.plot(# постройте график истории изменений для 7-го и 14-го дней
  73. grid=True,# добавьте на график сетку, задав параметр grid
  74. figsize=(15, 5) )# установите размер графика 15 на 5, задав параметр figsize
  75.  
  76. plt.title('Динамика удержания пользователей на первую и вторую недели «жизни»')
  77. plt.xlabel('Дата привлечения')
  78. plt.xticks(rotation = 45)
  79. plt.ylabel('Доля удержанных пользователей')
  80. plt.show()

Replies to Re: Re: Re: Re: Re: Untitled rss

Title Name Language When
Re: Re: Re: Re: Re: Re: Untitled Bulky Crow text 3 Months ago.
Re: Re: Re: Re: Re: Re: Untitled Sludgy Monkey text 3 Months ago.

Reply to "Re: Re: Re: Re: Re: Untitled"

Here you can reply to the paste above