[英]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.