¿Cómo calcular el promedio ponderado en pandas?

Un promedio ponderado es un cálculo que considera el valor relativo de los números enteros en una recopilación de datos. Cada valor en el conjunto de datos se escala por un peso predefinido antes de que se complete el cálculo final cuando se calcula un promedio ponderado.

Sintaxis:

def weighted_average(dataframe, value, weight):
    val = dataframe[value]
    wt = dataframe[weight]
    return (val * wt).sum() / wt.sum()

Devolverá el promedio ponderado del artículo en valor. En el numerador, multiplicamos cada valor con el peso correspondiente asociado y los sumamos todos. En el denominador se suman todos los pesos. 

Acercarse

  • Tomamos un marco de datos o hacemos nuestro propio marco de datos.
  • Defina una función para calcular el promedio ponderado por la fórmula mencionada anteriormente.
  • Necesitamos tener al menos tres elementos en el marco de datos, es decir, índice (que puede ser el nombre del elemento, la fecha o cualquier variable similar), el valor y el peso.
  • Haremos una llamada de función pasando estos tres valores.

Ejemplo :

Veamos un ejemplo para calcular el promedio ponderado del valor agrupado por item_name. 

Supongamos que hay tres tiendas y cada tienda contiene tres artículos, es decir, chocolates, helados y galletas. Tenemos el peso de cada uno de los artículos y el precio de cada uno de los artículos en las tres tiendas. Ahora necesitamos encontrar el promedio ponderado de cada elemento. 

Python3

import pandas as pd
 
 
def weighted_average(dataframe, value, weight):
    val = dataframe[value]
    wt = dataframe[weight]
    return (val * wt).sum() / wt.sum()
 
 
# creating a dataframe to represent different
# items and their corresponding weight and value
dataframe = pd.DataFrame({'item_name': ['Chocolate', 'Chocolate',
                                        'Chocolate', 'Biscuit',
                                        'Biscuit', 'Biscuit',
                                        'IceCream', 'IceCream',
                                        'IceCream'],
                          'value': [90, 50, 86, 87, 42, 48,
                                    68, 92, 102],
                          'weight': [4, 2, 3, 5, 6, 5, 3, 7,
                                     5]})
 
# Weighted average of value  grouped by item name
dataframe.groupby('item_name').apply(weighted_average,
                                     'value', 'weight')

Salida :

Usando groupby()

Aquí vamos a agrupar los elementos usando la función groupby() y calcularemos los pesos agrupando estos elementos junto con la función de suma. Entonces, al usar este método, solo estamos formando un grupo de elementos similares para obtener la suma

Sintaxis:

def weighted_average_of_group(values, weights, item):
    return (values * weights).groupby(item).sum() / weights.groupby(item).sum()

Ejemplo :

Python3

import pandas as pd
 
 
def weighted_average_of_group(values, weights, item):
    return (values * weights).groupby(item).sum() / weights.groupby(item).sum()
 
 
# creating a dataframe to represent different items
# and their corresponding weight and value
dataframe = pd.DataFrame({'item_name': ['Chocolate', 'Chocolate', 'Chocolate',
                                        'Biscuit', 'Biscuit', 'Biscuit',
                                        'IceCream', 'IceCream', 'IceCream'],
                          'value': [90, 50, 86, 87, 42, 48, 68, 92, 102],
                          'weight': [4, 2, 3, 5, 6, 5, 3, 7, 5]})
 
# Finding grouped average of group
weighted_average_of_group(values=dataframe.value,
                          weights=dataframe.weight, item=dataframe.item_name)

Salida :

Para calcular el promedio ponderado de todo el marco de datos (no de cada grupo, sino como un todo) usaremos la sintaxis que se muestra a continuación:

Sintaxis

def weighted_average_of_whole_dataframe(dataframe, value, weight):
    val = dataframe[value]
    wt = dataframe[weight]
    return (val * wt).sum() / wt.sum()

Ejemplo :

Python3

import pandas as pd
 
 
def weighted_average(dataframe, value, weight):
    val = dataframe[value]
    wt = dataframe[weight]
    return (val * wt).sum() / wt.sum()
 
 
# creating a dataframe to represent different items
# and their corresponding weight and value
dataframe = pd.DataFrame({'item_name': ['Chocolate', 'Chocolate', 'Chocolate',
                                        'Biscuit', 'Biscuit', 'Biscuit',
                                        'IceCream', 'IceCream', 'IceCream'],
                          'value': [90, 50, 86, 87, 42, 48, 68, 92, 102],
                          'weight': [4, 2, 3, 5, 6, 5, 3, 7, 5]})
 
# Weighted average of whole dataframe as a whole
weighted_average(dataframe, 'value', 'weight')

Producción:

75.075

Publicación traducida automáticamente

Artículo escrito por error_502 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *