gpt4 book ai didi

python - 你如何在 Python 中建模随时间变化的东西?

转载 作者:行者123 更新时间:2023-12-03 18:13:57 25 4
gpt4 key购买 nike

我正在寻找一种数据类型来帮助我模拟流动时间内的资源可用性。

  • 我们从 9 点到 6 点开放,可以处理 5 个并行作业。在我想象中的编程领域,我刚刚初始化了一个具有该范围的对象,其值为 3。
  • 我们在书上有约会,每个约会都有开始和结束时间。
  • 我需要把每一天都打出来
  • 这给我留下了可用性上升和下降的各种图表,但最终让我能够快速找到剩余可用性的时间范围。

  • 我已经从多个方向解决了这个问题,但总是回到不知道数据类型来建模像整数这样简单的东西的基本问题。

    我可以将我的约会转换为时间序列事件(例如,约会到达意味着 -1 可用性,约会离开意味着 +1)但我仍然不知道如何操作该数据,以便我可以提取可用性大于零的时间段.

    有人以缺乏重点为由进行了近距离投票,但我在这里的目标似乎很单一,因此我将尝试以图形方式解释问题。我试图推断事件作业数量低于给定容量的时间段。

    enter image description here

    将一系列已知的并行容量(例如 9-6 之间的 3 个)和具有可变开始/结束的作业列表转换为可用时间的时间范围列表。

    最佳答案

    我的方法是构建时间序列,但包括可用性对象,该对象的值设置为该期间的可用性。

    availability: 
    [
    {
    "start": 09:00,
    "end": 12:00,
    "value": 4
    },
    {
    "start": 12:00,
    "end": 13:00,
    "value": 3
    }
    ]
    data: [
    {
    "start": 10:00,
    "end": 10:30,
    }
    ]

    在开始/结束时间建立时间序列索引,以值作为值。可用性的开始时间是+值,结束时间是-值。对于事件,如您所说,它是 -1 或 +1。
    "09:00" 4
    "10:00" -1
    "10:30" 1
    "12:00" -4
    "12:00" 3
    "13:00" -3

    然后按索引、总和和累计总和分组。

    得到:
    "09:00" 4
    "10:00" 3
    "10:30" 4
    "12:00" 3
    "13:00" 0

    Pandas 中的示例代码:

    import numpy as np
    import pandas as pd


    data = [
    {
    "start": "10:00",
    "end": "10:30",
    }
    ]

    breakpoints = [
    {
    "start": "00:00",
    "end": "09:00",
    "value": 0
    },
    {
    "start": "09:00",
    "end": "12:00",
    "value": 4
    },
    {
    "start": "12:00",
    "end": "12:30",
    "value": 4
    },
    {
    "start": "12:30",
    "end": "13:00",
    "value": 3
    },
    {
    "start": "13:00",
    "end": "00:00",
    "value": 0
    }
    ]

    df = pd.DataFrame(data, columns=['start', 'end'])

    print(df.head(5))

    starts = pd.DataFrame(data, columns=['start'])
    starts["value"] = -1
    starts = starts.set_index("start")

    ends = pd.DataFrame(data, columns=['end'])
    ends["value"] = 1
    ends = ends.set_index("end")

    breakpointsStarts = pd.DataFrame(breakpoints, columns=['start', 'value']).set_index("start")

    breakpointsEnds = pd.DataFrame(breakpoints, columns=['end', 'value'])
    breakpointsEnds["value"] = breakpointsEnds["value"].transform(lambda x: -x)
    breakpointsEnds = breakpointsEnds.set_index("end")

    countsDf = pd.concat([starts, ends, breakpointsEnds, breakpointsStarts]).sort_index()
    countsDf = countsDf.groupby(countsDf.index).sum().cumsum()

    print(countsDf)

    # Periods that are available

    df = countsDf
    df["available"] = df["value"] > 0

    # Indexes where the value of available changes
    # Alternatively swap out available for the value.
    time_changes = df["available"].diff()[df["available"].diff() != 0].index.values
    newDf = pd.DataFrame(time_changes, columns= ["start"])

    # Setting the end column to the value of the next start
    newDf['end'] = newDf.transform(np.roll, shift=-1)
    print(newDf)

    # Join this back in to get the actual value of available
    mergedDf = newDf.merge(df, left_on="start", right_index=True)

    print(mergedDf)

    最后返回:
       start    end  value  available
    0 00:00 09:00 0 False
    1 09:00 13:00 4 True
    2 13:00 00:00 0 False

    关于python - 你如何在 Python 中建模随时间变化的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60536592/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com