python 生成 Dataframe 示例

yhxst69z  于 2023-05-16  发布在  Python
关注(0)|答案(1)|浏览(97)

我有个问题我想创建一个示例 Dataframe 。如你所见,有11个任务。特别是对于Task2Task3Task7,您可以选择-因此您只能选择路径。
我想为每个任务创建一个开始和结束时间的示例 Dataframe 。我怎么能这么做重要的是,每一个终点都应该以未来为起点。进一步的工作也应该在将来。Task2_Start > Task1_EndTask5_End > Task5_Start注意特殊情况可以从Task8返回到Task7So Task7_Start > Task8_End > Task8_Start > Task7_End,因为你可以回到task7
如何创建一个示例 Dataframe ?
我想要三列(下面你可以找到一个例子)

d = {'id': [],
    'step': [],
     'timestamp': []}

import pandas as pd
import random

steps = ['Task1', 'Task2', 'Task3', 'Task4', 'Task5', 'Task6', 'Task7', 'Task8', 'Task9', 'Task10', 'Task11']

num_ids = 10

data = []
for id in range(1, num_ids + 1):
    current_step = 'Task1'
    for _ in range(len(steps)):
        data.append({'id': id, 'step': current_step})
        if current_step == 'Task2':
            next_step = random.choice(['Task3', 'Task4'])
        elif current_step == 'Task7':
            next_step = random.choice(['Task8', 'Task9'])
        elif current_step == 'Task3':
            next_step = random.choice(['Task5', 'Task11'])
        else:
            next_step = random.choice(steps)
        current_step = next_step

df = pd.DataFrame(data)
df['timestamp'] = pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S')

只有三个且没有条件的示例

import pandas as pd 
d = {'id': [1, 1, 1, 1, 1, 1,
            2, 2, 2, 2, 2, 2],
    'step': ['Task1_Start', 'Task1_End1', 'Task2_Start', 'Task2_End', 'Task3_Start', 'Task3_End',
              'Task1_Start', 'Task1_End1', 'Task2_Start', 'Task2_End', 'Task3_Start', 'Task3_End',],
     'timestamp': ['2023-01-01', '2023-01-05', '2023-01-10', '2023-01-12', '2023-02-12', '2023-02-14',
               '2023-01-01', '2023-01-05', '2023-01-10', '2023-01-12', '2023-01-15', '2023-02-16',]}

df  = pd.DataFrame(data=d,)

bmp9r5qi

bmp9r5qi1#

我不完全确定您在寻找什么,但我认为您可能希望创建一个字典(在我下面的代码中为steps),将每个任务Map到可能的下一个任务列表。
此外,通过将每个“时间戳”存储为datetime对象,您可以在每一步添加一个timedelta--这里我在每一步添加了一个30到60之间的随机秒数。也就是说,每个“id”具有比前一个晚30-60秒的时间戳。

import pandas as pd
import datetime
import random

steps = {
    1: [2],
    2: [3, 4],
    3: [5, 11],
    4: [5],
    5: [6],
    6: [7],
    7: [8,9],
    8: [7],
    9: [10],
    10: [1],
    11: [1]
}

num_ids = 100

records = []

current_task = 1
current_time = datetime.datetime.now()
for _id in range(num_ids):
    records.append({
        'id': _id,
        'task': current_task,
        'timestamp': current_time
    })
    _possible_next_tasks: list = steps.get(current_task)
    current_task = random.choice(_possible_next_tasks)
    current_time = current_time + datetime.timedelta(seconds=random.randint(30, 60))

df = pd.DataFrame.from_records(records)

您还可以定义一个字典,将每个任务Map到任务所需的时间,如

times_dict = {
   1: (60, 120),
   2: (2, 5)
}

然后将for循环内的替换代码替换为

_possible_next_tasks: list = steps.get(current_task)
    _secs_min, _secs_max = times_dict.get(current_task, (30, 60))
    current_task = random.choice(_possible_next_tasks)
    current_time = current_time + datetime.timedelta(seconds=random.randint(_secs_min, _secs_max))

这将gettimes_dict的可能时间范围,并在该范围内随机选择秒数,如果当前任务不在times_dict中,则默认为(30,60)。

相关问题