如何用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 ...
随机推荐
- mysql 查询前几条数据
limit是mysql的语法select * from table limit m,n其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1条开始,取n条.select * from ...
- pyCharm最新2018激活码
本教程对jetbrains全系列可用例:IDEA.WebStorm.phpstorm.clion等 因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等信息,所以需要我做一个爬虫项 ...
- javascript ----字符串的使用
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- RESTClient 使用
Wisdom RESTClient 一款自动化测试REST API的工具,它可以自动化测试RESTful API并生成精美的测试报告,同时基于测试过的历史API,可以生成精美的RESTful API文 ...
- jquery的on()用法实例
首先,先看官方描述: 再来,用实例解释一下: 1.简单绑定单个事件: $("body").on("click",".edit_btn",fu ...
- vue项目创建过程
在使用vue-cli之前,请确认你的电脑已经安装了 node,建议版本在 8.0.0 以上 可以通过node -v 检查版本 1.安装 vue-cli (这里我们确认已安装过node) 1.使用 np ...
- COMS3200 The RUSH protocol
Part C (50 marks)The RUSH protocol (Reliable UDP Substitute for HTTP) is a HTTP-like stop-and-wait p ...
- ajax错误类型大全
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html ajax错误类型大全
- js中的所有鼠标事件 键盘事件
https://www.cnblogs.com/torchstar/p/null.html
- Java语言之循环基础;各个语句的区别
FOR: WHILE DO WHILE break 与 continue的区别 break直接中断语句跳出循环,continue跳出当前循环,后面会继续执行