I only simulated sample_type==1. Apologies if I got it backwards.
# %%
background_rate = 1e-4
signal_rate = 5e-2
num_obs = 500
simulated_data = pd.DataFrame(
data=[ss.norm.rvs(loc=10_000, scale=1_500, size=num_obs)], index=["N"]
).T
simulated_data["N"] = simulated_data["N"].astype(int)
simulated_data["sample_type"] = [
np.random.randint(2) for i in range(len(simulated_data))
]
simulated_data["fraction"] = ss.uniform.rvs(size=num_obs)
simulated_data["fraction"] = 0.5
simulated_data["background_counts"] = ss.binom.rvs(
n=simulated_data["N"], p=background_rate
)
simulated_data["signal_counts"] = ss.binom.rvs(n=simulated_data["N"], p=signal_rate)
cnd = simulated_data["sample_type"] == 0
simulated_data.loc[cnd, "signal_counts"] = 0
simulated_data["observed_counts"] = (
simulated_data["signal_counts"] * simulated_data["fraction"]
) + (simulated_data["background_counts"] * (1 - simulated_data["fraction"]))
simulated_data["observed_counts"] = simulated_data["observed_counts"].astype(int)
simulated_data = simulated_data[simulated_data["sample_type"] == 1]