Pandas: Interpolasi (upsample) deret waktu non-equispaced menjadi equispaced 18.0rc1

Dibuat pada 7 Mar 2016  ·  3Komentar  ·  Sumber: pandas-dev/pandas

Saya ingin menginterpolasi (kelas atas) deret waktu nonequispaced untuk mendapatkan deret waktu equispaced.

Saat ini saya melakukannya dengan cara berikut:

  1. mengambil rangkaian waktu asli.
  2. buat deret waktu baru dengan nilai NaN pada setiap interval 30 detik ( menggunakan resample('30S').asfreq() )
  3. concat deret waktu asli dan deret waktu baru
  4. urutkan deret waktu untuk mengembalikan urutan waktu (Ini yang saya tidak suka - penyortiran memiliki kompleksitas O = n log(n) )
  5. menambah
  6. hapus poin asli dari deret waktu

apakah ada cara yang lebih sederhana? seperti di matlab Anda memiliki rangkaian waktu asli dan Anda melewatkan waktu baru sebagai parameter ke fungsi interpolate() untuk menerima nilai pada waktu yang diinginkan. Idealnya saya ingin memiliki fungsi seperti

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

Saya berkomentar bahwa waktu deret waktu asli mungkin bukan bagian dari waktu deret waktu yang diinginkan.

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

Komentar yang paling membantu

ini membuat Anda cukup dekat

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

Semua 3 komentar

gunakan order_merge daripada concat dan sort
http://pandas.pydata.org/pandas-docs/stable/merging.html#merging -ordered-data

Akan menyenangkan untuk melakukannya tanpa perlu menggabungkan sama sekali karena saya tidak benar-benar membutuhkan deret waktu yang digabungkan, saya hanya membutuhkan deret waktu yang sama yang dihasilkan. Apakah cara yang saya jelaskan (disempurnakan dengan perintah_merge) cara paling efisien untuk melakukannya? Mungkin menggunakan pedas langsung akan lebih baik

http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/interpolate.html#d -interpolation-interp1d
scipy memungkinkan untuk melakukannya dalam gaya Matlab, menyimpan deret waktu asli, dan meneruskan indeks baru untuk mendapatkan deret waktu baru.

juga saya akan bekerja akan data online sehingga deret waktu asli akan tumbuh dan saya perlu menginterpolasi data baru dan menambahkannya ke deret waktu yang diinterpolasi (equispaced).

ini membuat Anda cukup dekat

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
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

MatzeB picture MatzeB  ·  3Komentar

mfmain picture mfmain  ·  3Komentar

amelio-vazquez-reina picture amelio-vazquez-reina  ·  3Komentar

Ashutosh-Srivastav picture Ashutosh-Srivastav  ·  3Komentar

andreas-thomik picture andreas-thomik  ·  3Komentar