【发布时间】:2021-09-21 15:33:51
【问题描述】:
我有一个数据框,我想在新列中创建随机数。随机数必须满足两个约束:
- 随机数之和必须达到指定的总和(在示例中,总和为 300)
- 对于每个观察,随机数必须不超过约束列中的值。
在下面的示例中,由于总和为 300,并且随机数不超过约束列,因此满足了约束。
示例:
| GEOID | CONSTRAINT | RANDOM |
|---|---|---|
| 010010000001 | 100 | 80 |
| 010010000002 | 50 | 40 |
| 010010000003 | 75 | 60 |
| 010010000004 | 75 | 60 |
| 010010000005 | 100 | 60 |
似乎已经证明了random numbers totaling a sum,但我没有看到带有第二个约束的示例。
为清楚起见进行编辑:新列必须是整数。最小下限值为 0。
【问题讨论】:
-
如果数字由于限制而不能相加怎么办?
-
我表达得很糟糕。让我们尝试一个例子:如果所有约束等于 10 并且总和是 300,那么您的问题没有解决方案
-
我认为类似:
res = rng.multinomial(300, df["CONSTRAINT"] / df["CONSTRAINT"].sum(), size=1)可能适用于整数 -
@DaniMesejo - 太棒了,我只有 2% 违反了第二个约束。这非常适合拒绝抽样,首次尝试成功率为 98%。
-
@DaniMesejo 能否请您将
res = rng.multinomial(300, df["CONSTRAINT"] / df["CONSTRAINT"].sum(), size=1)放入正式答案并解释其工作原理?我使用该答案尝试了 100 组 1000 次尝试,发现平均而言,我拒绝了 23% 的结果,因为其中一个结果大于约束。因为我可以检查有效的尝试,并且每次迭代都很快,所以这个解决方案适合我。
标签: python pandas random sum constraints