2014-06-29 4 views
1

I ont la trame de données suivante df:Pandas: De-seasonalizing données de séries chronologiques-

[out]:

     VOL 
2011-04-01 09:30:00 11297 
2011-04-01 09:30:10 6526 
2011-04-01 09:30:20 14021 
2011-04-01 09:30:30 19472 
2011-04-01 09:30:40 7602 
... 
2011-04-29 15:59:30 79855 
2011-04-29 15:59:40 83050 
2011-04-29 15:59:50 602014 

Cette df se composent d'observations de volume à chaque 10 secondes pendant 22 jours non consécutifs . Je veux désaisonnaliser mes séries chronologiques en divisant chaque observation par le volume moyen de leur intervalle de temps respectif de 5 minutes. Pour ce faire, je dois prendre le volume moyen de la série chronologique toutes les 5 minutes sur les 22 jours. Donc, je me retrouverais avec une série chronologique de moyennes à toutes les 5 minutes 9:30:00 - 9:35:00; 9:35:00 - 9:40:00; 9:40:00 - 9:45:00 ... jusqu'à 16:00:00. La moyenne pour l'intervalle 9:30:00 - 9:35:00 est la moyenne du volume pour cet intervalle de temps sur l'ensemble des 22 jours (c.-à-d. Donc, la moyenne entre 9:30:00 à 9:35:00 est le volume total entre 9:30:00 à 9:35 : 00 le (jour 1 + jour 2 + jour 3 ... jour 22)/22. Est-ce logique?). Je diviserais alors chaque observation en df qui sont entre 9:30:00 - 9:35:00 par la moyenne de cet intervalle de temps.

Y at-il un paquet en Python/Pandas qui peut faire cela?

Répondre

4

Edité réponse:

date_times = pd.date_range(datetime.datetime(2011, 4, 1, 9, 30), 
          datetime.datetime(2011, 4, 16, 0, 0), 
          freq='10s') 
VOL = np.random.sample(date_times.size) * 10000.0 

df = pd.DataFrame(data={'VOL': VOL,'time':date_times}, index=date_times) 
df['h'] = df.index.hour 
df['m'] = df.index.minute 
df1 = df.resample('5Min', how={'VOL': np.mean}) 
times = pd.to_datetime(df1.index) 
df2 = df1.groupby([times.hour,times.minute]).VOL.mean().reset_index() 
df2.columns = ['h','m','VOL'] 
df.merge(df2,on=['h','m']) 
df_norm = df.merge(df2,on=['h','m']) 
df_norm['norm'] = df_norm['VOL_x']/df_norm['VOL_y'] 

** réponse plus ancien (en gardant temporairement)

Utilisez la fonction de rééchantillonnage

df.resample('5Min', how={'VOL': np.mean}) 

par exemple:

date_times = pd.date_range(datetime.datetime(2011, 4, 1, 9, 30), 
          datetime.datetime(2011, 4, 16, 0, 0), 
          freq='10s') 
VOL = np.random.sample(date_times.size) * 10000.0 

df = pd.DataFrame(data={'VOL': VOL}, index=date_times) 
df.resample('5Min', how={'VOL': np.mean}) 
+0

Non, ce serait juste la moyenne consécutive à toutes les 5 minutes ove r l'ensemble de l'échantillon. J'ai besoin de la moyenne pour chaque intervalle de 5 minutes dans la série chronologique. Ainsi, la moyenne entre 9h30 et 9h35 est le volume total entre 9h30 et 9h35 le (jour 1 + jour 2 + jour 3 ... jour 22)/22. Est-ce que cela a du sens? Merci pour votre tentative – Plug4

+0

La réponse mise à jour la résout-elle? – Zero

+0

Ça a l'air bien! Merci! – Plug4

Questions connexes