2015-05-29 16 views
11

Sto usando Python Pandas per la prima volta. Ho di 5 minuti i dati sul traffico di ritardo in formato CSV:Interpolazione e regolarizzazione delle serie temporali dei panda di Python

... 
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 
... 

Ci sono diverse questioni:

  • per alcuni timestamp c'è mancante di dati (-1)
  • voci mancanti (anche 2/3 ore consecutive)
  • la frequenza delle osservazioni non è esattamente 5 minuti, ma in realtà perde alcuni secondi tanto

Vorrei ottenere una serie storica regolare, quindi con voci ogni (esattamente) 5 minuti (e nessun valore mancante). Ho interpolato con successo le serie storiche con il seguente codice, sul ravvicinamento delle -1 valori con questo codice:

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

Come posso sia interpolare e regolarizzare la frequenza delle osservazioni? Grazie a tutti per l'aiuto.

risposta

17

Cambiare le -1 s a NaNs:

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

Poi ricampionare i dati per avere una frequenza di 5 minuti.

ts = ts.resample('5T') 

Si noti che, per impostazione predefinita, se due misure cadono nello stesso periodo di 5 minuti, resample calcola la media dei valori.

Infine, si potrebbe linearmente interpolare le serie temporali a seconda del tempo:

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

Poiché sembra che i dati già ha all'incirca una frequenza di 5 minuti, si potrebbe essere necessario ricampionare a una frequenza più corto in modo cubica o spline può attenuare la curva:

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

Grazie, funziona perfettamente! C'è un modo in cui posso prima aggiungere i normali timestamp di 5 minuti alla serie con nan come valori, e quindi interpolarli con una spline di ordine 3? – riccamini

+0

Non capisco cosa intendi con "aggiungi i normali timestamp di 5 minuti alla serie con nan come valori", ma ho aggiunto un esempio che mostra l'interpolazione di "time" e con le spline order-3. – unutbu

+0

Voglio dire, ci sarebbe qualche differenza se invece interpolate linearmente le serie temporali con ** resample() **, costruiamo prima una serie temporale con le semplici voci nei dati, quindi aggiungiamo voci del tipo 2015- 01-01-08: 00, nan 2015-01-01-08: 05, nan e così via, e infine li si interpola con un ordine 3 spline? – riccamini

Problemi correlati