欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何将时间序列转换为Python中的监督学习问题(3)

程序员文章站 2022-07-16 07:53:54
...

根据我的上篇博客如何将时间序列转换为Python中的监督学习问题(2)点击打开链接,对上述程序做了一些修改,使更符合我们的实际需要。

  1. 让数据变量名是我们输入原始数据的变量名
  2. 让前移步数和后移步数,更直观(比如,前移一步n_in=1,后移一步n_out=1)

因此,我们需重新定义一个函数:time_series_to_supervised()

该函数有四个参数:

  • data:作为列表或2D NumPy数组的观察序列。需要。
  • n_in:作为输入的滞后观察数(X)。值可以在[1..len(数据)]之间可选。默认为1。
  • n_out:作为输出的观测数量(y)。值可以在[0..len(数据)]之间。可选的。默认为1。
  • dropnan:Boolean是否删除具有NaN值的行。可选的。默认为True。

该函数返回一个值:

  • 返回:系列的Pandas DataFrame用于监督学习。

完整代码如下:

from pandas import DataFrame
from pandas import concat
import random
def time_series_to_supervised(data, n_in=1, n_out=1,dropnan=True):
    n_vars = 1 if type(data) is list else data.shape[1]
    df = DataFrame(data)
    origNames = df.columns
    cols, names = list(), list()
    cols.append(df.shift(0))
    names += [('%s' % origNames[j]) for j in range(n_vars)]
    n_in = max(0, n_in)
    for i in range(n_in, 0, -1):
        time = '(t-%d)' % i
        cols.append(df.shift(i))
        names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
    n_out = max(n_out, 0)
    for i in range(1, n_out+1):
        time = '(t+%d)' % i
        cols.append(df.shift(-i))
        names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
    agg = concat(cols, axis=1)
    agg.columns = names
    if dropnan:
        agg.dropna(inplace=True)
    return agg

对代码进行一个简单的测试:

from pandas import DataFrame
from pandas import concat
import random
def time_series_to_supervised(data, n_in=1, n_out=1,dropnan=True):
    n_vars = 1 if type(data) is list else data.shape[1]
    df = DataFrame(data)
    origNames = df.columns
    cols, names = list(), list()
    cols.append(df.shift(0))
    names += [('%s' % origNames[j]) for j in range(n_vars)]
    n_in = max(0, n_in)
    for i in range(n_in, 0, -1):
        time = '(t-%d)' % i
        cols.append(df.shift(i))
        names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
    n_out = max(n_out, 0)
    for i in range(1, n_out+1):
        time = '(t+%d)' % i
        cols.append(df.shift(-i))
        names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
    agg = concat(cols, axis=1)
    agg.columns = names
    if dropnan:
        agg.dropna(inplace=True)
    return agg

df= DataFrame()
df['q']= [x for x in range(10)]
df['w']= [2*x for x in range(10)]
df['e']= random.sample(range(100),10)
result= time_series_to_supervised(df, n_in= 1, n_out= 1)
print (result)

输出的结果为:

如何将时间序列转换为Python中的监督学习问题(3)

结论:

经过上述的修正,可以看到结果输出既保留了当前时刻的值,也有前一时刻和后一时刻的值,而且变量名为原始数据的变量名。