Замена ручной стандартизации на стандартную функцию скалера - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу заменить ручной расчет стандартизации ежемесячных данных пакетом StandardScaler от sklearn.Я попробовал строку кода ниже закомментированного кода, но получаю следующую ошибку.

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler

arr = pd.DataFrame(np.arange(1,21), columns=['Output'])
arr2 = pd.DataFrame(np.arange(10, 210, 10), columns=['Output2'])
index2 = pd.date_range('20180928 10:00am', periods=20, freq="W")
# index3 = pd.DataFrame(index2, columns=['Date'])
df2 = pd.concat([pd.DataFrame(index2, columns=['Date']), arr, arr2], axis=1)
print(df2)


cols = df2.columns[1:]
# df2_grouped = df2.groupby(['Date'])

df2.set_index('Date', inplace=True)
df2_grouped = df2.groupby(pd.Grouper(freq='M'))

for c in cols:
    #df2[c] = df2_grouped[c].apply(lambda x: (x-x.mean()) / (x.std()))
    df2[c] = df2_grouped[c].apply(lambda x: StandardScaler().fit_transform(x))
print(df2)


ValueError: Expected 2D array, got 1D array instead:
array=[1.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

1 Ответ

0 голосов
/ 12 февраля 2019

В сообщении об ошибке говорится, что StandardScaler().fit_transform принимает только двумерный аргумент.

Таким образом, вы можете заменить:

df2[c] = df2_grouped[c].apply(lambda x: StandardScaler().fit_transform(x))

на:

from sklearn.preprocessing import scale
df2[c] = df2_grouped[c].transform(lambda x: scale(x.astype(float)))

в качестве обходного пути.

С sklearn.preprocessing.scale:

Стандартизировать набор данных по любой оси

Отцентрировать к средней и компонентной шкале к единице дисперсии.

Так что это должно работатьв качестве стандартного скалера.

...