首页 > 解决方案 > 在 SciKit Learn 中使用相同的预处理器缩放数据框中的多列

问题描述

在下面的数据框中,我想在每个符号中使用相同的最小值和最大值来缩放 Open、High、Low、Close。

我可以用下面的代码做到这一点,但是有没有一种合理的方法可以用 SciKit Learn 预处理器来实现它?

df = pd.DataFrame([[1, 'A', 10, 11, 9, 9, 100],
                   [2, 'A', 9, 13, 9, 12, 150],
                   [3, 'A', 12, 15, 11, 15, 130],
                   [1, 'B', 90, 95, 90, 92, 10],
                   [2, 'B', 92, 93, 84, 85, 13],
                   [3, 'B', 85, 88, 81, 83, 11]],
                  columns=['Timestamp', 'Symbol', 'Open', 'High', 'Low', 'Close', 'Volume'])

df.set_index(['Timestamp', 'Symbol', 'Volume'], inplace=True)
((df.stack() - df.stack().groupby('Symbol').min()) / (df.stack().groupby('Symbol').max() - df.stack().groupby('Symbol').min())).unstack().reset_index(['Volume'])

标签: pythonpandasdataframescikit-learn

解决方案


为了回答我自己的问题,下面的代码似乎可以工作,但我不确定这是否真的是“正确”的方法:

df.set_index(['Timestamp', 'Symbol', 'Volume'], inplace=True)
df = df.stack().to_frame().groupby('Symbol').apply(SklearnWrapper(MinMaxScaler()))[0].unstack().reset_index()

我从Apply multiple StandardScaler's to individual groups 中获得了 SklearnWrapper?

import typing
import pandas as pd

class SklearnWrapper:
    def __init__(self, transform: typing.Callable):
        self.transform = transform

    def __call__(self, df):
        transformed = self.transform.fit_transform(df.values)
        return pd.DataFrame(transformed, columns=df.columns, index=df.index)```

推荐阅读