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

السؤال

نشر

السلام عليكم

هو انا عندي تطبقه الIterativeImputer فا البيانات كلها انحولت لنوع float مع العلم ان كان في int وfloat ازي احل المشكله دي ؟

ده الكود 

data_train = ordinalencoder_data(data_train)

imputer = IterativeImputer(max_iter=5 , random_state=42 , initial_strategy='mean')

imputer_data = imputer.fit_transform(data_train)

data_train = pd.DataFrame(imputer_data , columns=data_train.columns)


print(data_train.info())

 

Recommended Posts

  • 0
نشر

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

هذا بسبب أن IterativeImputer يقوم بإستخادم طرق إحصائية لتقدير القيم المفقودة وأيضا الخوارزمية التي يعمل بها  تقوم بإجراء عمليات حسابية مما قد تتضمن قيم غير صحيحة  (قيم العشرية).

و لحل تلك المشكلة يمكننا أولا الإحتفاظ بقائمة الأعمدة ال int و ال float  قبل تطبيق الIterativeImputer ومن ثم بعد ذلك نقوم بتحويلها مرة أخرى إلى int.

int_columns = data_train.select_dtypes(include=['int64']).columns
float_columns = data_train.select_dtypes(include=['float64']).columns

imputer = IterativeImputer(max_iter=5, random_state=42, initial_strategy='mean')
imputer_data = imputer.fit_transform(data_train[float_columns])

data_train[float_columns] = imputer_data
data_train[int_columns] = data_train[int_columns].astype('int')

print(data_train.info())

 

  • 0
نشر
بتاريخ 3 دقائق مضت قال محمد عاطف17:

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

هذا بسبب أن IterativeImputer يقوم بإستخادم طرق إحصائية لتقدير القيم المفقودة وأيضا الخوارزمية التي يعمل بها  تقوم بإجراء عمليات حسابية مما قد تتضمن قيم غير صحيحة  (قيم العشرية).

و لحل تلك المشكلة يمكننا أولا الإحتفاظ بقائمة الأعمدة ال int و ال float  قبل تطبيق الIterativeImputer ومن ثم بعد ذلك نقوم بتحويلها مرة أخرى إلى int.

int_columns = data_train.select_dtypes(include=['int64']).columns
float_columns = data_train.select_dtypes(include=['float64']).columns

imputer = IterativeImputer(max_iter=5, random_state=42, initial_strategy='mean')
imputer_data = imputer.fit_transform(data_train[float_columns])

data_train[float_columns] = imputer_data
data_train[int_columns] = data_train[int_columns].astype('int')

print(data_train.info())

 

الف شكرااا جدا جدا لحضرتك

جزاك الله كل خير

  • 0
نشر

المشكلة هنا أن IterativeImputer يحول كل البيانات إلى float، حتى لو كانت بعض الأعمدة int، و هذا السلوك يحدث لأن imputer.fit_transform() يعيد مصفوفة numpy تحتوي على قيم float64، و الحل هو أنه بعد تحويل البيانات باستخدام IterativeImputer، يمكنك إجبار الأعمدة الصحيحة على العودة إلى نوع البيانات الأصلي باستخدام astype(int) للأعمدة التي كانت int بهذا الشكل:

for col in data_train.columns:
    if original_dtypes[col] == 'int64':
        data_train[col] = data_train[col].astype(int)

 

  • 0
نشر
بتاريخ 1 دقيقة مضت قال Chihab Hedidi:

المشكلة هنا أن IterativeImputer يحول كل البيانات إلى float، حتى لو كانت بعض الأعمدة int، و هذا السلوك يحدث لأن imputer.fit_transform() يعيد مصفوفة numpy تحتوي على قيم float64، و الحل هو أنه بعد تحويل البيانات باستخدام IterativeImputer، يمكنك إجبار الأعمدة الصحيحة على العودة إلى نوع البيانات الأصلي باستخدام astype(int) للأعمدة التي كانت int بهذا الشكل:

for col in data_train.columns:
    if original_dtypes[col] == 'int64':
        data_train[col] = data_train[col].astype(int)

 

الف شكرااا لحضرتك جدا 

جزاك الله كل خير

طيب معليش بس هو الكود ده اي الاخطاء 


data_train = ordinalencoder_data(data_train)

original_dtypes = data_train.dtypes.copy()

imputer = IterativeImputer(max_iter=5 , random_state=42 , initial_strategy='mean')

imputer_data = imputer.fit_transform(data_train)


data_train = pd.DataFrame(imputer_data , columns=data_train.columns)


data_train[original_dtypes.select_dtypes(include=['int64']).columns] = original_dtypes.select_dtypes(include=['int64']).astype(int)


print(data_train.info())

 

  • 0
نشر
بتاريخ 2 ساعة قال Ali Ahmed55:

الف شكرااا لحضرتك جدا 

جزاك الله كل خير

طيب معليش بس هو الكود ده اي الاخطاء 


data_train = ordinalencoder_data(data_train)

original_dtypes = data_train.dtypes.copy()

imputer = IterativeImputer(max_iter=5 , random_state=42 , initial_strategy='mean')

imputer_data = imputer.fit_transform(data_train)


data_train = pd.DataFrame(imputer_data , columns=data_train.columns)


data_train[original_dtypes.select_dtypes(include=['int64']).columns] = original_dtypes.select_dtypes(include=['int64']).astype(int)


print(data_train.info())

 

المشكلة في السطر التالي:

data_train[original_dtypes.select_dtypes(include=['int64']).columns] = original_dtypes.select_dtypes(include=['int64']).astype(int)

فما تريده هو تحويل الأعمدة التي كانت في الأصل من نوع صحيح int64 مرة أخرى إلى أعداد صحيحة بعد الإكمال، ولكن ما يتم في الكود هو تعيين أنواع البيانات الأصلية المحولة إلى أعداد صحيحة بدلاً من تحويل بيانات الأعمدة نفسها.

بمعنى original_dtypes.select_dtypes(include=['int64']).columns يجلب أسماء الأعمدة التي كانت في الأصل من نوع int64.

original_dtypes.select_dtypes(include=['int64']).astype(int) يعمل على تحويل أنواع البيانات التي تكون كائنات dtype إلى أعداد صحيحة، وذلك غير منطقي لأنك تريد تحويل القيم في الأعمدة إلى أعداد صحيحة وليس أنواع البيانات.

عليك تطبيق دالة astype(int) مباشرة على بيانات تلك الأعمدة وليس على معلومات أنواع البيانات. 

data_train = ordinalencoder_data(data_train)

original_dtypes = data_train.dtypes.copy()

imputer = IterativeImputer(max_iter=5, random_state=42, initial_strategy='mean')

imputer_data = imputer.fit_transform(data_train)

data_train = pd.DataFrame(imputer_data, columns=data_train.columns)

int_columns = original_dtypes[original_dtypes == 'int64'].index

data_train[int_columns] = data_train[int_columns].astype(int)

print(data_train.info())

 

  • 0
نشر
بتاريخ منذ ساعة مضت قال Mustafa Suleiman:

المشكلة في السطر التالي:

data_train[original_dtypes.select_dtypes(include=['int64']).columns] = original_dtypes.select_dtypes(include=['int64']).astype(int)

فما تريده هو تحويل الأعمدة التي كانت في الأصل من نوع صحيح int64 مرة أخرى إلى أعداد صحيحة بعد الإكمال، ولكن ما يتم في الكود هو تعيين أنواع البيانات الأصلية المحولة إلى أعداد صحيحة بدلاً من تحويل بيانات الأعمدة نفسها.

بمعنى original_dtypes.select_dtypes(include=['int64']).columns يجلب أسماء الأعمدة التي كانت في الأصل من نوع int64.

original_dtypes.select_dtypes(include=['int64']).astype(int) يعمل على تحويل أنواع البيانات التي تكون كائنات dtype إلى أعداد صحيحة، وذلك غير منطقي لأنك تريد تحويل القيم في الأعمدة إلى أعداد صحيحة وليس أنواع البيانات.

عليك تطبيق دالة astype(int) مباشرة على بيانات تلك الأعمدة وليس على معلومات أنواع البيانات. 

data_train = ordinalencoder_data(data_train)

original_dtypes = data_train.dtypes.copy()

imputer = IterativeImputer(max_iter=5, random_state=42, initial_strategy='mean')

imputer_data = imputer.fit_transform(data_train)

data_train = pd.DataFrame(imputer_data, columns=data_train.columns)

int_columns = original_dtypes[original_dtypes == 'int64'].index

data_train[int_columns] = data_train[int_columns].astype(int)

print(data_train.info())

 

تمام جدا 

الف شكرااا جدا لحضرتك

جزاك الله كل خير

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...