在Pandas中制作多个移位(滞后)列

时间:2018-02-15 23:59:39

标签: python pandas

我有一个时间序列DataFrame,我想复制我的200个功能/列中的每一个作为额外的滞后功能。所以目前我在时间t有功能,想要在时间步t-1,t-2等创建功能。

我知道这最好用df.shift()完成,但我完全无法完成。我还要将列重命名为'功能(t-1)','功能(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个滞后时间步,我会得到一个新的df,其中包含1,000个特征(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

2 个答案:

答案 0 :(得分:7)

您可以使用字典理解创建其他列,然后通过assign将其添加到数据框中。

df = pd.DataFrame(np.random.randn(5, 2), columns=list('AB'))

lags = range(1, 3)  # Just two lags for demonstration.

>>> df.assign(**{
    '{} (t-{})'.format(col, t): df[col].shift(t)
    for t in lags
    for col in df
})
          A         B   A (t-1)   A (t-2)   B (t-1)   B (t-2)
0 -0.773571  1.945746       NaN       NaN       NaN       NaN
1  1.375648  0.058043 -0.773571       NaN  1.945746       NaN
2  0.727642  1.802386  1.375648 -0.773571  0.058043  1.945746
3 -2.427135 -0.780636  0.727642  1.375648  1.802386  0.058043
4  1.542809 -0.620816 -2.427135  0.727642 -0.780636  1.802386

答案 1 :(得分:0)

如果您有一个大型数据框并依赖大量滞后值,您可能需要使用 pd.concatpd.DataFrame.add_sufix 应用更有效的解决方案:

df = pd.DataFrame(np.random.randn(5, 2), columns=list('AB'))    
lags = range(0, 3)

df = pd.concat([df.shift(t).add_suffix(f" (t-{t})") for t in lags], axis=1)  # add lags