Ho un grande dataframe panda dei dati delle serie temporali.Finestra scorrevole su panda Dataframe
Attualmente sto manipolando questo dataframe per creare un nuovo dataframe più piccolo che ruota mediamente ogni 10 righe. cioè una tecnica a finestra rotolante. Come questo:
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
Codice di prova:
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
uscita:
X
0 4.5
1 14.5
Tuttavia, voglio la funzione di rendere la nuova dataframe utilizzando una finestra scorrevole con un 50% sovrapposizione
Quindi l'output sarebbe simile a questo:
X
0 4.5
1 9.5
2 14.5
Come posso fare questo?
Ecco che cosa ho provato:
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
alcuni potrebbero anche suggerire utilizzando i panda rolling_mean() metodi, ma se è così, non riesco a vedere come utilizzare questa funzione con la finestra di sovrapposizione.
Qualsiasi aiuto sarebbe molto apprezzato.
'df [4 :: 5]' - è fantastico! – MaxU
@MaxU Non andrei così lontano, ma grazie! – JohnE
Non sarebbe uno spreco di potere computazionale? Diciamo che ho una sovrapposizione del 50% su 64 finestre di esempio, quindi in pratica utilizzo solo 1/32 del lavoro. A meno che non sia valutato pigramente, ovviamente. –