web-dev-qa-db-fra.com

Python pandas interpolation et régularisation des séries temporelles)

J'utilise Python Pandas pour la première fois. J'ai des données de trafic de retard de 5 min au format csv:

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

Il y a plusieurs problèmes:

  • pour certains horodatages, il manque des données (-1)
  • entrées manquantes (également 2/3 heures consécutives)
  • la fréquence des observations n'est pas exactement de 5 minutes, mais perd en fait quelques secondes de temps en temps

Je voudrais obtenir une série chronologique régulière, donc avec des entrées toutes les (exactement) 5 minutes (et aucun valus manquant). J'ai réussi à interpoler la série chronologique avec le code suivant pour approximer les valeurs -1 avec ce code:

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

Comment puis-je interpoler et régulariser la fréquence des observations? Merci à tous pour l'aide.

17
riccamini

Changer la -1s à NaNs:

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

Rééchantillonnez ensuite les données pour avoir une fréquence de 5 minutes.

ts = ts.resample('5T')

Notez que, par défaut, si deux mesures relèvent de la même période de 5 minutes, resample fait la moyenne des valeurs ensemble.

Enfin, vous pouvez interpoler linéairement les séries temporelles en fonction du temps:

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

Comme il semble que vos données aient déjà une fréquence d'environ 5 minutes, vous devrez peut-être rééchantillonner à une fréquence plus courte afin que l'interpolation cubique ou spline puisse lisser la courbe:

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

25
unutbu