用Standard Scaler功能代替手动标准化

时间:2019-02-12 14:23:33

标签: python group-by sklearn-pandas

我想用sklearn的StandardScaler软件包代替将每月数据标准化的手动计算。我尝试了注释掉的代码下面的代码行,但收到​​以下错误。

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 :(得分:1)

该错误消息表明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

  

沿任意轴标准化数据集

     

以均值和分量尺度为中心,以单位方差为中心。

因此它应该作为标准的缩放器。