簡體   English   中英

在python中以不同的步驟移動數據

[英]shifting data in python in different steps

如果我使用了錯誤的語音,請糾正我。 我想用不同的步驟轉移數據。 我發現對於可變的窗口大小,此值偏移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)

在這里,我正在像這樣移動(點只是為了說明如何進行):

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

我想做的是例如移動2:

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

如何更改上面的代碼或如何執行此操作?

您可以做的是定義一個稱為累積滯后的變量。 例如,假設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開始而不是從0開始for循環,因為如果從0開始,則本質上是復制數據幀的原始列

for i in range(1, window_size):
    cum_lag = i * lag_by_rate
    col_name = 'lag_by_'+str(cum_lag)
    df[col_name] =  df.original.shift(-cum_lag)

最后,我使用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

這種方法的確為每個列保留了相同的列標題,您可以使用以下方法解決此問題:

df_result.columns = range(len(df_result.columns))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM