{"id":"l-pda-2-4","courseId":"python-data-analysis","lang":"ar","kind":"lesson","summary":"صفِّ الصفوف بالأقنعة المنطقية، وادمج الشروط بـ &amp; و | و ~، واستخدم isin و between للتصفيات الشائعة، ورتّب الصفوف أو اختر أعلاها بـ sort_values و nlargest.","html":"<p>سؤال رئيس النمو له نافذة زمنية: الربع الرابع من 2025. قبل أن تستطيع تفسير ذلك الربع، تحتاج إلى عزله، ثم تقطيعه أكثر: أيّ هذه الطلبات استخدم كوبونًا، وأيّها جاء عبر الـ marketplace، وأيّها كان من طلبات الجمعة السوداء. كل واحد من هذه الأسئلة تصفية، وتصفّي pandas بالطريقة نفسها في كل مرة: ابنِ عمودًا من <code dir=\"ltr\">True</code>/<code dir=\"ltr\">False</code>، ثم احتفظ بصفوف <code dir=\"ltr\">True</code>.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">الأقنعة المنطقية</h2>\n<p>المقارنة على عمود لا تعيد إجابة واحدة؛ بل تعيد إجابة لكل صف:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"0\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">is_free </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"shipping_fee\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 0</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(is_free.head())</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(is_free.sum(), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders with free shipping\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">round</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(is_free.mean(), </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"share of all orders\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>تُسمّى تلك الـ Series المنطقية <strong>قناعًا (mask)</strong>. جمعه يعدّ قيم <code dir=\"ltr\">True</code>، ومتوسطه هو حصة الصفوف المطابقة: 43% من طلبات Cartwheel شُحنت مجانًا. كثيرًا ما تعرف ما تحتاجه من العدد وحده، دون تصفية أي شيء.</p>\n<p>لتحتفظ بالصفوف المطابقة، ضع القناع داخل الأقواس المربعة، أو داخل <code dir=\"ltr\">.loc</code> حين تريد أيضًا اختيار الأعمدة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"1\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">cancelled </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"cancelled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">len</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(cancelled))</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(orders.loc[orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"shipping_fee\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, [</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"channel\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"coupon_code\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]].head())</span></span></code></pre><div class=\"run-output\" data-run-output=\"1\" hidden></div></div>\n<h2 id=\"sec-2\" tabindex=\"-1\">دمج الشروط</h2>\n<p>الأسئلة الحقيقية فيها عدة شروط. تستخدم pandas العلامة <code dir=\"ltr\">&amp;</code> بمعنى “و”، و<code dir=\"ltr\">|</code> بمعنى “أو”، و<code dir=\"ltr\">~</code> بمعنى “ليس”، وتطبّقها صفًا بصف:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"2\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">in_q4 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">>=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"2025-10-01\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">&#x26;</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">&#x3C;</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"2026-01-01\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">not_cancelled </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">!=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"cancelled\"</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">q4 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[in_q4 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">&#x26;</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> not_cancelled]</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">len</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(orders[in_q4]), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders in Q4 2025,\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">len</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(q4), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"not cancelled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(q4[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"channel\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].value_counts())</span></span></code></pre><div class=\"run-output\" data-run-output=\"2\" hidden></div></div>\n<p>منح كل قناع اسمًا، كما هنا، يُبقي التصفيات الطويلة مقروءة، ويتيح لك طباعة كل شرط وعدّه منفردًا حين تبدو نتيجة خاطئة. ويمكن مقارنة عمود datetime بتاريخ مكتوب كنص، <code dir=\"ltr\">&quot;2025-10-01&quot;</code>، فتحوّله pandas نيابةً عنك. والحد الأعلى هو “قبل 1 يناير”، لا “في 31 ديسمبر أو قبله”، لأن طلبات 31 ديسمبر لها وقت بعد منتصف الليل.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>and و or والأقواس المفقودة</span></p>\n<p>الكود <code dir=\"ltr\">orders[a == 1 and b == 2]</code> يسبّب <code dir=\"ltr\">ValueError: The truth value of a Series is ambiguous</code>. الكلمة <code dir=\"ltr\">and</code> في Python تريد True أو False واحدة، والـ Series فيها قيم كثيرة. استخدم <code dir=\"ltr\">&amp;</code>. وضع كل شرط بين قوسين: <code dir=\"ltr\">&amp;</code> أقوى ارتباطًا من <code dir=\"ltr\">==</code>، فيُقيَّم <code dir=\"ltr\">orders[&quot;channel&quot;] == &quot;web&quot; &amp; orders[&quot;shipping_fee&quot;] == 0</code> بترتيب خاطئ ويفشل.</p>\n</aside>\n<h2 id=\"sec-3\" tabindex=\"-1\">طريقان مختصران: isin و between</h2>\n<p>مطابقة أيٍّ من عدة قيم بسلاسل من <code dir=\"ltr\">|</code> تصبح طويلة. أما <code dir=\"ltr\">isin</code> فتأخذ قائمة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"3\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">problem </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].isin([</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"cancelled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"returned\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(problem.sum(), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"cancelled or returned\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">black_friday_week </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].between(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"2025-11-24\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"2025-11-30 23:59:59\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(black_friday_week.sum(), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders in Black Friday week 2025\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">bf </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"coupon_code\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"BLACKFRIDAY25\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(bf[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].dt.month.value_counts().head(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span></code></pre><div class=\"run-output\" data-run-output=\"3\" hidden></div></div>\n<p>تشمل <code dir=\"ltr\">between</code> الطرفين، ولهذا يحمل الحد الأعلى وقتًا. والأسطر الأخيرة تحتوي اكتشافًا حقيقيًا: من بين 124 طلبًا استُخدم فيها الكوبون <code dir=\"ltr\">BLACKFRIDAY25</code>، يقع 91 في نوفمبر، والبقية متفرّقة على مدار السنة. هل تُرك الكود فعّالًا، أم نُشر على موقع كوبونات، أم أن البيانات خاطئة؟ التصفيات لا تجيب عن ذلك، لكنها تُظهر السؤال، والمحللون الجيدون يحملونه إلى من يديرون العرض الترويجي قبل البناء عليه. (تستخرج <code dir=\"ltr\">.dt.month</code> رقم الشهر؛ ويشرح الدرس 4.4 الـ accessor المسمّى <code dir=\"ltr\">dt</code> بالتفصيل.)</p>\n<h3 id=\"sec-4\" tabindex=\"-1\">الجدول المُصفّى جدول جديد</h3>\n<p>تعيد التصفية DataFrame جديدًا. الجدول <code dir=\"ltr\">q4</code> في المثال السابق لا يتذكّر أنه جاء من <code dir=\"ltr\">orders</code>، ويجب أن تعامله كجدول مستقل: إذا أردت لاحقًا إضافة عمود إليه، فتضيفه إلى <code dir=\"ltr\">q4</code>، ويبقى <code dir=\"ltr\">orders</code> كما هو. وفي كود pandas 2 سترى كثيرًا <code dir=\"ltr\">.copy()</code> بعد التصفية: فهي توضّح ذلك وتُسكت تحذير <code dir=\"ltr\">SettingWithCopyWarning</code> الذي تطبعه pandas 2 حين تضيف عمودًا إلى جدول مُصفّى. أما مع Copy-on-Write، وهو السلوك الافتراضي منذ pandas 3.0 ويمكنك تفعيله في pandas 2 بـ <code dir=\"ltr\">pd.options.mode.copy_on_write = True</code>، فكل نتيجة مُصفّاة تتصرّف أصلًا كنسخة مستقلة. ويبيّن الدرس 2.5 لماذا يهم هذا حين تبدأ بتغيير القيم.</p>\n<h2 id=\"sec-5\" tabindex=\"-1\">الترتيب واختيار الأعلى</h2>\n<p>ترتّب <code dir=\"ltr\">sort_values</code> الصفوف بحسب عمود واحد أو أكثر:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"4\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"4\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">latest </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.sort_values(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">ascending</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(latest[[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]].head(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">by_fee </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.sort_values([</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"shipping_fee\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">], </span><span style=\"color:#953800;--shiki-dark:#FFA657\">ascending</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(by_fee[[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"shipping_fee\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]].head(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(orders.nlargest(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"shipping_fee\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"shipping_fee\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]])</span></span></code></pre><div class=\"run-output\" data-run-output=\"4\" hidden></div></div>\n<p>مع قائمة أعمدة، يكسر العمود الثاني التعادل في الأول، وتأخذ <code dir=\"ltr\">ascending</code> قائمة مطابقة. و<code dir=\"ltr\">nlargest(n, column)</code> و<code dir=\"ltr\">nsmallest</code> طريقان مختصران لـ “رتّب وخذ أعلى n”؛ وهما أسرع على الجداول الكبيرة ويعبّران عمّا تقصده.</p>\n<p>آخر ثلاثة طلبات ما زالت <code dir=\"ltr\">processing</code> أو <code dir=\"ltr\">shipped</code>: قُدّمت في آخر أيام ديسمبر ولم تكن قد سُلّمت حين صُدّرت البيانات. هذا قرار آخر في تعريفك للإيراد، وستتخذه في القسم 4.</p>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>عُدّ قبل وبعد</span></p>\n<p>اطبع <code dir=\"ltr\">len(df)</code> قبل كل تصفية وبعدها. إذا أزالت تصفية كان يُفترض أن تحذف بضعة صفوف نصفَ الجدول، أو لم تُزِل شيئًا، فستعرف فورًا بدلًا من أن تعرف بعد ثلاث خطوات.</p>\n</aside>\n<p>في التمرين تعزل الربع الرابع من 2025 وتقيس استخدام الكوبونات فيه. وفي الدرس التالي تضيف أعمدة جديدة، مثل إيراد كل بند، وتتعلّم الطريقة الصحيحة الوحيدة لتغيير القيم في DataFrame.</p>\n","toc":[{"id":"sec-1","text":"الأقنعة المنطقية","level":2},{"id":"sec-2","text":"دمج الشروط","level":2},{"id":"sec-3","text":"طريقان مختصران: isin و between","level":2},{"id":"sec-4","text":"الجدول المُصفّى جدول جديد","level":3},{"id":"sec-5","text":"الترتيب واختيار الأعلى","level":2}],"takeaways":["المقارنة على عمود تعيد قناعًا منطقيًا (boolean mask)؛ و<code dir=\"ltr\">df[mask]</code> أو <code dir=\"ltr\">df.loc[mask, cols]</code> تحتفظ بالصفوف التي يكون فيها <code dir=\"ltr\">True</code>.","ادمج الأقنعة بـ <code dir=\"ltr\">&amp;</code> (و) و<code dir=\"ltr\">|</code> (أو) و<code dir=\"ltr\">~</code> (ليس)، وضع كل شرط بين قوسين.","<code dir=\"ltr\">mask.sum()</code> تعدّ الصفوف المطابقة و<code dir=\"ltr\">mask.mean()</code> تعطي حصتها، دون تصفية أي شيء.","الدالة <code dir=\"ltr\">isin([...])</code> تحلّ محل السلاسل الطويلة من <code dir=\"ltr\">==</code> مع <code dir=\"ltr\">|</code>، و<code dir=\"ltr\">between(a, b)</code> تشمل الطرفين.","تقبل <code dir=\"ltr\">sort_values</code> قوائم للترتيب بعدة أعمدة؛ و<code dir=\"ltr\">nlargest(n, col)</code> هي الطريق المختصر لقائمة الأعلى n."],"further":[{"title":"Boolean indexing","url":"https://pandas.pydata.org/docs/user_guide/indexing.html#boolean-indexing"},{"title":"pandas.DataFrame.sort_values","url":"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html"},{"title":"pandas.Series.isin","url":"https://pandas.pydata.org/docs/reference/api/pandas.Series.isin.html"}],"quiz":[{"q":"<p>أيّ سطر يحتفظ بطلبات الويب التي استخدمت كوبونًا؟</p>","options":[{"text":"<code dir=\"ltr\">orders[(orders[&quot;channel&quot;] == &quot;web&quot;) &amp; (orders[&quot;coupon_code&quot;].notna())]</code>","why":"صحيح. كل شرط Series منطقية بين قوسيها، ويُدمجان عنصرًا بعنصر باستخدام <code dir=\"ltr\">&amp;</code>."},{"text":"<code dir=\"ltr\">orders[orders[&quot;channel&quot;] == &quot;web&quot; and orders[&quot;coupon_code&quot;].notna()]</code>","why":"الكلمة <code dir=\"ltr\">and</code> تطلب قيمة True/False واحدة لـ Series كاملة، فتُطلق pandas الخطأ <code dir=\"ltr\">ValueError: The truth value of a Series is ambiguous</code>."},{"text":"<code dir=\"ltr\">orders[orders[&quot;channel&quot;] == &quot;web&quot; &amp; orders[&quot;coupon_code&quot;].notna()]</code>","why":"بدون أقواس، يُنفَّذ <code dir=\"ltr\">&amp;</code> قبل <code dir=\"ltr\">==</code>، فتقيّم Python الجزء <code dir=\"ltr\">&quot;web&quot; &amp; ...</code> أولًا، فيفشل التعبير أو يعني شيئًا آخر."},{"text":"<code dir=\"ltr\">orders[&quot;channel&quot; == &quot;web&quot;][&quot;coupon_code&quot;]</code>","why":"الجزء <code dir=\"ltr\">&quot;channel&quot; == &quot;web&quot;</code> يقارن نصين وقيمته دائمًا <code dir=\"ltr\">False</code>؛ ولا ينظر إلى العمود أبدًا."}],"answer":0},{"q":"<p><code dir=\"ltr\">mask = orders[&quot;shipping_fee&quot;] == 0</code>. ماذا تعيد <code dir=\"ltr\">mask.mean()</code>؟</p>","options":[{"text":"متوسط رسوم الشحن","why":"هذا ما تعطيه <code dir=\"ltr\">orders[&quot;shipping_fee&quot;].mean()</code>. أما القناع فيحمل قيمًا منطقية لا رسومًا."},{"text":"عدد الطلبات ذات الشحن المجاني","why":"هذا ما تعطيه <code dir=\"ltr\">mask.sum()</code>. أما المتوسط فيقسم ذلك العدد على عدد الصفوف."},{"text":"حصة الطلبات ذات الشحن المجاني، بين 0 و1","why":"صحيح. <code dir=\"ltr\">True</code> تُحسب 1 و<code dir=\"ltr\">False</code> تُحسب 0، فيكون متوسط القناع هو نسبة الصفوف التي يكون فيها صحيحًا."}],"answer":2},{"q":"<p>تريد الطلبات العشرة ذات أعلى رسوم شحن، والأحدث أولًا بين الرسوم المتساوية. أيّ استدعاء هو الصحيح؟</p>","options":[{"text":"<code dir=\"ltr\">orders.sort_values(&quot;shipping_fee&quot;).head(10)</code>","why":"الترتيب الافتراضي تصاعدي، فهذا يعطيك العشرة الأرخص، ولا تُرتَّب الحالات المتعادلة بحسب التاريخ."},{"text":"<code dir=\"ltr\">orders.sort_values([&quot;shipping_fee&quot;, &quot;order_date&quot;], ascending=[False, True]).head(10)</code>","why":"ترتيب التاريخ هنا تصاعدي، فيضع الطلبات الأقدم أولًا بين الرسوم المتساوية."},{"text":"<code dir=\"ltr\">orders.nlargest(10, &quot;order_date&quot;)</code>","why":"هذا يرتّب بحسب التاريخ لا بحسب الرسوم."},{"text":"<code dir=\"ltr\">orders.sort_values([&quot;shipping_fee&quot;, &quot;order_date&quot;], ascending=[False, False]).head(10)</code>","why":"صحيح. العمودان يُرتَّبان تنازليًا، الرسوم أولًا، ثم التاريخ لكسر التعادل."}],"answer":3}],"exercise":{"kind":"python","files":["orders.csv"],"starter":"import pandas as pd\n\norders = pd.read_csv(\"orders.csv\", parse_dates=[\"order_date\"])\n\n# 1. Orders placed in Q4 2025 (October to December) that were NOT cancelled\nq4 = None\n\n# 2. Share of those Q4 orders that used any coupon, rounded to 3 decimals\ncoupon_share = None\n\n# 3. In the whole table: number of marketplace orders that used a coupon\nmarketplace_coupons = None\n\n# 4. order_id of the 3 most recent orders in q4, newest first, as a list\nlatest_ids = None\n","solution":"import pandas as pd\n\norders = pd.read_csv(\"orders.csv\", parse_dates=[\"order_date\"])\n\nin_q4 = (orders[\"order_date\"] >= \"2025-10-01\") & (orders[\"order_date\"] < \"2026-01-01\")\nq4 = orders[in_q4 & (orders[\"status\"] != \"cancelled\")]\nprint(len(q4))\n\ncoupon_share = round(q4[\"coupon_code\"].notna().mean(), 3)\n\nmarketplace_coupons = ((orders[\"channel\"] == \"marketplace\") & orders[\"coupon_code\"].notna()).sum()\n\nlatest_ids = q4.nlargest(3, \"order_date\")[\"order_id\"].tolist()\n","checks":[{"id":"q4-rows","test":"isinstance(q4, pd.DataFrame) and len(q4) == 642"},{"id":"q4-clean","test":"(q4['status'] != 'cancelled').all() and q4['order_date'].min() >= pd.Timestamp('2025-10-01')"},{"id":"coupon-share","test":"round(float(coupon_share), 3) == 0.231"},{"id":"marketplace","test":"int(marketplace_coupons) == 44"},{"id":"latest","test":"list(latest_ids) == [2017, 2735, 1550]"}],"title":"اعزل الربع الرابع من 2025","prompt":"<p>باستخدام <code dir=\"ltr\">orders</code> (مع تحليل <code dir=\"ltr\">order_date</code> مسبقًا): اجعل <code dir=\"ltr\">q4</code> الطلبات المقدَّمة من 1 أكتوبر إلى 31 ديسمبر 2025 التي لم تُلغَ. واجعل <code dir=\"ltr\">coupon_share</code> حصة طلبات <code dir=\"ltr\">q4</code> التي استخدمت كوبونًا، مقرّبة إلى 3 منازل عشرية. واجعل <code dir=\"ltr\">marketplace_coupons</code> عدد الطلبات في الجدول كله التي جاءت عبر القناة <code dir=\"ltr\">&quot;marketplace&quot;</code> واستخدمت كوبونًا. واجعل <code dir=\"ltr\">latest_ids</code> قائمة بأرقام <code dir=\"ltr\">order_id</code> لأحدث 3 طلبات في <code dir=\"ltr\">q4</code>، الأحدث أولًا.</p>\n","hints":["قارن <code dir=\"ltr\">order_date</code> بـ <code dir=\"ltr\">&quot;2025-10-01&quot;</code> و<code dir=\"ltr\">&quot;2026-01-01&quot;</code>، وادمج الأقنعة بـ <code dir=\"ltr\">&amp;</code>، كلٌّ بين قوسين.","يكون الكوبون مستخدمًا حين لا يكون <code dir=\"ltr\">coupon_code</code> مفقودًا: <code dir=\"ltr\">.notna()</code>. متوسط Series منطقية حصة؛ و<code dir=\"ltr\">.sum()</code> عدد.","<code dir=\"ltr\">q4.nlargest(3, &quot;order_date&quot;)[&quot;order_id&quot;].tolist()</code> تعطي أحدث ثلاثة معرّفات كقائمة."],"explanation":"<p>بلغ عدد طلبات الربع الرابع من 2025 ما مجموعه 677 طلبًا، لم يُلغَ منها 642. استخدام “قبل 1 يناير” حدًا أعلى يحتفظ بكل طلبات 31 ديسمبر أيًّا كان وقتها. استخدم 23.1% من تلك الطلبات كوبونًا، وهذا أعلى من متوسط 18.8% عبر السنتين، وهو تلميح مبكر إلى أن العروض الترويجية مهمة في قصة الربع الرابع. العدّ بـ <code dir=\"ltr\">(mask_a &amp; mask_b).sum()</code> يجيب عن سؤال الـ marketplace دون بناء جدول مُصفّى. ولأحدث المعرّفات، تعمل <code dir=\"ltr\">nlargest</code> على عمود التاريخ (أو <code dir=\"ltr\">sort_values(&quot;order_date&quot;, ascending=False).head(3)</code>) بالقدر نفسه.</p>\n","checkLabels":{"q4-rows":"في <code dir=\"ltr\">q4</code> 642 طلبًا","q4-clean":"لا طلبات ملغاة في <code dir=\"ltr\">q4</code> ولا شيء قبل أكتوبر 2025","coupon-share":"<code dir=\"ltr\">coupon_share</code> يساوي 0.231","marketplace":"44 طلبًا من الـ marketplace استُخدم فيها كوبون","latest":"<code dir=\"ltr\">latest_ids</code> تساوي <code dir=\"ltr\">[2017, 2735, 1550]</code>"}},"words":595,"readMinutes":4}