在python中按不同步骤移动数据

2024-09-30 08:32:58 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我用错了声门,请纠正我。我想用不同的步骤转换数据。我发现对于可变的窗口大小,这个值会偏移1:

import pandas as pd
import numpy as np

a=np.random.rand(30)
series=pd.DataFrame(a)
window_size = 3
series_s = series.copy()
for i in range(window_size):
    series = pd.concat([series, series_s.shift(-(i+1))], axis = 1)

series.dropna(axis=0, inplace=True)

在这里,我是这样改变的(点只是它将如何进行):

^{pr2}$

我想做的是移位,例如2:

5 4  8
6 3  9    
4 8 10   
3 9  .    
8 10 .    
9  . .    
10 . .

我该如何更改上面的代码或如何更改?在


Tags: 数据importnumpypandassizeasnp步骤
2条回答

你能做的就是定义一个叫做累积滞后的变量。 例如,设window size=n,lag_rate为2,则原始列的滞后为零,第一列相对于原始列的滞后为2,第二列相对于第一列的滞后为4,第n列相对于第一列的滞后为2*n

稍微修改代码以提高可读性:

#set up the variables
a=np.random.rand(30)
df = pd.DataFrame()
df['original'] = a
window_size = 3
lag_by_rate = 2 

现在,我将开始迭代window_size参数以生成新列。注意,应该从1开始for循环,而不是从零开始,因为如果从零开始,实际上就是复制dataframe的原始列

^{pr2}$

最后,我使用dropna函数打印头部:

df.dropna(axis=0, inplace=True)
print(df.head())

我的输出示例:

    original    lag_by_2    lag_by_4
0   0.595142    0.625494    0.812595
1   0.822615    0.582148    0.778157
2   0.625494    0.812595    0.693790
3   0.582148    0.778157    0.416109
4   0.812595    0.693790    0.748151

不管怎样,使用这种方法,您将以显著的速度丢失数据。如果len(df)/window_size==lag_rate,那么在删除N/A值之后,数据帧中的行数将为零

除了您下面的评论,我替换了您在示例中提到的值,得到了相同的输出:

    original    lag_by_2    lag_by_4
0   5           4.0         8.0
1   6           3.0         9.0
2   4           8.0         10.0

shift返回数据帧的副本,它不会修改它,因此没有必要创建副本。在

您可以通过使用列表理解进一步清理代码,并使用一些代数将每列移动两个而不是一个。在

x = np.random.randint(1, 10, 10)
df = pd.DataFrame(x)
dfs = [df.shift(-(2+2*i)) for i in range(3)]

pd.concat([df, *dfs], axis=1)

   0    0    0    0
0  3  1.0  3.0  8.0
1  9  1.0  6.0  8.0
2  1  3.0  8.0  1.0
3  1  6.0  8.0  9.0
4  3  8.0  1.0  NaN
5  6  8.0  9.0  NaN
6  8  1.0  NaN  NaN
7  8  9.0  NaN  NaN
8  1  NaN  NaN  NaN
9  9  NaN  NaN  NaN

这种方法确实为每个列保留了相同的列标题,您可以使用类似的方法进行修复:

^{pr2}$

相关问题 更多 >

    热门问题