python - 在 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'])
解决方案
为了回答我自己的问题,下面的代码似乎可以工作,但我不确定这是否真的是“正确”的方法:
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)```
推荐阅读
- react-apollo - Apollo 客户端延迟请求
- jquery - 如何在淘汰赛中不断更新绑定到视图的值数据
- sql - SQL column name with comma
- c# - 从文件夹中获取所有文件及其信息
- ffmpeg - 使用 ffmpeg 或 ffplay 播放问题
- javascript - 我无法将值传递给函数
- android - Pusher Beams - 推送通知取消订阅在 android 中不起作用
- gulp - 什么是项目进行 gulp 集成的最佳时间或阶段?
- arrays - 对数组元素使用 Mockito 匹配器
- django - 通过 POST 请求将图像保存到 Django 媒体文件夹