بايثون للبيانات
درس 1 من 9
1بايثون للبيانات
الصورة الكبيرةpandas وNumPy أسرع وأقوى، لكنهما مبنيان على نفس الأفكار. لو فهمت كيف تفلتر وتجمّع وترتب قائمة قواميس ببايثون العادية، ستفهم كل سطر pandas بعدها.
ماذا تشاهد في الرسم: خط معالجة البيانات الصغير. نفس الخطوات ستكتبها لاحقًا بسطر pandas لكل خطوة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
تخيّل دفتر مبيعات المقهى: كل سطر عملية بيع فيها الصنف والسعر والفرع. تريد معرفة أكثر صنف مبيعًا في كل فرع. ستمر على السطور، وتشطب الفارغ، وتجمع لكل فرع، ثم ترتب. بايثون تفعل هذا بالضبط، أسرع منك بمليون مرة.
الأنواع الأساسية: list (مرتبة)، dict (مفتاح لقيمة)، set (بلا تكرار)، tuple (ثابتة). الفهم المختصر [f(x) for x in xs if cond] يعوّض أغلب الحلقات. csv.DictReader يعيد كل صف قاموسًا بنصوص، فحوّل الأنواع بنفسك. collections.Counter وdefaultdict للتجميع، وsorted(key=...) للترتيب. الدوال النقية (بلا آثار جانبية) أسهل اختبارًا وتركيبًا. والمولدات (generators) تمر على ملفات ضخمة دون تحميلها كاملة.
قبل أن تبدأ
🧭ابدأ من هنا
درس تأسيس هذا المسار.
الفكرة الجوهرية
1جدول = قائمة قواميس
نقرأ CSV من نص (كأنه ملف)، ونحوّل الأنواع، ونتخلص من الصفوف المعطوبة في سطر واحد:
import csv
import io
raw = """item,price,branch
latte,14,riyadh
mocha,16,jeddah
latte,,riyadh
tea,6,riyadh
latte,14,jeddah
"""
rows = list(csv.DictReader(io.StringIO(raw)))
clean = [{**r, "price": int(r["price"])} for r in rows if r["price"]]
print(len(rows), "rows,", len(clean), "clean")
print(clean[0])csv يقرأ كل شيء نصًا. "14" + "6" يعطي "146" لا 20. حوّل الأرقام صراحة.2التجميع والترتيب
defaultdict يجمع لكل مفتاح، وCounter يعدّ، وsorted بمفتاح يرتب:
from collections import Counter, defaultdict
sales = [
{"item": "latte", "price": 14, "branch": "riyadh"},
{"item": "mocha", "price": 16, "branch": "jeddah"},
{"item": "tea", "price": 6, "branch": "riyadh"},
{"item": "latte", "price": 14, "branch": "jeddah"},
{"item": "latte", "price": 14, "branch": "riyadh"},
]
revenue = defaultdict(int)
for s in sales:
revenue[s["branch"]] += s["price"]
print("revenue:", dict(revenue))
popular = Counter(s["item"] for s in sales)
print("most sold:", popular.most_common(2))
by_price = sorted({s["item"]: s["price"] for s in sales}.items(), key=lambda kv: kv[1], reverse=True)
print("by price:", by_price)3JSON والمولدات
أغلب واجهات النماذج تعيد JSON، وjson.loads يحوّله لقواميس وقوائم. ولملف ضخم، المولد يقرأ سطرًا سطرًا (صيغة JSONL شائعة في بيانات التدريب):
import io
import json
jsonl = io.StringIO('{"text": "great coffee", "label": 1}\n'
'{"text": "cold and late", "label": 0}\n'
'{"text": "friendly staff", "label": 1}\n')
def records(stream):
for line in stream:
if line.strip():
yield json.loads(line)
positive = sum(r["label"] for r in records(jsonl))
print("positive examples:", positive)مثال محلول
المسألة: ملف تقييمات فيه 10,000 سطر، بعضها بلا نص وبعضها مكرر. الخطوات: DictReader ← فلترة if r["text"].strip() ← إزالة التكرار بـ set على النص ← Counter على التقييم. النتيجة: 9,212 سطرًا نظيفًا وتوزيع التقييمات، في 8 أسطر بلا مكتبات. في الدرس التالي نفس الشيء بـ pandas.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| pandas تغني عن بايثون الأساسية. | كل تنظيف معقد ينتهي بدالة بايثون عادية تمررها لـ pandas. |
| الحلقات دائمًا بطيئة. | لآلاف الصفوف لا فرق يُذكر. لملايين، NumPy وpandas أسرع بكثير. |
اختبر فهمك
بأي نوع يقرأ csv.DictReader الأرقام؟
كل شيء نص، فحوّل بنفسك.
أي أداة تعدّ تكرار كل عنصر بسرعة؟
Counter قاموس عدّاد مع most_common.
لماذا مولّد لملف ضخم؟
الذاكرة تحمل سطرًا واحدًا في كل لحظة.
بطاقات مراجعة سريعة
تحقق من فهمك
كيف تمثل جدولًا ببايثون العادية؟
قائمة قواميس: كل قاموس صف، والمفاتيح أسماء الأعمدة.
كيف تزيل التكرار مع الحفاظ على الترتيب؟
list(dict.fromkeys(items)).
متى تنتقل لـ pandas؟
حين تكبر البيانات أو تحتاج عمليات جدولية كثيرة. الفهم الذي بنيته هنا ينتقل معك.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.