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.

¿Existe una manera de calcular el promedio móvil anual en Python?

Tengo algunos datos de fútbol que estoy modificando para análisis. Básicamente quiero calcular promedios de carrera y por juego por año de forma semanal para varias estadísticas.

Ejemplo:

Lo que tengo:

Jugador Año Semana Yardas por carrera Catches
Seth Johnson 2020 1 100 4
Seth Johnson 2020 2 80 2
Seth Johnson 2021 1 50 3
Seth Johnson 2021 2 50 2

Lo que quiero:

Jugador Año Semana Yardas por carrera Catches Yardas de carrera por juego de carrera Capturas por juego de carrera Yardas por juego de carrera anuales Capturas por juego de carrera anuales
Seth Johnson 2020 1 100 4 100 4 100 4
Seth Johnson 2020 2 80 2 90 3 90 3
Seth Johnson 2021 1 50 3 76.67 3 50 3
Seth Johnson 2021 2 40 2 67.5 2.75 45 2.5

Calculé las estadísticas de carrera y las estadísticas anuales por separado y luego simplemente las uní todo por Jugador / Año / Semana, pero no estoy seguro de cómo calcular los promedios móviles dado que la ventana dependería del Año y la Semana.

He intentado cosas como iterar a través de las categorías deseadas y calcular promedios móviles:

new_df [‘Career’ + category + ‘per Game’] = df.groupby (‘Jugador’) [category]. apply (lambda x: x.rolling(3, min_periods = 0).mean())

Pero no estoy encontrando la creatividad necesaria para hacer la ventana personalizada adecuada para rolling (). ¿Alguien tiene alguna idea aquí?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para calcular los promedios por partido en una base semanal para varias estadísticas en datos de fútbol, puede seguir estos pasos:

    1. Calcular estadísticas de carrera: Para calcular las estadísticas de carrera, debe agrupar los datos por jugador y calcular la suma acumulada de las estadísticas para cada jugador. Luego, puede dividir la suma acumulada por el número de partidos jugados por cada jugador para obtener el promedio de carrera. Puede usar las funciones groupby y cumsum en pandas para lograr esto.
    df['Yardas por carrera en la carrera'] = df.groupby('Player')['Rushing Yards'].cumsum()
    df['Atrapadas en la carrera'] = df.groupby('Player')['Catches'].cumsum()
    df['Yardas por carrera en la carrera por juego'] = df['Yardas por carrera en la carrera'] / df.groupby('Player').cumcount()
    df['Atrapadas en la carrera por juego'] = df['Atrapadas en la carrera'] / df.groupby('Player').cumcount()
    
    1. Calcular estadísticas anuales: Para calcular las estadísticas anuales, debe agrupar los datos por jugadores y año, y calcular la suma acumulada de las estadísticas para cada jugador en cada año. Luego, puedes dividir la suma acumulada por el número de partidos jugados por cada jugador en cada año para obtener el promedio anual. Puede usar las funciones groupby y cumsum en pandas para lograr esto.
    df['Yardas por carrera anuales'] = df.groupby(['Player', 'Year'])['Rushing Yards'].cumsum()
    df['Atrapadas anuales'] = df.groupby(['Player', 'Year'])['Catches'].cumsum()
    df['Yardas por carrera anuales por juego'] = df['Yardas por carrera anuales'] / df.groupby(['Player', 'Year']).cumcount()
    df['Atrapadas anuales por juego'] = df['Atrapadas anuales'] / df.groupby(['Player', 'Year']).cumcount()
    
    1. Calcular promedios móviles: Para calcular los promedios móviles, puedes usar la función de rolling en pandas. Debe agrupar los datos por jugador y aplicar la función de rolling a las estadísticas de cada jugador. El tamaño de ventana para la función de rolling debe depender del año y la semana. Puede usar la función shift para desplazar la ventana rodante a la posición correcta basada en la semana actual.
    tamaño_de_ventana = df.groupby(['Player', 'Year'])['Week'].shift(1) - df['Week']
    df['Yardas por carrera en la carrera por juego'] = df.groupby('Player')['Rushing Yards'].rolling(tamaño_de_ventana).mean()
    df['Atrapadas en la carrera por juego'] = df.groupby('Player')['Catches'].rolling(tamaño_de_ventana).mean()
    
    tamaño_de_ventana = df.groupby(['Player', 'Year', 'Week'])['Week'].diff().fillna(0)
    df['Yardas por carrera anuales por juego'] = df.groupby(['Player', 'Year'])['Rushing Yards'].rolling(tamaño_de_ventana).mean()
    df['Atrapadas anuales por juego'] = df.groupby(['Player', 'Year'])['Catches'].rolling(tamaño_de_ventana).mean()
    
    1. Unir los datos: Finalmente, puede unir las estadísticas de carrera y anuales con los datos originales usando la función de merge en pandas.
    columnas_para_unir = ['Player', 'Year', 'Week', 'Rushing Yards', 'Catches']
    columnas_de_carrera = ['Yardas por carrera en la carrera por juego', 'Atrapadas en la carrera por juego']
    columnas_anuales = ['Yardas por carrera anuales por juego', 'Atrapadas anuales por juego']
    
    datos_de_carrera = df[columnas_para_unir + columnas_de_carrera].drop_duplicates(['Player', 'Year'], keep='last')
    datos_anuales = df[columnas_para_unir + columnas_anuales].drop_duplicates(['Player', 'Year', 'Week'], keep='last')
    
    datos_finales = df.merge(datos_de_carrera, on=['Player', 'Year', 'Week'], how='left')
    datos_finales = datos_finales.merge(datos_anuales, on=['Player', 'Year', 'Week'], how='left')
    

    Esto debería darle el resultado deseado con los promedios por partido de carrera y anuales calculados en una base semanal para varias estadísticas.

Comments are closed.