تعديل المحتوى الموضوع * -- اختر موضوع --C# CourseCSSHTMLJava ScriptPython Fundamentals اساسياتSQL Serverرواية الفيل الأزرقمواضيع متنوعة الوحدة * -- اختر وحدة --1. الوحدة 1: الانطلاقة (1)2. الوحدة 2: الأساسيات (2)3. الوحدة 3: التحكم في مسار البرنامج (3)4. الوحدة 4: هياكل البيانات (4)5. الوحدة 5: الدوال وتنظيم الكود (5)6. الوحدة 6: الملفات والمدخلات والمخرجات (6)7. الوحدة 7: البرمجة الكائنية OOP (7)8. الوحدة 8: مكتبات Python الأساسية (8)9. الوحدة 9: مقدمة تحليل البيانات (9) ترتيب الدرس ترتيب ظهور الدرس داخل الوحدة عنوان المحتوى * محتوى الدرس * (17089 حرف) <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>الدرس 9.4: التعديل على البيانات (تنظيف – فرز – تصفية)</title> <script src="https://cdn.tailwindcss.com"></script> <link href="https://fonts.googleapis.com/css2?family=Tajawal:wght@300;400;700;800&display=swap" rel="stylesheet"> <style> body { font-family: 'Tajawal', sans-serif; background-color: #f8fafc; color: #1e293b; } .section-card { background: white; border-radius: 1rem; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); padding: 2rem; margin-bottom: 2rem; border-right: 5px solid #10b981; } .icon-box { display: inline-flex; align-items: center; justify-content: center; width: 3rem; height: 3rem; border-radius: 0.5rem; margin-left: 0.75rem; font-size: 1.7rem; } .code-block { position: relative; background-color: #1e293b; color: #e2e8f0; border-radius: 0.75rem; padding: 1.5rem; font-family: 'Courier New', monospace; overflow-x: auto; text-align: left; direction: ltr; margin-top: 1rem; white-space: pre; font-size: 1.05rem; border: 2px solid #0f172a; } .copy-btn { position: absolute; top: 0.5rem; right: 0.5rem; background-color: #334155; color: white; border: 1px solid #475569; padding: 0.3rem 0.9rem; border-radius: 0.25rem; font-size: 0.85rem; cursor: pointer; transition: 0.2s; font-family: 'Tajawal', sans-serif; } .copy-btn:hover { background-color: #475569; } .copy-btn.copied { background-color: #10b981; border-color: #10b981; } .try-btn { margin-top: 0.5rem; background-color: #10b981; color: white; padding: 0.55rem 1.2rem; border-radius: 0.45rem; font-size: 0.95rem; font-weight: 700; display: inline-block; cursor: pointer; transition: 0.2s; box-shadow: 0 3px 5px rgba(16, 185, 129, 0.22); } .try-btn:hover { background-color: #059669; transform: translateY(-1px); box-shadow: 0 4px 8px rgba(16, 185, 129, 0.28); } .py-comment { color:#94a3b8; font-style:italic; } .py-str { color:#4ade80; } .py-func { color:#60a5fa; } .py-num { color:#facc15; } .py-import { color:#a5b4fc; font-weight:bold; } </style> </head> <body> <div class="p-4 md:p-8 max-w-6xl mx-auto"> <!-- Header --> <header class="text-center mb-12"> <h1 class="text-4xl md:text-5xl font-extrabold text-green-700 mb-4"> الدرس 9.4: التعديل على البيانات (تنظيف – فرز – تصفية) </h1> <p class="text-2xl text-gray-600"> كيف نحول البيانات الخام إلى بيانات جاهزة للتحليل باستخدام Pandas </p> </header> <!-- Section 1: مقدمة --> <section class="section-card"> <h2 class="text-3xl font-bold mb-6 flex items-center"> <span class="icon-box bg-green-100 text-green-700">🧹</span> لماذا نحتاج إلى تنظيف وفرز وتصفية البيانات؟ </h2> <p class="text-xl text-gray-700 mb-4"> في الواقع العملي، البيانات نادرًا ما تأتي نظيفة وجاهزة للتحليل. غالبًا نجد: </p> <ul class="list-disc pr-6 text-gray-700 text-xl space-y-2"> <li>قيم ناقصة (Missing Values).</li> <li>صفوف غير مهمة أو مكررة.</li> <li>قيم غير منطقية أو خارج نطاق معين.</li> </ul> <p class="text-xl text-gray-700 mt-4"> مكتبة <strong>Pandas</strong> توفر أدوات قوية لـ: </p> <ul class="list-disc pr-6 text-gray-700 text-xl space-y-2"> <li><strong>تنظيف البيانات:</strong> التعامل مع القيم الناقصة، تعديل الأسماء، حذف الصفوف غير المطلوبة.</li> <li><strong>فرز البيانات:</strong> ترتيب الجدول حسب عمود أو أكثر.</li> <li><strong>تصفية البيانات:</strong> اختيار جزء معين من البيانات حسب شروط معينة.</li> </ul> </section> <!-- Section 2: مثال DataFrame سنعمل عليه --> <section class="section-card" style="border-right-color:#0ea5e9;"> <h2 class="text-3xl font-bold mb-6 flex items-center"> <span class="icon-box bg-blue-100 text-blue-700">📋</span> إنشاء جدول بيانات تجريبي </h2> <p class="text-xl text-gray-700 mb-4"> سننشئ DataFrame يحتوي على بيانات موظفين، مع بعض القيم الناقصة لاستخدامها في الأمثلة: </p> <div class="code-block"> <button class="copy-btn" onclick="copyCode('df-sample', this)">نسخ</button> <code id="df-sample"> <span class="py-import">import</span> pandas <span class="py-func">as</span> pd <span class="py-import">import</span> numpy <span class="py-func">as</span> np data = { <span class="py-str">"name"</span>: [<span class="py-str">"Ali"</span>, <span class="py-str">"Sara"</span>, <span class="py-str">"Omar"</span>, <span class="py-str">"Mona"</span>, <span class="py-str">"Laila"</span>], <span class="py-str">"age"</span>: [<span class="py-num">25</span>, <span class="py-num">np.nan</span>, <span class="py-num">30</span>, <span class="py-num">28</span>, <span class="py-num">np.nan</span>], <span class="py-str">"salary"</span>: [<span class="py-num">8000</span>, <span class="py-num">7500</span>, <span class="py-num">np.nan</span>, <span class="py-num">9000</span>, <span class="py-num">8500</span>], <span class="py-str">"city"</span>: [<span class="py-str">"Riyadh"</span>, <span class="py-str">"Jeddah"</span>, <span class="py-str">"Riyadh"</span>, <span class="py-str">"Dammam"</span>, <span class="py-str">"Riyadh"</span>] } df = pd.DataFrame(data) <span class="py-func">print</span>(df) </code> </div> <button class="try-btn" onclick="runCode('df-sample')">▶️ تجربة الكود</button> </section> <!-- Section 3: التعامل مع القيم الناقصة --> <section class="section-card" style="border-right-color:#f97316;"> <h2 class="text-3xl font-bold mb-6 flex items-center"> <span class="icon-box bg-orange-100 text-orange-700">❓</span> تنظيف البيانات: القيم الناقصة (NaN) </h2> <p class="text-xl text-gray-700 mb-4"> القيم الناقصة في Pandas تمثّل عادة بـ <strong>NaN</strong> (من NumPy). يمكن التعامل معها بعدة طرق حسب الحالة: </p> <ul class="list-disc pr-6 text-gray-700 text-xl space-y-2"> <li><strong>حذف الصفوف الناقصة:</strong> عند كون الصف غير مهم.</li> <li><strong>ملء القيم:</strong> مثل وضع متوسط، صفر، أو قيمة ثابتة.</li> </ul> <div class="code-block"> <button class="copy-btn" onclick="copyCode('df-missing', this)">نسخ</button> <code id="df-missing"> <span class="py-import">import</span> pandas <span class="py-func">as</span> pd <span class="py-import">import</span> numpy <span class="py-func">as</span> np data = { <span class="py-str">"name"</span>: [<span class="py-str">"Ali"</span>, <span class="py-str">"Sara"</span>, <span class="py-str">"Omar"</span>, <span class="py-str">"Mona"</span>], <span class="py-str">"age"</span>: [<span class="py-num">25</span>, <span class="py-num">np.nan</span>, <span class="py-num">30</span>, <span class="py-num">28</span>], <span class="py-str">"salary"</span>: [<span class="py-num">8000</span>, <span class="py-num">7500</span>, <span class="py-num">np.nan</span>, <span class="py-num">9000</span>] } df = pd.DataFrame(data) <span class="py-comment"># 1) معرفة القيم الناقصة</span> <span class="py-func">print</span>(df.isna()) <span class="py-comment"># 2) حذف الصفوف التي تحتوي على NaN</span> cleaned = df.dropna() <span class="py-func">print</span>(cleaned) <span class="py-comment"># 3) ملء القيم الناقصة في العمر بمتوسط العمر</span> mean_age = df[<span class="py-str">"age"</span>].mean() df[<span class="py-str">"age"</span>] = df[<span class="py-str">"age"</span>].fillna(mean_age) <span class="py-comment"># 4) ملء الرواتب الناقصة بقيمة ثابتة (مثلاً 0)</span> df[<span class="py-str">"salary"</span>] = df[<span class="py-str">"salary"</span>].fillna(<span class="py-num">0</span>) <span class="py-func">print</span>(df) </code> </div> <button class="try-btn" onclick="runCode('df-missing')">▶️ تجربة الكود</button> </section> <!-- Section 4: فرز البيانات --> <section class="section-card" style="border-right-color:#6366f1;"> <h2 class="text-3xl font-bold mb-6 flex items-center"> <span class="icon-box bg-indigo-100 text-indigo-700">⬆️⬇️</span> فرز البيانات sort_values </h2> <p class="text-xl text-gray-700 mb-4"> يمكن ترتيب الصفوف حسب عمود معيّن (أو أكثر)، تصاعديًا أو تنازليًا: </p> <div class="code-block"> <button class="copy-btn" onclick="copyCode('df-sort', this)">نسخ</button> <code id="df-sort"> <span class="py-import">import</span> pandas <span class="py-func">as</span> pd data = { <span class="py-str">"name"</span>: [<span class="py-str">"Ali"</span>, <span class="py-str">"Sara"</span>, <span class="py-str">"Omar"</span>, <span class="py-str">"Mona"</span>], <span class="py-str">"age"</span>: [<span class="py-num">25</span>, <span class="py-num">22</span>, <span class="py-num">30</span>, <span class="py-num">28</span>], <span class="py-str">"salary"</span>: [<span class="py-num">8000</span>, <span class="py-num">7500</span>, <span class="py-num">9000</span>, <span class="py-num">8500</span>] } df = pd.DataFrame(data) <span class="py-comment"># فرز حسب العمر تصاعديًا</span> by_age = df.sort_values(by=<span class="py-str">"age"</span>) <span class="py-func">print</span>(by_age) <span class="py-comment"># فرز حسب الراتب تنازليًا</span> by_salary_desc = df.sort_values(by=<span class="py-str">"salary"</span>, ascending=<span class="py-func">False</span>) <span class="py-func">print</span>(by_salary_desc) </code> </div> <button class="try-btn" onclick="runCode('df-sort')">▶️ تجربة الكود</button> </section> <!-- Section 5: تصفية البيانات (Filtering) --> <section class="section-card" style="border-right-color:#8b5cf6;"> <h2 class="text-3xl font-bold mb-6 flex items-center"> <span class="icon-box bg-purple-100 text-purple-700">🎯</span> تصفية البيانات باستخدام الشروط (Filtering) </h2> <p class="text-xl text-gray-700 mb-4"> التصفية تعني اختيار الصفوف التي تحقق شرطًا معيّنًا، مثل: <strong>كل الموظفين من مدينة معيّنة، أو من لديهم راتب أكبر من قيمة معينة</strong>. </p> <div class="code-block"> <button class="copy-btn" onclick="copyCode('df-filter', this)">نسخ</button> <code id="df-filter"> <span class="py-import">import</span> pandas <span class="py-func">as</span> pd data = { <span class="py-str">"name"</span>: [<span class="py-str">"Ali"</span>, <span class="py-str">"Sara"</span>, <span class="py-str">"Omar"</span>, <span class="py-str">"Mona"</span>, <span class="py-str">"Laila"</span>], <span class="py-str">"age"</span>: [<span class="py-num">25</span>, <span class="py-num">22</span>, <span class="py-num">30</span>, <span class="py-num">28</span>, <span class="py-num">27</span>], <span class="py-str">"salary"</span>: [<span class="py-num">8000</span>, <span class="py-num">7500</span>, <span class="py-num">9000</span>, <span class="py-num">8500</span>, <span class="py-num">7000</span>], <span class="py-str">"city"</span>: [<span class="py-str">"Riyadh"</span>, <span class="py-str">"Jeddah"</span>, <span class="py-str">"Riyadh"</span>, <span class="py-str">"Dammam"</span>, <span class="py-str">"Riyadh"</span>] } df = pd.DataFrame(data) <span class="py-comment"># الموظفون الذين رواتبهم أكبر من 8000</span> high_salary = df[df[<span class="py-str">"salary"</span>] > <span class="py-num">8000</span>] <span class="py-func">print</span>(high_salary) <span class="py-comment"># الموظفون من مدينة الرياض فقط</span> riyadh_only = df[df[<span class="py-str">"city"</span>] == <span class="py-str">"Riyadh"</span>] <span class="py-func">print</span>(riyadh_only) <span class="py-comment"># شرط مركّب: من الرياض وراتبهم >= 8000</span> cond = (df[<span class="py-str">"city"</span>] == <span class="py-str">"Riyadh"</span>) & (df[<span class="py-str">"salary"</span>] >= <span class="py-num">8000</span>) filtered = df[cond] <span class="py-func">print</span>(filtered) </code> </div> <button class="try-btn" onclick="runCode('df-filter')">▶️ تجربة الكود</button> <p class="text-xl text-gray-700 mt-4"> نستخدم العلامة <strong>&</strong> للجمع بين شرطين (AND)، والعلامة <strong>|</strong> للتعبير عن (OR) عند الحاجة. </p> </section> <!-- Section 6: إضافة وتعديل الأعمدة --> <section class="section-card" style="border-right-color:#f97316;"> <h2 class="text-3xl font-bold mb-6 flex items-center"> <span class="icon-box bg-orange-100 text-orange-700">➕</span> إضافة أعمدة جديدة وتعديل القيم </h2> <p class="text-xl text-gray-700 mb-4"> يمكن بسهولة إنشاء أعمدة جديدة اعتمادًا على أعمدة موجودة، مثل احتساب ضريبة أو درجة نهائية: </p> <div class="code-block"> <button class="copy-btn" onclick="copyCode('df-add-column', this)">نسخ</button> <code id="df-add-column"> <span class="py-import">import</span> pandas <span class="py-func">as</span> pd data = { <span class="py-str">"name"</span>: [<span class="py-str">"Ali"</span>, <span class="py-str">"Sara"</span>, <span class="py-str">"Omar"</span>], <span class="py-str">"salary"</span>: [<span class="py-num">8000</span>, <span class="py-num">7500</span>, <span class="py-num">9000</span>] } df = pd.DataFrame(data) <span class="py-comment"># إضافة عمود نسبة الضريبة 15%</span> df[<span class="py-str">"tax"</span>] = df[<span class="py-str">"salary"</span>] * <span class="py-num">0.15</span> <span class="py-comment"># إضافة عمود صافي الراتب بعد الضريبة</span> df[<span class="py-str">"net_salary"</span>] = df[<span class="py-str">"salary"</span>] - df[<span class="py-str">"tax"</span>] <span class="py-func">print</span>(df) </code> </div> <button class="try-btn" onclick="runCode('df-add-column')">▶️ تجربة الكود</button> </section> <!-- Section 7: تمرين عملي --> <section class="section-card" style="border-right-color:#ec4899;"> <h2 class="text-3xl font-bold mb-6 flex items-center"> <span class="icon-box bg-pink-100 text-pink-700">🧪</span> تمرين عملي (مرقّم) </h2> <div class="bg-pink-50 p-6 rounded-lg border border-pink-200 text-right"> <h3 class="text-pink-900 font-bold mb-4 text-2xl">المطلوب منك:</h3> <ol class="space-y-4 text-gray-700 text-xl list-decimal pr-6"> <li> أنشئ DataFrame يحتوي على بيانات 6 طلاب: <br> الأعمدة: <strong>name, math, physics, english</strong>. <br> ضع بعض القيم الناقصة (NaN) في الدرجات. </li> <li> استخدم <code>isna()</code> لمعرفة مواضع القيم الناقصة، ثم استخدم <code>fillna()</code> لملء القيم الناقصة في كل مادة بمتوسط درجات تلك المادة. </li> <li> أضف عمودًا جديدًا باسم <strong>total</strong> يمثل مجموع درجات المواد الثلاث لكل طالب. </li> <li> فرز الجدول تنازليًا حسب عمود <strong>total</strong> لاختيار أعلى الطلاب درجة. </li> <li> أنشئ تصفية (filter) لاختيار الطلاب الذين: <ul class="list-disc pr-6 mt-2"> <li>مجموع درجاتهم أكبر من أو يساوي 240.</li> <li>واطبع أسماءهم فقط.</li> </ul> </li> </ol> </div> </section> <footer class="text-center text-gray-400 text-lg mt-8 pb-8"> الدرس 9.4 — التعديل على البيانات (تنظيف – فرز – تصفية) </footer> </div> <script> function copyCode(elementId, btnElement=null) { const text = document.getElementById(elementId).innerText; const textarea = document.createElement('textarea'); textarea.value = text; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); textarea.remove(); if (btnElement) { const original = btnElement.innerText; btnElement.innerText = "تم النسخ!"; btnElement.classList.add('copied'); setTimeout(() => { btnElement.innerText = original; btnElement.classList.remove('copied'); }, 1500); } } function runCode(elementId) { copyCode(elementId); window.open("/python/trypython", "_blank"); } </script> </body> </html> حفظ إلغاء حفظ وإضافة جديد