python實現季節性數據按季度分割訓練集測試集

示例:

實現目標說明:假設存在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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章