Pandas: Interpolar (muestra ascendente) series de tiempo no equiespaciadas en 18.0rc1 equiespaciadas

Creado en 7 mar. 2016  ·  3Comentarios  ·  Fuente: pandas-dev/pandas

Quiero interpolar (a mayor escala) series de tiempo no espaciadas para obtener series de tiempo equiespaciadas.

Actualmente lo estoy haciendo de la siguiente manera:

  1. tomar series temporales originales.
  2. cree nuevas series temporales con valores de NaN en intervalos de 30 segundos (usando remuestreo ('30S'). asfreq ())
  3. concat series de tiempo originales y nuevas series de tiempo
  4. ordenar las series de tiempo para restaurar el orden de los tiempos (Esto no me gusta, la clasificación tiene una complejidad de O = n log (n))
  5. interpolar
  6. eliminar puntos originales de la serie temporal

¿Existe una forma más sencilla? como en matlab, tiene series de tiempo originales y pasa nuevos tiempos como parámetro a la función interpolate () para recibir valores en los momentos deseados. Idealmente me gustaría tener una función como

origTimeSeries.interpolate(newIndex=newTimeIndex, method='spline')

Observo que los tiempos de las series temporales originales pueden no ser un subconjunto de los tiempos de las series temporales deseadas.

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

values = [271238, 329285, 50, 260260, 263711]
timestamps = pd.to_datetime(['2015-01-04 08:29:4',
                             '2015-01-04 08:37:05',
                             '2015-01-04 08:41:07',
                             '2015-01-04 08:43:05',
                             '2015-01-04 08:49:05'])

ts = pd.Series(values, index=timestamps)
ts
ts[ts==-1] = np.nan
newFreq=ts.resample('60S').asfreq()

new=pd.concat([ts,newFreq]).sort_index()
new=new.interpolate(method='time')

ts.plot(marker='o')
new.plot(marker='+',markersize=15)

new[newFreq.index].plot(marker='.')

lines, labels = plt.gca().get_legend_handles_labels()
labels = ['original values (nonequispaced)', 'original + interpolated at new frequency (nonequispaced)', 'interpolated values without original values (equispaced!)']
plt.legend(lines, labels, loc='best')
plt.show()


image

Enhancement Resample Timeseries

Comentario más útil

esto te acerca bastante

In [42]: ts.reindex(ts.resample('60s').asfreq().index, method='nearest', tolerance=pd.Timedelta('60s')).interpolate('time')
Out[42]: 
2015-01-04 08:29:00    271238.000000
2015-01-04 08:30:00    271238.000000
2015-01-04 08:31:00    279530.428571
2015-01-04 08:32:00    287822.857143
2015-01-04 08:33:00    296115.285714
2015-01-04 08:34:00    304407.714286
2015-01-04 08:35:00    312700.142857
2015-01-04 08:36:00    320992.571429
2015-01-04 08:37:00    329285.000000
2015-01-04 08:38:00    329285.000000
2015-01-04 08:39:00    219540.000000
2015-01-04 08:40:00    109795.000000
2015-01-04 08:41:00        50.000000
2015-01-04 08:42:00        50.000000
2015-01-04 08:43:00    260260.000000
2015-01-04 08:44:00    260260.000000
2015-01-04 08:45:00    260950.200000
2015-01-04 08:46:00    261640.400000
2015-01-04 08:47:00    262330.600000
2015-01-04 08:48:00    263020.800000
2015-01-04 08:49:00    263711.000000
Freq: 60S, dtype: float64

Todos 3 comentarios

use order_merge en lugar de concat y sort
http://pandas.pydata.org/pandas-docs/stable/merging.html#merging -ordered-data

Sería bueno hacerlo sin necesidad de fusionar por completo, ya que realmente no necesito la serie de tiempo fusionada, solo necesito la serie de tiempo equiespaciada resultante. ¿Es la forma que describí (mejorada con Order_merge) la forma más eficiente de hacerlo? Tal vez usar picante directamente sería mejor que

http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/interpolate.html#d -interpolation-interp1d
scipy permite hacerlo en estilo Matlab, mantener las series temporales originales y pasar un nuevo índice para obtener nuevas series temporales.

también estaré trabajando con datos en línea para que la serie de tiempo original crezca y necesitaré interpolar los nuevos datos y agregarlos a la serie de tiempo interpolada (equiespaciada).

esto te acerca bastante

In [42]: ts.reindex(ts.resample('60s').asfreq().index, method='nearest', tolerance=pd.Timedelta('60s')).interpolate('time')
Out[42]: 
2015-01-04 08:29:00    271238.000000
2015-01-04 08:30:00    271238.000000
2015-01-04 08:31:00    279530.428571
2015-01-04 08:32:00    287822.857143
2015-01-04 08:33:00    296115.285714
2015-01-04 08:34:00    304407.714286
2015-01-04 08:35:00    312700.142857
2015-01-04 08:36:00    320992.571429
2015-01-04 08:37:00    329285.000000
2015-01-04 08:38:00    329285.000000
2015-01-04 08:39:00    219540.000000
2015-01-04 08:40:00    109795.000000
2015-01-04 08:41:00        50.000000
2015-01-04 08:42:00        50.000000
2015-01-04 08:43:00    260260.000000
2015-01-04 08:44:00    260260.000000
2015-01-04 08:45:00    260950.200000
2015-01-04 08:46:00    261640.400000
2015-01-04 08:47:00    262330.600000
2015-01-04 08:48:00    263020.800000
2015-01-04 08:49:00    263711.000000
Freq: 60S, dtype: float64
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

songololo picture songololo  ·  3Comentarios

amelio-vazquez-reina picture amelio-vazquez-reina  ·  3Comentarios

venuktan picture venuktan  ·  3Comentarios

matthiasroder picture matthiasroder  ·  3Comentarios

andreas-thomik picture andreas-thomik  ·  3Comentarios