范围来自数据框中多列的 MinMaxScaler
MinMaxScaler with range from multiple columns in dataframe
我有一个 OHLC 数据框(开盘价、最高价、最低价、收盘价),用于每分钟的传感器数据。我需要缩放值,但所有值都具有相同的比例。比例尺需要使用四列中任意一列的最小值和最大值。例如,最小值可以在 'Low' 列中,最大值可以在 'High' 列中。基于该范围 (min(df['low'])
- max(df['high'])
),我想安装洁牙器。
我目前正在使用 sklearn.preprocessing 的 MinMaxScaler
。但是,我只能将它放入一列。因此,如果我将它放入 df['open']
列并转换另一列,则值不再介于 0 和 1 之间,而是可以是 < 0 和 > 1.
如何使用定标器中所有列的完整范围?
您可以通过自己进行数学运算来标准化所有列,使用 df.min().min()
和 df.max().max()
获取整个数据帧的最小值和最大值,或者更简单地说 df['Low'].min()
和 df['High'].max()
分别从 Low
和 High
列中获取 minimum/maximum 值。例如:
df = pd.DataFrame({
'Open': [1, 1.1, 0.9, 0.9],
'High': [1.2, 1.2, 1.1, 1.3],
'Low': [1, 1.0, 0.8, 0.7],
'Close': [1.1, 1.2, 0.8, 1.2]
})
df
# Open High Low Close
# 0 1.0 1.2 1.0 1.1
# 1 1.1 1.2 1.0 1.2
# 2 0.9 1.1 0.8 0.8
# 3 0.9 1.3 0.7 1.2
min = df.min().min() # df['Low'].min()
max = df.max().max() # df['High'].max()
norm = (df - min) / (max - min)
norm
# Open High Low Close
# 0 0.500000 0.833333 0.500000 0.666667
# 1 0.666667 0.833333 0.500000 0.833333
# 2 0.333333 0.666667 0.166667 0.166667
# 3 0.333333 1.000000 0.000000 0.833333
如果有人最终访问此页面,我实际上找到了另一种方法,即使用 Numpy 重塑数据并将其输入缩放器。重塑并根据我的问题排序创建一个新的数据框:
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
#kudo's to Nick, I used his df to illustrate my example.
df = pd.DataFrame({
'Open': [1, 1.1, 0.9, 0.9],
'High': [1.2, 1.2, 1.1, 1.3],
'Low': [1, 1.0, 0.8, 0.7],
'Close': [1.1, 1.2, 0.8, 1.2]
})
scaler = MinMaxScaler()
df_np = scaler.fit_transform(df.to_numpy().reshape(-1,1))
df = pd.DataFrame(df_np.reshape(4,-1), columns=df.columns)
# Open High Low Close
# 0 0.500000 0.833333 0.500000 0.666667
# 1 0.666667 0.833333 0.500000 0.833333
# 2 0.333333 0.666667 0.166667 0.166667
# 3 0.333333 1.000000 0.000000 0.833333
我有一个 OHLC 数据框(开盘价、最高价、最低价、收盘价),用于每分钟的传感器数据。我需要缩放值,但所有值都具有相同的比例。比例尺需要使用四列中任意一列的最小值和最大值。例如,最小值可以在 'Low' 列中,最大值可以在 'High' 列中。基于该范围 (min(df['low'])
- max(df['high'])
),我想安装洁牙器。
我目前正在使用 sklearn.preprocessing 的 MinMaxScaler
。但是,我只能将它放入一列。因此,如果我将它放入 df['open']
列并转换另一列,则值不再介于 0 和 1 之间,而是可以是 < 0 和 > 1.
如何使用定标器中所有列的完整范围?
您可以通过自己进行数学运算来标准化所有列,使用 df.min().min()
和 df.max().max()
获取整个数据帧的最小值和最大值,或者更简单地说 df['Low'].min()
和 df['High'].max()
分别从 Low
和 High
列中获取 minimum/maximum 值。例如:
df = pd.DataFrame({
'Open': [1, 1.1, 0.9, 0.9],
'High': [1.2, 1.2, 1.1, 1.3],
'Low': [1, 1.0, 0.8, 0.7],
'Close': [1.1, 1.2, 0.8, 1.2]
})
df
# Open High Low Close
# 0 1.0 1.2 1.0 1.1
# 1 1.1 1.2 1.0 1.2
# 2 0.9 1.1 0.8 0.8
# 3 0.9 1.3 0.7 1.2
min = df.min().min() # df['Low'].min()
max = df.max().max() # df['High'].max()
norm = (df - min) / (max - min)
norm
# Open High Low Close
# 0 0.500000 0.833333 0.500000 0.666667
# 1 0.666667 0.833333 0.500000 0.833333
# 2 0.333333 0.666667 0.166667 0.166667
# 3 0.333333 1.000000 0.000000 0.833333
如果有人最终访问此页面,我实际上找到了另一种方法,即使用 Numpy 重塑数据并将其输入缩放器。重塑并根据我的问题排序创建一个新的数据框:
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
#kudo's to Nick, I used his df to illustrate my example.
df = pd.DataFrame({
'Open': [1, 1.1, 0.9, 0.9],
'High': [1.2, 1.2, 1.1, 1.3],
'Low': [1, 1.0, 0.8, 0.7],
'Close': [1.1, 1.2, 0.8, 1.2]
})
scaler = MinMaxScaler()
df_np = scaler.fit_transform(df.to_numpy().reshape(-1,1))
df = pd.DataFrame(df_np.reshape(4,-1), columns=df.columns)
# Open High Low Close
# 0 0.500000 0.833333 0.500000 0.666667
# 1 0.666667 0.833333 0.500000 0.833333
# 2 0.333333 0.666667 0.166667 0.166667
# 3 0.333333 1.000000 0.000000 0.833333