Динамическое распределение весов по категориям с использованием Python - PullRequest
0 голосов
/ 09 мая 2018

Постановка задачи: Динамическое распределение предварительно определенных весовых коэффициентов для категорий в случае отсутствия категории (й).

Подробности: Есть 3 категории данных C1, C2 и C3, каждая из которых имеет предопределенный вес (скажем, 0,5, 0,3 и 0,2 соответственно). Если данные существуют для всех трех категорий, мы берем «средневзвешенное значение»: C1 * d1 + C2 * d2 + C3 * d3.

C1, C2 и C3 предварительно определены и всегда будут равны 1.

Проблема возникает в случае отсутствия данных для d1 / d2 / d3. В таких сценариях мы должны равномерно распределить веса соответствующих категорий по другим существующим категориям.

например, если присутствуют d1 и d2, а d3 нет, то значение C3 должно быть равномерно разделено на C1 и C2. Таким образом, новый расчет будет новым c1 * d1 + newC2 * d2, где newC1 и newC2 - пересмотренные значения веса, взятые из C3. Аналогично для всех возможных случаев (наличия d1, d2, d3).

ТОЛЬКО будет 3 категории (C1, C2, C3) - чтобы сделать эту проблему максимально простой на данный момент.

Входной кадр данных, содержащий значения d1, d2, d3, как показано ниже (называется SCORE):

Col1   Col2  **SCORE**        Col4              Col5     Col6
123    987 **53.357809** 2017-05-03 16:39:20     456     'ABC'

Есть ли общий способ решения этой проблемы? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 09 мая 2018

Это должно работать

import pandas as pd
import numpy as np


weights = {"C1": 0.5, "C2": 0.3, "C3":0.2}

def rule(row):
    nans = row.isna()

    if nans.any():
        cols_na = np.array(df.columns)[nans]
        cols_fill = np.array(df.columns)[~nans]
        distrib = sum([weights[w] for w in cols_na])
        return sum([(weights[col] + (distrib/len(cols_fill)))*row[col] for col in cols_fill])

    return sum(weights[col]*row[col] for col in df.columns)

df.apply(rule, axis=1)
...