2014-06-29 3 views
1

У меня есть следующие dataframe df:Панды: данные De-seasonalizing временных рядов

[Выход]:

     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 

Это df состоят из наблюдений объема на каждые 10 секунду в течение 22 дней непоследовательных , Я хочу, чтобы DE-сезонализировал мой временной ряд, разделив каждое наблюдение на средний объем их соответствующего 5-минутного интервала времени. Чтобы сделать это, мне нужно взять средний объем времени в течение каждых 5 минут в течение 22 дней. Поэтому я получаю временные ряды средних значений каждые 5 минут 9:30:00 - 9:35:00; 9:35:00 - 9:40:00; 9:40:00 - 9:45:00 ... до 16:00:00. Среднее значение для интервала 9:30:00 - 9:35:00 - это среднее значение объема за этот интервал времени за все 22 дня (т. Е. Среднее значение между 9:30:00 до 9:35:00 - общий объем между 9:30:00 до 9:35 : 00 в (день 1 + день 2 + день 3 ... день 22)/22. Имеет ли смысл?). Затем я разделил бы каждое наблюдение в df, которые находятся между 9:30:00 - 9:35:00 в среднем за этот интервал времени.

Есть ли пакет в Python/Pandas, который может это сделать?

ответ

4

Отредактированный ответ:

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'] 

** Пожилым ответ (держа его временно)

Используйте функцию передискретизации

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

например:

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

Нет, что бы просто последовательный средний за каждые 5 минут ove r весь образец. Мне нужно среднее значение для каждого интервала в 5 минут по временному ряду. Таким образом, средний показатель между 9:30:00 до 9:35:00 - общий объем между 9:30:00 до 9:35:00 (день 1 + день 2 + день 3 ... день 22)/22. Это имеет смысл? Спасибо за вашу попытку – Plug4

+0

Реализует ли обновленный ответ? – Zero

+0

Это выглядит хорошо! благодаря! – Plug4

Смежные вопросы