Оценка по строке с использованием весов для подмножества столбцов с пропущенными значениями - PullRequest
0 голосов
/ 23 сентября 2019

Я экспериментирую с Python / Pandas, используя DataFrame, имеющий следующую структуру:

import pandas as pd
import numpy as np

df = pd.DataFrame({"item" : ["A", "B", "C", "D", "E"], 
                   "size_ratio" : [0.3, 0.9, 1, 0.4, 0.7], 
                   "weight_ratio" : [0.5, 0.7, 1, 0.5, np.nan], 
                   "power_ratio" : [np.nan, 0.3, 0.5, 0.1, 1]})

print(df)

  item  size_ratio  weight_ratio  power_ratio
0    A         0.3           0.5          NaN
1    B         0.9           0.7          0.3
2    C         1.0           1.0          0.5
3    D         0.4           0.5          0.1
4    E         0.7           NaN          1.0

Как видите, каждый элемент описывается тремя нормализованными метриками, а именно: size_ratio, weight_ratio и power_ratio.Кроме того, NaN значения возможны для каждой метрики.

Моя цель состоит в том, чтобы объединить эти показатели вместе, чтобы создать глобальный счет ( S ) для каждой строки.В частности, функция, которую я хотел бы применить / реализовать, следующая:

enter image description here

, где

  • s_i - индивидуальные оценки;
  • w_i - определяемые пользователем веса, связанные с каждой метрикой;
  • alpha - определяемый пользователем параметр (положительное целое число).

Я хочу иметь возможность быстро настроить вес и параметр alpha для проверки различных комбинаций.

Например, настройка w_1 = 3, w_2 = 2 , w_3 = 1 и alpha = 5, выходные данные должны быть следующими:

  item  size_ratio  weight_ratio  power_ratio  global_score
0    A         0.3           0.5          NaN          0.36
1    B         0.9           0.7          0.3          0.88
2    C         1.0           1.0          0.5          0.99
3    D         0.4           0.5          0.1          0.44
4    E         0.7           NaN          1.0          0.70

Обратите внимание, что для знаменателя мы суммируем только веса, связанные с не пропущенными метриками (та же логика применима к числителю).

Будучи относительно новым для языка программирования Python, я начал с поиска ответов здесь.В этом посте я узнал, как вычислять построчную операцию на панде DataFrame с пропущенными значениями;и в этом посте я видел пример, где каждый использует словарь для установки весов.

К сожалению, я не смог применить то, что нашел, к своей конкретной проблеме.Прямо сейчас я использую Excel для создания различных симуляций, но я бы очень хотел поэкспериментировать с этим в Python.Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 23 сентября 2019

Вы можете попробовать что-то вроде этого:

import pandas as pd
import numpy as np

def global_score(scores, weights, alpha):
    # if we have nan values remove them before calculating the score
    nan_vals = np.argwhere(np.isnan(scores))
    weights = np.delete(weights, nan_vals)
    scores = scores.dropna()
    # calculate the score
    numer = np.sum((scores * weights)**alpha)**(1/alpha)
    denom = np.sum((weights)**alpha)**(1/alpha)
    return numer/denom

weights = [3, 2, 1]
alpha = 5

df = pd.DataFrame({"item" : ["A", "B", "C", "D", "E"], 
                   "size_ratio" : [0.3, 0.9, 1, 0.4, 0.7], 
                   "weight_ratio" : [0.5, 0.7, 1, 0.5, np.nan], 
                   "power_ratio" : [np.nan, 0.3, 0.5, 0.1, 1]})

# only utilize the 3 score columns for the calculation 
df['global_score'] = df[['size_ratio','weight_ratio','power_ratio']].apply(lambda x: global_score(x, weights, alpha), axis=1)

функция global_score сбросит любые значения nan перед выполнением вычисления.Функция apply применяет вычисление ко всем строкам, когда ось = 1. Функция apply выполняет итерацию по строкам и df[['size_ratio','weight_ratio','power_ratio']] обеспечивает передачу только интересующих числовых столбцов в функцию global_score.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...