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萬現金大獎」

「其他文章」