我想为数据创建滞后值。我正在使用for循环,因为我必须包含大约100个滞后值。但是问题是熊猫方法“ shift”在创建一个滞后值后抛出错误。
例如,当我使用
data1['lag_1']=data1.shift(1)
它正在为一个滞后值生成列。
但是,对于下一个滞后值运行相同的代码时,则会引发错误。
data1['lag_2']=data1.shift(2)
我想在for循环中执行此操作,因为我想创建100个滞后值列,但是这种转换似乎不起作用。
Traceback (most recent call last):
File "<ipython-input-93-bc545991b12c>", line 1, in <module>
data1['lag_2']=data1.shift(2)
File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3370, in __setitem__
self._set_item(key, value)
File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3446, in _set_item
NDFrame._set_item(self, key, value)
File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\generic.py", line 3172, in _set_item
self._data.set(key, value)
File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\internals\managers.py", line 1056, in set
self.insert(len(self.items), item, value)
File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\internals\managers.py", line 1158, in insert
placement=slice(loc, loc + 1))
File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py", line 3095, in make_block
return klass(values, ndim=ndim, placement=placement)
File "C:\Users\k0932146\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py", line 87, in __init__
'{mgr}'.format(val=len(self.values), mgr=len(self.mgr_locs)))
ValueError: Wrong number of items passed 2, placement implies 1
我也想为100个滞后值实现它,是否有任何有效的方法来创建这些滞后值?
答案 0 :(得分:0)
这里的问题是数据框中的列数。
最初,您的数据框中只有一列,因此shift
只需要数据框中存在一列。
data1 = pd.DataFrame(np.arange(10))
data1['lag_1']=data1.shift(1)
print(data1)
输出:
0 lag_1
0 0 NaN
1 1 0.0
2 2 1.0
3 3 2.0
4 4 3.0
5 5 4.0
6 6 5.0
7 7 6.0
8 8 7.0
9 9 8.0
现在您的数据框有2列,但是shift
仅可应用于单列,因此会引发错误。
在列上应用shift
>
data1['lag_2']=data1[0].shift(2)
输出:
0 lag_1 lag_2
0 0 NaN NaN
1 1 0.0 NaN
2 2 1.0 0.0
3 3 2.0 1.0
4 4 3.0 2.0
5 5 4.0 3.0
6 6 5.0 4.0
7 7 6.0 5.0
8 8 7.0 6.0
9 9 8.0 7.0
修改
对于100个滞后值,您可以执行以下操作:
for i in range(100):
col = "lag_{}".format(i+1)
data1[col] = data1[0].shift(i+1)
答案 1 :(得分:0)
假设原始data1
数据帧只有一列。所以当你写:
data1['lag_1']=data1.shift(1)
您正在将单列数据帧分配到新列中,这很好。
但是写第二遍时:
data1['lag_2']=data1.shift(2)
您现在将2列数据帧分配给不再有意义的单列。您应该这样做:
data1['lag_2']=data1.iloc[:,0].shift(2)
以便仅移动和复制第一列。