2017-05-19 25 views
1

我真的很困惑,試圖解決這個問題。我試圖使用sklearn函數:MinMaxScaler但我得到一個錯誤,因爲它似乎是我設置序列的數組元素。列表中的數組

的代碼是:

raw_values = series.values 
    # transform data to be stationary 
    diff_series = difference(raw_values, 1); 
    diff_values = diff_series.values; 
    diff_values = diff_values.reshape(len(diff_values), 1) 

    # rescale values to 0,1 
    scaler = MinMaxScaler(feature_range=(0, 1)) 
    scaled_values = scaler.fit_transform(diff_values); print(scaled_values) 
    scaled_values = scaled_values.reshape(len(scaled_values), 1) 

「系列」是,我試圖用MinMaxScaler [0,1]之間重新調整一個差分時間序列和時間序列大熊貓以前求差。

我運行代碼時出現以下錯誤: ValueError: setting an array element with a sequence.

,我不明白的是,如果只有一個feature或一列變量,代碼運行良好,但在這種情況下我有2 features,每一個在不同的列。

回溯:

File "C:/....py", line 88, in prepare_data 
    scaled_values = scaler.fit_transform(diff_values); print(scaled_values) 
    File "C:\Users\name\AppData\Roaming\Python\Python35\site-packages\sklearn\base.py", line 494, in fit_transform 
    return self.fit(X, **fit_params).transform(X) 
    File "C:\Users\name\AppData\Roaming\Python\Python35\site-packages\sklearn\preprocessing\data.py", line 292, in fit 
    return self.partial_fit(X, y) 
    File "C:\Users\name\AppData\Roaming\Python\Python35\site-packages\sklearn\preprocessing\data.py", line 318, in partial_fit 
    estimator=self, dtype=FLOAT_DTYPES) 
    File "C:\Users\name\AppData\Roaming\Python\Python35\site-packages\sklearn\utils\validation.py", line 382, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: setting an array element with a sequence. 

而這就是我得到如果我打印diff_values

[[array([ -1.3, 119. ])] 
[array([ 0.5, -9. ])] 
[array([ 0.8, 17. ])] 
..., 
[array([ 2.8, 742. ])] 
[array([ 1.50000000e+00, -1.65900000e+03])] 
[array([ -2., 856.])]] 

是不是我的,它已經從here

編輯獲得完整的代碼:

Here是我的數據集

只需切換名稱「洗髮水,sales.csv'to 'datos2.csv',這句話:

return datetime.strptime('190'+x, '%Y-%m') 

這一個:

return datetime.strptime(''+x, '%Y-%m-%d') 
+0

你可以包括完整的追蹤和/或給出'series'爲例分配(所以我們可以重現錯誤) –

+0

當然,我也要去在文章中包含完整的代碼 – Jvr

+0

您還可以發佈您的數據(或其中的一部分),以便我們可以重現錯誤。 –

回答

1

在你鏈接到的教程,對象series實際上是一個熊貓Series。它是一個信息向量,帶有一個命名索引。但是,您的數據集除了包含時間序列索引之外,還包含兩個信息字段,使其成爲DataFrame。這就是爲什麼教程代碼會打破你的數據的原因。

下面是從您的數據的樣本:

import pandas as pd 

def parser(x): 
    return datetime.strptime(''+x, '%Y-%m-%d') 

df = pd.read_csv("datos2.csv", header=None, parse_dates=[0], 
       index_col=0, squeeze=True, date_parser=parser) 
df.head() 
       1  2 
0      
2012-01-01 10.9 3736 
2012-01-02 10.3 3570 
2012-01-03 9.0 3689 
2012-01-04 9.5 3680 
2012-01-05 10.3 3697 

而且從教程相當於一節:「運行示例加載數據集作爲一個熊貓系列,並打印第5行」

Month 
1901-01-01 266.0 
1901-02-01 145.9 
1901-03-01 183.1 
1901-04-01 119.3 
1901-05-01 180.3 
Name: Sales, dtype: float64 

爲了驗證這一點,選擇的領域之一,並將其​​保存爲series,然後再嘗試運行MinMaxScaler。你會看到,它在運行時錯誤:

series = df[1] 
# ... compute difference and do scaling ... 
print(scaled_values) 
[[ 0.58653846] 
[ 0.55288462] 
[ 0.63942308] 
..., 
[ 0.75  ] 
[ 0.6875 ] 
[ 0.51923077]] 

注:數據集中的另外一個微小的差別相比教程數據是,有您的數據沒有標題。設置header=None以避免將第一行數據分配爲列標題。

UPDATE
到整個數據集傳送到MinMaxScaler,只是運行在兩列difference()和轉化載體傳遞的縮放。 MinMaxScaler接受n維DataFrame對象:

ncol = 2 
diff_df = pd.concat([difference(df[i], 1) for i in range(1,ncol+1)], axis=1) 
scaler = MinMaxScaler(feature_range=(0, 1)) 
scaled_values = scaler.fit_transform(diff_df) 
+0

非常感謝。它按照你說的那樣工作,但是,我試圖用這兩個變量來做出預測。通過這樣做,不可能考慮所有變量。 series = df [1]僅考慮第一列。是否可以使用所有變量? – Jvr

+0

我已經更新了我的答案,以演示如何一次縮放多個向量。 –

+0

這正是我所需要的。謝謝。 – Jvr