Pandas: рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯ (рдЕрдкрд╕реИрдВрдкрд▓) рдЧреИрд░-рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╕рдордп-рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕рдорд╕реНрдерд╛рдирд┐рдХ 18.0rc1 . рдореЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдорд╛рд░реНрдЪ 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pandas-dev/pandas

рдореИрдВ рд╕рдорд╕реНрдерд╛рдирд┐рдХ рд╕рдордп-рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдордп-рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд (рдЕрдкрд╕реНрдХреЗрд▓) рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

  1. рдореВрд▓ рд╕рдордп-рд╕рд╛рд░рд┐рдгреА рд▓реЗрдВред
  2. рдкреНрд░рддреНрдпреЗрдХ 30 рд╕реЗрдХрдВрдб рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ NaN рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдирдИ рд╕рдордп-рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдПрдВ (resample('30S').asfreq() ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
  3. рд╕рдорд╕рд╛рдордпрд┐рдХ рдореВрд▓ рд╕рдордп рдФрд░ рдирдИ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛
  4. рд╕рдордп рдХреЗ рдХреНрд░рдо рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп-рд╕рд╛рд░рд┐рдгреА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ (рдпрд╣ рдореБрдЭреЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ - рдЫрдБрдЯрд╛рдИ рдореЗрдВ O = n log(n) рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╣реИ)
  5. рд▓рдЧрд╛рдирд╛
  6. рдореВрд▓ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рдордп-рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ

рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ? рдЬреИрд╕реЗ рдореИрдЯрд▓реИрдм рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореВрд▓ рд╕рдордп-рд╕рд╛рд░рд┐рдгреА рд╣реИ рдФрд░ рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рд╕рдордп рдкрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯ() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирдпрд╛ рд╕рдордп рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдореИрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдХрд┐

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 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреЙрдирдХреИрдЯ рдФрд░ рд╕реЙрд░реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдСрд░реНрдбрд░_рдорд░реНрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
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 рдЗрд╕реЗ рдореИрдЯрд▓реИрдм рд╢реИрд▓реА рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдореВрд▓ рд╕рдордп-рд╕рд╛рд░рд┐рдгреА рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдирдИ рд╕рдордп-рд╕рд╛рд░рд┐рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдИ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдСрдирд▓рд╛рдЗрди рдбреЗрдЯрд╛ рдкрд░ рднреА рдХрд╛рдо рдХрд░реВрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореВрд▓ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдврд╝реЗрдЧреА рдФрд░ рдореБрдЭреЗ рдирдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд (рд╕рдорд╛рди) рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдпрд╣ рдЖрдкрдХреЛ рдмрд╣реБрдд рдХрд░реАрдм рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ

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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mfmain picture mfmain  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amelio-vazquez-reina picture amelio-vazquez-reina  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ebran picture ebran  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Abrosimov-a-a picture Abrosimov-a-a  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Ashutosh-Srivastav picture Ashutosh-Srivastav  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ