def _combine_apply(self, datas, fitted_feature):
        cols = []
        colnames = []
        data = concat(datas, axis=1)
        n = len(data.columns)
        for i in range(n):
            d1 = data[data.columns[i]]
            for j in range(i+1, n):
                d2 = data[data.columns[j]]
                d = d1.mul( d2)
                colnames.append((d1.name, d2.name) % '%s, %s')
                cols.append(d)
        return concat(cols, keys=colnames, axis=1)


# class OutlierCount(ComboFeature):
#     # TODO: add prep
#     def __init__(self, features, stdevs=5):
#         super(OutlierCount, self).__init__(features)
#         self.stdevs = stdevs
#         self._name = self._name + '_%d'%stdevs

#     def is_outlier(self, x, mean, std):
#         return int(abs((x-mean)/std) > self.stdevs)

#     def _combine_apply(self, datas, fitted_feature):
#         count = DataFrame(np.zeros(len(datas[0])), index=datas[0].index)
#         eps = 1.0e-8
#         col_names = []
#         for data in datas:
#             for col in data.columns:
#                 d = data[col]
#                 m = d.mean()
#                 s = d.std()
#                 if s < eps:
#                     continue
#                 d = d.map(lambda x: self.is_outlier(x, m, s))
#                 col_names.append(col)
#                 count = count.add(d, axis=0)
#         count.columns = [','.join(col_names)]
#         return count
dataset/ETHPy150Open kvh/ramp/ramp/features/combo.py/Interactions._combine_apply/swapped operands of `%`