اذهب إلى المحتوى

السؤال

نشر

السلام عليكم

أنا أريد فقط تقريب القيم التي تم تعويضها (وليس كل القيم) إلى رقم عشري واحد بعد الفاصلة، فهل الكود التالي يحقق ذلك؟

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

 

Recommended Posts

  • 0
نشر

نعم، الكود الذي قدمته يقرّب جميع القيم في البيانات (بما في ذلك القيم التي تم تعويضها والقيم الأصلية) إلى رقم عشري واحد بعد الفاصلة باستخدام

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) دون تغيير.

  • 0
نشر

وعليكم السلام ورحمة الله وبركاته.

إن الجزء المسؤول عن التقريب في الكود لديك هو 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 في الأصل.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...