Pandas: أقحم (upample) سلاسل زمنية غير متساوية إلى 18.0rc1 متساوي التباعد

تم إنشاؤها على ٧ مارس ٢٠١٦  ·  3تعليقات  ·  مصدر: pandas-dev/pandas

أريد أن أقحم (راقية) متسلسلة زمنية غير متباعدة للحصول على متسلسلة زمنية متساوية.

أفعل ذلك حاليًا بالطريقة التالية:

  1. خذ السلاسل الزمنية الأصلية.
  2. إنشاء سلاسل زمنية جديدة بقيم NaN في كل فواصل زمنية مدتها 30 ثانية (باستخدام إعادة تشكيل ('30S'). asfreq ())
  3. سلسلة أوقات أصلية ومسلسلات زمنية جديدة
  4. قم بفرز التسلسلات الزمنية لاستعادة ترتيب الأوقات (هذا لا يعجبني - الفرز به تعقيد O = n log (n))
  5. تحقق
  6. إزالة النقاط الأصلية من التسلسل الزمني

هل هناك طريقة أكثر بساطة؟ كما هو الحال في matlab ، لديك سلاسل زمنية أصلية وتمرر أوقاتًا جديدة كمعامل إلى دالة interpolate () لتلقي القيم في الأوقات المطلوبة. من الناحية المثالية ، أود الحصول على وظيفة مثل

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

ألاحظ أن أوقات السلاسل الزمنية الأصلية قد لا تكون مجموعة فرعية من أوقات السلاسل الزمنية المرغوبة.

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

التعليق الأكثر فائدة

هذا يجعلك قريبًا جدًا

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

ال 3 كومينتر

استخدم Order_merge بدلاً من concat والفرز
http://pandas.pydata.org/pandas-docs/stable/merging.html#merging -ordered-data

سيكون من الجيد القيام بذلك دون الحاجة إلى الدمج تمامًا لأنني لا أحتاج حقًا إلى السلسلة الزمنية المدمجة ، فأنا بحاجة فقط إلى السلاسل الزمنية المتساوية الناتجة. هل الطريقة التي وصفتها (محسّنة بالدمج_الطلب) هي الطريقة الأكثر فاعلية للقيام بذلك؟ ربما سيكون استخدام التوابل مباشرة أفضل بعد ذلك

http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/interpolate.html#d -interpolation-interp1d
يسمح scipy بالقيام بذلك بأسلوب Matlab ، والاحتفاظ بالسلاسل الزمنية الأصلية ، وتمرير فهرس جديد للحصول على سلاسل زمنية جديدة.

كما سأعمل على البيانات عبر الإنترنت حتى تنمو السلاسل الزمنية الأصلية وسأحتاج إلى استيفاء البيانات الجديدة وإضافتها إلى السلاسل الزمنية (المتقاربة).

هذا يجعلك قريبًا جدًا

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
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات