Вычисление Взвешенного Среднего в Pandas и Python

В этом руководстве вы узнаете, как рассчитать взвешенное среднее с использованием Pandas и Python. Взвешенные средние учитывают "веса" заданных значений, что делает их более репрезентативными для фактического среднего. Это имеет множество практических применений, включая расчет прогнозов продаж или оценку эффективности за разные периоды времени.

Хотя Pandas оснащён множеством полезных встроенных функций, таких как чрезвычайно простой способ вычисления среднего значения столбца, в нём нет встроенной функции для расчёта средневзвешенного значения. Однако это не проблема, так как Pandas позволяет легко определить функцию для выполнения этой задачи.

В конце этого учебного материала вы узнаете, что такое взвешенное среднее и чем оно отличается от обычного арифметического среднего, как рассчитать взвешенное среднее столбца в Pandas, а также как вычислить его на основе двух различных списков.

Краткий ответ: Используйте Pandas

# Вычисление взвешенного среднего для DataFrame Pandas с использованием NumPy

import pandas as pd
import numpy as np

df = pd.DataFrame.from_dict({
    'NumCourses': [3, 2, 4, 6, 2],
    'Grades': [90, 85, 95, 85, 70]
})

weighted_average = np.average(a=df['Grades'], weights=df['NumCourses'])
print(weighted_average)

# Возвращает: 86.47058823529412

Оглавление

Что такое средневзвешенное значение?

Термин взвешенное среднее относится к среднему значению, которое учитывает различные степени важности чисел в наборе данных. Поэтому взвешенное среднее, вероятно, будет отличаться от значения, рассчитанного с использованием арифметического среднего.

Формула для вычисления взвешенного среднего выглядит следующим образом:

Формула для расчета взвешенного среднего

Эта формула представляет собой сумму каждого элемента, умноженного на его вес, делённую на количество элементов.

Давайте посмотрим, как это сравнивается с примерами данных. Рассмотрим следующую таблицу, где мы хотим вычислить среднюю оценку по каждому курсу.

Количество курсов
Оценка

3

90

2

85

4

95

6

85

2

70

Если бы мы рассчитывали обычное среднее, его можно было бы вычислить так:

( 90 + 85 + 95 + 85 + 70 ) / 5

Тем не менее, это может создать некоторые проблемы из-за различий в количестве курсов. Если мы действительно хотим посчитать среднюю оценку за курс, нам стоит рассмотреть расчет взвешенного среднего.

Этот расчет будет выглядеть

( 90×3 + 85×2 + 95×4 + 85×4 + 70×2 ) / (3 + 2 + 4 + 6 + 2 )

Это может дать нам гораздо более репрезентативную оценку за курс

Давайте посмотрим, как мы можем разработать пользовательскую функцию для вычисления взвешенного среднего в Pandas.

Рассчитайте средневзвешенное значение в Pandas, используя пользовательскую функцию

В этом разделе вы узнаете, как использовать Python для создания пользовательской функции, чтобы рассчитать средневзвешенное значение в DataFrame Pandas. Хотя в Pandas есть встроенный метод mean(), нам потребуется разработать пользовательскую функцию. Это потому, что средневзвешенное значение фактически зависит от нескольких переменных: одной, которая определяет вес, и другой, содержащей фактические значения.

Давайте загрузим наш пример таблицы сверху как датафрейм, который мы можем использовать на протяжении всего руководства:

# Вычисление взвешенного среднего в Pandas с использованием пользовательской функции

import pandas as pd

df = pd.DataFrame.from_dict({
    'NumCourses': [3, 2, 4, 6, 2],
    'Grades': [90, 85, 95, 85, 70]
})

print(df)

# Возвращает:
#    NumCourses  Grades
# 0           3      90
# 1           2      85
# 2           4      95
# 3           6      85
# 4           2      70

Мы можем разработать настраиваемую функцию, которая вычисляет взвешенное среднее, передавая два аргумента: столбец, содержащий веса, и столбец, содержащий оценки.

Давайте посмотрим, как будет выглядеть

# Вычисление взвешенного среднего в Pandas с использованием пользовательской функции

import pandas as pd

df = pd.DataFrame.from_dict({
    'NumCourses': [3, 2, 4, 6, 2],
    'Grades': [90, 85, 95, 85, 70]
})

def weighted_average(df, values, weights):
    return sum(df[weights] * df[values]) / df[weights].sum()

print(weighted_average(df, 'Grades', 'NumCourses'))

# Возвращает: 86.47058823529412

Давайте разберемся, что мы здесь сделали:

  1. Мы создали функцию, которая принимает на вход DataFrame и два столбца: один для значений, другой для весов.

  2. Затем мы вводим формулу, которая вычисляет сумму весов, умноженных на значения, деленную на сумму значений

В следующем разделе вы научитесь использовать метод groupby() для вычисления средневзвешенного в Pandas.

Рассчитайте средневзвешенное значение в Pandas с помощью GroupBy

Бывают случаи, когда у вас есть третья переменная, по которой вы хотите разделить ваши данные. Например, если наши данные также разбиты по годам, мы захотим рассчитать взвешенное среднее по каждому году. Вот где метод .groupby() вступает в игру.

Давайте добавим столбец с годом в наш датафрейм и посмотрим, как можно вычислить средневзвешенное значение для каждого года:

# Вычисление взвешенного среднего в Pandas с использованием GroupBy

import pandas as pd

df = pd.DataFrame.from_dict({
    'Year': ['2021', '2021', '2022', '2022', '2022'],
    'NumCourses': [3, 2, 4, 6, 2],
    'Grades': [90, 85, 95, 85, 70]
})

def weighted_average(df, values, weights):
    return sum(df[weights] * df[values]) / df[weights].sum()

print(df.groupby('Year').apply(weighted_average, 'Grades', 'NumCourses'))

# Возвращает: 
# Year
# 2021    88.000000
# 2022    85.833333
# dtype: float64

Здесь мы сначала используем метод .groupby(), чтобы сгруппировать наши данные по годам. Затем мы применяем функцию и передаем в неё два столбца. Это возвращает напечатанную серию данных.

В следующем разделе вы узнаете, как использовать numpy для вычисления взвешенного среднего.

Вычислить средневзвешенное значение в Pandas с помощью Numpy

Библиотека numpy имеет функцию average(), которая позволяет передавать необязательный аргумент для указания весов значений. Функция принимает массив в аргументе a=, и другой массив для весов в аргументе weights=.

Посмотрим, как мы можем вычислить средневзвешенное значение Pandas Dataframe с использованием numpy:

# Вычисление взвешенного среднего в Pandas с использованием NumPy

import pandas as pd
import numpy as np

df = pd.DataFrame.from_dict({
    'NumCourses': [3, 2, 4, 6, 2],
    'Grades': [90, 85, 95, 85, 70]
})

weighted_average = np.average(a=df['Grades'], weights=df['NumCourses'])
print(weighted_average)

# Возвращает: 86.47058823529412

Это более аккуратный способ расчета взвешенного среднего значения в DataFrame Pandas. Важно учитывать читаемость при написании кода – вы хотите, чтобы ваш код был интуитивно понятным. Если это требует импорта другой функции из модуля, то это может быть стоящим компромиссом.

В следующем разделе вы узнаете, как вычислить взвешенное среднее из двух списков, используя функцию zip в Python.

Вычислить средневзвешенное значение двух списков с помощью Zip

В этом разделе вы узнаете, как вычислить средневзвешенное двух списков с помощью функции zip в Python. Хотя этот метод может быть не таким практичным, как другие описанные выше методы, он может пригодиться на собеседованиях по программированию.

Предположим, у вас есть два списка: один содержит веса, а другой содержит фактические значения.

Мы можем вычислить средневзвешенное значение списка значений, используя следующий подход:

# Вычисление взвешенного среднего двух списков в Python

num_courses = [3, 2, 4, 6, 2]
grades = [90, 85, 95, 85, 70]

def weighted_average(values, weights):
    weighted_sum = []
    for value, weight in zip(values, weights):
        weighted_sum.append(value * weight)
    
    return sum(weighted_sum) / sum(weights)

print(weighted_average(grades, num_courses))

# Возвращает: 86.47058823529412

В приведенном выше примере мы разработали новую функцию, которая принимает два списка в качестве параметров. Функция создает новый список, затем выполняет итерацию по zip-объекту, возвращенному из двух списков. Значения перемножаются и суммируются, затем делятся на сумму весов.

Заключение

В этом учебнике вы узнали, как рассчитать средневзвешенное значение в Pandas, включая использование Pandas, пользовательской функции, numpy и функции zip. Умение рассчитывать средневзвешенное значение имеет множество практических применений, включая использование в бизнесе и науке.

Чтобы узнать больше о функции average в numpy, ознакомьтесь с официальной документацией здесь.

Last updated