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