2017-08-01 87 views
2

說50%的重疊的窗口我有這樣一個數據幀:滑動與熊貓數據幀

   x y z 
timestamp 
some_date_1 5 2 4 
some_date_2 1 2 6 
some_date_3 7 3 5 
... 
some_date_50 4 3 6 

,我想用50施加大小爲10的滑動窗(稱此爲變量window_size) %重疊在xyz列(使這個變量step_size這一半的window_size)。所以,我就從0打印的第10行 - 9之後,我將打印5 - 14,10 - 19,15 - 24等

我會怎麼做,如果我有一個函數:

def sliding_window(df, window_size, step_size): 

假設timestamp是日期時間。

我想爲每個窗口獨立的結構。因此,例如,我想爲前十行分別設置一個DataFrame,然後再爲後十個分別設置一個DataFrame。

爲了簡單起見,我將展示一個窗口大小爲4,步長爲2的示例。

    x y z 
timestamp 
some_date_1 5 2 4 
some_date_2 1 2 6 
some_date_3 2 3 1 
some_date_4 5 4 4 

       x y z 
timestamp 
some_date_3 2 3 1 
some_date_4 5 4 4 
some_date_5 6 7 9 
some_date_6 2 1 8 

回答

2

考慮數據框df

df = pd.DataFrame(np.arange(1, 73).reshape(-1, 3), columns=list('xyz')) 
df 

def windows(d, w, t): 
    r = np.arange(len(d)) 
    s = r[::t] 
    z = list(zip(s, s + w)) 
    f = '{0[0]}:{0[1]}'.format 
    g = lambda t: d.iloc[t[0]:t[1]] 
    return pd.concat(map(g, z), keys=map(f, z)) 

這會返回一個用pd.MultiIndex數據框,我們可以很容易地loc

wdf = windows(df, 10, 5) 

wdf.loc['0:10'] 

    x y z 
0 1 2 3 
1 4 5 6 
2 7 8 9 
3 10 11 12 
4 13 14 15 
5 16 17 18 
6 19 20 21 
7 22 23 24 
8 25 26 27 
9 28 29 30 

或者

wdf.loc['15:25'] 

    x y z 
15 46 47 48 
16 49 50 51 
17 52 53 54 
18 55 56 57 
19 58 59 60 
20 61 62 63 
21 64 65 66 
22 67 68 69 
23 70 71 72 
+0

我編輯我的問題訪問的每個窗口,這是不是真的是我一直在尋找。 – dirtysocks45

+0

@ dirtysocks45你能告訴我你在找什麼嗎?否則,我只是猜測。 – piRSquared

+0

我舉了一個例子 – dirtysocks45