diff --git a/function/data_processor_date.py b/function/data_processor_date.py index 6e6b069..d264cf3 100644 --- a/function/data_processor_date.py +++ b/function/data_processor_date.py @@ -211,19 +211,27 @@ class DataProcessor: processor = self.preprocessing_methods[method_name](**params) + # 分离特征和标签 + features = df.drop('target', axis=1) + target = df['target'] + # 根据不同类型的方法进行处理 if method_name in ['IsolationForest', 'OneClassSVM', 'LocalOutlierFactor', 'EllipticEnvelope']: # 异常值检测方法 - mask = processor.fit_predict(df) != -1 - df = df[mask] + mask = processor.fit_predict(features) != -1 + features = features[mask] + target = target[mask] else: # 其他预处理方法 - df = pd.DataFrame( - processor.fit_transform(df), - columns=df.columns, - index=df.index + features = pd.DataFrame( + processor.fit_transform(features), + columns=features.columns, + index=features.index ) + # 重新组合特征和标签 + df = pd.concat([features, target], axis=1) + self.logger.info(f"Applied preprocessing method {method_name}") return df @@ -236,17 +244,21 @@ class DataProcessor: try: method_name = method['method_name'] params = method.get('params', {}) - columns = method.get('columns', df.columns) + columns = method.get('columns', df.drop('target', axis=1).columns) # 排除target列 if method_name not in self.feature_engineering_methods: raise ValueError(f"Unknown feature engineering method: {method_name}") processor = self.feature_engineering_methods[method_name](**params) + # 分离特征和标签 + features = df.drop('target', axis=1) + target = df['target'] + # 根据不同类型的特征工程方法进行处理 if method_name in ['LabelEncoder', 'OneHotEncoder']: # 编码方法 - df_temp = df[columns].copy() + df_temp = features[columns].copy() if method_name == 'LabelEncoder': for col in columns: df_temp[col] = processor.fit_transform(df_temp[col]) @@ -256,17 +268,17 @@ class DataProcessor: encoded = pd.DataFrame( encoded, columns=[f"{col}_{i}" for col in columns for i in range(encoded.shape[1]//len(columns))], - index=df.index + index=features.index ) df_temp = encoded - # 更新原始数据框 - df = df.drop(columns=columns) - df = pd.concat([df, df_temp], axis=1) + # 更新特征数据框 + features = features.drop(columns=columns) + features = pd.concat([features, df_temp], axis=1) elif method_name in ['KBinsDiscretizer']: # 离散化方法 - transformed = processor.fit_transform(df[columns]) + transformed = processor.fit_transform(features[columns]) if processor.encode == 'onehot': feature_names = [f"{col}_{i}" for col in columns for i in range(processor.n_bins_)] else: @@ -275,33 +287,36 @@ class DataProcessor: df_temp = pd.DataFrame( transformed, columns=feature_names, - index=df.index + index=features.index ) - df = df.drop(columns=columns) - df = pd.concat([df, df_temp], axis=1) + features = features.drop(columns=columns) + features = pd.concat([features, df_temp], axis=1) elif method_name in ['PCA', 'SelectKBest', 'RFE']: # 降维和特征选择方法 - transformed = processor.fit_transform(df[columns]) + transformed = processor.fit_transform(features[columns]) n_features = transformed.shape[1] df_temp = pd.DataFrame( transformed, columns=[f"feature_{i}" for i in range(n_features)], - index=df.index + index=features.index ) - df = df.drop(columns=columns) - df = pd.concat([df, df_temp], axis=1) + features = features.drop(columns=columns) + features = pd.concat([features, df_temp], axis=1) else: # 其他特征工程方法 - transformed = processor.fit_transform(df[columns]) + transformed = processor.fit_transform(features[columns]) df_temp = pd.DataFrame( transformed, columns=[f"{col}_transformed" for col in columns], - index=df.index + index=features.index ) - df = df.drop(columns=columns) - df = pd.concat([df, df_temp], axis=1) + features = features.drop(columns=columns) + features = pd.concat([features, df_temp], axis=1) + + # 重新组合特征和标签 + df = pd.concat([features, target], axis=1) self.logger.info(f"Applied feature engineering method {method_name}") return df