时序工具Kats使用入门
Kats(Kits to Analyze Time Series)是一款轻量级、易于使用、可扩展和通用的框架,用于在Python中进行时序分析,由Facebook开源。
TimeSeriesData是Kats中表示单变量和多变量时间序列的基本数据结构,有两种初始化的方法:
- TimeSeriesData(df):要求包含一个"time"列和任意值列的pd.DataFrame对象
- TimeSeriesData(time, value):其中"time"是pd.Series或者pd.DatetimeIndex对象,值是pd.Series(单变量)或者pd.DataFrame(多变量)
安装
Mac中安装是非常简单的,直接pip install;如果是Windows系统,请百度解决各种依赖问题:
1 | pip install --upgrade pip |
GitHub学习地址:https://github.com/facebookresearch/Kats
API地址:https://facebookresearch.github.io/Kats/api/
导入库
In [1]:
1 | # 导入库 |
单变量预测
使用的是air_passengers.csv的数据集。
导入数据
In [2]:
1 | # ./ 表示的当前目录下 |
字段重命名
方式1:创建TimeSeriesData对象
In [7]:
1 | type(air) # 转换前 |
Out[7]:
1 | pandas.core.frame.DataFrame |
In [8]:
1 | air_ts = TimeSeriesData(air) # 实施转换 |
In [9]:
1 | type(air_ts) # 转换后 |
Out[9]:
1 | kats.consts.TimeSeriesData |
In [10]:
1 | print(type(air_ts.time)) |
方式2:TimeSeriesData(time,value)创建
In [11]:
1 | air_ts_from_series = TimeSeriesData(time=air.time, value=air.value) |
TimeSeriesData对象操作
TimeSeriesData对象支持很多类似pd.DataFrame的操作:
- 切片取数slicing
- 数学计算
- 内置的plot()方法绘图
- 一些常用的内置函数使用
切片取数
数学运算
当两个TimeSeries对象进行相加的时候,time列的取值必须相同:
In [16]:
1 | air_ts[2:8] + air_ts_from_series[2:8] |
如果time列的值不同,则会报错:
逻辑判断
In [18]:
1 | air_ts == air_ts_from_series |
Out[18]:
1 | True |
计算长度
In [19]:
1 | len(air_ts) |
Out[19]:
1 | 144 |
常用属性
In [20]:
1 | air_ts.max |
Out[20]:
1 | 622 |
In [21]:
1 | air_ts.min |
Out[21]:
1 | 104 |
In [22]:
1 |
|
Out[22]:
1 | True |
In [23]:
1 |
|
Out[23]:
1 | False |
In [24]:
1 |
|
Out[24]:
1 | False |
转成DataFrame对象
In [25]:
1 | air_to_df = air_ts.to_dataframe() |
扩充extend(重点)
对两个不同的TimeSeries对象在axis=0方向上的扩充
In [26]:
1 | k1 = air_ts[2:5] # 3行记录 |
需要注意的是,扩充的时候两个对象的日期的头尾必须是能连接的上:
绘图
直接使用plot方法对Kats中的TimeSeriesData对象进行绘图
In [29]:
1 | air_ts.plot() |
基于Kats的预测
Kats目前是支持多种预测的算法,常见的有:
- Linear
- Quadratic
- ARIMA(重点)
- SARIMA
- Holt-Winters
- Prophet(重点)
- AR-Net
- LSTM(重点)
- Theta
- VAR
在使用的时候通过fit和predict函数就可以完成基本的预测功能。
使用Prophet
建模拟合 + 预测的过程:
In [30]:
1 | from kats.models.prophet import ProphetModel, ProphetParams |
下面的预测结果中:fcst是预测的均值,fcst_lower是预测的下限,fcst_upper是预测的上限
绘制预测结果的可视化图形:
In [31]:
1 | model.plot() |
加上历史数据我们再预测一次:
1 | from kats.models.prophet import ProphetModel, ProphetParams |
黑线是原始的数据,蓝线是预测的结果
使用LSTM
使用LSTM模型再预测一次:
In [33]:
1 | from kats.models.lstm import LSTMModel,LSTMParams |
对比Prophet和LSTM模型,我们发现:Prophet的趋势更好
多变量预测
导入数据
创建TimeSeriesData对象
方式1
In [4]:
1 | multi_ts = TimeSeriesData(df) |
In [5]:
1 | type(multi_ts.time) |
Out[5]:
1 | pandas.core.series.Series |
In [6]:
1 | type(multi_ts.value) |
Out[6]:
1 | pandas.core.frame.DataFrame |
方式2
In [7]:
1 | multi_ts_two = TimeSeriesData(time=df.time,value=df[["v1","v2"]]) |
原数据绘图
In [10]:
1 | multi_ts.plot(cols=["v1","v2"]) |
多变量预测
1 | from kats.models.var import VARModel, VARParams |
预测结果如下:
上海疫情
手动整理上海最近30天的数据:
1 | data = pd.date_range(start="2022-03-02",end="2022-04-01",freq="D") |
读取数据:
绘图
1、每日新增的预测结果:
具体数值为:
2、7日均值的预测趋势图
具体的数值为:
后续会来验证下这个结果!
时序资料
将来需要学习的主要内容:
1、模型框架:Prophet + Kats + ARIMA
2、推荐一门Intel的时序分析课程:https://www.intel.cn/content/www/cn/zh/developer/learn/course-time-series-analysis.html
3、书籍:FPP《预测:方法与实践》(第2版左,第三版右),第二版中文在线地址:https://otexts.com/fppcn/