2015-05-29 4 views
11

Я использую Python Pandas в первый раз. У меня есть данные задержки трафика 5-минутных в формате CSV:Интерполяция и регуляризация временных рядов Python pandas

... 
2015-01-04 08:29:05,271238 
2015-01-04 08:34:05,329285 
2015-01-04 08:39:05,-1 
2015-01-04 08:44:05,260260 
2015-01-04 08:49:05,263711 
... 

Там несколько вопросов:

  • для некоторых меток времени там не хватает данных (-1)
  • отсутствующие записи (также 2/3 часов подряд)
  • частота наблюдений не точно 5 минут, но на самом деле теряет несколько секунд один раз в то время

Я хотел бы получить регулярные временные ряды, поэтому с записями каждые (ровно) 5 минут (и без недостающего значения). Я успешно интерполированный временные ряды с помощью следующего кода аппроксимировать -1 значения с этим кодом:

ts = pd.TimeSeries(values, index=timestamps) 
ts.interpolate(method='cubic', downcast='infer') 

Как и интерполировать и упорядочение частоты наблюдений? Спасибо всем за помощь.

ответ

17

Измените -1 s к NaNs:

ts[ts==-1] = np.nan 

Затем ресэмплировать данные, чтобы иметь 5 минут частоту.

ts = ts.resample('5T') 

Обратите внимание, что по умолчанию, если два измерения находятся в пределах одной и той же 5-минутного периода, resample усредняет значения вместе.

Наконец, вы можете линейно интерполировать временных рядов в зависимости от времени:

ts = ts.interpolate(method='time') 

Так это выглядит, как ваши данные уже есть примерно в 5-минутную частоту, вы , возможно, потребуется ресэмплировать в короче частоты так, кубической или сплайн-интерполяция может сгладить кривую:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

values = [271238, 329285, -1, 260260, 263711] 
timestamps = pd.to_datetime(['2015-01-04 08:29:05', 
          '2015-01-04 08:34:05', 
          '2015-01-04 08:39:05', 
          '2015-01-04 08:44:05', 
          '2015-01-04 08:49:05']) 

ts = pd.Series(values, index=timestamps) 
ts[ts==-1] = np.nan 
ts = ts.resample('T', how='mean') 

ts.interpolate(method='spline', order=3).plot() 
ts.interpolate(method='time').plot() 
lines, labels = plt.gca().get_legend_handles_labels() 
labels = ['spline', 'time'] 
plt.legend(lines, labels, loc='best') 
plt.show() 

enter image description here

+0

Спасибо, что он отлично работает! Вместо этого я могу вместо этого добавить обычные 5-минутные метки времени в ряд с nan как значениями, а затем интерполировать их с помощью сплайна 3-го порядка? – riccamini

+0

Я не понимаю, что вы подразумеваете под «добавлением регулярных 5-минутных временных меток к серии с nan как значениями», но я добавил пример, показывающий интерполяцию «временем» и сплайнами order-3. – unutbu

+0

Я имею в виду, что будет какая-либо разница, если вместо этого линейно интерполировать временные ряды с ** resample() **, мы сначала построим временные ряды с простыми вводами данных, затем добавим записи типа 2015- 01-01-08: 00, nan 2015-01-01-08: 05, nan и т. Д., И, наконец, интерполировать их с помощью заказа 3 сплайна? – riccamini

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