Как написать преобразователь в конвейере sklearn с несколькими входами столбцов данных - PullRequest
0 голосов
/ 09 мая 2020

Мой фрейм данных выглядит как

+---------------------+-------------+---------+---------+---------+---------+
| Date                |   pre_close |    open |    high |     low |   close |  
|---------------------+-------------+---------+---------+---------+---------+
| 1992-04-27 00:00:00 |     0.93152 | 0.93152 | 1.12912 | 0.93152 | 1.08677 |   
| 1992-04-28 00:00:00 |     1.08677 | 1.07266 | 1.12912 | 1.07266 | 1.10512 | 
| 1992-04-29 00:00:00 |     1.10512 | 1.10512 | 1.12347 | 1.08677 | 1.11077 | 
| 1992-04-30 00:00:00 |     1.11077 | 1.11077 | 1.14323 | 1.10089 | 1.1277  |   
| 1992-05-04 00:00:00 |     1.1277  | 1.17146 | 1.19969 | 1.17146 | 1.19686 |  
+---------------------+-------------+---------+---------+---------+---------+

Я хочу использовать столбцы: pre_close, close, high, low для вычисления метри c TR с помощью конвейера sklearn, вот как я написал свой трансформатор

class TR(BaseEstimator, TransformerMixin):

    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
        return np.max([X['high']-X['low'],
                      np.abs(X['pre_close']-X['high']),
                      np.abs(X['pre_close']-X['low'])], axis=1)

вот как я использую его в конвейере

pipeline = Pipeline([("tr", TR()])

full_pipeline = ColumnTransformer([("num", pipeline, ['pre_close', 'close', 'high', 'low'])], remainder="passthrough")

data = full_pipeline.fit_transform(df)

Но я получаю эту ошибку:

TypeError: Last step of Pipeline should implement fit or be the string 'passthrough'. '<function TR at 0x1a181d2170>' (type <class 'function'>) doesn't

1 Ответ

0 голосов
/ 09 мая 2020

Я думаю, вы можете просто использовать pandas apply:

df["num"] = df.apply(lambda x: np.max([x['high']-x['high'], 
                                       np.abs(x['pre_close']-x['high']), 
                                       np.abs(x['pre_close']-x['low'])]), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...