Ali Ahmed55 نشر 7 يونيو أرسل تقرير نشر 7 يونيو السلام عليكم أنا أريد فقط تقريب القيم التي تم تعويضها (وليس كل القيم) إلى رقم عشري واحد بعد الفاصلة، فهل الكود التالي يحقق ذلك؟ def handle_missing_values(data, save_path): numeric_features = data.select_dtypes(include=['number']).columns.tolist() text_features = data.select_dtypes(include=['object']).columns.tolist() preprocessor = ColumnTransformer( transformers=[ ('num',IterativeImputer(),numeric_features), ('text', 'passthrough', text_features), ] ) df_transformed = preprocessor.fit_transform(data) features_names = numeric_features + text_features data = pd.DataFrame(df_transformed, columns=features_names) if save_path is not None: data.round(1).to_csv(save_path, index=False) return data 2 اقتباس
0 بلال زيادة نشر 7 يونيو أرسل تقرير نشر 7 يونيو نعم، الكود الذي قدمته يقرّب جميع القيم في البيانات (بما في ذلك القيم التي تم تعويضها والقيم الأصلية) إلى رقم عشري واحد بعد الفاصلة باستخدام data.round(1) قبل حفظ البيانات إلى ملف CSV. لكن إذا كنت تريد تقريب القيم التي تم تعويضها فقط (أي القيم التي أُنتجت من IterativeImputer) دون التأثير على القيم الأصلية، فإن الكود الحالي لا يحقق ذلك. لتقريب القيم التي تم تعويضها فقط، تحتاج إلى تتبع الأماكن التي تحتوي على قيم مفقودة في البيانات الأصلية (مثل NaN)، ثم تطبيق التقريب فقط على تلك القيم بعد عملية التعويض. يمكن تحقيق ذلك بالطريقة التالية: import pandas as pd import numpy as np from sklearn.compose import ColumnTransformer from sklearn.impute import IterativeImputer def handle_missing_values(data, save_path): # تحديد الأعمدة الرقمية والنصية numeric_features = data.select_dtypes(include=['number']).columns.tolist() text_features = data.select_dtypes(include=['object']).columns.tolist() # تخزين قناع القيم المفقودة في الأعمدة الرقمية missing_mask = data[numeric_features].isna() # إعداد المعالج preprocessor = ColumnTransformer( transformers=[ ('num', IterativeImputer(), numeric_features), ('text', 'passthrough', text_features), ] ) # تحويل البيانات df_transformed = preprocessor.fit_transform(data) # إنشاء DataFrame جديد بالأسماء features_names = numeric_features + text_features data_transformed = pd.DataFrame(df_transformed, columns=features_names) # تقريب القيم التي تم تعويضها فقط إلى رقم عشري واحد for col in numeric_features: # تطبيق التقريب فقط على القيم التي كانت مفقودة data_transformed.loc[missing_mask[col], col] = data_transformed.loc[missing_mask[col], col].round(1) # حفظ البيانات إذا تم توفير مسار if save_path is not None: data_transformed.to_csv(save_path, index=False) return data_transformed قبل التعويض، يتم إنشاء (missing_mask) باستخدام isna() لتحديد مواقع القيم المفقودة (NaN) في الأعمدة الرقمية. بعد التحويل باستخدام ColumnTransformer، يتم تطبيق round(1) فقط على القيم في الأعمدة الرقمية التي كانت مفقودة (باستخدام القناع missing_mask)، القيم التي لم تكن مفقودة (غير NaN) تبقى دون تغيير. إذا كانت لديك بيانات مثل data = pd.DataFrame({ 'A': [1.234, np.nan, 3.456], 'B': ['x', 'y', 'z'] }) فإن الكود المعدل سيُعوض القيمة المفقودة في العمود A (مثلًا تصبح 2.34567) ثم يقربها إلى 2.3، بينما تبقى القيم الأصلية (1.234 و3.456) دون تغيير. 1 اقتباس
0 محمد_عاطف نشر 7 يونيو أرسل تقرير نشر 7 يونيو وعليكم السلام ورحمة الله وبركاته. إن الجزء المسؤول عن التقريب في الكود لديك هو data.round(1) هنا : بتاريخ 4 دقائق مضت قال Ali Ahmed55: data.round(1).to_csv(save_path, index=False) و هذا السطر يقوم بتقريب جميع القيم في DataFrame data بعد تعويض القيم المفقودة إلى رقم عشري واحد وليس فقط القيم التي تم تعويضها بواسطة IterativeImputer أى الكود ليس صحيحا لما تريد تنفيذه. ولتنفيذ ما تريده ستحتاج إلى طريقة لتتبع هذه القيم وتطبيق التقريب عليها بشكل منفصل. حيث للأسف IterativeImputer لا يوفر طريقة مباشرة للقيام بذلك بعد عملية التعويض. def handle_missing_values(data, save_path): # عمل نسخة من البيانات الأصلية للحفاظ على الدقة الأصلية original_data = data.copy() numeric_features = data.select_dtypes(include=['number']).columns.tolist() text_features = data.select_dtypes(include=['object']).columns.tolist() preprocessor = ColumnTransformer( transformers=[ ('num', IterativeImputer(), numeric_features), ('text', 'passthrough', text_features), ] ) df_transformed = preprocessor.fit_transform(data) features_names = numeric_features + text_features data_imputed = pd.DataFrame(df_transformed, columns=features_names) # تقريب فقط القيم التي تم تعويضها (التي كانت مفقودة أصلاً) for col in numeric_features: mask = original_data[col].isna() # تحديد القيم المفقودة الأصلية data_imputed.loc[mask, col] = data_imputed.loc[mask, col].round(1) # تقريبها فقط if save_path is not None: data_imputed.to_csv(save_path, index=False) return data_imputed حيث أولا نقوم بعمل نسخة من ال data قبل أي تعويض وحفظها في original_data. بعد ذلك نقوم بتحديد القيم التي تم تعويضها فنستخدم original_data[col].isna() للكشف عن تلك القيمة هل هي كانت مفقودة أم لا. وم ثم نطبق .round(1) فقط على القيم التي تم تعويضها أى التي كانت NaN في الأصل. 1 اقتباس
0 Ali Ahmed55 نشر 7 يونيو الكاتب أرسل تقرير نشر 7 يونيو الف شكراا جدا لحضرتكم جزاكم الله كل خير اقتباس
السؤال
Ali Ahmed55
السلام عليكم
أنا أريد فقط تقريب القيم التي تم تعويضها (وليس كل القيم) إلى رقم عشري واحد بعد الفاصلة، فهل الكود التالي يحقق ذلك؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.