طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 244 · علم البيانات للويب
الدرس 7 · الوحدة 4: تقنيات استخراج البيانات من مصادر الويب

واجهات API و JSON المتداخل

ردود الواجهات متداخلة؛ كيف نسطّحها إلى جداول بعمودٍ لكل حقل؟ ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تدرك أن بيانات الواجهات متداخلة.
  • تسطّح الكائنات المتداخلة بـ json_normalize.
  • تفرد القوائم الداخلية بـ record_path.
  • تحمل حقول المستوى الأعلى بـ meta.

١بيانات الواجهات ليست مسطّحة

واجهات الويب تردّ JSON متداخلًا: كائن داخل كائن، وقوائم داخل حقول. read_json يعجز عن تسطيحه. الأداة هي pd.json_normalize: تفتح المستويات المتداخلة إلى أعمدة مسطّحة.

٢تسطيح كائن متداخل

main.py
import pandas as pdimport json data = json.loads('''[  {"id": 1, "user": {"name": "سارة", "city": "الرياض"}, "total": 300},  {"id": 2, "user": {"name": "خالد", "city": "جدة"}, "total": 150}]''') df = pd.json_normalize(data)print(df)print("الأعمدة:", list(df.columns))
Shell×
>>> %Run main.py
id total user.name user.city
0 1 300 سارة الرياض
1 2 150 خالد جدة
الأعمدة: ['id', 'total', 'user.name', 'user.city']
>>>

صار user.name وuser.city عمودين مستقلّين. النقطة في الاسم تدلّ على المستوى الذي جاء منه الحقل.

٣قائمة داخل الحقل: record_path

حين يحوي السجلّ قائمةً (كطلبات عميل)، نفرد كل عنصر صفًّا بـ record_path، ونحمل معه حقولًا من الأعلى بـ meta:

main.py
import pandas as pdimport json data = json.loads('''[  {"user": "سارة", "orders": [{"item": "سماعة", "qty": 2}, {"item": "كاميرا", "qty": 1}]},  {"user": "خالد", "orders": [{"item": "لوحة", "qty": 3}]}]''') df = pd.json_normalize(data, record_path="orders", meta="user")print(df)print("إجمالي القطع:", df["qty"].sum())
Shell×
>>> %Run main.py
item qty user
0 سماعة 2 سارة
1 كاميرا 1 سارة
2 لوحة 3 خالد
إجمالي القطع: 6
>>>

توقّع وتحقّق

لتسطيح JSON متداخل إلى جدول:

user.name في عمود يعني أن name جاء من:

لفرد قائمة داخلية صفوفًا نستخدم:

لحمل حقول من المستوى الأعلى مع الفرد:

الخلاصة

تحدٍّ برمجي: سطّح ردّ واجهة

متوسط

سطّح بيانات الواجهة المتداخلة، واطبع عدد الصفوف الناتجة، ومجموع amount.

المطلوب:
  • استخدم json_normalize مع record_path وmeta.
  • اطبع عدد الصفوف ثم مجموع amount.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
import pandas as pdimport jsondata = json.loads('''[  {"city": "الرياض", "sales": [{"amount": 300}, {"amount": 120}]},  {"city": "جدة", "sales": [{"amount": 200}]}]''')# سطّح sales واحمل city، ثم اطبع عدد الصفوف ومجموع amount
المطلوب×
3
620
💡 تلميح 1
pd.json_normalize(data, record_path="sales", meta="city").
💡 تلميح 2
ثم len(df) وdf["amount"].sum().

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
import pandas as pdimport jsondata = json.loads('''[  {"city": "الرياض", "sales": [{"amount": 300}, {"amount": 120}]},  {"city": "جدة", "sales": [{"amount": 200}]}]''')df = pd.json_normalize(data, record_path="sales", meta="city")print(len(df))print(int(df["amount"].sum()))
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس