如何用python将一个时间序列转化成有监督学习
机器学习可以被用于时间序列预测。
在机器学习能使用之前,时间序列预测需要被重新转化成有监督学习。将一个序列组合成成对的输入输出序列。
在这篇教程中,你会发现如何通过使用机器学习算法将单变量和多变量的时间预测序列转化成有监督学习。
在看完这篇教程之后,你会知道:
1、如何写一个将时间序列的数据集转化成有监督学习的数据集的函数。
2、如何将机器学习用于一个单变量的时间序列。
3、如何将机器学习用于一个多变量的时间序列。
开始吧~
- 时间序列vs有监督学习
开始之前,我们先来看看时间序列和有监督学习的数据。
一个时间预测序列是一串通过时间索引排序的数字序列,这可以被认为是一列排好序的数值。
比如:
0
1
2
3
4
5
一个有监督学习将输入(X)和输出(Y)进行组合,以便于算法可以学习如何预测从输入预测输出。
比如:
X, Y
1, 2
2, 3
3, 4
4, 5
5, 6
- Pandas的shift()函数
一个帮助将时间序列转化成有监督学习任务的关键函数是Pandas shift() 函数。
给定一个DataFrame,shift()函数可以被用来创造一列数据的副本,然后将数据向前推进或者向后回退。
这个行为要求在监督学习的形式内创造一列滞后的观察值作为时间序列的预测值。
让我们看一下例子吧~
我们定义一个模拟的含有十个数据的时间序列,在DateFrame这样创造:
from pandas import DataFrame
df = DataFrame()
df['t'] = [x for x in range(10)]
print(df)
运行这个小例子,会打印时间序列数据以及它们的列索引
t
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
我们可以通过在顶上插入一个新行使得这一列的时间序列数据滞后原来一个时间步长。因为新的行没有数据,我们可以使用NaN来表示没有数据。
shift()函数可以自动帮我们做这个事:
from pandas import DataFrame
df = DataFrame()
df['t'] = [x for x in range(10)]
df['t-1'] = df['t].shift(1)
print(df)
运行这个小例子会得到两行数据,第一列是原来的,第二列是转化后的。
可以看出来将序列向前推进一个时间步可以给我们一个原始的有监督学习数据集,尽管X和Y是错误的顺序。忽略列中的行标记。第一行被抛弃因为有NaN数值。第二行表示输入为0.0时,输出为1。
t t-1
0 0 NaN
1 1 0.0
2 2 1.0
3 3 2.0
4 4 3.0
5 5 4.0
6 6 5.0
7 7 6.0
8 8 7.0
9 9 8.0
可以看到,如果我们重复上述过程给shift()函数2,3...等参数,就可以创造一个可以被用来预测输出Y的长的输入序列X。
shift()函数也可以接收负整数为参数,负整数会将数据提前并且在序列最后加NaN。
from pandas import DataFrame
df = DataFrame()
df['t'] = [x for x in range(10)]
df['t+1'] = df['t'].shift(-1)
print(df)
运行这个小例子,会得到:
t t+1
0 0 1.0
1 1 2.0
2 2 3.0
3 3 4.0
4 4 5.0
5 5 6.0
6 6 7.0
7 7 8.0
8 8 9.0
9 9 NaN
在时间序列预测中,(t)表示当前时间,未来将要被预测的时间是(t+1, t+2,...,t+n),过去被已经被观察的时间是(t-1, t-2,..., t-n)。
我们已经看到对时间序列如何进行正向或者逆向的转化组成输入和输出形式的DateFrame,并将此作为有监督学习的数据集。这种方法不仅可以组成X->y的预测,还可以组成输入和输出都是序列的X->Y的预测。
- The series_to_supervised() Function
在这部分,我们会定义一个新的python函数叫做 series_to_supervised() ,它可以完成将单变量或者多变量的时间序列数据转化成有监督学习的数据。
这个函数有四个参数:
- data:2D的numpy数组或者列表存储序列。
- n_in:将时间序列滞后n_in个时间步,取值范围为[1...len(data)],默认值为1。
- n_out:输出y的个数,取值范围为[1...len(data)-1]。默认值为1。
- dropnan:布尔值,表示是否丢弃NaN值。默认值为True,表示丢弃。
- return:panda DataFrame
from pandas import DataFrame
from pandas import concat def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
"""
Frame a time series as a supervised learning dataset.
Arguments:
data: Sequence of observations as a list or NumPy array.
n_in: Number of lag observations as input (X).
n_out: Number of observations as output (y).
dropnan: Boolean whether or not to drop rows with NaN values.
Returns:
Pandas DataFrame of series framed for supervised learning.
"""
n_vars = 1 if type(data) is list else data.shape[1]
df = DataFrame(data)
cols, names = list(), list()
# input sequence (t-n, ... t-1)
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(df.shift(-i))
if i == 0:
names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
else:
names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
# put it all together
agg = concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
return agg
参考博客:https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/
如何用python将一个时间序列转化成有监督学习的更多相关文章
- 用Python将一个列表分割成小列表
用Python将一个列表分割成小列表 2018年01月15日 11:09:25 幸福丶如此 阅读数:16842 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- python将文本转化成语音并播放
一.问题 在学习的过程中,我们会涉及到将文本信息,转化成语音的过程,比如:我爬取了一个小说的网站,我要将里面的内容进行语音处理.目前能够进行语音的方法还是很多,比如win32com,百度ai. 二.解 ...
- Python matplotlib图片转化成矢量图并裁剪
Python目前可以生成的图的格式是:eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 在写论文时候我一般生成png ...
- 怎样将一个整数转化成字符串数,并且不用函数itoa
#include<iostream> using namespace std; int main() { , j = , i = ; ], str[]; while (num) { tem ...
- Python中将列表转化成矩阵表示
list1 = [] a = [1,3,4] b = [2,5,6] list1.append(a) list1.append(b) arr = np.array(list1) # 打印arr pri ...
- java将一个javabean转化为另一个javabean
公司的项目是用webservice来进行前后台对接,启动后台后需要刷服务才能在前台生成对应的代码,但是有一个很恶心的地方,它给每个service都生成了一个model,于是出现后台只有一个javabe ...
- Python如何将整数转化成二进制字符串
Python 如何将整数转化成二进制字符串 1.你可以自己写函数采用 %2 的方式来算. >>> binary = lambda n: '' if n==0 else binary( ...
- 如何将一个Maven项目转化成一个Eclipse项目
有时候我们需要将一个Maven项目导入到Eclipse中,直接作为一个普通的eclipse项目来导入是不行的,我们可以通过一个命令来实现:mvn eclipse:eclipse 1. 进入该Maven ...
- Python代码阅读(第2篇):数字转化成列表
本篇阅读的代码实现了将输入的数字转化成一个列表,输入数字中的每一位按照从左到右的顺序成为列表中的一项. 本篇阅读的代码片段来自于30-seconds-of-python. digitize def d ...
随机推荐
- SSM(Spring4.x.x+SpringMVC4.x.x+Mybatis3.4.x)框架整合
本文是参考SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)修改而来的 一.环境 1. Myeclipse2016 2. Mysql 二.具体步骤 1. 整合Spring和 ...
- 外星人入侵游戏(python代码)
https://github.com/ehmatthes/pcc/tree/master/chapter_12/images
- mongodb副本集基于centos7部署
安装mongodb,基于端口的安装三个节点 下载安装MongoDB安装包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel ...
- 读 vue 源码一 (为什么this.message能够访问data里面的message)
12月离职后,打算在年后再找工作了,最近陆陆续续的看了黄轶老师的vue源码解析,趁着还有几天过年时间记录一下. 目标:vue如何实现通过this.key,就能直接访问data,props,method ...
- xpath解析数据
xpath解析数据 """ xpath 也是一种用于解析xml文档数据的方式 xml path w3c xpath搜索用法 在 XPath 中,有七种类型的节点:元素.属 ...
- 【Django视图与网址进阶004】
一.在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 django-admin.py startproject zqxt_views cd zqxt_views p ...
- c++的虚继承
今天去面试了一家公司,真是套路深啊,套路深,原谅我是后知后觉,所以人吧总的长大,出差正常情况下都是有补贴的,为啥这部分也要算我工资一部分,名其名曰工资高,哈哈哈,自古套路方得人心 今天学习了一下c++ ...
- BZOJ 4259 残缺的字符串
思路 同样是FFT进行字符串匹配 只不过两个都有通配符 匹配函数再乘一个\(A_i\)即可 代码 #include <cstdio> #include <algorithm> ...
- Jvm类的加载机制
1.概述 虚拟机加载Class文件(二进制字节流)到内存,并对数据进行校验.转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这一系列过程就是类的加载机制. 2.类的加载时机 类从被虚拟机加 ...
- Drools+springboot
查看我的github, 后续会陆续补充文档和Drools技术 https://github.com/zongheng14/insurance-rules