2016-04-29 22 views
5

Ich habe einen großen Pandas Datenrahmen von Zeitreihendaten.Schiebefenster über Pandas Dataframe

Ich manipuliere derzeit diesen Datenrahmen, um einen neuen, kleineren Datenrahmen zu erstellen, der durchschnittlich alle 10 Zeilen rollt. eine Rollfenstertechnik. Wie folgt aus:

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 

-Code zu testen:

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 

Ausgang:

 X 
0 4.5 
1 14.5 

Allerdings mag ich die Funktion den neuen Datenrahmen mit einem Schiebefenster mit einem 50% machen Überlappung

So würde die Ausgabe so aussehen:

 X 
0 4.5 
1 9.5 
2 14.5 

Wie kann ich das tun?

Hier ist, was ich versucht habe:

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 

Einige auch die Pandas rolling_mean() Methoden könnte darauf hindeuten, verwenden, aber wenn ja, kann ich nicht sehen, wie diese Funktion mit Fensterüberlappung verwenden.

Jede Hilfe würde sehr geschätzt werden.

Antwort

5

Ich denke, Pandas Walztechniken sind hier in Ordnung. Beachten Sie, dass Sie ab Version 0.18.0 von Pandas rolling().mean() anstelle von rolling_mean() verwenden.

>>> 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]' - das ist brilliant! – MaxU

+0

@MaxU Ich würde nicht so weit gehen, aber danke! – JohnE

+1

Wäre das nicht eine Verschwendung von Rechenleistung? Angenommen, ich habe eine Überlappung von 50% über 64 Beispielfenstern, also benutze ich nur 1/32 der Arbeit. Es sei denn, es wird natürlich faul ausgewertet. –