Как отобразить категориальные данные в category_encoders.OrdinalEncoder в кадре данных Python Pandas - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь использовать category_encoders.OrdinalEncoder для отображения категорий на целые числа в кадре данных панд. Но я получаю следующую ошибку без каких-либо других полезных советов.

TypeError: 'NoneType' object is not iterable

Код работает нормально без попытки сопоставления, но я бы хотел сопоставление.

Код:

import category_encoders as ce

ordinal_cols = [
    "ExterQual",
]

ordinal_cols_mapping = [{
    "ExterQual": {
        'Ex': 5,
        'Gd': 4,
        'TA': 3, 
        'Fa': 2,
        'Po': 1,
        'NA': NaN
    }},
]

encoder = ce.OrdinalEncoder(  mapping = ordinal_cols_mapping, return_df = True, cols = ordinal_cols,)  

df_train = encoder.fit_transform(train_data)
print(df_train)

Что я не так делаю?

mapping: список dict для отображения класса на метку для использования в кодировка, необязательно.

http://contrib.scikit -learn.org / категорично-кодирование / ordinal.html

Полный след стека:

---------------------------------------------------------------------------
TypeError                                 
Traceback (most recent call last)
<ipython-input-56-4944c8d41d07> in <module>()
    150 # use the Ordinal Encoder to map the ordinal data to interval and then fit transform
    151 encoder = ce.OrdinalEncoder( return_df = True, cols = ordinal_cols, mapping = ordinal_cols_mapping)  #NaNs get -1, mapping = ordinal_cols_mapping removed due to error
--> 152 X = encoder.fit_transform(X)

/opt/conda/lib/python3.6/site-packages/sklearn/base.py in fit_transform(self, X, y, **fit_params)
    515         if y is None:
    516             # fit method of arity 1 (unsupervised transformation)
--> 517             return self.fit(X, **fit_params).transform(X)
    518         else:
    519             # fit method of arity 2 (supervised transformation)

/opt/conda/lib/python3.6/site-packages/category_encoders/ordinal.py in fit(self, X, y, **kwargs)
    130             cols=self.cols,
    131             impute_missing=self.impute_missing,
--> 132             handle_unknown=self.handle_unknown
    133         )
    134         self.mapping = categories

/opt/conda/lib/python3.6/site-packages/category_encoders/ordinal.py in ordinal_encoding(X_in, mapping, cols, impute_missing, handle_unknown)
    249             for switch in mapping:
    250                 X[str(switch.get('col')) + '_tmp'] = np.nan
--> 251                 for category in switch.get('mapping'):
    252                     X.loc[X[switch.get('col')] == category[0], str(switch.get('col')) + '_tmp'] = str(category[1])
    253                 del X[switch.get('col')]

TypeError: 'NoneType' object is not iterable

Пример данных:

0    0
1    1
2    0
3    1
4    0
Name: ExterQual, dtype: int64

Ответы [ 2 ]

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

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

In [82]:
from category_encoders.ordinal import OrdinalEncoder
import pandas as pd
from pandas.api.types import CategoricalDtype

# define a categorical dtype
platforms = ['android', 'ios', 'amazon']
platform_category = CategoricalDtype(categories=platforms, ordered=False)

# create a dataframe
df = pd.DataFrame([
    {'id': 1, 'platform': 'android'},
    {'id': 2, 'platform': 'ios'},
    {'id': 3, 'platform': 'amazon'},
])
# apply the categorical dtype
df['platform'] = df['platform'].astype(platform_category)

# create a mapping from all categorical columns that can be used with OrdinalEncoder
categorical_columns = list(df.select_dtypes(['category']).columns)
category_mapping = [
    {'col': column_name, 'mapping': list(zip(df[column_name].cat.categories, df[column_name].cat.codes))} 
    for column_name in categorical_columns
]

# pass this as the mapping
cat_encoder = OrdinalEncoder(cols=categorical_columns, mapping=category_mapping)
cat_encoder
Out[82]:
OrdinalEncoder(cols=['platform'], drop_invariant=False,
        handle_unknown='impute', impute_missing=True,
        mapping=[{'col': 'platform', 'mapping': [('android', 0), ('ios', 1), ('amazon', 2)]}],
        return_df=True, verbose=0)
0 голосов
/ 01 мая 2018

Вы используете неверный параметр 'mapping'.

Формат должен быть:

'mapping' Параметр должен быть list из dicts, где внутренний dicts должен содержать ключи 'col' и 'mapping' и в этом ключ 'mapping' должен иметь список кортежей формата (original_label, encoded_label) как значение.

Примерно так:

ordinal_cols_mapping = [{
    "col":"ExterQual",    
    "mapping": [
        ('Ex',5), 
        ('Gd',4), 
        ('TA',3), 
        ('Fa',2), 
        ('Po',1), 
        ('NA',np.nan)
    ]},
]

Тогда нет необходимости устанавливать параметр 'cols' отдельно. Имена столбцов будут использоваться из параметра 'mapping'.

Просто сделайте это:

encoder = OrdinalEncoder(mapping = ordinal_cols_mapping, 
                         return_df = True)  
df_train = encoder.fit_transform(train_data)

Надеюсь, это прояснит.

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