2016-04-29 80 views
5

我有時間序列數據的大數據幀大熊貓。滑動窗口在熊貓據幀

我目前操縱這個數據幀,以創建一個滾動的每隔10行的平均一個新的,更小的數據幀。即滾動窗口技術。就像這樣:

def create_new_df(df): 
    features = [] 
    x = df['X'].astype(float) 
    i = x.index.values 
    time_sequence = [i] * 10 
    idx = np.array(time_sequence).T.flatten()[:len(x)] 
    x = x.groupby(idx).mean() 
    x.name = 'X' 
    features.append(x) 
    new_df = pd.concat(features, axis=1) 
    return new_df 

代碼來測試:

columns = ['X'] 
df_ = pd.DataFrame(columns=columns) 
df_ = df_.fillna(0) # with 0s rather than NaNs 
data = np.array([np.arange(20)]*1).T 
df = pd.DataFrame(data, columns=columns) 

test = create_new_df(df) 
print test 

輸出:

 X 
0 4.5 
1 14.5 

但是,我想要的功能使用滑動窗口爲50%,使新的數據幀重疊

所以輸出應該是這樣的:

 X 
0 4.5 
1 9.5 
2 14.5 

我該怎麼做?

這是我已經試過:

from itertools import tee, izip 

def window(iterable, size): 
    iters = tee(iterable, size) 
    for i in xrange(1, size): 
     for each in iters[i:]: 
      next(each, None) 
    return izip(*iters) 

for each in window(df, 20): 
    print list(each) # doesn't have the desired sliding window effect 

有的還可能會建議使用熊貓rolling_mean()方法,但即便如此,我不能看到如何使用該功能窗口重疊。

任何幫助將不勝感激。

回答

5

我覺得熊貓滾滾技術是在這裏很好。請注意,從熊貓版本0.18.0開始,您將使用rolling().mean()而不是rolling_mean()

>>> df=pd.DataFrame({ 'x':range(30) }) 
>>> df = df.rolling(10).mean()   # version 0.18.0 syntax 
>>> df[4::5]        # take every 5th row 

     x 
4 NaN 
9 4.5 
14 9.5 
19 14.5 
24 19.5 
29 24.5 
+2

'df [4 :: 5]' - 那太棒了! – MaxU

+0

@MaxU我不會走那麼遠,但謝謝! – JohnE

+1

這不會浪費計算能力嗎?假設我在64個樣本窗口中有50%的重疊,所以基本上我只使用了1/32的工作。當然,除非它被懶惰地評估過。 –