تحسين محاكاة الانقطاع العشوائي للمنشآت الصناعية باستخدام الباندا

Python

تعزيز كفاءة محاكاة انقطاع التيار الكهربائي

تعد محاكاة الانقطاعات العشوائية للمنشآت الصناعية مهمة بالغة الأهمية لضمان التخطيط التشغيلي الأمثل وإدارة المخاطر. يمكن أن يكون كل مصنع متصلاً بالإنترنت أو غير متصل بالإنترنت، وقد يتطلب إنشاء بيانات سلاسل زمنية لتمثيل هذا التوفر عملية حسابية كبيرة. تقليديًا، يعد استخدام لغة بايثون الأصلية لرسم سلسلة من أطوال الانقطاعات والفترات الفاصلة بين الانقطاعات من التوزيعات الهندسية أسلوبًا شائعًا.

ومع ذلك، عند توسيع نطاق ذلك إلى مصانع متعددة، تصبح العملية بطيئة وغير فعالة. تستكشف هذه المقالة كيف يمكننا الاستفادة من Pandas لتسريع عملية المحاكاة، مع الاستفادة من قدراتها القوية في معالجة البيانات لتبسيط عملية إنشاء مجموعات بيانات السلاسل الزمنية هذه.

يأمر وصف
pd.date_range() يُنشئ نطاقًا من التواريخ بين تاريخي البدء والانتهاء المحددين.
np.log() يحسب اللوغاريتم الطبيعي للمدخلات المستخدمة لإنشاء عينات التوزيع الهندسي.
random.random() إرجاع رقم الفاصلة العائمة العشوائي بين 0.0 و1.0، المستخدم لإنشاء احتمالات عشوائية.
math.floor() إرجاع أكبر عدد صحيح أقل من أو يساوي القيمة المحددة، المستخدمة لتحويل العدد العائم إلى عدد صحيح.
math.ceil() إرجاع أصغر عدد صحيح أكبر من أو يساوي القيمة المحددة، ويستخدم للتقريب إلى أقرب عدد صحيح.
pd.DataFrame() ينشئ كائن DataFrame من القاموس، ويستخدم لتنظيم البيانات الجدولية ومعالجتها.
extend() إلحاق عناصر متعددة بنهاية القائمة، تُستخدم لإضافة حالات انقطاع متعددة مرة واحدة.
datetime() يمثل تاريخًا ووقتًا محددين، يُستخدمان لتحديد تواريخ بدء وانتهاء المحاكاة.

محاكاة مبسطة لانقطاع المصنع مع الباندا

توضح البرامج النصية أعلاه كيفية محاكاة الانقطاعات العشوائية بكفاءة لمنشآت صناعية متعددة باستخدام Pandas. الهدف الأساسي هو إنشاء بيانات تسلسلية زمنية تعكس مدى توفر كل مصنع، إما عبر الإنترنت (1) أو دون اتصال (0). في البداية، نحدد فترة المحاكاة بـ كائنات تمثل تاريخي البدء والانتهاء. يتم أيضًا تعيين ثوابت مثل متوسط ​​مدة الانقطاع ومتوسط ​​الوقت غير المتصل بالإنترنت. باستخدام هذه القيم، نحسب معلمات التوزيعات الهندسية على وجه التحديد و والتي سوف تساعد في توليد فترات عشوائية. جوهر المحاكاة هو حلقة تولد بيانات الانقطاع لكل مصنع. في هذه الحلقة نستخدم np.log و لسحب عينات لأطوال الانقطاع والفترات الفاصلة بين الانقطاعات. يتم بعد ذلك استخدام هذه العينات لتحديث حالة كل مصنع يومًا بعد يوم. إذا كانت المحطة غير متصلة بالإنترنت، يتم تعيين الحالة إلى 0 طوال مدة انقطاع الخدمة؛ وبخلاف ذلك، يتم ضبطه على 1. يتم تكرار هذه العملية حتى تتم تغطية فترة المحاكاة. يتم بعد ذلك تخزين بيانات الحالة التي تم إنشاؤها لكل مصنع في Pandas DataFrame، مما يسمح بمعالجة البيانات وتحليلها بكفاءة.

يعمل البرنامج النصي الثاني على تحسين إنشاء بيانات الانقطاع عن طريق تغليف المنطق في وظيفة تسمى . تتبع هذه الوظيفة نفس الخطوات ولكنها أكثر نمطية وقابلة لإعادة الاستخدام، مما يسمح بتعليمات برمجية أكثر نظافة وقابلية للصيانة. تقوم الوظيفة بإنشاء حالة التوفر لمصنع واحد وتقوم بإرجاع قائمة تمثل حالة المصنع خلال فترة المحاكاة. من خلال استدعاء هذه الوظيفة داخل حلقة لمحطات متعددة، نقوم بملء DataFrame ببيانات الانقطاع لكل محطة. استخدام لإنشاء تسلسل من التواريخ و يضمن تنظيم البيانات أن تكون المحاكاة فعالة وسهلة الفهم. يمكن استخدام DataFrame النهائي لمزيد من التحليل أو التصور، مما يوفر رؤى قيمة حول أنماط توفر المنشآت الصناعية.

تحسين عمليات محاكاة انقطاع المصنع باستخدام الباندا

بايثون - استخدام الباندا لمحاكاة السلاسل الزمنية الفعالة

import pandas as pd
import numpy as np
import random
import math
from datetime import datetime, timedelta

# Constants
SIMULATION_START_DATE = datetime(2024, 1, 1)
SIMULATION_END_DATE = datetime(2025, 1, 1)
mean_outage_duration = 3
mean_fraction_offline = 0.05

# Simulation Parameters
days_in_simulation = (SIMULATION_END_DATE - SIMULATION_START_DATE).days
outage_length_mu = -1 / mean_outage_duration
between_outages_mu = -1 / (days_in_simulation * mean_fraction_offline)

# DataFrame to hold the time-series data
plants = 10  # Number of plants
data = pd.DataFrame({'day': pd.date_range(start=SIMULATION_START_DATE, end=SIMULATION_END_DATE)})
for plant in range(plants):
    status = []
    sum_of_days = 0
    while sum_of_days < days_in_simulation:
        outage_length = math.floor(np.log(1 - random.random()) / outage_length_mu)
        days_until_next_outage = math.ceil(np.log(1 - random.random()) / between_outages_mu)
        if random.random() > mean_fraction_offline:
            days_until_next_outage = 0
        sum_of_days += days_until_next_outage
        for _ in range(days_until_next_outage):
            if sum_of_days >= days_in_simulation:
                break
            status.append(1)
            sum_of_days += 1
        for _ in range(outage_length):
            if sum_of_days >= days_in_simulation:
                break
            status.append(0)
            sum_of_days += 1
    data[f'plant_{plant}'] = status[:days_in_simulation]

print(data.head())

إنشاء سلسلة زمنية فعالة لانقطاعات المصانع

Python - التحسين باستخدام Pandas للحصول على أداء أفضل

import pandas as pd
import numpy as np
import random
from datetime import datetime, timedelta

# Constants
SIMULATION_START_DATE = datetime(2024, 1, 1)
SIMULATION_END_DATE = datetime(2025, 1, 1)
mean_outage_duration = 3
mean_fraction_offline = 0.05

# Simulation Parameters
days_in_simulation = (SIMULATION_END_DATE - SIMULATION_START_DATE).days
outage_length_mu = -1 / mean_outage_duration
between_outages_mu = -1 / (days_in_simulation * mean_fraction_offline)

# Function to generate a single plant's outage data
def generate_outages():
    status = []
    sum_of_days = 0
    while sum_of_days < days_in_simulation:
        outage_length = math.floor(np.log(1 - random.random()) / outage_length_mu)
        days_until_next_outage = math.ceil(np.log(1 - random.random()) / between_outages_mu)
        if random.random() > mean_fraction_offline:
            days_until_next_outage = 0
        sum_of_days += days_until_next_outage
        status.extend([1] * min(days_until_next_outage, days_in_simulation - sum_of_days))
        sum_of_days += outage_length
        status.extend([0] * min(outage_length, days_in_simulation - sum_of_days))
    return status[:days_in_simulation]

# Generate DataFrame for multiple plants
plants = 10
data = pd.DataFrame({'day': pd.date_range(start=SIMULATION_START_DATE, end=SIMULATION_END_DATE)})
for plant in range(plants):
    data[f'plant_{plant}'] = generate_outages()

print(data.head())

تحسين عمليات محاكاة انقطاع الخدمة باستخدام تقنيات الباندا المتقدمة

بالإضافة إلى محاكاة السلاسل الزمنية الأساسية باستخدام Pandas، هناك العديد من التقنيات والوظائف المتقدمة التي يمكنها تحسين العملية بشكل أكبر. إحدى هذه التقنيات هي التوجيه، والذي يتضمن إجراء عمليات على مصفوفات بأكملها بدلاً من التكرار من خلال العناصر الفردية. ومن خلال الاستفادة من العمليات الموجهة في Pandas، يمكننا تسريع عملية محاكاة انقطاع الخدمة بشكل كبير. يقلل هذا الأسلوب من الحمل الزائد لحلقات Python ويستفيد بشكل كامل من التحسينات الداخلية لـ Pandas. جانب حاسم آخر هو التعامل الفعال مع مجموعات البيانات الكبيرة. عند التعامل مع عمليات المحاكاة للعديد من المصانع على مدى فترات طويلة، تصبح إدارة الذاكرة أمرًا ضروريًا. يمكن أن يؤدي استخدام أنواع البيانات التي تستهلك ذاكرة أقل، مثل نوع البيانات الفئوية لـ Pandas لحالات المصنع، إلى تحسينات كبيرة في الأداء. بالإضافة إلى ذلك، فإن استخدام تقنيات مثل التجميع، حيث تتم معالجة مجموعة البيانات في أجزاء أصغر، يمكن أن يساعد في إدارة استخدام الذاكرة بشكل فعال ومنع مشكلات تجاوز سعة الذاكرة المحتملة أثناء المحاكاة.

علاوة على ذلك، يمكن أن يؤدي دمج المكتبات الأخرى مثل NumPy وSciPy إلى تحسين وظائف وأداء عمليات محاكاة انقطاع الخدمة. على سبيل المثال، تم تحسين وظائف أخذ العينات العشوائية في NumPy بدرجة كبيرة ويمكن استخدامها لإنشاء فترات انقطاع وفترات زمنية أكثر كفاءة. يوفر SciPy وظائف إحصائية متقدمة يمكن أن تكون مفيدة لعمليات المحاكاة الأكثر تعقيدًا. يتيح الجمع بين هذه المكتبات مع Pandas إنشاء إطار محاكاة أكثر قوة وقابلية للتطوير، وقادرًا على التعامل مع السيناريوهات المختلفة وتوفير رؤى أعمق حول أنماط توفر المصنع.

  1. ما هي مزايا استخدام Pandas لمحاكاة الانقطاع؟
  2. توفر Pandas إمكانات فعالة لمعالجة البيانات وتحليلها، مما يسمح بمحاكاة أسرع لمجموعات البيانات الكبيرة مقارنة بحلقات Python الأصلية.
  3. كيف يعمل التوجيه على تحسين أداء عمليات محاكاة الانقطاع؟
  4. تقوم تقنية Vectorization بإجراء عمليات على مصفوفات بأكملها مرة واحدة، مما يقلل الحمل الزائد للحلقات ويستفيد من التحسينات الداخلية في Pandas.
  5. ما هو دور في السيناريو المحاكاة؟
  6. يُستخدم لحساب اللوغاريتم الطبيعي، مما يساعد في إنشاء عينات من التوزيع الهندسي لأطوال فترات الانقطاع والفواصل الزمنية.
  7. لماذا تعتبر إدارة الذاكرة مهمة في عمليات المحاكاة واسعة النطاق؟
  8. تمنع إدارة الذاكرة الفعالة تجاوز سعة الذاكرة وتضمن التنفيذ السلس، خاصة عند محاكاة العديد من النباتات على مدى فترات طويلة.
  9. كيف يمكن لأنواع البيانات الفئوية في Pandas المساعدة في تحسين عمليات المحاكاة؟
  10. تعمل أنواع البيانات الفئوية على تقليل استخدام الذاكرة من خلال تمثيل القيم المتكررة بشكل أكثر كفاءة، وهو أمر مفيد في التعامل مع بيانات حالة المصنع.
  11. ما هي بعض المكتبات الأخرى التي يمكنها تحسين عمليات محاكاة الانقطاع؟
  12. توفر المكتبات مثل NumPy وSciPy وظائف محسنة لأخذ العينات العشوائية والتحليل الإحصائي، مما يكمل قدرات معالجة البيانات لدى Pandas.
  13. هل يمكن استخدام التجزئة لإدارة مجموعات البيانات الكبيرة في عمليات محاكاة الانقطاع؟
  14. نعم، تساعد معالجة مجموعة البيانات في أجزاء أصغر على إدارة استخدام الذاكرة بشكل فعال وتضمن قدرة المحاكاة على التعامل مع مجموعات البيانات الكبيرة دون مشاكل.
  15. ما هي فوائد دمج NumPy مع Pandas لعمليات المحاكاة؟
  16. يمكن لوظائف أخذ العينات العشوائية المحسنة في NumPy أن تولد فترات انقطاع وفترات زمنية أكثر كفاءة، مما يعزز الأداء العام للمحاكاة.

إن دمج الباندا لمحاكاة الانقطاعات العشوائية في المنشآت الصناعية يعزز بشكل كبير من كفاءة العملية. ومن خلال الاستفادة من قدرات Pandas القوية في معالجة البيانات، يمكننا إنشاء بيانات تسلسلية زمنية دقيقة لتوافر المصنع. لا يعمل هذا الأسلوب على تحسين سرعة المحاكاة فحسب، بل يضمن أيضًا إدارة أفضل للذاكرة وقابلية التوسع. يؤدي استخدام التوجيه ودمج المكتبات مثل NumPy وSciPy إلى تحسين المحاكاة بشكل أكبر، مما يجعلها قوية وقابلة للتطوير لمجموعات البيانات الكبيرة. بشكل عام، توفر Pandas حلاً شاملاً لمحاكاة وتحليل انقطاعات الخدمة في المصنع بكفاءة، مما يتيح التخطيط التشغيلي وإدارة المخاطر بشكل أفضل.