def METHOD_NAME(umi, model_str, data, theta_estimation_fun="theta.ml") -> pd.DataFrame:
    # TODO: ignore `theta_estimation_fun`
    regressor_data = dmatrix("~log_umi", data, return_type='dataframe')
    results = Parallel(n_jobs=cpu_count(), backend="threading")(
        delayed(one_row_fit_poission)(regressor_data, y.toarray()[0], theta_estimation_fun)
        for y in umi
    )
    return pd.DataFrame(results, columns=["theta", "Intercept", "log_umi"])