【问题标题】:Array inside list列表内的数组
【发布时间】:2017-10-19 22:43:22
【问题描述】:

我真的很困惑试图解决这个问题。我正在尝试使用 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)

“series”是一个不同的时间序列,我试图在 [0,1] 和 MinMaxScaler 之间重新调整,而时间序列以前在 pandas 中是不同的。

运行代码时出现以下错误: 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 是我的数据集

只需将名称 'shampoo-sales.csv' 切换为 'datos2.csv' 和这句话:

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

到这个:

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

【问题讨论】:

  • 能否包含完整的回溯和/或为series 提供示例分配(以便我们重现错误)
  • 当然,我也会在帖子中包含完整的代码
  • 您能否也发布您的数据(或其中的一部分),以便我们重现错误。
  • 我忘记了。这是数据集的链接:mega.nz/#!XI1ixboS!u-K7vu18370L_6SG-c8f25iPRDnoLJZ57K9m_RDVqKc

标签: python pandas scikit-learn sklearn-pandas


【解决方案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

教程中的等效部分:
“运行示例将数据集加载为 Pandas 系列并打印前 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 以避免将第一行数据分配为列标题。

更新
要将整个数据集传递给 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)

【讨论】:

  • 非常感谢。它如您所说的那样有效,但是我正在尝试使用这两个变量来进行预测。通过这样做,不可能考虑所有变量。 series = df[1] 仅考虑第一列。是否可以使用所有变量?
  • 我已经更新了我的答案以演示如何一次缩放多个向量。
  • 这正是我所需要的。谢谢。
猜你喜欢
  • 2015-07-15
  • 2021-08-29
  • 1970-01-01
  • 2019-10-09
  • 2018-07-26
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多