Pandas中你一定要掌握的時間序列相關高階功能

語言: CN / TW / HK

Pandas 是大家都非常熟悉的資料分析與處理工具庫,對於結構化的業務資料,它能很方便地進行各種資料分析和資料操作。但我們的資料中,經常會存在對應時間的欄位,很多業務資料也是時間序組織,很多時候我們不可避免地需要和時間序列資料打交道。其實 Pandas 中有非常好的時間序列處理方法,但是因為使用並不特別多,很多基礎教程也會略過這一部分。

在本篇內容中,ShowMeAI對 Pandas 中處理時間的核心函式方法進行講解。相信大家學習過後,會在處理時間序列型資料時,更得心應手。

資料分析與處理的完整知識技能,大家可以參考ShowMeAI製作的工具庫速查表和教程進行學習和快速使用。 - 📘資料科學工具庫速查表 | Pandas 速查表 - 📘圖解資料分析:從入門到精通系列教程

💡 時間序列

時間序列是指將同一統計指標的數值按其發生的時間先後順序排列而成的數列。簡單說來,時間序列是隨著時間的推移記錄某些取值,比如說商店一年的銷售額(按照月份從1月到12月)。

💡 Pandas 時間序列處理

我們要了解的第一件事是如何在 Pandas 中建立一組日期。我們可以使用date_range()建立任意數量的日期,函式需要你提供起始時間、時間長度和時間間隔。

```python

構建時長為7的時間序列

pd.date_range("2022-01-01", periods=7, freq='D')

輸出

DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04','2022-01-05', '2022-01-06', '2022-01-07'], dtype='datetime64[ns]', freq='D')

```

注意到上面的頻率可用freq來設定:最常見的是'W'每週,'D'是每天,'M'是月末,'MS'是月開始。

下面我們建立一個包含日期和銷售額的時間序列資料,並將日期設定為索引。

```python

設定隨機種子,可以復現

np.random.seed(12)

構建資料集

df = pd.DataFrame({ 'date': pd.date_range("2022-01-01", periods=180, freq='D'), 'sales': np.random.randint(1000, 10000, size=180)})

# 設定索引 df = df.set_index('date') ```

注意,我們要方便地對時間序列進行處理,一個很重要的先序工作是將日期作為索引,我們前面已經完成這個工作了。

💦 重取樣

Pandas 中很重要的一個核心功能是resample,重新取樣,是對原樣本重新處理的一個方法,是一個對常規時間序列資料重新取樣和頻率轉換的便捷的方法。

方法的格式是:

python DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start',kind=None, loffset=None, limit=None, base=0)

核心的引數rule是字串,表示取樣的頻度。如下程式碼,在resample後接的mean是表示按照月度求平均。

```python

Resample by month end date

df.resample(rule= 'M').mean() ```

按月取平均值後,將索引設定為每月結束日期,結果如下。

我們也可以按每週銷售額繪製彙總資料。

```python

取樣繪圖

df.resample('W').mean().plot(figsize=(15,5), title='Avg Weekly Sales'); ```

上圖可以看出,銷量在3月和4月之間的銷售額有所下降,而在 6 月中旬達到頂峰。

💦 平移

Pandas 中的shift功能,可以讓欄位向上或向下平移資料。這個平移資料的功能很容易幫助我們得到前一天或者後一天的資料,可以通過設定shift的引數來完成上週或者下週資料的平移。

```python

原始資料的一份拷貝

df_shift = df.copy()

平移一天

df_shift['next_day_sales'] = df_shift.sales.shift(-1)

平移一週

df_shift['next_week_sales'] = df_shift.sales.shift(-7) ```

在時間序列問題中,我們經常要完成同比和環比資料,通過shift後的資料做差就很容易得到。

```python

計算差值

df_shift['one_week_net'] = df_shift.sales - df_shift.sales.shift(-7) ```

💦 滑動平均

下一個核心功能是rolling滑動平均,它是做交易的朋友非常常用到的一個功能,rolling函式建立一個視窗來聚合資料。

```python

長度為2天的視窗,求滑動平均

df.rolling(2).mean() ```

在下圖中,我們可以看到第一個值是NaN,因為再往前沒有資料了。對第2個點,它對資料集的前2行計算平均: (6787 + 4325)/2 = 5556。

滾動平均值非常適合表徵趨勢,滑動視窗越大,得到的結果曲線越平滑,最常用的是7天平均。

```python

滑動平均繪圖

df.sales.plot(figsize=(25,8), legend=True, linestyle='--', color='darkgray') df.rolling(window=7).sales.mean().plot(legend=True, label='7 day average', linewidth=2) df.rolling(30).sales.mean().plot(legend=True, label='30 day average', linewidth=3) df.rolling(100).sales.mean().plot(legend=True, label='100 day average', linewidth=4) ```

💡 總結

Pandas在時間序列處理和分析中也非常有效,ShowMeAI在本篇內容中介紹的3個核心函式,是最常用的時間序列分析功能:

  • resample:將資料從每日頻率轉換為其他時間頻率。
  • shift:欄位上下平移資料以進行比較或計算。
  • rolling:建立滑動平均值,檢視趨勢。

參考資料

本文正在參加「金石計劃 . 瓜分6萬現金大獎」

「其他文章」