如何用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 ...
随机推荐
- lua tonumber
[1]应用tonumber函数 local function test(telnum) , )) == ) -- 5000~5999公司预留号码 , ) == ' or isLen or isRese ...
- CLASS类继承
单继承:# class People: 经典类class People(object): #新式类 def __init__(self,name,age,n=1000): self.name = na ...
- 关于eric4和pyqt的入门学习(转)
在Eric4下用PyQt4编写Python的图形界面程序 转载请注明作者RunningOn 本文是PyQt4的入门教程.网上能搜到其它教程,但我觉得讲得不是很清楚,希望这篇文章对入门者更加有帮助. 先 ...
- Oarcle之事务
update:更新 例如转账: update emp_ temp set sal = sal-500 where ename = 'JONES':(更新表中sal项 为sal-500 是当ename= ...
- 目标URL存在跨站漏洞和目标URL存在http host头攻击漏洞处理方案
若需要学习技术文档共享(请关注群公告的内容)/讨论问题 请入QQ群:668345923 :若无法入群,请在您浏览文章下方留言,至于答复,这个看情况了 目录 HTTP协议详解 引言 一.HTTP协议详解 ...
- mysql window系统备份远程数据库到本地
使用方法:创建test.bat文件,保存以下内容,修改配置后双击打开 @echo off REM 声明采用UTF-8编码 chcp echo. echo MySQL数据库备份脚本 echo. echo ...
- Vue 旅游网首页开发2 - 首页编写
Vue 旅游网首页开发2 - 首页编写 项目结构 首页开发 效果图 项目开发组件化 将页面的各个部分划分成不同的组件,有助于项目的开发和维护. 项目代码初始化 项目结构修改 1.删除整个 compin ...
- MySQL 增删改查
增--添加数据 新建数据库 create database newdatabase; 选择数据库 use newdatabase; 新建表 create table newtable(id int,n ...
- Windoes包管理工具(Scoop)
Windoes包管理工具(Scoop) 对于习惯了apt-get,brew等工具的开发者来说,Windows下配置环境相对繁琐,这里推荐Win下的包管理工具Scoop. Win 包管理工具 Choco ...
- 连接MySQL报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
MySQL time zone 时区错误 使用root用户登陆执行命令: ---> show variables like '%time_zone%'; 默认值system为美国时间:如下图: ...