Ошибка ValueError: конструктор фрейма данных неправильно вызван ошибка при попытке вызова данных из конвейера

#python #pandas #scikit-learn #seaborn

Вопрос:

Я пытался визуализировать набор данных iris до и после использования StandardScaler с помощью seaborn, но при попытке определить фрейм данных я получил ошибку

Я нашел много похожих вопросов, но ни один из них не объяснял, как преобразовать данные конвейера в фрейм данных

         X = DATA.drop(['class'], axis = 'columns')
        y = DATA['class'].values
        
        X_train, X_test, y_train, y_test=train_test_split(X,y, test_size=0.20,random_state =42)

        gbl_pl=[]
        gbl_pl.append(('standard_scaler_gb',
        StandardScaler()))
        print(gbl_pl)           
        gblpq=Pipeline((gbl_pl))
        scaled_df=gblpq.fit(X_train,y_train)
        print(scaled_df.named_steps['standard_scaler_gb'].mean_)
      
        scaled_df =pd.DataFrame(scaled_df,
        columns=['petal_length', 'petal_width',
        'sepal_length','sepal_width'])        
        
        fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(6, 5))
        ax1.set_title('Before Scaling')
        sns.kdeplot(X['petal_length'], ax=ax1)
        sns.kdeplot(X['petal_width'], ax=ax1)
        sns.kdeplot(X['sepal_length'], ax=ax1)
        sns.kdeplot(X['sepal_width'], ax=ax1)
                
        ax2.set_title('After Standard Scaler')
        sns.kdeplot(scaled_df['petal_length'], ax=ax2)
        sns.kdeplot(scaled_df['petal_width'], ax=ax2)
        sns.kdeplot(scaled_df['sepal_length'], ax=ax2)
        sns.kdeplot(scaled_df['sepal_width'], ax=ax2)
        plt.savefig("output73.png")

 

Ошибка

     columns=['petal_length', 'petal_width',
   File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.8/site-packages/pandas/core/frame.py", line 509, in __init__
     raise ValueError("DataFrame constructor not properly called!")
 ValueError: DataFrame constructor not properly called!

 

Комментарии:

1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не комментарий) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.

2. @furas Моя оригинальная программа на самом деле очень большая , поэтому обратная связь очень длинная, но я обновил ее со всеми обратными связями, связанными с библиотекой pandas

Ответ №1:

Вы объединяете трансформаторы ( StandardScaler и Pipeline ) с данными. Возвращаемое значение вашего gblpq.fit(X_train y_train) объекта-это объект конвейера, а не данные. Чтобы получить масштабированные данные, вы можете использовать метод конвейера transform (или комбинацию удобства fit_transform ).

     ...
    scaled_df = gblpq.fit_transform(X_train, y_train)
    # gblpq is now fitted and contains learned statistics like the means:
    print(gblpq.named_steps['standard_scaler_gb'].mean_)
    # while scaled_df contains the transformed data as a numpy array
    
    scaled_df = pd.DataFrame(
        scaled_df,
        columns = [petal_length', petal_width', 'sepal_length', 'sepal_width']
    )
    ...
 

Комментарии:

1. можете ли вы просто показать пример получения масштабированных данных из конвейера?

2. Сейчас это работает нормально , спасибо за объяснение разницы между gbpq, который содержит статистику, и scaled_df, который содержит данные