you can move the `self.df.loc[:, self.columns]` out of the inner loop, right?  It's not different each iteration and no point in recalculating...