in causalml/match.py [0:0]
def check_table_one(self, tableone, matched, score_cols, pihat_threshold, caliper):
# check if better than past runs
smd_values = np.abs(tableone[tableone.index != "n"]["SMD"].astype(float))
num_cols_over_smd = (smd_values >= self.max_smd).sum()
self.cols_to_fix = (
smd_values[smd_values >= self.max_smd]
.sort_values(ascending=False)
.index.values
)
if self.user_col is None:
num_users_per_group = (
matched.reset_index().groupby(self.treatment_col)["index"].count().min()
)
else:
num_users_per_group = (
matched.groupby(self.treatment_col)[self.user_col].count().min()
)
deviations = [
np.abs(
self.original_stats[col]
/ matched[matched[self.treatment_col] == 1][col].mean()
- 1
)
for col in self.dev_cols_transformations.keys()
]
score = num_cols_over_smd
score += len(
[col for col in self.smd_cols if smd_values.loc[col] >= self.max_smd]
)
score += np.sum([dev * 10 * self.dev_factor for dev in deviations])
# check if can be considered as best score
if score < self.best_score and num_users_per_group > self.min_users_per_group:
self.best_score = score
self.best_params = {
"score_cols": score_cols.copy(),
"pihat": pihat_threshold,
"caliper": caliper,
}
self.best_matched = matched.copy()
if self.verbose:
logger.info(
"\tScore: {:.03f} (Best Score: {:.03f})\n".format(
score, self.best_score
)
)
# check if passes all criteria
self.pass_all = (
(num_users_per_group > self.min_users_per_group)
and (num_cols_over_smd == 0)
and all(dev < self.max_deviation for dev in deviations)
)