如何用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 ...
随机推荐
- 【kafka学习之一】 kafka初识
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4一.kafka是什么? (1)kafka是一个高吞吐的分部式消息系统.( ...
- Linux系统下为普通用户加sudo权限
Linux下为普通账号加sudo权限 1. 错误提示:当我们使用sudo命令切换用户的时候可能会遇到提示以下错误:xxx is not in the sudoers file. This incide ...
- mysql zip包安装,本地安装两个mysql
1.进入mysql下载页面下载zip包 https://dev.mysql.com/downloads/mysql/ 2.zip解压,解压后的目录 3.新建my.ini文件 [mysql] defau ...
- .eslintrc文件配置
{ // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser": true, "node ...
- 58 字体反爬攻略 python3
1.下载安装包 pip install fontTools 2.下载查看工具FontCreator 百度后一路傻瓜式安装即可 3.反爬虫机制 网页上看见的 后台源代码里面的 从上面可以看出,生这个字变 ...
- centos 增强功能安装失败
centos 共享目录设置失败 /sbin/mount.vboxsf: mounting failed with the error: No such device 准备安装增强功能 [root@lo ...
- NAT穿透的详解及分析
一.什么是NAT?为什么要使用NAT?NAT是将私有地址转换为合法IP地址的技术,通俗的讲就是将内网与内网通信时怎么将内网私有IP地址转换为可在网络中传播的合法IP地址.NAT的出现完美地解决了lP地 ...
- Java过滤器Filter
过滤器 一. 简介 过滤器一般用于设置字符编码.登录验证.权限验证.敏感词过滤等,减少了代码的冗余,便于代码的复用,但是不一定是每个servlet都必须使用过滤器的. 二. 过滤器的工作流程 图片来源 ...
- SAP 打印自动导出PDF本地文件(自己做的例子)
smartforms导出PDF: 常用函数有: convert_otfconvert_otfspooljob_2_pdfconvert_abapspooljob_2_pdfCONVERT_OTF_2_ ...
- C语言--第1次作业
1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 经过一周C语言的正式课堂学习,不同于暑期时扒视频囫囵吞枣式学习,林丽老师的讲解详细异常,尽管已经学习了一部分内 ...