【问题标题】:Generate random data for dates based on a few constraints根据一些约束为日期生成随机数据
【发布时间】:2019-12-30 10:06:14
【问题描述】:

我对此并不陌生,甚至可能会问一个幼稚的问题。我想生成一个带有一些约束的随机数据集:

date_1 - already generated in csv (Dated from 1 august 2018- 1 august 2019)
date_2 - 60% of the data lies within the 30 days from the date_1 and 40% of the data lies within 90 days of the date_2.  

capacity_1 - 3500 kgs is the threshold for a day. Cannot exceed the same for date_2 
capacity_2 - leftout weight for the day. its 3500-capacity_1 for a particular day.

我拥有的 date_1 格式是 d/m/y

谁能告诉我如何实现其他列。我打算用 100,000 行构建虚拟数据。

编辑:附加数据here的csv文件

EDIT2:输入看起来像:

date_1   

01/08/2018
01/08/2018
01/08/2018
01/08/2018
01/08/2018
01/08/2018
01/08/2018
01/08/2018
01/08/2018
01/08/2018
01/08/2018
01/08/2018

预期输出:

对于特定的 date_2,这里的 capacity_2 将是 3500-capacity_1。 capacity_2 基本上会给出特定日期已使用 3500 中的多少的想法。

谢谢

【问题讨论】:

  • @AndiDomi 你能帮我提供一个较小条目的伪代码吗?我没有得到解释的部分。
  • 抱歉第一个不清楚的评论,更新:我会用pandas 加载csv 然后我会在pandas 中取60% 的第一行,然后取总行数将该数字乘以 0.6 得到 df[ : first_60] 然后取 df[first_60 : ] 其余部分(40%)。
  • 然后根据上面的数据集,对于每一列,我将使用randrange(30)randrange(90) 生成带有timedelta 的一天
  • @AndiDomi 我做了数据集的拆分:df1 = df[:60000] df2 = df[60000:100000] 我们如何用 timedelta 生成一天,我无法得到。你能帮忙吗?
  • 这将有助于我们从您的 csv 文件中获取一些行(至少一些可以使用的虚拟数据),因为我们并不真正知道您的数据是什么样子以及最终结果应该是什么样子。跨度>

标签: python data-generation


【解决方案1】:

看看这个例子:

import pandas as pd
import datetime
import random

data = [
  [1,'a','b','01/08/2018'],
  [2,'a','b','01/08/2018'],
  [3,'a','b','01/08/2018'],
  [4,'a','b','01/08/2018'],
  [5,'a','b','01/08/2018'],
  [6,'a','b','01/08/2018'],
  [7,'a','b','01/08/2018'],
  [8,'a','b','01/08/2018'],
  [9,'a','b','01/08/2018'],
  [10,'a','b','01/08/2018']
  ]
# this should be crated by reading the csv file
df = pd.DataFrame(data) 

df = pd.to_datetime(df[0:][3], format='%d/%m/%Y')

generated_data = []
for index, date_1 in df.iteritems():
  # if in the first 60% generate +-30 days
  if index <= len(df) * 0.6 :
    days_to_add = random.randint(-30,30)
  else : 
    days_to_add = random.randint(-90,90)

  # add that day to the date_1
  date_2 = date_1 + datetime.timedelta(days=days_to_add)
  weight = random.randint(0,3500)
  capacity_1 = random.randint(0, 3500 - weight)
  capacity_2 = 3500 - capacity_1
  generated_data.append([date_1, date_2, weight, capacity_1, capacity_2])

df2 = pd.DataFrame(generated_data)
print(df2)

首先,我们从提取的 CSV 中仅删除第三列。然后我们使用生成日期添加到日期然后我们date_1 并创建 date_2。 capacity_1 是以3500-weight 为上限创建的,其余的很容易。 输出如下:

0 2018-08-01 2018-07-06  3136    11  3489
1 2018-08-01 2018-08-11  3476    13  3487
2 2018-08-01 2018-07-28  2620   207  3293
3 2018-08-01 2018-07-22  1976  1437  2063
4 2018-08-01 2018-07-06  3057    19  3481
5 2018-08-01 2018-08-19   773  1481  2019
6 2018-08-01 2018-08-06   823  2002  1498
7 2018-08-01 2018-07-01  1166  2200  1300
8 2018-08-01 2018-10-22   156  2567   933
9 2018-08-01 2018-06-18  1248  1842  1658

【讨论】:

  • 感谢您的回复,我想您误解了我的意思,1.日期需要随机选择,而不仅仅是基于索引,因为它只会导致分配给30天。此外,规则是 ex-如果在 2018-01-01 中有 20 个 date_2 条目,则 capacity_1 的总和不应超过 3500 的总数。它应该是 3500 或更少。然后 capacity_2 = 1-capacity_1 每天的总和。
  • 不太清楚您的预期输出是什么。是否应该在每个日期之后更新 capacity_1?这意味着如果我们有 1 个日期重复两次,则 capacity_1 会是什么样子。是浮点数吗?请使用预期的输出示例更新您的问题。
  • 我已经用输入和预期输出编辑了问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多