蟒蛇。创建特征向量,其中条目是过去状态的序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蟒蛇。创建特征向量,其中条目是过去状态的序列相关的知识,希望对你有一定的参考价值。

具体来说,我有多变量的时间序列数据

u(k)= [u_0(k),..,u_n(k)]

我需要创建新的特征向量,y(k)由时间k加上l过去值的原始时间序列组成,即y(k)是:

y(k)= [u(k)^ T,u(k-1)^ T,...,u(k-l)^ T]

其中l可以是任意数量的时间步长。所以,例如,如果我有

data = pd.DataFrame(np.reshape(range(25), (5,5)), columns = ["u_0", "u_1", "u_2", "u_3", "u_4"])

   u_0  u_1  u_2  u_3  u_4
0    0    1    2    3    4
1    5    6    7    8    9
2   10   11   12   13   14
3   15   16   17   18   19
4   20   21   22   23   24

使用l = 2,y(3)应该是

y[3]= [[15, 16, 17, 18, 19] , [10,  11,  12,  13,  14], [5,   6,   7,   8,   9]]

我无法想出一个不涉及任何qazxsw poi的解决方案。有没有正确的方法来做到这一点?

答案

假设我们想在需要时使用0填充,以下内容可以正常工作:

for-loops

如果有人有更好的解决方案,我将离开Q开放!

另一答案

我在工作中遇到了类似的问题,因为我写了另一个(差)答案,我已经了解了pandas data_1 = data.copy() data_2 = data.copy() data_1.index = data_1.index+1 data_2.index = data_2.index+2 df= pd.concat([data, data_1, data_2], axis=1).fillna(0) X = df.apply(lambda x: np.split(x, 3), axis=1) -method。

给出与问题中相同的数据:

shift()

有DataFrame:

data = pd.DataFrame(np.reshape(range(25), (5,5)), 
              columns = ["u_0", "u_1", "u_2", "u_3", "u_4"])

这是一个函数(lambda),你可以调用,给定一个值已经定义了# data DataFrame: u_0 u_1 u_2 u_3 u_4 0 0 1 2 3 4 1 5 6 7 8 9 2 10 11 12 13 14 3 15 16 17 18 19 4 20 21 22 23 24

l

那么l = 2 y = lambda r: [df.shift(i).iloc[r].values.tolist() for i in range(l+1)] 的返回值是:

y(3)

当然,如果你可以使用numpy数组,那么不需要[[15, 16, 17, 18, 19], [10.0, 11.0, 12.0, 13.0, 14.0], [5.0, 6.0, 7.0, 8.0, 9.0]] ,如果你可以使用pandas Series,那么.tolist()部分也可以跳过。我在这里使用了两个,因为问题中的所需输出是列表列表。

当然,这可以以各种方式重写,例如, .values-value也可以是一个参数,通过重写y来:

l

如果y = lambda r, l: [df.shift(i).iloc[r].values.tolist() for i in range(l+1)] ,这被称为y(3,2)

或者,如果更喜欢lambda的函数,那就做一个正常的函数:

l=2
另一答案

编辑:

TL; DR:一个块实现:

def shifted_lookback(row_i, n_lookbacks):
    return [df.shift(i).iloc[row_i].values.tolist() for i in range(n_lookbacks+1)]

更新:从 df = pd.DataFrame(...) # Your data l = 2 n_rows = df.shape[0] dfs = [] # views of the dataframe to concat for i in range(l+1): dfs.append(df[l-i: n_rows-i].reset_index(drop=True)) new_df = pd.concat(dfs, axis=1, ignore_index=True)[:n_rows-l] ,以获得所需的结果(请参阅注释和问题),只需添加他所做的:

answer of BS BS

然而,这对他的回答几乎没有什么贡献。 (除非复制DataFrames,否则它们会被复制到内存中,而使用slice会多次读取相同的数据。)// update。

//编辑

下面是一个使用扩展值创建新DataFrame的示例,在本例中为new_df.apply(lambda x: np.split(x, 3), axis=1)

l=2

输出

l = 2
pd.concat([
        pd.DataFrame(df[2:].values), 
        pd.DataFrame(df[1:-1].values), 
        pd.DataFrame(df[:-2].values)
    ], axis=1, ignore_index=True)

我假设您不想保留前两行,也不想保留最后两行,因为它们将填充 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 10 11 12 13 14 5 6 7 8 9 0 1 2 3 4 1 15 16 17 18 19 10 11 12 13 14 5 6 7 8 9 2 20 21 22 23 24 15 16 17 18 19 10 11 12 13 14 值。

l的任何值的一般方法:

生成切片的一般方法:

NaN

或作为发电机

def make_slices(l):
    slices = []
    for i in range(l+1):
        slices.append((l-i, -i))
    return slices

然后你可以创建一个DataFrames对象列表来传递给def slices_generator(l): for i in range(l+1): yield l-i, -i 方法:

concat

组装它:

def make_dfs(df, l):
    dfs = []
    for i_from, i_to in slices_generator(l):
        dfs.append(df[i_from:df.shape[0]-i_to].reset_index(drop=True))
    return dfs

最后一点:def get_timeseries(df, l): return pd.concat(make_dfs(df, l), axis=1, ignore_index=True)[:df.shape[0]-l] ,只是剪切最后一行,否则将填充[:df.shape[0]-l]s。

使用它:

NaN

会产生这个:

get_timeseries(df, 2)

以上是关于蟒蛇。创建特征向量,其中条目是过去状态的序列的主要内容,如果未能解决你的问题,请参考以下文章

Python图像特征的音乐序列生成深度卷积网络,以及网络核心

将命名向量添加到列表中

任务四: 创建总的网络模型

Python代码提取时间序列特征基于tsfeature

如何将列转换为向量类型?

创建特征向量以对空中图像中的片段进行分类