الدرس 6 من 8
تنضيف البيانات
الداتا الحقيقية عمرها ما بتيجي نضيفة.
شكل الداتا في الحقيقة
ده فورم تسجيل عملاء اتجمع من موقع. بص على المشاكل: مسافات زيادة، حروف كابيتال وسمول، سعر مكتوب كنص، صف متكرر، وقيم ناقصة.
import pandas as pd from io import StringIO raw = StringIO("""name,city,age,spent Ahmed , cairo,28,"1,200 EGP" Sara,GIZA,,850 EGP Omar,Cairo ,35,"2,500 EGP" Sara,GIZA,,850 EGP Laila,alexandria,240,400 EGP Youssef,,31,""") df = pd.read_csv(raw) print(df)
خطوة ١: المكرر
import pandas as pd from io import StringIO raw = StringIO("""name,city,age,spent Ahmed , cairo,28,"1,200 EGP" Sara,GIZA,,850 EGP Omar,Cairo ,35,"2,500 EGP" Sara,GIZA,,850 EGP Laila,alexandria,240,400 EGP Youssef,,31,""") df = pd.read_csv(raw) print("Duplicates:", df.duplicated().sum()) df = df.drop_duplicates() print("Rows now:", len(df))
خطوة ٢: النصوص
import pandas as pd from io import StringIO raw = StringIO("""name,city,age,spent Ahmed , cairo,28,"1,200 EGP" Sara,GIZA,,850 EGP Omar,Cairo ,35,"2,500 EGP" Laila,alexandria,240,400 EGP Youssef,,31,""") df = pd.read_csv(raw) # .str gives you string methods for a whole column df["name"] = df["name"].str.strip() df["city"] = df["city"].str.strip().str.title() # "1,200 EGP" -> 1200.0 df["spent"] = (df["spent"].str.replace(" EGP", "") .str.replace(",", "") .astype(float)) print(df) print(df.dtypes["spent"])
خطوة ٣: القيم الناقصة
عندك ٣ اختيارات: تمسح الصف (لو الناقص كتير أو مهم)، أو تملاه بقيمة معقولة زي الوسيط، أو تسيبه وتعلّم عليه. مفيش إجابة واحدة صح، بتفرق حسب الداتا.
import pandas as pd import numpy as np df = pd.DataFrame({ "name": ["Ahmed", "Sara", "Omar", "Laila", "Youssef"], "city": ["Cairo", "Giza", "Cairo", "Alexandria", None], "age": [28, np.nan, 35, 240, 31], "spent": [1200, 850, 2500, 400, np.nan], }) print(df.isna().sum()) # missing per column df["age"] = df["age"].fillna(df["age"].median()) # fill with median df["city"] = df["city"].fillna("Unknown") df = df.dropna(subset=["spent"]) # drop rows missing 'spent' print(df)
خطوة ٤: القيم المستحيلة
ليلى عندها ٢٤٠ سنة! غالباً اتكتبت ٢٤ وحد زود صفر. دي outlier لازم تتعامل معاها قبل ما تبوظ المتوسطات والموديل.
import pandas as pd df = pd.DataFrame({ "name": ["Ahmed", "Sara", "Omar", "Laila"], "age": [28, 31, 35, 240], }) valid = df["age"].between(10, 100) print(df[~valid]) # ~ means NOT -> show invalid rows df.loc[~valid, "age"] = pd.NA # mark as missing, decide later print(df)
🤖 ليه ده مهم للموديل؟أغلب موديلات الـ ML بتضرب لو لقت قيمة ناقصة، ومبتفهمش
"1,200 EGP" كرقم، وبتعتبر cairo و Cairo مدينتين مختلفتين. الموديل بيتعلم من اللي انت بتديهوله بالظبط، فأي غلطة هنا بتتحول لغلطة في التوقعات.