Конвейер Python KeyError, почему это не работает? ⇐ Python
-
Гость
Конвейер Python KeyError, почему это не работает?
Я пытаюсь пройти свой набор тестов через конвейер:
pipeline = Pipeline([("featureimputer",FeatureImputer()),("featurecreator",FeatureCreator()),("featureencoder",FeatureEncoder()),("featuredropper",FeatureDropper()) ,("featurescaler",FeatureScaling())]) trainset = конвейер.fit_transform(поезд) набор тестов = конвейер.transform(тест) Однако выдает ошибку, например:
KeyError Traceback (самый последний вызов — последний) Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\indexes\base.py:3621, в Index.get_loc(self, key, метод, допуск) 3620 попробуйте: -> 3621 return self._engine.get_loc(casted_key) 3622, за исключением KeyError как ошибки: Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\_libs\index.pyx:136, в pandas._libs.index.IndexEngine.get_loc() Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\_libs\index.pyx:163, в pandas._libs.index.IndexEngine.get_loc() Файл pandas\_libs\hashtable_class_helper.pxi:5198 в pandas._libs.hashtable.PyObjectHashTable.get_item() Файл pandas\_libs\hashtable_class_helper.pxi:5206 в pandas._libs.hashtable.PyObjectHashTable.get_item() KeyError: «reservation_status» Вышеупомянутое исключение было непосредственной причиной следующего исключения: KeyError Traceback (самый последний вызов — последний) c:\Users\asus\Documents\HMIF_DS\notebook8d3fb2632c.ipynb Ячейка 107, строка 3 1 конвейер = Pipeline([("featureimputer",FeatureImputer()),("featurecreator",FeatureCreator()),("featureencoder",FeatureEncoder()),("featuredropper",FeatureDropper()),("featurescaler" ,Масштабирование функций())]) 2 trainset = конвейер.fit_transform(поезд) ----> 3 тестовый набор = конвейер.transform(тест) Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\pipeline.py:689 в Pipeline.transform(self, X) 687 Хт = Х 688 для _, _, преобразование в self._iter(): --> 689 Xt = Transform.transform(Xt) 690 возврат Хт Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\utils\_set_output.py:140, в _wrap_method_output..wrapped(self, X, *args, **кварги) 138 @wraps(ф) 139 def обернут(self, X, *args, **kwargs): --> 140 data_to_wrap = f(self, X, *args, **kwargs) 141, если isinstance(data_to_wrap, кортеж): 142 # переносим только первый вывод для перекрестной декомпозиции 143 return_tuple = ( 144 _wrap_data_with_container(метод, data_to_wrap[0], X, self), 145 *data_to_wrap[1:], 146 ) c:\Users\asus\Documents\HMIF_DS\notebook8d3fb2632c.ipynb Ячейка 107, строка 3 34 # Примените вменение для каждого столбца на основе его типа dtype 35 для столбца, вменитель в self.imputers.items(): ---> 36 X_copy[col] = imputer.transform(X_copy[col].values.reshape(-1, 1)).ravel() 38 возврат X_copy Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\frame.py:3505, в DataFrame.__getitem__(self, key) 3503, если self.columns.nlevels > 1: 3504 вернуть self._getitem_multilevel (ключ) -> 3505 индексатор = self.columns.get_loc(ключ) 3506, если is_integer(индексатор): 3507 индексатор = [индексатор] Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\indexes\base.py:3623, в Index.get_loc(self, key, метод, допуск) 3621 вернуть self._engine.get_loc(casted_key) 3622, за исключением KeyError как ошибки: -> 3623 поднять KeyError (ключ) из ошибки 3624, кроме TypeError: 3625 # Если у нас есть ключ в виде списка, _check_indexing_error поднимет 3626 # Ошибка ИнвалидИндекс. В противном случае мы провалимся и сделаем ре-рейз. 3627 # Ошибка типа. 3628 self._check_indexing_error (ключ) Ключевая ошибка: 'статус_резервирования' В тестовом наборе не было тега reservation_status, однако я убедился, что внутри кода конвейера вообще нет тегов reservation_status;
из sklearn.base import BaseEstimator, TransformerMixin из sklearn.impute импорт SimpleImputer импортировать numpy как np класс FeatureImputer (BaseEstimator, TransformerMixin): def __init__(self, Strategy='most_frequent'): self.strategy = стратегия def fit(self, X, y=None): # Сохраняем данные для каждого столбца self.imputers = {} # Определить столбцы по dtype numeric_columns = X.select_dtypes(include=['float64', 'int64']).columns categorical_columns = X.select_dtypes(exclude=['float64', 'int64']).columns # Создание и установка импутеров для числовых столбцов для столбца в численных_столбцах: imputer = SimpleImputer(missing_values=np.nan, Strategy=self.strategy) imputer.fit(X[col].values.reshape(-1, 1)) self.imputers[col] = входной # Создайте и подгоните импутеры для категориальных столбцов для столбца в categorical_columns: imputer = SimpleImputer(missing_values=np.nan, Strategy=self.strategy) imputer.fit(X[col].values.reshape(-1, 1)) self.imputers[col] = входной вернуть себя защита преобразования (сам, X): X_copy = X.copy() # Применяем вменение для каждого столбца на основе его типа dtype для col, вставьте в self.imputers.items(): X_copy[col] = imputer.transform(X_copy[col].values.reshape(-1, 1)).ravel() вернуть X_копию класс FeatureCreator (BaseEstimator, TransformerMixin): def fit(self,X,y=None): вернуть себя защитное преобразование (self,X): # lead_time_bins = [0, 100, 200, 300, 400,500,600,700,float('inf')] # labels = ['0-100', '101-200', '201-300', '301-400', '401-500','501-600','601-700','700+' ] # X['lead_time_group'] = pd.cut(X['lead_time'], bins=lead_time_bins, labels=labels, right=False) ['PRT','GBR','FRA','ESP','DEU'] X['isAccordance'] = (X['assigned_room_type'] == X['reserved_room_type']).astype(int) X['PRT'] = (X['country'] == 'PRT').astype(int) X['GBR'] = (X['country'] == 'GBR').astype(int) X['FRA'] = (X['country'] == 'FRA').astype(int) X['ESP'] = (X['country'] == 'ESP').astype(int) X['DEU'] = (X['country'] == 'DEU').astype(int) X['ITA'] = (X['country'] == 'ITA').astype(int) X['IRL'] = (X['country'] == 'IRL').astype(int) X["total_people"] = X['взрослые'] + X['дети'] + X['дети'] X["total_day"] = X['stays_in_week_nights'] + X['stays_in_weekend_nights'] X['agentstatus'] = X['agent'].notna().astype(int) вернуть Х из sklearn.preprocessing импортировать OneHotEncoder из sklearn.base импортировать BaseEstimator, TransformerMixin класс FeatureEncoder (BaseEstimator, TransformerMixin): def fit(self, X, y=None): # Установите кодировщик для функции «отель». self.hotel_encoder = OneHotEncoder() self.hotel_encoder.fit(X[['отель']]) # Установите кодировщик для функции «еда» self.meal_encoder = OneHotEncoder() self.meal_encoder.fit(X[['meal']]) # Установите кодировщик для функции market_segment self.market_segment_encoder = OneHotEncoder() self.market_segment_encoder.fit(X[['market_segment']]) # Установите кодировщик для функции «distribution_channel». self.distribution_channel_encoder = OneHotEncoder() self.distribution_channel_encoder.fit(X[['distribution_channel']]) # Установите кодировщик для функции «deposit_type». self.deposit_type_encoder = OneHotEncoder() self.deposit_type_encoder.fit(X[['deposit_type']]) # Установите кодировщик для функции «customer_type». self.customer_type_encoder = OneHotEncoder() self.customer_type_encoder.fit(X[['customer_type']]) вернуть себя защита преобразования (сам, X): # Преобразуйте функцию «отель» hotel_matrix = self.hotel_encoder.transform(X[['hotel']]).toarray() hotel_column_names = ['Курортный отель', 'Городской отель'] для меня в диапазоне (len(hotel_matrix.T)): X[hotel_column_names] = hotel_matrix.T # Преобразуйте функцию «еда» food_matrix = self.meal_encoder.transform(X[['meal']]).toarray() food_column_names = ["HB", "BB", "FB", "SC", "Не определено"] для меня в диапазоне (len(meal_matrix.T)): X[meal_column_names] = food_matrix.T # Преобразуйте функцию «market_segment» market_segment_matrix = self.market_segment_encoder.transform(X[['market_segment']]).toarray() market_segment_column_names = ["Группы", "Онлайн-ТА", «Офлайн ТА/ТО», «Прямой», «Авиационный», «Корпоративный», «Дополнительный», «Неопределенный»] для i в диапазоне (len(market_segment_matrix.T)): X[market_segment_column_names] = market_segment_matrix.T # Преобразование функции «distribution_channel» Distribution_channel_matrix = self.distribution_channel_encoder.transform(X[['distribution_channel']]).toarray() Distribution_channel_column_names = ['TA/TO', 'Прямой', 'Корпоративный', 'GDS', 'Не определено'] для i в диапазоне (len(distribution_channel_matrix.T)): X[имя_столбцов_канала_распределения] = матрица_канала_распределения.T # Преобразование функции «deposit_type» депозит_тип_матрица = self.deposit_type_encoder.transform(X[['deposit_type']]).toarray() Deposit_type_column_names = ["Без депозита", "Без возврата", "Возврат"] для i в диапазоне (len(deposit_type_matrix.T)): X[имя_столбца_депозита_типа] = матрица_типа_депозита.T # Преобразование функции «customer_type» customer_type_matrix = self.customer_type_encoder.transform(X[['customer_type']]).toarray() customer_type_column_names = ['Переходная сторона', 'Переходный', 'Контракт', 'Группа'] для i в диапазоне (len(customer_type_matrix.T)): X[имя_столбца_клиента_типа[i]] = матрица_типа_клиента.T[i] вернуть Х класс FeatureDropper (BaseEstimator, TransformerMixin): def fit(self, X, y=None): вернуть себя защита преобразования (сам, X): X = X.drop(["deposit_type", "agent", "company","hotel","market_segment","distribution_channel","meal","reserved_room_type","assigned_room_type","country","arrival_date_month" ,"customer_type","id"], axis=1, error="игнорировать") вернуть Х из sklearn.preprocessing импорт StandardScaler из sklearn.base импортировать BaseEstimator, TransformerMixin импортировать numpy как np класс FeatureScaling (BaseEstimator, TransformerMixin): def __init__(self, columns_to_scale=None): self.scaler = Стандартный масштабатор() self.columns_to_scale = columns_to_scale def fit(self, X, y=None): если self.columns_to_scale имеет значение None: self.columns_to_scale = [col для столбца в X.columns if (не np.array_equal(X[col].unique(), [1, 0]) и не np.array_equal(X[col].unique(), [ 0, 1]))] self.scaler.fit(X[self.columns_to_scale]) вернуть себя защита преобразования (сам, X): X_copy = X.copy() X_copy[self.columns_to_scale] = self.scaler.transform(X_copy[self.columns_to_scale]) вернуть X_копию Я пытался запустить его только через импутер, а также без импутера, и оба дали одинаковый результат. Может ли кто-нибудь помочь мне это исправить?
Я пытался отладить, но ничего не вышло, но я уверен, что это связано с конвейером.
Я пытаюсь пройти свой набор тестов через конвейер:
pipeline = Pipeline([("featureimputer",FeatureImputer()),("featurecreator",FeatureCreator()),("featureencoder",FeatureEncoder()),("featuredropper",FeatureDropper()) ,("featurescaler",FeatureScaling())]) trainset = конвейер.fit_transform(поезд) набор тестов = конвейер.transform(тест) Однако выдает ошибку, например:
KeyError Traceback (самый последний вызов — последний) Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\indexes\base.py:3621, в Index.get_loc(self, key, метод, допуск) 3620 попробуйте: -> 3621 return self._engine.get_loc(casted_key) 3622, за исключением KeyError как ошибки: Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\_libs\index.pyx:136, в pandas._libs.index.IndexEngine.get_loc() Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\_libs\index.pyx:163, в pandas._libs.index.IndexEngine.get_loc() Файл pandas\_libs\hashtable_class_helper.pxi:5198 в pandas._libs.hashtable.PyObjectHashTable.get_item() Файл pandas\_libs\hashtable_class_helper.pxi:5206 в pandas._libs.hashtable.PyObjectHashTable.get_item() KeyError: «reservation_status» Вышеупомянутое исключение было непосредственной причиной следующего исключения: KeyError Traceback (самый последний вызов — последний) c:\Users\asus\Documents\HMIF_DS\notebook8d3fb2632c.ipynb Ячейка 107, строка 3 1 конвейер = Pipeline([("featureimputer",FeatureImputer()),("featurecreator",FeatureCreator()),("featureencoder",FeatureEncoder()),("featuredropper",FeatureDropper()),("featurescaler" ,Масштабирование функций())]) 2 trainset = конвейер.fit_transform(поезд) ----> 3 тестовый набор = конвейер.transform(тест) Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\pipeline.py:689 в Pipeline.transform(self, X) 687 Хт = Х 688 для _, _, преобразование в self._iter(): --> 689 Xt = Transform.transform(Xt) 690 возврат Хт Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\utils\_set_output.py:140, в _wrap_method_output..wrapped(self, X, *args, **кварги) 138 @wraps(ф) 139 def обернут(self, X, *args, **kwargs): --> 140 data_to_wrap = f(self, X, *args, **kwargs) 141, если isinstance(data_to_wrap, кортеж): 142 # переносим только первый вывод для перекрестной декомпозиции 143 return_tuple = ( 144 _wrap_data_with_container(метод, data_to_wrap[0], X, self), 145 *data_to_wrap[1:], 146 ) c:\Users\asus\Documents\HMIF_DS\notebook8d3fb2632c.ipynb Ячейка 107, строка 3 34 # Примените вменение для каждого столбца на основе его типа dtype 35 для столбца, вменитель в self.imputers.items(): ---> 36 X_copy[col] = imputer.transform(X_copy[col].values.reshape(-1, 1)).ravel() 38 возврат X_copy Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\frame.py:3505, в DataFrame.__getitem__(self, key) 3503, если self.columns.nlevels > 1: 3504 вернуть self._getitem_multilevel (ключ) -> 3505 индексатор = self.columns.get_loc(ключ) 3506, если is_integer(индексатор): 3507 индексатор = [индексатор] Файл c:\Users\asus\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\indexes\base.py:3623, в Index.get_loc(self, key, метод, допуск) 3621 вернуть self._engine.get_loc(casted_key) 3622, за исключением KeyError как ошибки: -> 3623 поднять KeyError (ключ) из ошибки 3624, кроме TypeError: 3625 # Если у нас есть ключ в виде списка, _check_indexing_error поднимет 3626 # Ошибка ИнвалидИндекс. В противном случае мы провалимся и сделаем ре-рейз. 3627 # Ошибка типа. 3628 self._check_indexing_error (ключ) Ключевая ошибка: 'статус_резервирования' В тестовом наборе не было тега reservation_status, однако я убедился, что внутри кода конвейера вообще нет тегов reservation_status;
из sklearn.base import BaseEstimator, TransformerMixin из sklearn.impute импорт SimpleImputer импортировать numpy как np класс FeatureImputer (BaseEstimator, TransformerMixin): def __init__(self, Strategy='most_frequent'): self.strategy = стратегия def fit(self, X, y=None): # Сохраняем данные для каждого столбца self.imputers = {} # Определить столбцы по dtype numeric_columns = X.select_dtypes(include=['float64', 'int64']).columns categorical_columns = X.select_dtypes(exclude=['float64', 'int64']).columns # Создание и установка импутеров для числовых столбцов для столбца в численных_столбцах: imputer = SimpleImputer(missing_values=np.nan, Strategy=self.strategy) imputer.fit(X[col].values.reshape(-1, 1)) self.imputers[col] = входной # Создайте и подгоните импутеры для категориальных столбцов для столбца в categorical_columns: imputer = SimpleImputer(missing_values=np.nan, Strategy=self.strategy) imputer.fit(X[col].values.reshape(-1, 1)) self.imputers[col] = входной вернуть себя защита преобразования (сам, X): X_copy = X.copy() # Применяем вменение для каждого столбца на основе его типа dtype для col, вставьте в self.imputers.items(): X_copy[col] = imputer.transform(X_copy[col].values.reshape(-1, 1)).ravel() вернуть X_копию класс FeatureCreator (BaseEstimator, TransformerMixin): def fit(self,X,y=None): вернуть себя защитное преобразование (self,X): # lead_time_bins = [0, 100, 200, 300, 400,500,600,700,float('inf')] # labels = ['0-100', '101-200', '201-300', '301-400', '401-500','501-600','601-700','700+' ] # X['lead_time_group'] = pd.cut(X['lead_time'], bins=lead_time_bins, labels=labels, right=False) ['PRT','GBR','FRA','ESP','DEU'] X['isAccordance'] = (X['assigned_room_type'] == X['reserved_room_type']).astype(int) X['PRT'] = (X['country'] == 'PRT').astype(int) X['GBR'] = (X['country'] == 'GBR').astype(int) X['FRA'] = (X['country'] == 'FRA').astype(int) X['ESP'] = (X['country'] == 'ESP').astype(int) X['DEU'] = (X['country'] == 'DEU').astype(int) X['ITA'] = (X['country'] == 'ITA').astype(int) X['IRL'] = (X['country'] == 'IRL').astype(int) X["total_people"] = X['взрослые'] + X['дети'] + X['дети'] X["total_day"] = X['stays_in_week_nights'] + X['stays_in_weekend_nights'] X['agentstatus'] = X['agent'].notna().astype(int) вернуть Х из sklearn.preprocessing импортировать OneHotEncoder из sklearn.base импортировать BaseEstimator, TransformerMixin класс FeatureEncoder (BaseEstimator, TransformerMixin): def fit(self, X, y=None): # Установите кодировщик для функции «отель». self.hotel_encoder = OneHotEncoder() self.hotel_encoder.fit(X[['отель']]) # Установите кодировщик для функции «еда» self.meal_encoder = OneHotEncoder() self.meal_encoder.fit(X[['meal']]) # Установите кодировщик для функции market_segment self.market_segment_encoder = OneHotEncoder() self.market_segment_encoder.fit(X[['market_segment']]) # Установите кодировщик для функции «distribution_channel». self.distribution_channel_encoder = OneHotEncoder() self.distribution_channel_encoder.fit(X[['distribution_channel']]) # Установите кодировщик для функции «deposit_type». self.deposit_type_encoder = OneHotEncoder() self.deposit_type_encoder.fit(X[['deposit_type']]) # Установите кодировщик для функции «customer_type». self.customer_type_encoder = OneHotEncoder() self.customer_type_encoder.fit(X[['customer_type']]) вернуть себя защита преобразования (сам, X): # Преобразуйте функцию «отель» hotel_matrix = self.hotel_encoder.transform(X[['hotel']]).toarray() hotel_column_names = ['Курортный отель', 'Городской отель'] для меня в диапазоне (len(hotel_matrix.T)): X[hotel_column_names] = hotel_matrix.T # Преобразуйте функцию «еда» food_matrix = self.meal_encoder.transform(X[['meal']]).toarray() food_column_names = ["HB", "BB", "FB", "SC", "Не определено"] для меня в диапазоне (len(meal_matrix.T)): X[meal_column_names] = food_matrix.T # Преобразуйте функцию «market_segment» market_segment_matrix = self.market_segment_encoder.transform(X[['market_segment']]).toarray() market_segment_column_names = ["Группы", "Онлайн-ТА", «Офлайн ТА/ТО», «Прямой», «Авиационный», «Корпоративный», «Дополнительный», «Неопределенный»] для i в диапазоне (len(market_segment_matrix.T)): X[market_segment_column_names] = market_segment_matrix.T # Преобразование функции «distribution_channel» Distribution_channel_matrix = self.distribution_channel_encoder.transform(X[['distribution_channel']]).toarray() Distribution_channel_column_names = ['TA/TO', 'Прямой', 'Корпоративный', 'GDS', 'Не определено'] для i в диапазоне (len(distribution_channel_matrix.T)): X[имя_столбцов_канала_распределения] = матрица_канала_распределения.T # Преобразование функции «deposit_type» депозит_тип_матрица = self.deposit_type_encoder.transform(X[['deposit_type']]).toarray() Deposit_type_column_names = ["Без депозита", "Без возврата", "Возврат"] для i в диапазоне (len(deposit_type_matrix.T)): X[имя_столбца_депозита_типа] = матрица_типа_депозита.T # Преобразование функции «customer_type» customer_type_matrix = self.customer_type_encoder.transform(X[['customer_type']]).toarray() customer_type_column_names = ['Переходная сторона', 'Переходный', 'Контракт', 'Группа'] для i в диапазоне (len(customer_type_matrix.T)): X[имя_столбца_клиента_типа[i]] = матрица_типа_клиента.T[i] вернуть Х класс FeatureDropper (BaseEstimator, TransformerMixin): def fit(self, X, y=None): вернуть себя защита преобразования (сам, X): X = X.drop(["deposit_type", "agent", "company","hotel","market_segment","distribution_channel","meal","reserved_room_type","assigned_room_type","country","arrival_date_month" ,"customer_type","id"], axis=1, error="игнорировать") вернуть Х из sklearn.preprocessing импорт StandardScaler из sklearn.base импортировать BaseEstimator, TransformerMixin импортировать numpy как np класс FeatureScaling (BaseEstimator, TransformerMixin): def __init__(self, columns_to_scale=None): self.scaler = Стандартный масштабатор() self.columns_to_scale = columns_to_scale def fit(self, X, y=None): если self.columns_to_scale имеет значение None: self.columns_to_scale = [col для столбца в X.columns if (не np.array_equal(X[col].unique(), [1, 0]) и не np.array_equal(X[col].unique(), [ 0, 1]))] self.scaler.fit(X[self.columns_to_scale]) вернуть себя защита преобразования (сам, X): X_copy = X.copy() X_copy[self.columns_to_scale] = self.scaler.transform(X_copy[self.columns_to_scale]) вернуть X_копию Я пытался запустить его только через импутер, а также без импутера, и оба дали одинаковый результат. Может ли кто-нибудь помочь мне это исправить?
Я пытался отладить, но ничего не вышло, но я уверен, что это связано с конвейером.