使用 .resample() 進行上采樣與插值

Manipulating Time Series Data in Python

Stefan Jansen

Founder & Lead Data Scientist at Applied Artificial Intelligence

頻率轉換與轉換方法

  • .resample():類似 .groupby()

  • 依重採樣期間分組,對每組套用一種或多種方法

  • 新日期由位移決定,例如起始、結束等

  • 上采樣:由現有值填補或做插值

  • 下采樣:對現有資料做彙總

Manipulating Time Series Data in Python

開始上手:每月失業率

unrate = pd.read_csv('unrate.csv', parse_dates['Date'], index_col='Date')

unrate.info()
DatetimeIndex: 208 entries, 2000-01-01 to 2017-04-01
Data columns (total 1 columns):
UNRATE    208 non-null float64 # no frequency information
dtypes: float64(1)
unrate.head()
            UNRATE
DATE
2000-01-01     4.0
2000-02-01     4.1
2000-03-01     4.0
2000-04-01     3.8
2000-05-01     4.0
  • 報告日期:每月第 1 天
Manipulating Time Series Data in Python

重採樣期間與頻率位移

  • 重採樣會依頻率位移產生新日期
  • 月底不只一種替代方案

 

頻率 別名 範例日期
行事曆月末 M 2017-04-30
行事曆月初 MS 2017-04-01
營業日月末 BM 2017-04-28
營業日月初 BMS 2017-04-03
Manipulating Time Series Data in Python

重採樣邏輯

重採樣與插值示意圖

Manipulating Time Series Data in Python

重採樣邏輯

重採樣流程範例

Manipulating Time Series Data in Python

用 .resample() 指定頻率

unrate.asfreq('MS').info()
DatetimeIndex: 208 entries, 2000-01-01 to 2017-04-01
Freq: MS
Data columns (total 1 columns):
UNRATE    208 non-null float64
dtypes: float64(1)
unrate.resample('MS') # creates Resampler object
DatetimeIndexResampler [freq=<MonthBegin>, axis=0, closed=left, 
                        label=left, convention=start, base=0]
Manipulating Time Series Data in Python

用 .resample() 指定頻率

unrate.asfreq('MS').equals(unrate.resample('MS').asfreq())
True
  • .resample():只有再呼叫其他方法時才會回傳資料
Manipulating Time Series Data in Python

季別實質 GDP 成長

gdp = pd.read_csv('gdp.csv')

gdp.info()
DatetimeIndex: 69 entries, 2000-01-01 to 2017-01-01
Data columns (total 1 columns):
gpd    69 non-null float64 # no frequency info
dtypes: float64(1)
gdp.head(2)
            gpd
DATE
2000-01-01  1.2
2000-04-01  7.8
Manipulating Time Series Data in Python

插補每月實質 GDP 成長

gdp_1 = gdp.resample('MS').ffill().add_suffix('_ffill')
       gpd_ffill
DATE
2000-01-01  1.2
2000-02-01  1.2
2000-03-01  1.2
2000-04-01  7.8
Manipulating Time Series Data in Python

插補每月實質 GDP 成長

gdp_2 = gdp.resample('MS').interpolate().add_suffix('_inter')
            gpd_inter
DATE
2000-01-01  1.200000
2000-02-01  3.400000
2000-03-01  5.600000
2000-04-01  7.800000
  • .interpolate():在既有資料間的直線上找出插值點
Manipulating Time Series Data in Python

串接兩個 DataFrame

df1 = pd.DataFrame([1, 2, 3], columns=['df1'])

df2 = pd.DataFrame([4, 5, 6], columns=['df2'])
pd.concat([df1, df2])
   df1  df2
0  1.0  NaN
1  2.0  NaN
2  3.0  NaN
0  NaN  4.0
1  NaN  5.0
2  NaN  6.0
Manipulating Time Series Data in Python

串接兩個 DataFrame

pd.concat([df1, df2], axis=1)
   df1  df2
0    1    4
1    2    5
2    3    6
  • axis=1:水平串接
Manipulating Time Series Data in Python

繪製插值後的實質 GDP 成長

pd.concat([gdp_1, gdp_2], axis=1).loc['2015':].plot()

插值後的實質 GDP 成長趨勢

Manipulating Time Series Data in Python

合併 GDP 成長與失業率

pd.concat([unrate, gdp_inter], axis=1).plot();

合併 GDP 成長與失業率

Manipulating Time Series Data in Python

一起來練習吧!

Manipulating Time Series Data in Python

Preparing Video For Download...