如何在分割数据集的同时修复我的python代码中的“ KeyError:1”

时间:2019-08-10 08:17:32

标签: python-3.x pandas dataframe

我正在尝试将时间序列数据分为训练和测试集。但是我在运行代码时得到Key Error :1

def prepare_data(data, lags=1):
    X, y = [], []
    for row in range(len(data) - lags - 1):
        a = data[row:(row + lags), 0]
        X.append(a)
        y.append(data[row + lags, 0])

    return np.array(X), np.array(y)     

# prepare the data
lags = 1
X_train, y_train = prepare_data(train, lags)
X_test, y_test = prepare_data(test, lags)
y_true = y_test     # due to naming convention
  

错误消息:

     

KeyError跟踪(最近的呼叫   持续)   C:\ ProgramData \ Anacondaa3 \ envs \ tf \ lib \ site-packages \ pandas \ core \ indexes \ base.py   在get_loc(self,key,method,tolerance)2656中尝试:   -> 2657返回self._engine.get_loc(key)2658,除了KeyError:

     pandas._libs.index.IndexEngine.get_loc()中的

pandas / _libs / index.pyx

     pandas._libs.index.IndexEngine.get_loc()中的

pandas / _libs / index.pyx

     

pandas / _libs / hashtable_class_helper.pxi在   pandas._libs.hashtable.PyObjectHashTable.get_item()

     

pandas / _libs / hashtable_class_helper.pxi在   pandas._libs.hashtable.PyObjectHashTable.get_item()

     

KeyError:1

     

在处理上述异常期间,发生了另一个异常:

     

KeyError跟踪(最近的呼叫   最后)         1#准备数据         2滞后= 1   ----> 3 X_train,y_train = prepare_data(火车,滞后)         4 X_test,y_test = prepare_data(测试,滞后)         5 y_true = y_test#由于命名约定

     prepare_data中的

(数据,滞后)         4 a =数据[行:(行+滞后)]         5 X.append(a)   ----> 6 y.append(data [row + lags])         7返回np.array(X),np.array(y)         8

     

C:\ ProgramData \ Anacondaa3 \ envs \ tf \ lib \ site-packages \ pandas \ core \ frame.py   如果是self.columns.nlevels,则在 getitem ((自我,密钥)中)2925

     
    

1:2926返回self._getitem_multilevel(key)     -> 2927 indexer = self.columns.get_loc(key)2928 if is_integer(indexer):2929 indexer = [indexer]

  
     

C:\ ProgramData \ Anacondaa3 \ envs \ tf \ lib \ site-packages \ pandas \ core \ indexes \ base.py   在get_loc(自身,键,方法,公差)中2657
  返回self._engine.get_loc(key)2658,但KeyError除外:   -> 2659返回self._engine.get_loc(self._maybe_cast_indexer(key))2660
  索引器= self.get_indexer([键],方法=方法,公差=公差)   2661如果indexer.ndim> 1或indexer.size> 1:

     pandas._libs.index.IndexEngine.get_loc()中的

pandas / _libs / index.pyx

     pandas._libs.index.IndexEngine.get_loc()中的

pandas / _libs / index.pyx

     

pandas / _libs / hashtable_class_helper.pxi在   pandas._libs.hashtable.PyObjectHashTable.get_item()

     

pandas / _libs / hashtable_class_helper.pxi在   pandas._libs.hashtable.PyObjectHashTable.get_item()

     

KeyError:1

1 个答案:

答案 0 :(得分:0)

我猜您的索引错误出现了,因为您使用了数据框的索引,但是看来您真正想要的是基于位置进行访问。

如果以下代码更改可解决此问题,请尝试

  def prepare_data(data, lags=1):
        X, y = [], []
        index_of_y_column= 0    # change this if necessary
        indexes_of_x_columns= [i for i in range(data.shape[1]) if i != index_of_y_column]
        for row in range(len(data) - lags - 1):
            a = data.iloc[(row + lags): indexes_of_x_columns]
            X.append(a)
            y.append(data.iloc[row + lags, index_of_y_column])
        return np.array(X), np.array(y)     

顺便说一句,如果您只想移位一列或多列或整个数据帧(在最后一种情况下,所有数据都相对于索引移位),则也可以使用shift()方法。

例如data.shift(1)将使整个数据帧移动一行。

data['targetcol_shifted']= data['targetcol'].shift(-1)

将使用存储在下一行中的值targetcol_shifted填充新列targetcol。如果您可以使用shift(),我建议您使用它,因为它比手工完成要快得多。