es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Calcula el promedio acumulado de 2 meses para un grupo en Pandas.

Estoy tratando de calcular un promedio móvil de dos meses de la puntuación de un jugador utilizando el siguiente df:

df = pd.DataFrame({'player_id': [1098, 1098, 1098, 1098, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116],
              'date': ['2018-06-22', '2018-06-23', '2018-07-24', '2018-07-25', 
                      '2018-07-22', '2018-07-23', '2018-07-24', '2018-07-25',
                      '2018-08-22', '2018-08-23', '2018-08-24', '2018-08-25'],
              'score': [-2, 1, 2, 3, -8, 3, 2, -3, -2, 1, 2, 3]})

Quisiera que los promedios estén agrupados por la columna ‘player_ID’ para que el jugador 1098 tenga promedios de -2, -0.5, 0.33 y 1 respectivamente, para cada fila. Si solo hay una fecha en 2020, sería ese valor. Si hay una fecha en enero y febrero de 2020, la fila de enero sería ese valor, mientras que la fila de febrero sería el promedio de esos dos valores.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para calcular el promedio móvil de dos meses de la puntuación de un jugador, podemos utilizar la función rolling de pandas.

    Primero, necesitamos convertir la columna date en un objeto datetime utilizando la función to_datetime:

    df['date'] = pd.to_datetime(df['date'])
    

    Luego, podemos establecer el índice del DataFrame para que sea la columna date utilizando el método set_index:

    df.set_index('date', inplace=True)
    

    A continuación, podemos agrupar el DataFrame por player_id utilizando el método groupby:

    grouped = df.groupby('player_id')
    

    Finalmente, podemos calcular el promedio móvil de dos meses utilizando la función rolling:

    rolling_avg = grouped['score'].rolling('60D').mean()
    

    La función rolling toma un argumento window que hemos establecido en '60D' para representar una ventana móvil de 60 días. También hemos aplicado la función mean para calcular el promedio móvil.

    Para agregar los promedios móviles al DataFrame original, podemos restablecer el índice utilizando el método reset_index y luego concatenar los promedios móviles utilizando la función pd.concat:

    df.reset_index(inplace=True)
    rolling_avg = rolling_avg.reset_index(level=0, drop=True)
    df = pd.concat([df, rolling_avg], axis=1)
    df.rename(columns={'score': 'score_rolling_avg'}, inplace=True)
    

    Esto nos dará un DataFrame con una nueva columna score_rolling_avg que contiene los promedios móviles de dos meses para la puntuación de cada jugador.

Comments are closed.