MinMaxScaler с диапазоном из нескольких столбцов в кадре данных

У меня есть фрейм данных OHLC (Open, High, Low, Close) для данных датчика на поминутной основе. Мне нужно масштабировать значения, но все в одном масштабе. Шкала должна использовать минимум и максимум любого из четырех столбцов. Например, минимум может быть в столбце «Низкий», а максимум - в столбце «Высокий». Исходя из этого диапазона (min(df['low']) - max(df['high'])), я хочу установить масштабатор.

В настоящее время я использую MinMaxScaler из sklearn.preprocessing. Однако я могу уместить его только в одну колонку. Поэтому, если я поместил его в столбец df['open'] и преобразовал другой столбец, значения больше не будут между 0 и 1, а могут быть от ‹0 до› 1.

Как я могу использовать весь диапазон всех столбцов в средстве масштабирования?


person JarroVGIT    schedule 26.03.2021    source источник


Ответы (2)


Если кто-то попадает на эту страницу, я действительно нашел другой способ сделать это, который включает в себя изменение формы данных с помощью 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
person JarroVGIT    schedule 29.03.2021
comment
Если это сработало для вас лучше, чем мой ответ, вы должны принять его (когда сможете). Из любопытства вы делали какое-нибудь сравнение производительности? - person Nick; 30.03.2021

Вы можете нормализовать все столбцы, выполнив математические вычисления самостоятельно, используя df.min().min() и df.max().max(), чтобы получить минимальные и максимальные значения для всего фрейма данных, или, проще говоря, df['Low'].min() и df['High'].max(), чтобы получить минимальные / максимальные значения из столбцов Low и High соответственно. Например:

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
person Nick    schedule 26.03.2021
comment
Спасибо, я думаю, это сработает. Отличный пример и объяснение! - person JarroVGIT; 27.03.2021
comment
@JarroVGIT не беспокойтесь - я рад, что смог помочь. - person Nick; 27.03.2021