Fitting mixture of binomials

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]