بايثون للمهندسين: من الصفر إلى تحليل البيانات
لماذا Python للمهندس الصناعي؟
تخيّل أنك تعمل في مصنع فيه عشرات الحساسات — حرارة، ضغط، اهتزاز، تدفق — وكل حساس يُسجّل قراءة كل ثانية. في نهاية اليوم عندك ملايين الأرقام. كيف تحلّلها؟ كيف تكتشف أن محركاً بدأ يسخن أكثر من اللازم؟
هنا تأتي Python — اللغة الأسهل تعلماً والأكثر استخداماً في تحليل البيانات والذكاء الاصطناعي. لا تحتاج خبرة برمجية سابقة لتبدأ، وستجد مكتبات جاهزة لكل مهمة تحتاجها كمهندس.
لماذا Python تحديداً؟
| الميزة | التفاصيل |
|---|---|
| سهولة الكتابة | الكود يُقرأ كأنه إنجليزي عادي |
| مكتبات هندسية | NumPy, Pandas, Matplotlib, SciPy |
| ذكاء اصطناعي | TensorFlow, scikit-learn, PyTorch |
| أتمتة | قراءة ملفات، إرسال تقارير، التحكم بأجهزة |
| مجتمع ضخم | لكل سؤال تجد عشرات الإجابات |
المتغيرات وأنواع البيانات
المتغير في Python صندوق تحفظ فيه قيمة. لا تحتاج تحديد النوع مسبقاً — Python تفهم النوع تلقائياً:
# بيانات حساس الحرارة
temperature = 78.5 # رقم عشري (float)
machine_id = "CNC-042" # نص (string)
is_running = True # منطقي (boolean)
sensor_count = 12 # رقم صحيح (integer)
# قائمة قراءات حساس
readings = [78.5, 79.1, 80.3, 77.8, 81.2]
# قاموس لمعلومات آلة
machine = {
"id": "CNC-042",
"type": "مخرطة",
"location": "القاعة 3",
"max_temp": 95.0
}
أنواع البيانات الأساسية:
int— أرقام صحيحة:42,-7,1000float— أرقام عشرية:3.14,78.5str— نصوص:"مرحباً","CNC-042"bool— قيم منطقية:TrueأوFalselist— قوائم مرتبة:[1, 2, 3]dict— قواميس (مفتاح: قيمة):{"temp": 78.5}
الشروط: اتخاذ القرارات
تصوّر أنك تراقب حرارة محرك. إذا تجاوزت حداً معيناً، تريد إنذاراً:
temperature = 88.5
max_allowed = 85.0
critical = 95.0
if temperature > critical:
print("تحذير حرج! أوقف المحرك فوراً!")
# send_emergency_stop()
elif temperature > max_allowed:
print(f"تنبيه: الحرارة {temperature}°C تجاوزت الحد المسموح")
# send_alert_to_operator()
else:
print("الحرارة ضمن النطاق الطبيعي")
لاحظ بساطة الكود — يُقرأ تقريباً كأنه جملة إنجليزية عادية.
الحلقات: تكرار المهام
في الصناعة، كثيراً ما تحتاج فحص مجموعة قراءات أو معالجة بيانات يوم كامل:
# حلقة for: فحص كل قراءة
readings = [78.5, 85.2, 92.1, 77.3, 88.9, 96.5]
max_allowed = 90.0
alerts = []
for i, temp in enumerate(readings):
if temp > max_allowed:
alerts.append(f"القراءة {i+1}: {temp}°C - تجاوز!")
print(f"عدد التجاوزات: {len(alerts)}")
for alert in alerts:
print(f" - {alert}")
# حلقة while: مراقبة مستمرة
import time
def read_sensor():
"""محاكاة قراءة حساس"""
import random
return round(random.uniform(70, 100), 1)
monitoring = True
while monitoring:
temp = read_sensor()
print(f"الحرارة الحالية: {temp}°C")
if temp > 95:
print("إنذار! إيقاف المراقبة")
monitoring = False
time.sleep(1) # انتظار ثانية واحدة
الدوال: تنظيم الكود
الدالة هي كتلة كود تنفّذ مهمة محددة. بدل تكرار نفس الكود، تكتبه مرة واحدة وتستدعيه عند الحاجة:
def check_temperature(temp, machine_name, max_limit=85.0):
"""
فحص حرارة آلة وإرجاع حالتها
"""
if temp > max_limit * 1.1: # أكثر من 110% من الحد
return "critical", f"{machine_name}: حرارة حرجة ({temp}°C)"
elif temp > max_limit:
return "warning", f"{machine_name}: تجاوز الحد ({temp}°C)"
else:
return "normal", f"{machine_name}: طبيعي ({temp}°C)"
# استخدام الدالة
machines = [
("CNC-01", 82.3),
("CNC-02", 91.7),
("مضخة-05", 96.2),
("ضاغط-03", 78.1),
]
for name, temp in machines:
status, message = check_temperature(temp, name)
if status != "normal":
print(f"[{status.upper()}] {message}")
NumPy: الحساب العلمي السريع
NumPy هي المكتبة الأساسية للحساب العلمي في Python. تتعامل مع المصفوفات والعمليات الرياضية بسرعة فائقة:
import numpy as np
# قراءات حساس اهتزاز لمدة ساعة (3600 قراءة)
vibration_data = np.random.normal(loc=2.5, scale=0.8, size=3600)
# إحصائيات أساسية
print(f"المتوسط: {np.mean(vibration_data):.2f} mm/s")
print(f"الانحراف المعياري: {np.std(vibration_data):.2f} mm/s")
print(f"القيمة القصوى: {np.max(vibration_data):.2f} mm/s")
print(f"القيمة الدنيا: {np.min(vibration_data):.2f} mm/s")
# كشف القراءات الشاذة (أكثر من 3 انحرافات معيارية)
mean = np.mean(vibration_data)
std = np.std(vibration_data)
anomalies = vibration_data[np.abs(vibration_data - mean) > 3 * std]
print(f"عدد القراءات الشاذة: {len(anomalies)}")
مقارنة أداء NumPy مع Python العادي:
| العملية | Python عادي | NumPy |
|---|---|---|
| جمع مليون عنصر | ~150 مللي ثانية | ~1 مللي ثانية |
| ضرب مصفوفات 1000x1000 | دقائق | أجزاء من الثانية |
| التعامل مع الذاكرة | غير فعّال | محسّن جداً |
Pandas: تحليل بيانات الحساسات
Pandas هي الأداة المفضلة لقراءة وتحليل البيانات الجدولية — وهي مثالية لبيانات الحساسات المخزّنة في ملفات CSV:
import pandas as pd
# قراءة ملف CSV لبيانات الحساسات
df = pd.read_csv("sensor_log.csv")
# عرض أول 5 صفوف
print(df.head())
تخيّل أن ملف CSV يحوي أعمدة: timestamp, machine_id, temperature, vibration, pressure
# إحصائيات سريعة
print(df.describe())
# ترشيح: فقط القراءات فوق 85 درجة
high_temp = df[df["temperature"] > 85]
print(f"عدد قراءات الحرارة العالية: {len(high_temp)}")
# تجميع: متوسط الحرارة لكل آلة
avg_per_machine = df.groupby("machine_id")["temperature"].mean()
print(avg_per_machine.sort_values(ascending=False))
# إضافة عمود جديد: هل الحرارة تجاوزت الحد؟
df["temp_alert"] = df["temperature"] > 85
# حفظ النتائج
df.to_csv("analyzed_data.csv", index=False)
مثال تطبيقي: تحليل بيانات يوم عمل كامل
تصوّر أنك استلمت ملف CSV فيه بيانات 24 ساعة من حساسات مصنع:
import pandas as pd
import numpy as np
# قراءة البيانات
df = pd.read_csv("factory_24h.csv", parse_dates=["timestamp"])
# 1. ملخص عام
print("=== ملخص يوم العمل ===")
print(f"عدد القراءات: {len(df):,}")
print(f"الفترة: من {df['timestamp'].min()} إلى {df['timestamp'].max()}")
print(f"عدد الآلات: {df['machine_id'].nunique()}")
# 2. اكتشاف التجاوزات
limits = {"temperature": 85, "vibration": 5.0, "pressure": 150}
for param, limit in limits.items():
violations = df[df[param] > limit]
pct = len(violations) / len(df) * 100
print(f"\n{param}: {len(violations)} تجاوز ({pct:.1f}%)")
if len(violations) > 0:
worst = violations.loc[violations[param].idxmax()]
print(f" أسوأ قراءة: {worst[param]} في {worst['timestamp']}")
print(f" الآلة: {worst['machine_id']}")
# 3. تحليل بالساعة: متى تكون المشاكل أكثر؟
df["hour"] = df["timestamp"].dt.hour
hourly_avg = df.groupby("hour")["temperature"].mean()
peak_hour = hourly_avg.idxmax()
print(f"\nأعلى متوسط حرارة في الساعة: {peak_hour}:00")
# 4. تقرير لكل آلة
print("\n=== تقرير الآلات ===")
for machine in df["machine_id"].unique():
m_data = df[df["machine_id"] == machine]
avg_t = m_data["temperature"].mean()
max_t = m_data["temperature"].max()
alerts = len(m_data[m_data["temperature"] > 85])
print(f"{machine}: متوسط={avg_t:.1f}°C, أعلى={max_t:.1f}°C, إنذارات={alerts}")
الخطوات التالية
بعد إتقان هذه الأساسيات، يمكنك التوسع في:
Matplotlibلرسم المخططات البيانية للحساساتSciPyللتحليل الإحصائي المتقدم وتحليل فورييهscikit-learnللتنبؤ بالأعطال قبل حدوثها (Predictive Maintenance)openpyxlلتوليد تقارير Excel تلقائياً- التكامل مع PLCs عبر بروتوكول
pymodbusأوopcua
Python ليست بديلاً عن لغات التحكم الصناعي مثل Structured Text أو Ladder Logic — لكنها الأداة المثالية لتحليل البيانات واتخاذ القرارات الذكية في المصنع.