Напишите пайплайн для подготовки порядковых признаков из списка ord_columns. Он должен состоять из трёх шагов:

  1. Обработка пропусков: пропущенные значения сначала заполняются nan, а затем самым частотным значением ('most_frequent').
  2. Ordinal-кодирование:
  • У признаков 'Оценка комфортности покупки билета онлайн' и 'Оценка качества wifi' четыре уровня категорий: 'нормально', 'хорошо', 'плохо', 'отсутствует'.
  • У признака 'Оценка комфортности времени отправления/прибытия' три уровня: 'нормально', 'хорошо', 'плохо'.
  1. Обработка пропусков после кодирования: сначала заполнить nan, а затем самым частотным значением ('most_frequent').

При выполнении Ordinal-кодирования укажите категории в том же порядке, что и в условии задачи.

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

# загружаем нужные классы
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer

# загружаем дополнительные классы для преобразования данных
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder, StandardScaler

# загружаем класс для работы с пропусками
from sklearn.impute import SimpleImputer

# загружаем нужные метрики
from sklearn.metrics import roc_auc_score

# импортируем библиотеку для загрузки моделей
from sklearn.tree import DecisionTreeClassifier

RANDOM_STATE = 42
TEST_SIZE = 0.25

# загружаем данные
df_full = pd.read_csv('railway_full.csv')

X_train, X_test, y_train, y_test = train_test_split(
    df_full.drop(
        [
            'Удовлетворён предоставленной услугой',
            'Общая оценка качества предоставленной услуги'
        ], 
        axis=1
    ),
    df_full['Удовлетворён предоставленной услугой'],
    test_size = TEST_SIZE, 
    random_state = RANDOM_STATE,
    stratify = df_full['Удовлетворён предоставленной услугой']
)

# создаём списки с названиями признаков
ohe_columns = [
    'Пол', 'Путешествует с детьми', 'Путешествует по работе', 
    'Тип', 'Оценка качества питания'
]
ord_columns = [
    'Оценка комфортности покупки билета онлайн', 'Оценка качества wifi', 
    'Оценка комфортности времени отправления/прибытия'
]
num_columns = ['Возраст', 'Расстояние']

# создаём пайплайн для подготовки признаков из списка ohe_columns: заполнение пропусков и OHE-кодирование
# SimpleImputer + OHE
ohe_pipe = Pipeline(
    [
        (
            'simpleImputer_ohe', 
            SimpleImputer(missing_values=np.nan, strategy='most_frequent')
        ),
        (
            'ohe', 
            OneHotEncoder(drop='first', handle_unknown='ignore', sparse=False)
        )
    ]
)

# Создайте пайплайн для подготовки признаков из списка ord_columns:
# 1) заполните пропуски,
# 2) проведите Ordinal-кодирование.
ord_pipe = Pipeline(
    [
        (
            'simpleImputer_before_ord',
            SimpleImputer(missing_values=np.nan, strategy='most_frequent')
        ),
        (
            'ord',  
         OrdinalEncoder(
             categories=[
                 ['нормально', 'хорошо', 'плохо', 'отсутствует'],
                 ['нормально', 'хорошо', 'плохо', 'отсутствует'],
                 ['нормально', 'хорошо', 'плохо']
                ],
             handle_unknown='use_encoded_value', unknown_value=np.nan)
        ),
        (
         'simpleImputer_after_ord', 
         SimpleImputer(missing_values=np.nan, strategy='most_frequent')
        )
    ]
)
print(ord_pipe)

Результат
Pipeline(steps=[('simpleImputer_before_ord',
                 SimpleImputer(strategy='most_frequent')),
                ('ord',
                 OrdinalEncoder(categories=[['нормально', 'хорошо', 'плохо',
                                             'отсутствует'],
                                            ['нормально', 'хорошо', 'плохо',
                                             'отсутствует'],
                                            ['нормально', 'хорошо', 'плохо']],
                                handle_unknown='use_encoded_value',
                                unknown_value=nan)),
                ('simpleImputer_after_ord',
                 SimpleImputer(strategy='most_frequent'))])