使用 Pandas 优化工业工厂的随机断电模拟

使用 Pandas 优化工业工厂的随机断电模拟
使用 Pandas 优化工业工厂的随机断电模拟

提高停电模拟效率

模拟工厂的随机停电是确保最佳运营规划和风险管理的一项关键任务。每个工厂可以在线或离线,生成时间序列数据来表示这种可用性可能需要大量的计算。传统上,使用原生 Python 从几何分布中绘制一系列停电长度和停电间隔是一种常见的方法。

然而,当将其扩展到多个工厂时,该过程变得缓慢且低效。本文探讨了如何利用 Pandas 来加速模拟,利用其强大的数据操作功能来简化这些时间序列数据集的生成。

命令 描述
pd.date_range() 生成指定的开始日期和结束日期之间的日期范围。
np.log() 计算输入的自然对数,用于生成几何分布样本。
random.random() 返回 0.0 到 1.0 之间的随机浮点数,用于生成随机概率。
math.floor() 返回小于或等于指定值的最大整数,用于将浮点数转换为整数。
math.ceil() 返回大于或等于指定值的最小整数,用于向上舍入到最接近的整数。
pd.DataFrame() 从字典创建 DataFrame 对象,用于组织和操作表格数据。
extend() 将多个项目追加到列表末尾,用于一次添加多个中断状态。
datetime() 表示特定的日期和时间,用于定义模拟开始和结束日期。

使用 Pandas 简化工厂停电模拟

上面的脚本演示了如何使用 Pandas 有效地模拟多个工厂的随机中断。主要目标是生成反映每个工厂在线 (1) 或离线 (0) 可用性的时间序列数据。最初,我们定义模拟周期 datetime 表示开始日期和结束日期的对象。还设置了平均中断持续时间和平均离线时间比例等常数。使用这些值,我们计算几何分布的参数,特别是 outage_length_mubetween_outages_mu,这将有助于生成随机间隔。 模拟的核心是一个为每个工厂生成停电数据的循环。在这个循环中,我们使用 np.lograndom.random 抽取停电长度和停电间隔时间的样本。然后使用这些样本来每天更新每个工厂的状态。如果工厂离线,则在停电期间状态设置为 0;否则,设置为1。重复该过程,直到覆盖模拟周期。然后,为每个工厂生成的状态数据存储在 Pandas DataFrame 中,从而可以进行高效的数据操作和分析。

第二个脚本通过将逻辑封装在名为的函数中来优化中断数据的生成 generate_outages。该函数遵循相同的步骤,但更加模块化和可重用,从而允许更清晰和更易于维护的代码。该函数生成单个工厂的可用性状态,并返回表示模拟期间工厂状态的列表。通过在多个工厂的循环中调用此函数,我们使用每个工厂的停电数据填充 DataFrame。指某东西的用途 pd.date_range 创建日期序列并 pd.DataFrame 组织数据可确保模拟既高效又易于理解。最终的数据框架可用于进一步分析或可视化,为工厂的可用性模式提供有价值的见解。

使用 Pandas 优化工厂停电模拟

Python - 使用 Pandas 进行高效的时间序列模拟

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 进行基本的时间序列模拟之外,还有几种先进的技术和功能可以进一步优化流程。其中一种技术是向量化,它涉及对整个数组执行操作,而不是迭代单个元素。通过利用 Pandas 中的矢量化操作,我们可以显着加快中断模拟过程。这种方法减少了 Python 循环的开销,并充分利用了 Pandas 的内部优化。 另一个关键方面是高效处理大型数据集。当长时间处理大量工厂的模拟时,内存管理变得至关重要。使用消耗较少内存的数据类型(例如 Pandas 的植物状态分类数据类型)可以显着提高性能。此外,采用分块等技术(将数据集以较小的块进行处理)可以帮助有效管理内存使用情况并防止模拟过程中潜在的内存溢出问题。

此外,集成 NumPy 和 SciPy 等其他库可以增强断电模拟的功能和性能。例如,NumPy 的随机采样函数经过高度优化,可用于更有效地生成中断长度和间隔。 SciPy 提供了先进的统计函数,有利于更复杂的模拟。将这些库与 Pandas 相结合可以形成更强大且可扩展的模拟框架,能够处理各种场景并提供对工厂可用性模式的更深入的了解。

关于使用 Pandas 进行高效停电模拟的常见问题

  1. 使用 Pandas 进行停电模拟有哪些优势?
  2. Pandas 提供高效的数据操作和分析功能,与原生 Python 循环相比,可以更快地模拟大型数据集。
  3. 矢量化如何提高停电模拟的性能?
  4. 矢量化同时对整个数组执行操作,减少循环开销并利用 Pandas 的内部优化。
  5. 的作用是什么 np.log() 在模拟脚本中?
  6. np.log() 用于计算自然对数,这有助于根据停电长度和间隔的几何分布生成样本。
  7. 为什么内存管理在大规模模拟中很重要?
  8. 高效的内存管理可防止内存溢出并确保平稳执行,尤其是在长时间模拟大量工厂时。
  9. Pandas 中的分类数据类型如何帮助优化模拟?
  10. 分类数据类型通过更有效地表示重复值来减少内存使用,这有利于处理工厂状态数据。
  11. 还有哪些其他库可以增强中断模拟?
  12. NumPy 和 SciPy 等库提供了随机采样和统计分析的优化函数,补充了 Pandas 的数据操作功能。
  13. 可以使用分块来管理中断模拟中的大型数据集吗?
  14. 是的,以较小的块处理数据集有助于有效管理内存使用情况,并确保模拟可以毫无问题地处理大型数据集。
  15. 将 NumPy 与 Pandas 集成进行模拟有哪些好处?
  16. NumPy 的优化随机采样函数可以更有效地生成中断长度和间隔,从而增强模拟的整体性能。

有效优化停电模拟

使用 Pandas 来模拟工厂中的随机中断可显着提高流程效率。通过利用 Pandas 强大的数据处理功能,我们可以生成准确的工厂可用性时间序列数据。这种方法不仅提高了模拟速度,而且确保了更好的内存管理和可扩展性。使用矢量化和集成库(如 NumPy 和 SciPy)可进一步优化模拟,使其对于大型数据集而言具有鲁棒性和可扩展性。总的来说,Pandas 提供了一个全面的解决方案,可以有效地模拟和分析工厂停电,从而实现更好的运营规划和风险管理。