WOE и IV стол в питоне - PullRequest
0 голосов
/ 15 мая 2018

У меня есть функция, которая вычисляет WOE и IV, как показано ниже:

def calc_iv(df, feature, target, pr=0):

    lst = []

    for i in range(df[feature].nunique()):
        val = list(df[feature].unique())[i]
        lst.append([feature, val, df[df[feature] == val].count()[feature], df[(df[feature] == val) & (df[target] == 1)].count()[feature]])

    data = pd.DataFrame(lst, columns=['Variable', 'Value', 'All', 'Bad'])
    data = data[data['Bad'] > 0]

    data['Share'] = data['All'] / data['All'].sum()
    data['Bad Rate'] = data['Bad'] / data['All']
    data['Distribution Good'] = (data['All'] - data['Bad']) / (data['All'].sum() - data['Bad'].sum())
    data['Distribution Bad'] = data['Bad'] / data['Bad'].sum()
    data['grp_score'] = round((data['Distribution Good']/(data['Distribution Good'] + data['Distribution Bad']))*10, 2)
    data['WoE'] = np.log(data['Distribution Good'] / data['Distribution Bad'])
    data['IV'] = (data['WoE'] * (data['Distribution Good'] - data['Distribution Bad'])).sum()
    data['Efficiency'] =  abs(data['Distribution Good'] - data['Distribution Bad'])/2  
    data = data.sort_values(by=['Variable', 'Value'], ascending=True)

    d = {data['Distribution Good'],data['Distribution Bad'],data['Share'],
         data['Bad Rate'],data['grp_score'],data['WoE'],data['IV'],data['Efficiency']}

    mydf=pd.DataFrame(data=d)

    if pr == 1:
        print(data)

    #return data['IV'].values[0]
    return mydf.values

функция проверяет фрейм данных (dat), как показано ниже

myvar1 myvar2  myvar3  myvar4  target
 0       50     1000    7800     1
10       87     500     10000    0
35       0      3000    20000    0

Затем я вызываю функцию, как показано ниже

calc_iv(dat, 'myvar1', 'target', pr=0)

Я бы хотел, чтобы функция возвращала myvar1

Distribution Good Distribution Bad Share Bad Rate grp_score WoE IV    Efficiency
 0.1                   0.9          1        0.9     20      0.2  0.6    0.8
 0.8                   0.2          2        0.2     10      0.1  0.2    0.1
 0.7                   0.3          3        0.3     70      0.7  0.8    0.5

но я получаю ошибку ниже

TypeError: 'Series' objects are mutable, thus they cannot be hashed

1 Ответ

0 голосов
/ 17 марта 2019

Ну, это было довольно давно. Но для всех, кто затронул эту проблему. Это, в основном, из-за этого кода.

d = {data['Distribution Good'],data['Distribution Bad'],data['Share'],
         data['Bad Rate'],data['grp_score'],data['WoE'],data['IV'],data['Efficiency']}

Само исключение выдается, потому что класс Series расширяет NDFrame, что не позволяет его хэшировать (как видно из исходного кода здесь )

Самый простой способ - просто выбрать данные, подобные этим

d = data[[
      'Distribution Good',
      'Distribution Bad',
      'Share',
      'Bad Rate',
      'grp_score',
      'WoE',
      'IV',
      'Efficiency'
  ]]

С другой стороны, если OP хочет получить все результаты для этих трех строк. Вы, вероятно, хотите удалить эту строку «фильтра».

data = data[data['Bad'] > 0]

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