تخصيص مسارات المعالجة باستخدام قواميس الإعدادات
استبدل مسارات الملفات وأسماء الأعمدة الثابتة بقاموس إعدادات يُمرّر وقت التشغيل لجعل مسار المعالجة قابلًا لإعادة الاستخدام.
تخصيص مسارات المعالجة باستخدام قواميس الإعدادات درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
مشكلة القيم المضمّنة في الشيفرة
يتعطل المسار الذي يحتوي على مسارات ملفات وأسماء أعمدة وقيم عتبة مضمّنة في الشيفرة عند تغير البيئة — مثل استخدام خادم مختلف، أو إعادة تسمية عمود، أو تغيير قاعدة عمل. ويتطلب كل تغيير تعديل شيفرة المسار نفسها، مما يزيد خطر إدخال أخطاء. والحل هو إخراج جميع القيم المتغيرة إلى قاموس إعدادات يُحمّل وقت التشغيل ويُمرّر إلى دوال المسار.
import pandas as pd
# BAD: hardcoded values scattered through code
df = pd.read_csv('/data/orders_2024.csv')
df = df.dropna(subset=['revenue', 'quantity'])
df = df[df['revenue'] < 5000]
df.to_parquet('/output/orders_clean.parquet')
print('Hardcoded paths and thresholds are fragile')تعريف قاموس إعدادات
استبدلوا كل قيمة مضمّنة في الشيفرة بإدخال في قاموس إعدادات. وجمّعوا الإعدادات ذات الصلة منطقيًا: مسارات الإدخال والإخراج معًا، وعتبات التنظيف معًا، وتعيينات أسماء الأعمدة معًا. ويصبح قاموس الإعدادات المصدر الوحيد للحقيقة لجميع معلمات المسار. ويؤدي تغيير قيمة واحدة في الإعدادات إلى تحديث كل دالة تستخدمها من دون المساس بأجسام الدوال.
CONFIG = {
'input_path': '/data/orders_2024.csv',
'output_path': '/output/orders_clean.parquet',
'required_cols': ['order_id', 'order_date', 'revenue', 'quantity'],
'date_cols': ['order_date'],
'revenue_cap': 5000,
'min_quantity': 1,
'categorical_cols': ['region', 'category']
}
print('Config loaded:', list(CONFIG.keys()))تمرير الإعدادات إلى دوال الاستخراج
تقرأ دالة الاستخراج جميع معلماتها من الإعدادات: مسار الإدخال، وأعمدة التاريخ المطلوب تحليلها، وأي إعدادات للترميز أو الفاصل. وهذا يعني أن تشغيل المسار نفسه على مجموعة بيانات اختبار أو ملف لشهر مختلف لا يتطلب سوى تغيير الإعدادات، من دون تغيير الشيفرة. ويمكنكم الاحتفاظ بإعدادات منفصلة لبيئات التطوير والتهيئة والإنتاج.
def extract(config):
return pd.read_csv(
config['input_path'],
parse_dates=config.get('date_cols', [])
)
df = extract(CONFIG)
print('Extracted:', df.shape)تمرير الإعدادات إلى دوال التحويل
تستقبل كل دالة تحويل الإعدادات كاملة، وتستخرج منها القيم التي تحتاج إليها. وينبغي أن تستخدم الدوال config.get('key', default) مع قيم افتراضية منطقية، حتى يكون المسار متينًا في مواجهة الإعدادات غير المكتملة. فالدالة التي تتطلب عتبة افتراضية قيمتها 5000، مع إمكانية تجاوزها عبر الإعدادات، آمنة ومرنة في آن واحد.
def transform(df, config):
required = config.get('required_cols', [])
cap = config.get('revenue_cap', float('inf'))
min_qty = config.get('min_quantity', 1)
return (
df
.dropna(subset=required)
.query(f'quantity >= {min_qty}')
.assign(revenue=lambda d: d['quantity'] * d['unit_price'])
.assign(revenue_capped=lambda d: d['revenue'].clip(upper=cap))
)
df_clean = transform(df, CONFIG)
print(df_clean.shape)تحميل الإعدادات من ملف JSON
بالنسبة إلى مسارات الإنتاج، خزّنوا الإعدادات في ملف JSON بدلًا من قاموس Python مضمّن في الشيفرة النصية. وحمّلوها باستخدام json.load() عند بدء المسار. ويتيح ذلك لفرق العمليات تغيير العتبات من دون الوصول إلى شيفرة Python، كما يتيح تتبع إصدارات الإعدادات عبر Git — إذ يصبح كل تغيير في الإعدادات عملية commit موثقة بوصف لسبب التغيير التجاري.
import json
# config.json would contain the same keys as CONFIG above
# with open('config.json') as f:
# config = json.load(f)
# Example: write and read back
with open('/tmp/pipeline_config.json', 'w') as f:
json.dump(CONFIG, f, indent=2)
with open('/tmp/pipeline_config.json') as f:
loaded_config = json.load(f)
print('Loaded config from JSON:', loaded_config['revenue_cap'])إعدادات خاصة بكل بيئة
احتفظوا بملفات إعدادات منفصلة لكل بيئة: config_dev.json وconfig_staging.json وconfig_prod.json. وحددوا الملف الذي سيُحمّل استنادًا إلى متغير بيئة. ويمنع هذا النمط استخدام مسارات ملفات الإنتاج عن طريق الخطأ أثناء التطوير، كما يُبقي الأسرار الخاصة بالبيئة (مثل بيانات اعتماد قاعدة البيانات) خارج مستودع الشيفرة المشترك.
import os
ENV = os.environ.get('PIPELINE_ENV', 'dev')
CONFIG_PATH = f'config_{ENV}.json'
# In practice:
# with open(CONFIG_PATH) as f:
# config = json.load(f)
print(f'Using config for environment: {ENV}')
print(f'Config file: {CONFIG_PATH}')إعادة تعيين أسماء الأعمدة عبر الإعدادات
غالبًا ما تحتوي بيانات المصدر على أسماء أعمدة تختلف عن اصطلاح التسمية الداخلي لديكم. وبدلًا من كتابة df.rename(columns={'OrderDate': 'order_date', 'Qty': 'quantity'}) بشكل ثابت داخل جسم خط أنابيب البيانات، خزّنوا تعيين إعادة التسمية في الإعدادات. يتيح ذلك لخط أنابيب البيانات العمل بصرف النظر عن أسماء أعمدة المصدر، كما يسهل تكييفه عند تغيير موفر البيانات في المنبع لتنسيق ملف التصدير.
CONFIG['column_rename'] = {
'OrderDate': 'order_date',
'Qty': 'quantity',
'UnitPrice': 'unit_price',
'OrderID': 'order_id'
}
def rename_columns(df, config):
return df.rename(columns=config.get('column_rename', {}))
print('Column rename mapping stored in config.')إعدادات التجميع: مفاتيح groupby الديناميكية
غالبًا ما تجمع مرحلة التجميع البيانات وفق أعمدة مختلفة تبعًا لحالة الاستخدام. خزّنوا مفاتيح التجميع ومواصفات التجميع في الإعدادات بدلًا من كتابتها بشكل ثابت. يتيح ذلك للمحللين إنشاء جداول ملخصة مختلفة (حسب المنطقة أو الفئة أو الشهر) من خلال تغيير الإعدادات، دون تعديل دالة التجميع. وبذلك تصبح الدالة أداة تجميع عامة تعتمد بالكامل على الإعدادات.
CONFIG['agg_spec'] = {
'group_by': ['region', 'category'],
'agg_cols': {
'revenue': ['sum', 'mean'],
'quantity': ['sum', 'count']
}
}
def aggregate(df, config):
spec = config['agg_spec']
return df.groupby(spec['group_by']).agg(spec['agg_cols'])
result = aggregate(df_clean, CONFIG)
print(result.head())التحقق من الإعدادات عند بدء التشغيل
تحققوا من الإعدادات عند بدء خط أنابيب البيانات لاكتشاف المفاتيح المفقودة أو غير الصالحة قبل تحميل أي بيانات. فخط أنابيب البيانات الذي يستغرق تشغيله 10 دقائق ثم يفشل لأن revenue_cap كان سلسلة نصية بدلًا من عدد عشري يهدر الوقت. تحققوا من وجود جميع المفاتيح المطلوبة، ومن أن القيم من النوع الصحيح، ومن إمكانية الوصول إلى المسارات، وذلك باستخدام دالة قصيرة لفحص الإعدادات تعمل قبل تنفيذ أي عمليات إدخال وإخراج مكلفة.
def validate_config(config):
required_keys = ['input_path', 'output_path', 'required_cols']
for key in required_keys:
assert key in config, f'Config missing key: {key}'
assert isinstance(config['required_cols'], list), 'required_cols must be a list'
assert isinstance(config.get('revenue_cap', 1), (int, float)), 'revenue_cap must be numeric'
print('Config validation passed.')
validate_config(CONFIG)دمج الإعدادات الافتراضية مع إعدادات المستخدم
اسمحوا للمستخدمين بتوفير إعدادات جزئية لا تتجاوز القيم التي يرغبون في تغييرها. ادمجوا إعدادات المستخدم فوق الإعدادات الافتراضية باستخدام {**defaults, **user_config}. يوفر هذا النمط قيمًا افتراضية معقولة، مع الحفاظ على إمكانية ضبط جميع الخيارات. وهو النمط نفسه الذي تستخدمه مكتبات Python الشائعة التي تقبل الإعدادات في صورة قاموس أو kwargs.
DEFAULT_CONFIG = {
'revenue_cap': 10000,
'min_quantity': 1,
'date_cols': ['order_date'],
'required_cols': ['order_id', 'revenue']
}
user_config = {'revenue_cap': 5000, 'input_path': '/data/q1.csv'}
final_config = {**DEFAULT_CONFIG, **user_config}
print('Final config revenue_cap:', final_config['revenue_cap']) # 5000
print('Final config min_quantity:', final_config['min_quantity']) # 1 (from default)تخزين الإعدادات مع المخرجات
احفظوا الإعدادات بجوار ملف المخرجات حتى يتمكن أي شخص يفحص المخرجات من إعادة تشغيل خط أنابيب البيانات الذي أنشأها فورًا. خزّنوها في ملف JSON جانبي يحمل الاسم نفسه لملف المخرجات، ولكن بامتداد .config.json. أدرجوا وقت تشغيل خط أنابيب البيانات في الإعدادات المحفوظة لضمان إمكانية التتبع الكامل لكل ملف مخرجات.
import json
from datetime import datetime
def save_with_config(df, config):
output_path = config['output_path']
config_path = output_path.replace('.parquet', '.config.json')
run_metadata = {**config, 'run_at': datetime.now().isoformat()}
with open(config_path, 'w') as f:
json.dump(run_metadata, f, indent=2, default=str)
df.to_parquet(output_path, index=False)
print(f'Saved data to {output_path}')
print(f'Saved config to {config_path}')تحقق سريع
اختبروا مدى فهمكم لمفاهيم تحليل البيانات الواردة في هذا الدرس.
مراجعة الدرس
تعلمتم في هذا الدرس: استبدال القيم المكتوبة بشكل ثابت بقاموس إعدادات محمّل من JSON، وتمرير الإعدادات إلى دوال الاستخراج والتحويل والتجميع لإتاحة ضبط جميع المعلمات، والتحقق من الإعدادات عند بدء التشغيل وحفظها بجوار ملفات المخرجات لضمان إمكانية إعادة الإنتاج. سنستكشف بعد ذلك اختبار خطوات خط أنابيب البيانات باستخدام عمليات فحص عدد الصفوف وحواجز التأكيد.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «تخصيص مسارات المعالجة باستخدام قواميس الإعدادات» مجاني؟
نعم — نص درس «تخصيص مسارات المعالجة باستخدام قواميس الإعدادات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «تخصيص مسارات المعالجة باستخدام قواميس الإعدادات»؟
استبدل مسارات الملفات وأسماء الأعمدة الثابتة بقاموس إعدادات يُمرّر وقت التشغيل لجعل مسار المعالجة قابلًا لإعادة الاستخدام. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تخصيص مسارات المعالجة باستخدام قواميس الإعدادات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تنظيم خطوات التحويل في صورة دوال
- تخصيص مسارات المعالجة باستخدام قواميس الإعدادات
- اختبار خطوات مسار المعالجة بالتأكيدات
- جدولة عمليات مسار المعالجة وتسجيلها