我有一個資料框架,我想在一個新列中創建亂數。這些亂數必須滿足兩個約束條件:
在下面的例子中,約束條件得到了滿足,因為總和是300,亂數沒有超過約束列。
示例:
似乎有亂數總和已經被證明,但我沒有看到有第二個約束的例子。
為清晰起見,編輯一下:新列必須是整數。最小的下限值是0.
編輯以明確:新列必須是整數。
uj5u.com熱心網友回復:
你可以使用多項式分布來建立一個近似答案:
def sample(total, constraints)。
import numpy as np
rng = np.random.default_rng()
samples = rng.multinomial(total, constraints / constraints.sum(), size=100)
return next(val for val in samplesif np. all(val < constraints))
df["RANDOM"] = sample(300, df["CONSTRAINT"]. values)
print(df)
輸出
GEOID CONSTRAINT RANDOM
0 10010000001 100 81
1 10010000002 50 42
2 10010000003 75 57
3 10010000004 75 53
4 10010000005 100 67
感謝@Michael Szczesny對該解決方案的測驗。
解決這個問題的關鍵,依賴于(參考numpy docs):
它的值,X_i = [X_0, X_1, ..., X_p],代表結果是i的次數。 結果是i。
在這篇博客文章中看到更多細節。
uj5u.com熱心網友回復:
這是我的解決方案,讓我知道你對它的看法:
total_sum = 300 # total we want to get, is dynamical
# 我們檢查問題是否符合實際。
if sum(df["CONSTRAINT"/span>]) < total_sum。
raise Exception("impossible to REACH")
random_value_list = [] #新列RANDOM的值。
# We shuffle just to make sure the function works well in any case, (can keep the original order with older indexes)
df = df.sample(frac=1)
df = df.reset_index(drop=False)
for i in range(df.shape[0] - 1) 。
total_reached = sum(random_value_list)
total_yet_to_reach = total_sum - total_reached
max_value = min(df.at[i, "CONSTRAINT"), total_yet_to_reach)
# we put constraints or max value to not go above 300 as conditions.
sum_next_constraints = sum(df.loc[i 1:, :]["CONSTRAINT"/span>]
random_value = random.randint(0, max_value)
# 這個while條件是對隨機.randint的最小值的條件。
while random_value sum_next_constraints total_reached < total_sum:
random_value = random.randint(0, max_value)
random_value_list.append(random_value)
# 完成串列以得到300(可以是0)。
random_value_list.append(total_sum - sum(random_value_list)
df["RANDOM"/span>] = random_value_list
df
這里只是其中一個例子,你可以得到什么:
index GEOID CONSTRAINT RANDOM
0 3 010010000004 75 49
1 0 010010000001 100 94
2 1 010010000002 50 10
3 2 010010000003 75 69
4 4 010010000005 100 78
我們可以檢查:
sum(df["RANDOM"])
出來 : 300。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332421.html
標籤:
