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.
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)