не могу Порядковый кодировать мои данные, используя fit_transform category_encoders - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь преобразовать OrdinalEncoder из category_encoders в один из столбцов моих данных .
документация я пробовал просмотреть:

    import category_encoders as ce

    # here i'm defining mapping for OrdinalEncoder
    property_ordinal_mapping_1 = [{"col":"property_type", "mapping": [('Apartment', 1),('House', 2),('Condominium', 3),
                                                                      ('Townhouse', 4),('Loft', 5),('Other', 6),
                                                                      ('Guesthouse', 7),('Bed & Breakfast', 8),
                                                                      ('Bungalow', 9),('Villa', 10),('Dorm', 11),
                                                                      ('Guest suite', 12),('Camper/RV', 13),
                                                                      ('Timeshare', 14),('Cabin', 15),('In-law', 16),
                                                                      ('Hostel', 17),('Boutique hotel', 18),('Boat', 19),
                                                                      ('Serviced apartment', 20),('Tent', 21),('Castle', 22),
                                                                      ('Vacation home', 23),('Yurt', 24),('Hut', 25),
                                                                      ('Treehouse', 26),('Chalet', 27),('Earth House', 28),
                                                                      ('Tipi', 29),('Train', 30),('Cave', 31),
                                                                      ('Casa particular', 32),('Parking Space', 33),
                                                                      ('Lighthouse', 34),('Island', 35)
                                                                     ]
                                },
                               ]
    # preparing the OrdinalEncoder for fitting and transforming
    property_encoder_1 = ce.OrdinalEncoder(mapping = property_ordinal_mapping_1, return_df = True, cols=["property_type"])

проблема, которая возникает, когда я пытаюсь fit_transfom:
df_train = property_encoder_1.fit_transform(air_cat_2)
ошибка:

TypeError                                 Traceback (most recent call last)
<ipython-input-96-9cea1713182c> in <module>()
----> 1 df_train = property_encoder_1.fit_transform(air_cat_2)
/usr/local/lib/python3.6/dist-packages/sklearn/base.py in fit_transform(self, X, y, **fit_params)
    551         if y is None:
    552             # fit method of arity 1 (unsupervised transformation)
--> 553             return self.fit(X, **fit_params).transform(X)
    554         else:
    555             # fit method of arity 2 (supervised transformation)

/usr/local/lib/python3.6/dist-packages/category_encoders/ordinal.py in fit(self, X, y, **kwargs)
    139             cols=self.cols,
    140             handle_unknown=self.handle_unknown,
--> 141             handle_missing=self.handle_missing
    142         )
    143         self.mapping = categories

/usr/local/lib/python3.6/dist-packages/category_encoders/ordinal.py in ordinal_encoding(X_in, mapping, cols, handle_unknown, handle_missing)
    288             for switch in mapping:
    289                 column = switch.get('col')
--> 290                 X[column] = X[column].map(switch['mapping'])
    291 
    292                 try:

/usr/local/lib/python3.6/dist-packages/pandas/core/series.py in map(self, arg, na_action)
   3380         """
   3381         new_values = super(Series, self)._map_values(
-> 3382             arg, na_action=na_action)
   3383         return self._constructor(new_values,
   3384                                  index=self.index).__finalize__(self)

/usr/local/lib/python3.6/dist-packages/pandas/core/base.py in _map_values(self, mapper, na_action)
   1216 
   1217         # mapper is a function
-> 1218         new_values = map_f(values, mapper)
   1219 
   1220         return new_values

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

TypeError: 'list' object is not callable

sklearn.preprocessing.OrdinalEncoder была похожая ошибка.
что я делаю не так и как мне это решить. Я дважды проверил имена классов моей колонки и переписал весь код, и ничто не помогло; Или есть другой способ сделать это?
Пожалуйста, не отмечайте мой вопрос как дубликат.

1 Ответ

0 голосов
/ 21 июня 2019

Я бы порекомендовал вам использовать OrdinalEncoder из sklearn.preprocessing.У меня была такая же проблема при выполнении fit_transform из OrdinalEncoder тоже.Итак, этот пост очистил все мои мысли.

РЕДАКТИРОВАТЬ 1: Вот что я сделал (я сохранил его для повторного использования):

def ordinal_encode(a_column_of_dataframe):

    # make an array of unique categories by count for preference, because apparently the most occurred is what most offered(in context of hotel rooms)
    from collections import Counter
    most_occurred_desc = np.array(sorted(a_column_of_dataframe.values, key=Counter(a_column_of_dataframe.values).get, reverse=True))
    unique_elements = list(Counter(most_occured_desc).keys())

    # make an ordinal encoder with that ordered list
    from sklearn.preprocessing import OrdinalEncoder
    prop_ord_enc = OrdinalEncoder(categories=[unique_elements])

    # since transform needs list of lists 
    list_of_lists = [[i] for i in list(a_column_of_dataframe) ]

    # transform it now(ordinal encode it), which will return list of lists, just as been passed
    encoded_props = prop_ord_enc.fit_transform(list_of_lists)

    # return the flattened array
    return np.asarray(encoded_props).flattened()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...