时间序列数据在数据分析中经常遇到,为了更好地挖掘数据内部的信息,我们常常根据原始数据中的时间周期,将其转换成不同跨度的周期,然后再观察数据在新的周期上是否产生新的特性。
以下以模拟的K线数据为例,演示如何使用
pandas
进行周期转换。
其中各字段的含义:
open
(开盘价),
close
(收盘价),
high
(最高价),
low
(最低价),
volumn
(成交量)。
首先创建测试数据,下面创建一天的K线数据,数据的间隔为1分钟。
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
如果有股票或者类似交易的朋友都知道,K线的时间间隔是不固定的,一般根据自己的买卖频率会查看不同时间间隔的K线。但是采集数据时,一般不会去采集各种时间间隔的K线,我们可以根据1分钟的K线,去转换其他不同时间间隔的K线。转换的方法,就是使用
pandas
的
resample
函数。通过
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",
})
除了上面的5分钟的数据,通过
resample
还可以聚合15分钟的K线,1小时,4小时等各种时间间隔的K线。方法类似,这里不再一一赘述。
对于完整的数据,时间序列数据的分析过程中,周期转换是一个很常用的操作。但是,不是简单的用
resample
来转换就完事了,周期转换之后也会带来新的问题,比如由于转换形成的空值,这些空值是要直接丢弃?还是要插值?如果要插值的话,是用基准数据来填充?还是用平均值?用移动平均值?用中位数?等等来插值,这些都需要根据具体的分析场景和使用的分析算法来进一步讨论。本文主要介绍使用
resample
来转换数据,而关于插值方法的详细讨论将另文阐述。