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)**

注: 其他周期性数据,如月度或星期数据,也可按照同样的方法进行处理。

timevaluetimevaluetimevaluetimevalue
2010Q112012Q11112014Q111,1112016Q11,111,111
2010Q222012Q22222014Q222,2222016Q22,222,222
2010Q332012Q33332014Q333,3332016Q33,333,333
2010Q442012Q44442014Q444,4442016Q44,444,444
2011Q1112013Q11,1112015Q1111,1112017Q111,111,111
2011Q2222013Q22,2222015Q2222,2222017Q222,222,222
2011Q3332013Q33,3332015Q3333,3332017Q333,333,333
2011Q4442013Q44,4442015Q4444,4442017Q444,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]
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值