рассчитать показатель отказов по дням - PullRequest
0 голосов
/ 07 июня 2018

Это кажется очень простой задачей, но я боролся с ней некоторое время.

Я хочу рассчитать (количество сессий с PageView == 1) / (общее количество сессий)в день, выборочные данные ниже

session_df

Date/Timestamp  Session ID  PageViews
2/14/2016          a           1
2/14/2016          b           5
2/14/2016          c           8
3/23/2016          d           1
3/23/2016          e           1
3/23/2016          f           2

и ожидаемый результат:

Date/Timestamp  BounceRate
2/14/2016       0.333333333
3/23/2016       0.666666667

Сначала я попытался добавить столбец Bounced? на основеЧисло просмотров страниц, затем группировка и вычисление процента, затем мне нужно отфильтровать bounced?==False, что очень громоздко.Если кто-нибудь может предложить лучший способ сделать это, было бы здорово!

sessions_df['Bounced?'] = sessions_df['PageViews']>1
dt = pd.DatetimeIndex(sessions_df['Date/Timestamp'])
daily_session_bounce_rate = sessions_df.groupby([dt.date, 'Bounced?']).agg({'Session ID':'count'})

daily_session_bounce_rate = daily_session_bounce_rate.groupby(level=0).apply(lambda x: x / float(x.sum()))
daily_session_bounce_rate
# this is my output
           Bounced? Session ID
2016-01-01  False   0.459893
            True    0.540107


#filter data
daily_session_bounce_rate.loc[daily_session_bounce_rate['Bounced?']==True,['level_0','Session ID']]

Ответы [ 4 ]

0 голосов
/ 07 июня 2018
sessions_df['bounced?'] = sessions_df['PageViews']==1
daily_session_bounce_rate = sessions_df.groupby('Date/Timestamp').mean()['bounced?']

Первая строка создает столбец в зависимости от того, равен ли PageViews 1. Это противоположно тому, как вы это сделали;у вас было bounced? be True, когда PageViews больше 1 ... что, если я правильно понимаю ваше использование "отказов", является случаем, когда пользователь не отказов.

Вторая строка группируется по Date/Timestamp, а затем принимает среднее значение.Всякий раз, когда вы делаете математику с такими логическими значениями, как Python, они приводят их как int, поэтому каждый раз, когда кто-то отскакивает, это True / 1, а когда нет, это False / 0.Таким образом, сумма значений логических значений как int совпадает со значением True.Когда вы говорите пандам взять среднее значение для серии логических значений, оно берет сумму / количество истинных и делит их на общее количество значений, что совпадает с вычислением процента случаев, когда у вас есть истинное значение.

Таким образом, группировка по дате и взятие среднего значения дает вам фрейм данных, где строки - это даты, а столбцы - это средства для этой даты.Результирующий кадр данных имеет столбец для каждого столбца исходного кадра данных (в этом случае у вас есть столбец, состоящий из среднего значения PageViews для каждой даты и столбца среднего значения bounced? для каждой даты).Если вам нужен только процент отказов, вы можете задать для фрейма данных значение ['bounced?']

0 голосов
/ 07 июня 2018

Вам нужно:

grp = session_df.groupby(session_df['Date/Timestamp'].dt.day)['Session_ID'].count()
session_1 = session_df.loc[session_df['PageViews']==1].groupby(session_df['Date/Timestamp'].dt.day)['Session_ID'].count()
pd.DataFrame({'bouncerate':list(session_1/grp)}, index=session_df['Date/Timestamp'].unique())

Вывод:

           bouncerate
2016-02-14  0.333333
2016-03-23  0.666667
0 голосов
/ 07 июня 2018

Вам не нужно определять отдельный столбец Bounced?.Возьмите count сгруппированных строк, где PageViews==1, и разделите на число всех строк на эту дату, чтобы получить дробь

daily_session_bounce_rate = \
    df[df['PageViews']==1].groupby('Date/Timestamp').agg({'Session ID':'count'}) /\
    df.groupby('Date/Timestamp').agg({'Session ID':'count'})
0 голосов
/ 07 июня 2018

Вы можете попробовать вот так:

bouncerate = (df.loc[df['PageViews'] == 1]
              .groupby('Date/Timestamp')['Session ID'].count()
              .div(df.groupby('Date/Timestamp')['Session ID']
                   .count())
              .to_frame('Bounce Rate'))

Или:

bouncerate = (df.groupby('Date/Timestamp')
              .apply(lambda x: sum(x.PageViews == 1) / x.PageViews.count())
              .to_frame('Bounce Rate'))

Оба результата:

>>> bouncerate
                    Bounce Rate
Date/Timestamp             
2/14/2016          0.333333
3/23/2016          0.666667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...