Soluci贸n

Pandas

Vista general

Referencia del problema:

Escriba una soluci贸n para reportar la fracci贸n de jugadores que volvieron a iniciar sesi贸n el d铆a siguiente al que lo hicieron por primera vez, redondee el resultado a 2 decimales. En otras palabras, se requiere contar el n煤mero de jugadores que se conectaron durante al menos dos d铆as consecutivos a partir de la fecha de su primer inicio de sesi贸n, y a continuaci贸n, dividir ese n煤mero por el n煤mero total de jugadores.

Este problema es una extensi贸n o continuaci贸n natural de la parte II de la serie de problemas de cinco partes An谩lisis del juego. 驴Por qu茅? Porque contar el n煤mero de jugadores que iniciaron sesi贸n durante al menos dos d铆as consecutivos a partir de su primera fecha de inicio de sesi贸n implica naturalmente iniciar el proceso de resoluci贸n del problema averiguando la primera fecha de inicio de sesi贸n de cada jugador (que, debemos notar, es en realidad la soluci贸n de la parte I de esta serie de problemas).

Pero encontrar el primer inicio de sesi贸n de cada jugador es solo el inicio para resolver este problema. Necesitamos, de alguna forma, usar esta informaci贸n para determinar si el usuario se conect贸 un d铆a despu茅s de su primera conexi贸n. 隆C贸mo determinar esto es una parte crucial para este problema!.

Estrateg铆a 1: Manipulaci贸n de fechas y agregaci贸n condicional

Visualizaci贸n de este enfoque

game play analysis fig1

Intuici贸n

Analicemos el paso a paso de este enfoque usando el siguiente DataFrame como entrada:

player_id device_id event_date games_played
1 2 2016-03-01 5
1 2 2016-03-02 6
2 3 2017-06-25 1
3 1 2016-03-02 0
3 4 2018-07-03 5

Paso 1: Identificar la fecha de la primera conexi贸n

  • Objetivo: Determinar la primera fecha en que cada jugador inicio sesi贸n.
  • Intuici贸n: Agrupando la informaci贸n por player_id y obteniendo el event_date m铆nimo, determinamos la fecha de inicio de sesi贸n de cada jugador. Esto constituye nuestra l铆nea base para el seguimiento de la actividad de inicio de sesi贸n de cada jugador a lo largo del tiempo
first_login = activity.groupby('player_id')['event_date'].min().reset_index()
player_id event_date
1 2016-03-01
2 2017-06-25
3 2016-03-02

Paso 2: Calcular el d铆a antes de cada Fecha de Evento

  • Objetivo: Facilitar la identificaci贸n de conexiones consecutivas.
  • Intuici贸n: Tenga en cuenta que en la pregunta, las fechas consecutivas en realidad representan dos fechas adyacentes con una diferencia de un d铆a. Por lo tanto, creamos una columna que representa el d铆a anterior a cada event_date para ayudarnos a identificar inicios de sesion consecutivos en los pasos siguientes. Basicamente, esta columna nos permitir谩 compararla con la fecha del primer inicio de sesi贸n para ver si un jugador inici贸 sesi贸n consecutivamente. Por ejemplo, si un jugador inicio sesi贸n por primera vez el 2016-03-02 y tuvo inicios de sesi贸n consecutivos el 2016-03-03, agregar铆amos un valor de day_before_event = '2016-03-02' al segundo registro, el cual coincide con la fecha de la primera conexi贸n.
activity['day_before_event'] = activity['event_date'] - pd.to_timedelta(1, unit='D')
player_id device_id event_date games_played day_before_event
1 2 2016-03-01 5 2016-02-29
1 2 2016-03-02 6 2016-03-01
2 3 2017-06-25 1 2017-06-24
3 1 2016-03-02 0 2016-03-01
3 4 2018-07-03 5 2018-07-02

Paso 3: Fusionar los DataFrames para identificar potenciales inicios de sesi贸n consecutivos

  • Objetivo: Alinear las fechas de inicio de sesi贸n reales con las primeras fechas de inicio de sesi贸n de cada jugador.
  • Intuici贸n: Fusionamos la informaci贸n en base a su player_id para obtener un conjunto de datos combinado donde tendremos los detalles de cada inicio de sesi贸n de cada jugados con todos los otros d铆as que iniciaron sesi贸n. Esto nos prepara para directamente comparar si alguna de las fechas de inicio de sesi贸n se alinea por un d铆a con su primer inicio de sesi贸n, indicando que son inicios de sesi贸n consecutivos.
merged_df = activity.merge(first_login, on='player_id', suffixes=('_actual', '_first'))
player_id device_id event_date_actual games_played day_before_event event_date_first
1 2 2016-03-01 5 2016-02-29 2016-03-01
1 2 2016-03-02 6 2016-03-01 2016-03-01
2 3 2017-06-25 1 2017-06-24 2017-06-25
3 1 2016-03-02 0 2016-03-01 2016-03-02
3 4 2018-07-03 5 2018-07-02 2016-03-02

Paso 4: Identificar inicios de sesi贸n consecutivos

  • Objetivo: Identificar los casos exactos de inicios de sesi贸n consecutivos que ocurren un d铆a despu茅s del primer inicio de sesi贸n.
  • Intuici贸n: Al filtrar el conjunto de datos combinado para filas donde day_before_event es igual a event_date_first, identificamos los momentos precisos en los que se produjo un inicio de sesi贸n un d铆a despu茅s del primer inicio de sesi贸n, resaltando de manera efectiva los inicios de sesi贸n consecutivos.
consecutive_login = merged_df[
    merged_df['day_before_event'] == merged_df['event_date_first']
]
player_id device_id event_date_actual games_played day_before_event event_date_first
1 2 2016-03-02 6 2016-03-01 2016-03-01

Paso 5: Calcular la fracci贸n de inicios de sesi贸n consecutivos

  • Objetivo: Encontrar la fracci贸n que representa a los jugadores que iniciaron sesi贸n el d铆a despu茅s de su primer inicio de sesi贸n.
  • Intuici贸n: Aqu铆 encontramos el conteo 煤nico de jugadores que iniciaron sesi贸n consecutivamente y lo dividimos por el total de jugadores en el conjunto de datos. Esto nos da la proporci贸n de jugadores que exhibieron este comportamiento, lo que nos da una sensaci贸n de la retenci贸n de los jugadores despu茅s del primer inicio de sesi贸n.
fraction = round(consecutive_login['player_id'].nunique() / activity['player_id'].nunique(), 2)

Returns: 0.33

Paso 6: Formatear el resultado

  • Objetivo: Preparar el resultado final.
  • Intuici贸n: Creamos un nuevo DataFrame para almacenar la fracci贸n calculada asegurando que retornamos el resultado en un formato estructurado y legible, cumpliendo con el tipo de retorno de nuestra funci贸n.
output_df = pd.DataFrame({'fraction': [fraction]})
fraction
0.33

Implementaci贸n

import pandas as pd

def gameplay_analysis(activity: pd.DataFrame) -> pd.DataFrame:
    # Step 1: Find the first login date for each player
    first_login = activity.groupby('player_id')['event_date'].min().reset_index()
    # Step 2: Create a new column for the day before each event_date in the original DataFrame
    activity['day_before_event'] = activity['event_date'] - pd.to_timedelta(1, unit='D')

    # Step 3: Merge the dataframes to find rows where player logged in a day after their first login
    merged_df = activity.merge(first_login, on='player_id', suffixes=('_actual', '_first'))

    # Step 4: Find the rows where the actual event date matches the day after the first login date
    consecutive_login = merged_df[merged_df['day_before_event'] == merged_df['event_date_first']]

    # Step 5: Calculate the fraction of players that logged in again on the day after their first login
    fraction = round(consecutive_login['player_id'].nunique() / activity['player_id'].nunique(), 2)

    # Step 6: Create a dataframe to hold the output
    output_df = pd.DataFrame({'fraction': [fraction]})

    return output_df

slackmart blog 漏 2024