【发布时间】:2022-01-10 23:21:10
【问题描述】:
我有一个时间序列 DataFrame,我想将我的 200 个特征/列中的每一个复制为额外的滞后特征。所以目前我在时间 t 有特征,并想在时间步长 t-1、t-2 等创建特征。
我知道这最好用 df.shift() 来完成,但我很难把它放在一起。我还想将列重命名为“feature (t-1)”、“feature (t-2)”。
我的伪代码尝试是这样的:
lagged_values = [1,2,3,10]
for every lagged_values
for every column, make a new feature column with df.shift(lagged_values)
make new column have name 'original col name'+'(t-(lagged_values))'
最后,如果我有 200 列和 4 个滞后时间步长,我将拥有一个具有 1,000 个特征的新 df(在 t、t-1、t-2、t-3 和 t-10 各 200 个)。
我发现了类似的东西,但它没有按照machine learning mastery 保留原始列名(重命名为 var1、var2 等)。不幸的是,我对它的理解不够好,无法根据我的问题对其进行修改。
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
"""
Frame a time series as a supervised learning dataset.
Arguments:
data: Sequence of observations as a list or NumPy array.
n_in: Number of lag observations as input (X).
n_out: Number of observations as output (y).
dropnan: Boolean whether or not to drop rows with NaN values.
Returns:
Pandas DataFrame of series framed for supervised learning.
"""
n_vars = 1 if type(data) is list else data.shape[1]
df = DataFrame(data)
cols, names = list(), list()
# input sequence (t-n, ... t-1)
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(df.shift(-i))
if i == 0:
names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
else:
names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
# put it all together
agg = concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
return agg
【问题讨论】:
-
一些示例数据集和您想要的输出会有所帮助。