Quiero interpolar (a mayor escala) series de tiempo no espaciadas para obtener series de tiempo equiespaciadas.
Actualmente lo estoy haciendo de la siguiente manera:
¿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()
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
Comentario más útil
esto te acerca bastante