示例:
實現目標說明:假設存在8年的季度數據**[如下表](週期:circle=4),前5年的數據作爲訓練集(訓練集大小:trainSize=5*4=20),後三年的數據作爲測試集,利用前兩年(lagNum=2)第1/2/3/4季度的數據(train_X ,test_X)預測後一年第1/2/3/4季度的數據(train_y ,test_y)**
注: 其他週期性數據,如月度或星期數據,也可按照同樣的方法進行處理。
time | value | time | value | time | value | time | value |
---|---|---|---|---|---|---|---|
2010Q1 | 1 | 2012Q1 | 111 | 2014Q1 | 11,111 | 2016Q1 | 1,111,111 |
2010Q2 | 2 | 2012Q2 | 222 | 2014Q2 | 22,222 | 2016Q2 | 2,222,222 |
2010Q3 | 3 | 2012Q3 | 333 | 2014Q3 | 33,333 | 2016Q3 | 3,333,333 |
2010Q4 | 4 | 2012Q4 | 444 | 2014Q4 | 44,444 | 2016Q4 | 4,444,444 |
2011Q1 | 11 | 2013Q1 | 1,111 | 2015Q1 | 111,111 | 2017Q1 | 11,111,111 |
2011Q2 | 22 | 2013Q2 | 2,222 | 2015Q2 | 222,222 | 2017Q2 | 22,222,222 |
2011Q3 | 33 | 2013Q3 | 3,333 | 2015Q3 | 333,333 | 2017Q3 | 33,333,333 |
2011Q4 | 44 | 2013Q4 | 4,444 | 2015Q4 | 444,444 | 2017Q4 | 44,444,444 |
代碼函數:
def train_test(data,trainSize,circle,lagNum):
trainData = data[:trainSize]
testData = data[trainSize:]
train_X ,train_y ,test_X , test_y = [],[],[],[]
if(len(trainData)<=circle or len(testData)<=circle):
print('ERROR!')
else:
for c in range(circle):
trainX = [trainData[i] for i in range(len(trainData))if i%circle==c]
testX = [testData[i] for i in range(len(testData))if i%circle==c]
if(len(trainX)>lagNum):
train_X0 = [trainX[i:i+lagNum] for i in range(len(trainX)-lagNum)]#列表解析或列表推導式
train_y0 = [trainX[i+lagNum] for i in range(len(trainX)-lagNum)]
print('第%s季度 train_X: '%str(c+1),train_X0 )
print('第%s季度 train_y: '%str(c+1),train_y0 )
train_X += train_X0
train_y += train_y0
if(len(testX)>lagNum):
test_X0 = [testX[i:i+lagNum] for i in range(len(testX)-lagNum)]
test_y0 = [testX[i+lagNum] for i in range(len(testX)-lagNum)]
print('第%s季度 test_X: '%str(c+1),test_X0 )
print('第%s季度 test_y: '%str(c+1),test_y0 )
test_X += test_X0
test_y += test_y0
print('\n')
return train_X,train_y,test_X,test_y
測試代碼
#加載包
import numpy as np
import pandas as pd
#原始數據,如上表
df = pd.read_csv('sampleData.csv') #示例數據 'sampleData.csv' 如上表所示
data = list(df['value'])
print('原始數據:\n',data)
circle = 4#週期,eg: 季度數據則爲4,月度數據12,週數據7
trainSize = 20 # 訓練集大小,需是circle的整數倍
trainData = data[:trainSize]
lagNum = 2 #利用前lagNum年第1/2/3/4季度的數據預測agNum+1年第1/2/3/4季度的數據
train_X,train_y,test_X,test_y = train_test(data,trainSize,circle,lagNum)
print('ALL train_X:',train_X)
print('ALL train_y:',train_y)
print('\n')
print('ALL test_X:',test_X)
print('ALL test_y:',test_y)
結果展示:
原始數據:
[1, 2, 3, 4, 11, 22, 33, 44, 111, 222, 333, 444, 1111, 2222, 3333, 4444, 11111, 22222, 33333, 44444, 111111, 222222, 333333, 444444, 1111111, 2222222, 3333333, 4444444, 11111111, 22222222, 33333333, 44444444]
第1季度 train_X: [[1, 11], [11, 111], [111, 1111]]
第1季度 train_y: [111, 1111, 11111]
第1季度 test_X: [[111111, 1111111]]
第1季度 test_y: [11111111]
第2季度 train_X: [[2, 22], [22, 222], [222, 2222]]
第2季度 train_y: [222, 2222, 22222]
第2季度 test_X: [[222222, 2222222]]
第2季度 test_y: [22222222]
第3季度 train_X: [[3, 33], [33, 333], [333, 3333]]
第3季度 train_y: [333, 3333, 33333]
第3季度 test_X: [[333333, 3333333]]
第3季度 test_y: [33333333]
第4季度 train_X: [[4, 44], [44, 444], [444, 4444]]
第4季度 train_y: [444, 4444, 44444]
第4季度 test_X: [[444444, 4444444]]
第4季度 test_y: [44444444]
ALL train_X: [[1, 11], [11, 111], [111, 1111], [2, 22], [22, 222], [222, 2222], [3, 33], [33, 333], [333, 3333], [4, 44], [44, 444], [444, 4444]]
ALL train_y: [111, 1111, 11111, 222, 2222, 22222, 333, 3333, 33333, 444, 4444, 44444]
ALL test_X: [[111111, 1111111], [222222, 2222222], [333333, 3333333], [444444, 4444444]]
ALL test_y: [11111111, 22222222, 33333333, 44444444]