← العودة إلى المدونة

JSON في علم البيانات

كيفية استخدام JSON في علم البيانات وتحليل البيانات. أمثلة عملية مع Python وPandas.

Big JSON Team14 دقيقة للقراءةdata-science
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

14 دقيقة قراءة

# JSON في علم البيانات

JSON هو تنسيق شائع في علم البيانات لتخزين ونقل البيانات المنظمة.

لماذا JSON في علم البيانات؟

الفوائد

  • مرن - يدعم بنى معقدة
  • شائع - تستخدمه معظم APIs
  • قابل للقراءة - سهل الفهم
  • متداخل - يدعم البيانات الهرمية
  • متوافق - مع جميع الأدوات

JSON مع Pandas

قراءة JSON

import pandas as pd

# من ملف

df = pd.read_json('data.json')

# من نص

json_string = '[{"name": "أحمد", "age": 30}]'

df = pd.read_json(json_string)

# من URL

url = 'https://api.example.com/data'

df = pd.read_json(url)

print(df.head())

كتابة JSON

import pandas as pd

# إنشاء DataFrame

df = pd.DataFrame({

'الاسم': ['أحمد', 'فاطمة', 'محمد'],

'العمر': [30, 25, 35],

'المدينة': ['الرياض', 'جدة', 'الدمام']

})

# حفظ كـ JSON

df.to_json('output.json', orient='records', force_ascii=False)

# أو كنص

json_str = df.to_json(orient='records', force_ascii=False)

print(json_str)

توجهات JSON المختلفة

import pandas as pd

df = pd.DataFrame({

'الاسم': ['أحمد', 'فاطمة'],

'العمر': [30, 25]

})

# records (افتراضي)

# [{"الاسم":"أحمد","العمر":30}, {...}]

records = df.to_json(orient='records', force_ascii=False)

# columns

# {"الاسم":{"0":"أحمد","1":"فاطمة"}, ...}

columns = df.to_json(orient='columns', force_ascii=False)

# index

# {"0":{"الاسم":"أحمد","العمر":30}, ...}

index = df.to_json(orient='index', force_ascii=False)

# values

# [["أحمد",30], ["فاطمة",25]]

values = df.to_json(orient='values', force_ascii=False)

# table

# {"schema":{...}, "data":[...]}

table = df.to_json(orient='table', force_ascii=False)

معالجة JSON متداخل

تسطيح البيانات

import pandas as pd

from pandas import json_normalize

# JSON متداخل

data = [

{

'الاسم': 'أحمد',

'العمر': 30,

'العنوان': {

'المدينة': 'الرياض',

'الرمز': '12345'

}

}

]

# تسطيح

df = json_normalize(data)

print(df.columns)

# ['الاسم', 'العمر', 'العنوان.المدينة', 'العنوان.الرمز']

معالجة المصفوفات المتداخلة

import pandas as pd

from pandas import json_normalize

# بيانات مع مصفوفات متداخلة

data = [

{

'المستخدم': 'أحمد',

'الطلبات': [

{'id': 1, 'المبلغ': 100},

{'id': 2, 'المبلغ': 200}

]

}

]

# تسطيح مع فصل المصفوفات

df = json_normalize(

data,

record_path='الطلبات',

meta='المستخدم'

)

print(df)

# المستخدم id المبلغ

# 0 أحمد 1 100

# 1 أحمد 2 200

تحليل بيانات JSON

إحصائيات أساسية

import pandas as pd

# قراءة بيانات

df = pd.read_json('users.json')

# إحصائيات وصفية

print(df.describe())

# عدد القيم الفريدة

print(df.nunique())

# القيم الناقصة

print(df.isnull().sum())

# معلومات عامة

print(df.info())

التصفية والاستعلام

import pandas as pd

df = pd.read_json('users.json')

# تصفية بالعمر

adults = df[df['العمر'] >= 18]

# تصفية متعددة

riyadh_adults = df[

(df['المدينة'] == 'الرياض') &

(df['العمر'] >= 18)

]

# استخدام query

result = df.query('العمر > 25 and المدينة == "جدة"')

# البحث في النص

contains_ahmed = df[df['الاسم'].str.contains('أحمد')]

التجميع

import pandas as pd

df = pd.read_json('sales.json')

# التجميع حسب المدينة

by_city = df.groupby('المدينة').agg({

'المبيعات': 'sum',

'الطلبات': 'count',

'العملاء': 'nunique'

})

# تجميع متعدد

summary = df.groupby(['المدينة', 'الشهر']).agg({

'المبيعات': ['sum', 'mean', 'max'],

'الطلبات': 'count'

})

تحويل البيانات

من JSON إلى CSV

import pandas as pd

# قراءة JSON

df = pd.read_json('data.json')

# حفظ كـ CSV

df.to_csv('data.csv', index=False, encoding='utf-8-sig')

من JSON إلى Excel

import pandas as pd

# قراءة JSON

df = pd.read_json('data.json')

# حفظ كـ Excel

df.to_excel('data.xlsx', index=False, sheet_name='البيانات')

# أوراق متعددة

with pd.ExcelWriter('report.xlsx') as writer:

df_users.to_excel(writer, sheet_name='المستخدمون')

df_orders.to_excel(writer, sheet_name='الطلبات')

من JSON إلى SQL

import pandas as pd

from sqlalchemy import create_engine

# قراءة JSON

df = pd.read_json('data.json')

# إنشاء اتصال

engine = create_engine('sqlite:///database.db')

# حفظ في قاعدة البيانات

df.to_sql('users', engine, if_exists='replace', index=False)

معالجة API Responses

جلب ومعالجة البيانات

import requests

import pandas as pd

# جلب البيانات

response = requests.get('https://api.example.com/users')

data = response.json()

# تحويل إلى DataFrame

df = pd.DataFrame(data['users'])

# معالجة

df['العمر'] = df['تاريخ_الميلاد'].apply(calculate_age)

df['الاسم_الكامل'] = df['الاسم_الأول'] + ' ' + df['الاسم_الأخير']

# حفظ

df.to_json('processed_users.json', orient='records', force_ascii=False)

معالجة صفحات متعددة

import requests

import pandas as pd

def fetch_all_pages(base_url):

all_data = []

page = 1

while True:

response = requests.get(f'{base_url}?page={page}')

data = response.json()

if not data['users']:

break

all_data.extend(data['users'])

page += 1

return pd.DataFrame(all_data)

# الاستخدام

df = fetch_all_pages('https://api.example.com/users')

تنظيف البيانات

معالجة القيم الناقصة

import pandas as pd

df = pd.read_json('data.json')

# ملء القيم الناقصة

df['العمر'].fillna(df['العمر'].mean(), inplace=True)

df['المدينة'].fillna('غير محدد', inplace=True)

# حذف الصفوف الناقصة

df.dropna(subset=['البريد'], inplace=True)

# استبدال القيم

df['الحالة'].replace({'': 'نشط', None: 'نشط'}, inplace=True)

إزالة التكرارات

import pandas as pd

df = pd.read_json('data.json')

# عرض التكرارات

duplicates = df[df.duplicated()]

print(f'عدد التكرارات: {len(duplicates)}')

# إزالة التكرارات

df.drop_duplicates(inplace=True)

# إزالة بناءً على أعمدة محددة

df.drop_duplicates(subset=['البريد'], inplace=True)

تحويل الأنواع

import pandas as pd

df = pd.read_json('data.json')

# تحويل إلى datetime

df['التاريخ'] = pd.to_datetime(df['التاريخ'])

# تحويل إلى فئة

df['الفئة'] = df['الفئة'].astype('category')

# تحويل إلى رقمي

df['السعر'] = pd.to_numeric(df['السعر'], errors='coerce')

تحليل متقدم

الارتباط

import pandas as pd

df = pd.read_json('data.json')

# مصفوفة الارتباط

correlation = df[['العمر', 'الدخل', 'المبيعات']].corr()

print(correlation)

# رسم بياني

import matplotlib.pyplot as plt

import seaborn as sns

plt.figure(figsize=(10, 8))

sns.heatmap(correlation, annot=True, cmap='coolwarm')

plt.title('مصفوفة الارتباط')

plt.show()

السلاسل الزمنية

import pandas as pd

# قراءة بيانات زمنية

df = pd.read_json('timeseries.json')

df['التاريخ'] = pd.to_datetime(df['التاريخ'])

df.set_index('التاريخ', inplace=True)

# إعادة أخذ العينات

monthly = df.resample('M').sum()

weekly = df.resample('W').mean()

# المتوسط المتحرك

df['متوسط_7_أيام'] = df['القيمة'].rolling(window=7).mean()

التصور

import pandas as pd

import matplotlib.pyplot as plt

df = pd.read_json('data.json')

# رسم بياني بسيط

df.plot(kind='bar', x='الفئة', y='المبيعات')

plt.title('المبيعات حسب الفئة')

plt.xlabel('الفئة')

plt.ylabel('المبيعات')

plt.show()

# رسوم متعددة

fig, axes = plt.subplots(2, 2, figsize=(12, 10))

df['العمر'].hist(ax=axes[0, 0])

df.boxplot(column='الدخل', by='المدينة', ax=axes[0, 1])

df.plot(kind='scatter', x='العمر', y='الدخل', ax=axes[1, 0])

df['الفئة'].value_counts().plot(kind='pie', ax=axes[1, 1])

plt.tight_layout()

plt.show()

نماذج التعلم الآلي

تحضير البيانات

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import LabelEncoder

# قراءة البيانات

df = pd.read_json('data.json')

# ترميز الفئات

le = LabelEncoder()

df['الفئة_مرمزة'] = le.fit_transform(df['الفئة'])

# تقسيم البيانات

X = df[['العمر', 'الدخل', 'الفئة_مرمزة']]

y = df['الهدف']

X_train, X_test, y_train, y_test = train_test_split(

X, y, test_size=0.2, random_state=42

)

تدريب نموذج

from sklearn.ensemble import RandomForestClassifier

from sklearn.metrics import accuracy_score, classification_report

# إنشاء النموذج

model = RandomForestClassifier(n_estimators=100, random_state=42)

# التدريب

model.fit(X_train, y_train)

# التنبؤ

predictions = model.predict(X_test)

# التقييم

accuracy = accuracy_score(y_test, predictions)

print(f'الدقة: {accuracy:.2f}')

print(classification_report(y_test, predictions))

أفضل الممارسات

1. استخدم المخططات

import pandas as pd

# تحديد أنواع الأعمدة

dtype_spec = {

'id': 'int64',

'الاسم': 'string',

'العمر': 'int64',

'التاريخ': 'string'

}

df = pd.read_json('data.json', dtype=dtype_spec)

df['التاريخ'] = pd.to_datetime(df['التاريخ'])

2. معالجة الأخطاء

import pandas as pd

try:

df = pd.read_json('data.json')

except ValueError as e:

print(f'خطأ في قراءة JSON: {e}')

except FileNotFoundError:

print('الملف غير موجود')

3. حفظ الذاكرة

import pandas as pd

# قراءة بالأجزاء للملفات الكبيرة

chunks = []

for chunk in pd.read_json('large.json', lines=True, chunksize=1000):

processed = process_chunk(chunk)

chunks.append(processed)

df = pd.concat(chunks, ignore_index=True)

4. التوثيق

import pandas as pd

def load_and_process_data(filename):

"""

قراءة ومعالجة بيانات JSON

Args:

filename: مسار ملف JSON

Returns:

DataFrame معالج

"""

df = pd.read_json(filename)

df = clean_data(df)

df = transform_data(df)

return df

الملخص

JSON في علم البيانات:

  • تنسيق مرن وشائع
  • Pandas يجعل المعالجة سهلة
  • مناسب للـ APIs
  • قابل للتحويل

استخدم JSON مع Pandas لتحليل قوي!

Share:

مقالات ذات صلة

Read in English