pandas:時間序列數據的週期轉換

時間序列數據是數據分析中經常遇到的類型,爲了更多的挖掘出數據內部的信息,
我們常常依據原始數據中的時間週期,將其轉換成不同跨度的週期,
然後再看數據是否會在新的週期上產生新的特性。

下面以模擬的K線數據爲例,演示如何使用pandas來進行週期轉換。

1. 創建測試數據

首先創建測試數據,下面創建一天的K線數據,數據的間隔爲1分鐘(1min)。

import pandas as pd
import numpy as np

# 創建時間序列的列,時間間隔1分鐘
date_col = pd.date_range("2024-01-01", "2024-01-02", freq="1min")
data_len = len(date_col)

# 模擬的K線數據
df = pd.DataFrame(
    np.random.randint(1, 10, size=(data_len, 5)),
    columns=["open", "close", "high", "low", "volumn"],
)

df.insert(0, "begin_time", date_col)
df

image.png
其中各個字段的含義:
open(開盤價),close(收盤價),high(最高價),low(最低價),volumn(成交量)。

2. 週期轉換和數據聚合

如果有股票或者類似交易的朋友都知道,K線的時間間隔是不固定的,不一定像上面的測試數據那樣間隔1分鐘,
一般根據自己的買賣頻率會查看不同時間間隔的K線

但是採集數據時,一般不會去採集各種時間間隔的K線,我們可以根據1分鐘K線,去轉換其他不同時間間隔的K線
轉換的方法,就是使用pandasresample函數。
通過resample週期轉換其實就是以一定的週期對數據進行groupby,所以,resample也像groupby一樣,需要對新週期中的數據進行聚合。

比如,下面的數據我們將1分鐘的K線轉換爲5分鐘的K線。

df.resample("5min", on="begin_time").agg({
    "open": "first",
    "close": "last",
    "high": "max",
    "low": "min",
    "volumn": "sum",
})

image.png

比如,原始數據每5個聚合成一個。
以前5個數據(2024-01-01 00:00:00~2024-01-01 00:04:00)爲例。
image.png
open取第一個值,close取最後一個值,high取最大值,low取最小值,volumn取合計值。

除了上面的5分鐘的數據,通過resample還可以聚合15分鐘的K線,1小時4小時等等各種時間間隔的K線。
方法類似,這裏不再一一贅述。

3. 週期中的缺失值

對於完整的數據,就像上面那樣轉換即可,然而實際情況下的數據,部分缺失的情況是很常見的,
特別是上面的1分鐘K線數據,極有可能1分鐘沒有交易,出現缺失的情況,有可能連續5分鐘都沒有數據。

下面看看數據缺失時,resample轉換的情況。
先從上面的測試數據中取20個再進行一些刪減,構造數據缺失的情況:

df_ = df.copy()
df_ = df_.iloc[:20]
df_ = df_.drop([3, 5, 6, 7, 8, 9, 10, 15, 16])
df_ = df_.reset_index(drop=True)
df_

image.png
每組都有一些缺失,其中(2024-01-01 00:06:00~2024-01-01 00:10:00)整個5分鐘的數據都缺失了。

此時,再按照5分鐘間隔來resample,得到:

df_.resample("5min", on="begin_time").agg({
    "open": "first",
    "close": "last",
    "high": "max",
    "low": "min",
    "volumn": "sum",
})

image.png

從中可以得出兩個結論:

  1. 部分缺失,就用剩餘的數據來聚合計算(比如5分鐘的數據就剩3條,那就用這3條來聚合)
  2. 整個缺失,那麼就用聚合函數的默認值來填充,比如上面2024-01-01 00:05:00這條

4. 總結

時間序列數據的分析過程中,週期轉換是一個很常用的操作。

不過,不是簡單的用resample來轉換就完事了,
週期轉換之後也會帶來新的問題,比如上面示例中由於轉換形成的空值,
這些空值是要直接丟棄?還是要插值?
如果要插值的話,是用基準數據來填充?還是用平均值?用移動平均值?用中位數?等等來插值,
這些都需要根據具體的分析場景和使用的分析算法來進一步討論。
本文主要介紹使用resample來轉換數據,而關於插值方法的詳細討論將另文闡述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章