当前位置: 首页 > 面试题库 >

在pandas中创建多个移位(滞后)列

范豪
2023-03-14
问题内容

我有一个时序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个滞后时间步长,那么我将拥有一个具有1000个特征的新df(在t,t-1,t-2,t-3和t-10处各有200个)。

我发现类似的东西,但是按照机器学习的掌握,它不会保留原始的列名(重命名为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

问题答案:

您可以使用字典理解功能创建其他列,然后通过将它们添加到数据框中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


 类似资料:
  • 问题内容: 例 是否有创建系列的有效方法。例如,在每行中包含滞后值(在此示例中,直到滞后2) 这对应于 s = pd.Series([[3,4,5],[2,3,4],[1,2,3]],index = [3,4,5]) 对于时间序列很多且时间很长的数据帧,如何以有效的方式完成呢? 谢谢 看到答案后编辑 好的,最后我实现了这个功能: 它产生期望的输出,并管理结果DataFrame中列的命名。 对于系列

  • 如果每个事件间隔为1秒,并且有2秒的滞后,那么我希望示例输入和输出如下所示。 输入:1,2,3,4,5,6,7... 输出:NA,NA,1,2,3,4,5...

  • 有两个问题看起来很相似,但它们不是同一个问题:这里和这里。它们都调用的方法,例如或,我知道这会返回一个。我要问的是如何将(class)对象本身转换为。我将在下面举例说明。 构建一个示例,如下所示。 上面的应该如下所示(显然有不同的数字)。 我想做的是按列名称和采取分组(按此顺序),这样我就可以得到一个由列名称和采取构建的多索引索引,如下所示。 我如何实现这一点?如果我做了,那么是一个实例。正确的做

  • 我有一个数据框架,我想从其中一列的列表中创建5列 示例: 请注意,这里很少有列表少于5列,对于这些列,请在该位置插入NAN。

  • 我想“创建或替换”postgres表的触发器。但是,没有这样的sql表达式。 我看到我可以先执行“

  • 首先,我已经事先研究了stackoverflow这个主题,但是我想了解更多关于它的信息,所以我要问一个新问题。 所以基本上,我一直在PyGame1.9中工作。我已经成功地制作了一个简单的2D图形游戏。我使用的是Sprite类,因此我经常使用Group()方法。我使用groupName在屏幕上绘制图形。绘制(屏幕)。 我的游戏的一个组成部分是与地形互动的能力,例如移除瓷砖和放置瓷砖。每个磁贴都是绘制