Analisis del juego IV

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.

#pandas#basic-aggregate

Tabla: Activity

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+

- (player_id, event_date) es la llave primaria (combinaci贸n de columnas con valores 煤nicos).
- Esta tabla muestra la actividad de los jugadores de algunos juegos.
- Cada fila representa el registro de un jugador que se conect贸 y jugo un n煤mero de juegos (posiblemente 0)
  antes de cerrar sesi贸n en un cierto d铆a usando alg煤n dispositivo.

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Activity:
+-----------+-----------+------------+--------------+
| 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            |
+-----------+-----------+------------+--------------+

Salida:

+-----------+
| fraction  |
+-----------+
| 0.33      |
+-----------+

Explicaci贸n:
- Solo el jugador con id=1 se conect贸 un d铆a despu茅s de su primer inicio de sesi贸n, asi que la respuesta es 1/3 = 0.33.

Soluci贸n

import pandas as pd

def gameplay_analysis(activity: pd.DataFrame) -> pd.DataFrame:
    num_players = len(activity.groupby('player_id'))

    df = activity.sort_values(
        by=['player_id', 'event_date']
    ).groupby('player_id').head(2)

    df['is_consecutive'] = df['event_date'].eq(
        df['event_date'].shift() + pd.Timedelta('1D')
    )

    streak_two = df.loc[
        df['is_consecutive'] &
        df['player_id'].eq(df['player_id'].shift())
    ]

    result = pd.DataFrame({
        'fraction': [len(streak_two) / num_players]
    })
    result['fraction'] = result['fraction'].round(2)

    return result


def test_gameplay_analysis():
    data = [
        [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]
    ]
    activity = pd.DataFrame(
        data,
        columns=['player_id',
                 'device_id',
                 'event_date',
                 'games_played']
    ).astype({
        'player_id': 'Int64',
        'device_id': 'Int64',
        'event_date': 'datetime64[ns]',
        'games_played': 'Int64'
    })
    expected = pd.DataFrame({'fraction': [0.33]})
    got = gameplay_analysis(activity)
    pd.testing.assert_frame_equal(got, expected)

slackmart blog 漏 2024