【ASTGCN】模型调试学习笔记--数据生成详解(超详细)

利用滑动窗口生成时间序列

原理图示:

PEMS04数据集为例。

  • 该数据集维度为:(16992,307,3)16992表示时间序列的长度,307为探测器个数,即图的顶点个数,3为特征数,即流量,速度、平均占用率。
  • 现在利用滑动窗口生成新时间序列,假设滑动窗口大小(每次滑动所取时间序列的多少)为4,滑动窗口步长(每次滑动几格)为1,如图1所示,每次取4个长度的数据(总长度为16992,也就是图1中的L),滑动1个长度取一次,之后将滑动窗口取到的数据合并成新数据,如图2所示。
    在这里插入图片描述
    图1
    在这里插入图片描述
    图2

函数操作

函数调用关系:

def read_and_generate_dataset(graph_signal_matrix_filename,num_of_weeks, num_of_days,num_of_hours, num_for_predict,points_per_hour=12, save=False):def get_sample_indices(data_sequence, num_of_weeks, num_of_days, num_of_hours,label_start_idx, num_for_predict, points_per_hour=12):def search_data(sequence_length, num_of_depend, label_start_idx,num_for_predict, units, points_per_hour):

read_and_generate_dataset函数调用get_sample_indices函数,get_sample_indices函数再调用search_data函数。

search_data函数

  • 函数功能:获取每个滑动生成的窗口的索引的首尾。
  • 函数具体操作:
def search_data(sequence_length, num_of_depend, label_start_idx,num_for_predict, units, points_per_hour):####参数说明          #sequence_length在源码中接收的参数是get_sample_indices传递过来的data_sequence.shape[0],即原始数据的shape(16992,307,3)的第一个维度,即16992#num_of_depend:生成近期周期或日周期或周周期,源码中默认为num_of_hours = 1#label_start_idx在源码中接收的参数是get_sample_indices传递过来的label_start_idx,而get_sample_indices中的label_start_idx是read_and_generate_dataset函数传递过来的idx,在read_and_generate_dataset中,idx是range(data_seq.shape[0]),即0~16991,所以search_data中的label_start_idx是0~16991,search_data是处于for循环中被调用的。#num_for_predict:要预测的时间步长,源码中为12,也就是一个小时#units在get_sample_indices函数中传过来的值有三个,分别是7 * 24241,即前文所说的滑动窗口的步长,也就是论文原文中的近期周期、日周期、周周期,1代表一个小时;24代表24个小时,即一天;7*24代表一周。#points_per_hour:一个小时的步长,12# 如果points_per_hour小于0,则抛出一个ValueError异常,提示points_per_hour应该大于0if points_per_hour < 0:raise ValueError("points_per_hour should be greater than 0!")# 检查预测目标的起始索引加上要预测的时间步长是否超出了历史数据的长度,如果超出了历史数据的长度,则返回None,表示无法生成有效的索引范围;例如循环进行到idx(label_start_idx)=16981,此时16981+12>16992,则返回空。if label_start_idx + num_for_predict > sequence_length:return None# 创建一个空列表,用于存储生成的索引范围x_idx = []# 遍历依赖的数据点数量范围。在每次迭代中,计算当前依赖序列的起始索引start_idx和结束索引end_idxfor i in range(1, num_of_depend + 1):#源码中num_of_hours为1,此循环只执行一次# 计算当前依赖序列的起始索引start_idx = label_start_idx - points_per_hour * units * i  # idx-12*1*1# 计算当前依赖序列的结束索引end_idx = start_idx + num_for_predict # start_idx+12# 检查计算得到的起始索引是否大于等于0。如果大于等于0,说明该序列在历史数据中是有效的,可以加入到结果列表中if start_idx >= 0:x_idx.append((start_idx, end_idx))else:return None# 检查生成的索引范围的数量是否与预期的依赖数据点数量相等。如果不相等,则说明生成的索引范围数量不正确,返回Noneif len(x_idx) != num_of_depend:return None# 将生成的索引范围列表进行反转,并返回return x_idx[::-1]

举例说明:

  • for i in range(1, num_of_depend + 1):中num_of_depend为1时(源码中就为1),表示使用一个小时(近期)的历史数据来预测。
    因此代码为:for i in range(1, 2):,则此循环只执行一次。

    • 假设当前read_and_generate_dataset函数中的循环执行到idx=13
      start_idx = label_start_idx - points_per_hour * units * i :,则此时label_start_idx=13,start_idx =13-12*1*1=1end_idx=start_idx +num_for_predict =1+12=13
      if start_idx >= 0: x_idx.append((start_idx, end_idx)),此时 x_idx=[1,13],len(x_idx)==1
      if len(x_idx) != num_of_depend:,1=1

    • 假设当前read_and_generate_dataset函数中的循环执行到idx=14
      start_idx = label_start_idx - points_per_hour * units * i :,则此时label_start_idx=14,start_idx =14-12*1*1=2end_idx=start_idx +num_for_predict =2+12=14
      if start_idx >= 0: x_idx.append((start_idx, end_idx)),此时 x_idx=[2,14],len(x_idx)==1
      if len(x_idx) != num_of_depend:,1=1

  • for i in range(1, num_of_depend + 1):中num_of_depend为2时,表示使用2个小时(近期)的历史数据来预测。
    因此代码为:for i in range(1, 3):,则此循环执行两次。

    • 假设当前read_and_generate_dataset函数中的循环执行到idx=12for i in range(1, 3):循环执行到i=1
      start_idx = label_start_idx - points_per_hour * units * i :,则此时label_start_idx=12,start_idx =12-12*1*1=0end_idx=start_idx +num_for_predict =0+12=12
      if start_idx >= 0: x_idx.append((start_idx, end_idx)),此时 x_idx=[0,12],len(x_idx)==1
      if len(x_idx) != num_of_depend:,1=1

    • 假设当前read_and_generate_dataset函数中的循环执行到idx=12for i in range(1, 3):循环执行到i=2
      start_idx = label_start_idx - points_per_hour * units * i :,则此时label_start_idx=13,start_idx =14-12*1*2=-10end_idx=start_idx +num_for_predict =-10+12=2
      if start_idx >= 0: x_idx.append((start_idx, end_idx)),此时 start_idx =-10<0,索引不会加入x_idx中。
      因此本次search_data函数调用(函数内部进行了两次for循环)返回None

    • 假设当前read_and_generate_dataset函数中的循环执行到idx=24for i in range(1, 3):循环执行到i=1
      start_idx = label_start_idx - points_per_hour * units * i :,则此时label_start_idx=24,start_idx =24-12*1*1=12end_idx=start_idx +num_for_predict =12+12=24
      if start_idx >= 0: x_idx.append((start_idx, end_idx)),此时 x_idx=[12,24],

    • 假设当前read_and_generate_dataset函数中的循环执行到idx=24for i in range(1, 3):循环执行到i=2
      start_idx = label_start_idx - points_per_hour * units * i :,则此时label_start_idx=24,start_idx =24-12*1*2=0end_idx=start_idx +num_for_predict =0+12=12
      if start_idx >= 0: x_idx.append((start_idx, end_idx)),此时 x_idx=[0,12],
      循环2次之后, x_idx=[12,24],[0,12],最后执行return x_idx[::-1]
      则本次函数调用返回的索引序列是[[0,12],[12,24]]

代码测试:

if __name__ == '__main__':data_seq = np.load(graph_signal_matrix_filename)['data']for idx in range(data_seq.shape[0]):hour_indices=search_data(data_seq.shape[0],1,idx,12,1,12)#一个小时的索引print("hour_indice:",hour_indices)

输出:

hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: [(0, 12)]
hour_indice: [(1, 13)]
hour_indice: [(2, 14)]
hour_indice: [(3, 15)]
hour_indice: [(4, 16)]
hour_indice: [(5, 17)]
hour_indice: [(6, 18)]
hour_indice: [(7, 19)]
hour_indice: [(8, 20)]
hour_indice: [(9, 21)]
hour_indice: [(10, 22)]
hour_indice: [(11, 23)]
hour_indice: [(12, 24)]
...
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
if __name__ == '__main__':data_seq = np.load(graph_signal_matrix_filename)['data']for idx in range(data_seq.shape[0]):hour_indices=search_data(data_seq.shape[0],2,idx,12,1,12)#两个小时的索引print("hour_indice:",hour_indices)

输出:

hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: [(0, 12), (12, 24)]
hour_indice: [(1, 13), (13, 25)]
hour_indice: [(2, 14), (14, 26)]
hour_indice: [(3, 15), (15, 27)]
...
hour_indice: None
hour_indice: None
hour_indice: None
hour_indice: None

get_sample_indices函数

  • 函数功能:按近期、日周期、周周期获得样本数据。
  • 函数具体操作:
def get_sample_indices(data_sequence, num_of_weeks, num_of_days, num_of_hours,label_start_idx, num_for_predict, points_per_hour=12):####参数说明          #data_sequence在源码中接收的参数是read_and_generate_dataset传递过来的data_seq,即原始数据(16992,307,3)#num_of_weeks:0#num_of_days:0#num_of_hours:1#label_start_idx在源码中接收的参数是read_and_generate_dataset传递过来的idx,在read_and_generate_dataset中,idx是range(data_seq.shape[0]),即0~16991,所以get_sample_indices中的label_start_idx是0~16991,get_sample_indices是处于for循环中被调用的。#num_for_predict:要预测的时间步长,源码中为12,也就是一个小时#points_per_hour:一个小时的步长,12week_sample, day_sample, hour_sample = None, None, None# 构建sample的区间限制,分界点#如果索引越界了,直接return,例如循环进行到idx(label_start_idx)=16981,此时16981+12>16992if label_start_idx + num_for_predict > data_sequence.shape[0]:return week_sample, day_sample, hour_sample, None#num_of_weeks ,num_of_days ,num_of_hours 只能有一个大于0,因为只能同时构造一种时间序列数据if num_of_weeks > 0:week_indices = search_data(data_sequence.shape[0], num_of_weeks,label_start_idx, num_for_predict,7 * 24, points_per_hour)if not week_indices:return None, None, None, Noneweek_sample = np.concatenate([data_sequence[i: j]for i, j in week_indices], axis=0)if num_of_days > 0:day_indices = search_data(data_sequence.shape[0], num_of_days,label_start_idx, num_for_predict,24, points_per_hour)if not day_indices:return None, None, None, Noneday_sample = np.concatenate([data_sequence[i: j]for i, j in day_indices], axis=0)#如果num_of_hours >0if num_of_hours > 0:#生成hours切片数据,search_data函数的返回值为:[0,12][1,13],...,[[0,12],[1,13],...]等索引,hour_indices = search_data(data_sequence.shape[0], num_of_hours,label_start_idx, num_for_predict,1, points_per_hour)if not hour_indices:return None, None, None, None#按照索引在原始数据中提取数据hour_sample = np.concatenate([data_sequence[i: j]for i, j in hour_indices], axis=0)#生成标签target = data_sequence[label_start_idx: label_start_idx + num_for_predict]return week_sample, day_sample, hour_sample, target

举例说明

if __name__ == '__main__':data_seq = np.load(graph_signal_matrix_filename)['data']sample = []targetlist= []for idx in range(data_seq.shape[0]):hour_indice=search_data(data_seq.shape[0],1,idx,12,1,12)if not hour_indice:continue#从原始数据集中按索引取出对应的数据,并像图2那样拼在一起hour_sample = np.concatenate([data_seq[i: j]for i, j in hour_indice], axis=0)sample.append(hour_sample)#从hour_sample的后num_for_predict个步长取出数据,作为标签target = data_seq[idx: idx + num_for_predict]targetlist.append(target)print("idx:",idx)print("hour_sample.shape:",hour_sample.shape)print("len(sample):",len(sample))print("sample[0].shape):",sample[0].shape)print("sample[0][0].shape:",sample[0][0].shape)print("len(targetlist):",len(targetlist))print("targetlist[0].shape:",targetlist[0].shape)print("targetlist[0][0].shape:",targetlist[0][0].shape)

部分输出

idx: 12
hour_sample.shape: (12, 307, 3)
idx: 13
hour_sample.shape: (12, 307, 3)
idx: 14
hour_sample.shape: (12, 307, 3)
idx: 15
hour_sample.shape: (12, 307, 3)
idx: 16
hour_sample.shape: (12, 307, 3)
idx: 17
hour_sample.shape: (12, 307, 3)
idx: 18
hour_sample.shape: (12, 307, 3)
...
len(sample): 16969
sample[0].shape): (12, 307, 3)
sample[0][0].shape: (307, 3)
len(targetlist): 16969
targetlist[0].shape: (12, 307, 3)
targetlist[0][0].shape: (307, 3)

这里的

idx: 12
hour_sample.shape: (12, 307, 3)

就是根据search_data函数生成的hour_indice: [(0, 12)]索引在原数据集中取得的。

read_and_generate_dataset函数

  • 函数功能:调用search_dataget_sample_indices函数,按近期、日周期、周周期获得样本标签,并把样本、标签、时间步都放入all_samples列表。
  • 函数具体操作:
def read_and_generate_dataset(graph_signal_matrix_filename,num_of_weeks, num_of_days,num_of_hours, num_for_predict,points_per_hour=12, save=False):all_samples = []for idx in range(data_seq.shape[0]):sample = get_sample_indices(data_seq, num_of_weeks, num_of_days,num_of_hours, idx, num_for_predict,points_per_hour)if ((sample[0] is None) and (sample[1] is None) and (sample[2] is None)):continueweek_sample, day_sample, hour_sample, target = samplesample = [] # N表示传感器,F表示特征数,T表示时间段if num_of_weeks > 0:week_sample = np.expand_dims(week_sample, axis=0).transpose((0, 2, 3, 1))  # (1,N,F,T)sample.append(week_sample)if num_of_days > 0:day_sample = np.expand_dims(day_sample, axis=0).transpose((0, 2, 3, 1))  # (1,N,F,T)sample.append(day_sample)#把hour_sample(sample_i)进行维度变换if num_of_hours > 0:hour_sample = np.expand_dims(hour_sample, axis=0).transpose((0, 2, 3, 1))  # (1,N,F,T)sample.append(hour_sample)target = np.expand_dims(target, axis=0).transpose((0, 2, 3, 1))[:, :, 0, :]  # (1,N,T)sample.append(target)time_sample = np.expand_dims(np.array([idx]), axis=0)  # (1,1)sample.append(time_sample)all_samples.append(sample)  # sampe:[(week_sample),(day_sample),(hour_sample),target,time_sample] = [(1,N,F,Tw),(1,N,F,Td),(1,N,F,Th),(1,N,Tpre),(1,1)]# 60%作为训练,20%作为验证,20%作为测试split_line1 = int(len(all_samples) * 0.6)split_line2 = int(len(all_samples) * 0.8)training_set = [np.concatenate(i, axis=0)for i in zip(*all_samples[:split_line1])]  # [(B,N,F,Tw),(B,N,F,Td),(B,N,F,Th),(B,N,Tpre),(B,1)]validation_set = [np.concatenate(i, axis=0)for i in zip(*all_samples[split_line1: split_line2])]testing_set = [np.concatenate(i, axis=0)for i in zip(*all_samples[split_line2:])]train_x = np.concatenate(training_set[:-2], axis=-1)  # (B,N,F,T')val_x = np.concatenate(validation_set[:-2], axis=-1)test_x = np.concatenate(testing_set[:-2], axis=-1)train_target = training_set[-2]  # (B,N,T)val_target = validation_set[-2]test_target = testing_set[-2]train_timestamp = training_set[-1]  # (B,1)val_timestamp = validation_set[-1]test_timestamp = testing_set[-1](stats, train_x_norm, val_x_norm, test_x_norm) = normalization(train_x, val_x, test_x)all_data = {'train': {'x': train_x_norm,'target': train_target,'timestamp': train_timestamp,},'val': {'x': val_x_norm,'target': val_target,'timestamp': val_timestamp,},'test': {'x': test_x_norm,'target': test_target,'timestamp': test_timestamp,},'stats': {'_mean': stats['_mean'],'_std': stats['_std'],}}print('train x:', all_data['train']['x'].shape)print('train target:', all_data['train']['target'].shape)print('train timestamp:', all_data['train']['timestamp'].shape)print()print('val x:', all_data['val']['x'].shape)print('val target:', all_data['val']['target'].shape)print('val timestamp:', all_data['val']['timestamp'].shape)print()print('test x:', all_data['test']['x'].shape)print('test target:', all_data['test']['target'].shape)print('test timestamp:', all_data['test']['timestamp'].shape)print()print('train data _mean :', stats['_mean'].shape, stats['_mean'])print('train data _std :', stats['_std'].shape, stats['_std'])if save:file = os.path.basename(graph_signal_matrix_filename).split('.')[0]dirpath = os.path.dirname(graph_signal_matrix_filename)filename = os.path.join(dirpath, file + '_r' + str(num_of_hours) + '_d' + str(num_of_days) + '_w' + str(num_of_weeks)) + '_astcgn'print('save file:', filename)np.savez_compressed(filename,train_x=all_data['train']['x'], train_target=all_data['train']['target'],train_timestamp=all_data['train']['timestamp'],val_x=all_data['val']['x'], val_target=all_data['val']['target'],val_timestamp=all_data['val']['timestamp'],test_x=all_data['test']['x'], test_target=all_data['test']['target'],test_timestamp=all_data['test']['timestamp'],mean=all_data['stats']['_mean'], std=all_data['stats']['_std'])return all_data

sampletarget 在前面两个函数已经分析过,对于sample,在本函数中多了一个操作hour_sample = np.expand_dims(hour_sample, axis=0).transpose((0, 2, 3, 1))target = np.expand_dims(target, axis=0).transpose((0, 2, 3, 1))[:, :, 0, :]下面具体解释该操作。

  • np.expand_dims(hour_sample, axis=0):在指定的轴上插入一个新维度,hour_sample的原始形状是(12,307,3),经过expand_dims后变成(1,12,307,3)

  • target的原始形状是(12,307,3),经过expand_dims后变成(1,12,307,3)

  • .transpose((0, 2, 3, 1)):将hour_sample的维度按照指定的顺序重新排列,原来是(1,12,307,3),处理之后是(1,307,3,12)

  • .transpose((0, 2, 3, 1))[:, :, 0, :]:先将 target 变为(1,307,3,12),再提取 target 第三个维度的第一个特征,target 变为(1,307,1,12),即(1,307,12)

使用原始数据的数字对比:

  • sample[i]=(1,12,307,3)转为csv文件(12,307,1)只保存流量特征
#把sample[i]12, 307, 3)转为csv文件(12,307,1)只保存流量特征
import pandas as pd
def sampletocsv(i,sample):sample = sample[i]print("sample.shape:",sample.shape)#只提取流量reshaped_sample = sample[:, :, :1, :]print("Reshaped shape:", reshaped_sample.shape)data_2d = reshaped_sample.reshape(-1, reshaped_sample.shape[-1])df = pd.DataFrame(data_2d)df.to_csv(f'npytocsv/sample_dim1_{i}.csv', index=False)
if __name__ == '__main__':sampletocsv(0,sample)

输出如下,这里的每一份sample_i文件的维度都是(307,12),根据上面的get_sample_indices函数代码举例的输出,这样的sample_i一共有16969个。
在这里插入图片描述
sample_0:(部分)
在这里插入图片描述
sample_1:(部分)
在这里插入图片描述
sample_2:(部分)
在这里插入图片描述

  • targetlist[i](1, 307, 12)转为csv文件
#把target[i]1, 307, 12)转为csv文件
#运行search_data和get_sample_indices测试函数,不运行read_and_generate_dataset测试函数
import pandas as pd
def targetlisttocsv(i,targetlist):targetlist=targetlist[i]print("targetlist[i].shape:",targetlist.shape)targetlist_2d = targetlist.reshape(targetlist.shape[1], targetlist.shape[2])df = pd.DataFrame(targetlist_2d)df.to_csv(f'npytocsv/targetlist_{i}.csv', index=False)
if __name__ == '__main__':targetlisttocsv(2,targetlist)

在这里插入图片描述
targetlist_0:(部分)
在这里插入图片描述
targetlist_1:(部分)
在这里插入图片描述
targetlist_2:(部分)
在这里插入图片描述

  • 提取原始数据PEMS04.npz中的一部分转为csv文件
#把原始数据的流量的前i条的第j+1个特征转为csv
import pandas as pd
def dataseqtocsv(i,j):data_seq = np.load(graph_signal_matrix_filename)['data']print("data_seq.shape",data_seq.shape)subset_data_seq = data_seq[:i, :, j]print("subset_data_seq.shape:",subset_data_seq.shape)df = pd.DataFrame(subset_data_seq)df.to_csv(f'subset_data_seq{j+1}.csv', index=False)
if __name__ == '__main__':dataseqtocsv(50,0)

为了方便只输出16992条数据中的前50条,且只取流量特征,输出如下:
在这里插入图片描述
sampletarget联合起来与原数据集对比
在这里插入图片描述
在这里插入图片描述

  • 总结:get_sample_indices函数就是根据search_data函数所形成的索引,去原始数据集中提取对应的数据和标签,组成我们需要的近期(num_of_hours),日周期(num_of_days)、周周期(num_of_weeks)数据。

处理完hour_sample之后,把time_sample target 加入到all_samples中,

此时all_samples=[[hour_sample],[target],[time_sample],...,[hour_sample],[target],[time_sample]]

其中每一个 hour_sample=(1,307,3,12),每一个target =(1,307,),每一个time_sample =(1,1),且time_sample[0]=[[12]]time_sample[16969]=[[16980]]

接下来是按比例划分all_samples60%training_set20%validation_set20%testing_set

training_set = [np.concatenate(i, axis=0)for i in zip(*all_samples[:split_line1])] 
validation_set = [np.concatenate(i, axis=0)for i in zip(*all_samples[split_line1: split_line2])]
testing_set = [np.concatenate(i, axis=0)for i in zip(*all_samples[split_line2:])]

training_set中取出从第一个到倒数第二个之间元素(不包括倒数第二个),即[hour_sample]=(1,307,3,12),并沿着最后一个轴(时间)连接起来,组成train_xval_x test_x 同理。

    train_x = np.concatenate(training_set[:-2], axis=-1)val_x = np.concatenate(validation_set[:-2], axis=-1)test_x = np.concatenate(testing_set[:-2], axis=-1)

training_set中取出倒数第二个元素,即target=(1,307,12),组成train_targetval_target test_target同理。

	train_target = training_set[-2]  val_target = validation_set[-2]test_target = testing_set[-2]

training_set中取出最后一个元素,即time_sample =(1,1),组成train_timestamp val_timestamp test_timestamp 同理。

    train_timestamp = training_set[-1]  val_timestamp = validation_set[-1]test_timestamp = testing_set[-1]

接下来是归一化操作,先看归一化函数。

normalization函数

  • 函数功能:对这输入的数据集进行标准化处理,使得每个数据集的均值为 0,标准差为 1
  • 函数具体操作:
def normalization(train, val, test):#确保 train、val 和 test 数据集在第1轴及其后面的维度上形状相同assert train.shape[1:] == val.shape[1:] and val.shape[1:] == test.shape[1:]  # ensure the num of nodes is the samemean = train.mean(axis=(0, 1, 3), keepdims=True)std = train.std(axis=(0, 1, 3), keepdims=True)print('mean.shape:', mean.shape)print('std.shape:', std.shape)def normalize(x):return (x - mean) / stdtrain_norm = normalize(train)val_norm = normalize(val)test_norm = normalize(test)return {'_mean': mean, '_std': std}, train_norm, val_norm, test_norm

mean = train.mean(axis=(0, 1, 3), keepdims=True):计算 train数据集在第013轴上的均值,并保持这些维度以便后续广播。
std = train.std(axis=(0, 1, 3), keepdims=True):计算 train数据集在第013轴上的标准差,并保持这些维度以便后续广播。
返回一个字典,和标准化的结果,接下来构建一系列字典。

整体梳理

for idx in range(16992): 0-16991
  search_data函数生成hour_indice: [(0, 12)]
  get_sample_indices函数根据hour_indice,从原始数据中取出索引从011的数据,添加到hour_sample中,维度: (12,307,3),经过维度扩展操作后变为:(1,12,307,3)
  从原始数据中取出索引从12-23的数据,添加到target中,维度: (12,307,3),经过维度扩展操作后变为:(1,12,307,3)
  取idx的值加添加到time_sample中:[0]
  把hour_sampletargettime_sample添加到samples
  把samples添加到all_samples中,all_samples=[[[hour_sample],[target],[samples]],...,[[hour_sample],[target],[samples]]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

期权专题12:期权保证金和期权盈亏

目录 1. 期权保证金 1.1 计算逻辑 1.2 代码复现 1.3 实际案例 2. 期权盈亏 2.1 价格走势 2.2 计算公式 2.2.1 卖出期权 2.2.2 买入期权 免责声明&#xff1a;本文由作者参考相关资料&#xff0c;并结合自身实践和思考独立完成&#xff0c;对全文内容的准确性、完整性或…

[CISCN 2023 华北]normal_snake

[CISCN 2023 华北]normal_snake 源码和依赖 算了直接说吧&#xff0c;不想截图了&#xff0c;就多了一个C3P0和yaml的依赖 然后read路由可以反序列化yaml的Str 我们看到waf 那个String是可以二次反序列化绕过的,然后CUSTOM_STRING1解码后是"BadAttributeValuePairExcept…

【java】力扣 反转链表

力扣 206 链表反转 题目介绍 解法讲解 先定义两个游标indexnull&#xff0c;prenull&#xff0c;反转之后链表应该是5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;我们先进行2->1的反转&#xff0c;然后再循坏即可 让定义的游标index去存储head.n…

MySQL设置白名单限制

白名单&#xff08;Whitelist&#xff09;是一种机制&#xff0c;用于限制哪些主机可以连接到服务器&#xff0c;而阻止其他主机的访问。通过配置白名单&#xff0c;可以增加服务器的安全性&#xff0c;防止未授权的访问。 在MySQL数据库中直接设置白名单访问&#xff08;即限制…

【触摸屏】【地震知识宣传系统】功能模块:视频 + 知识问答

项目背景 鉴于地震知识的普及对于提升公众防灾减灾意识的重要性&#xff0c;客户希望开发一套互动性强、易于理解的地震学习系统&#xff0c;面向公众、学生及专业人员进行地震知识教育与应急技能培训。 产品功能 系统风格&#xff1a;严谨的设计风格和准确的信息呈现&#…

红酒的艺术之旅:品味、鉴赏与生活的整合

在繁忙的都市生活中&#xff0c;红酒如同一道不同的风景线&#xff0c;将品味、鉴赏与日常生活巧妙地整合在一起。它不仅仅是一种饮品&#xff0c;更是一种艺术&#xff0c;一种生活的态度。今天&#xff0c;就让我们一起踏上这趟红酒的艺术之旅&#xff0c;探寻雷盛红酒如何以…

【qt】如何读取文件并拆分信息?

需要用到QTextStream类 还有QFile类 对于文件的读取操作我们可以统一记下如下操作: 就这三板斧 获取到文件名用文件名初始化文件对象用文件对象初始化文本流 接下来就是打开文件了 用open()来打开文件 用readLine()来读取行数据 用atEnd()来判断是否读到结尾 用split()来获取…

02. Hibernate 初体验之持久化对象

1. 前言 本节课程让我们一起体验 Hibernate 的魅力&#xff01;编写第一个基于 Hibernate 的实例程序。 在本节课程中&#xff0c;你将学到 &#xff1a; Hibernate 的版本发展史&#xff1b;持久化对象的特点。 为了更好地讲解这个内容&#xff0c;这个初体验案例分上下 2…

go-高效处理应用程序数据

一、背景 大型的应用程序为了后期的排障、运营等&#xff0c;会将一些请求、日志、性能指标等数据保存到存储系统中。为了满足这些需求&#xff0c;我们需要进行数据采集&#xff0c;将数据高效的传输到存储系统 二、问题 采集服务仅仅针对某个需求开发&#xff0c;需要修改…

防火墙小试——部分(书接上回)

toop接上回 1.实验拓扑及要求 前情回顾 DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问. 生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 …

C#统一委托Func与Action

C#在System命名空间下提供两个委托Action和Func&#xff0c;这两个委托最多提供16个参数&#xff0c;基本上可以满足所有自定义事件所需的委托类型。几乎所有的 事件 都可以使用这两个内置的委托Action和Func进行处理。 Action委托&#xff1a; Action定义提供0~16个参数&…

使用亮数据代理IP+Python爬虫批量爬取招聘信息训练面试类AI智能体

本文目录 一、引言二、开发准备三、代码开发四、使用亮数据进行高效爬取4.1 为什么需要亮数据4.2 如何使用亮数据 五、使用数据训练AI智能体六、 总结 一、引言 在当今AI迅速发展的时代&#xff0c;招聘市场正经历着前所未有的变革。传统的招聘方式已难以满足双方的需求。AI智…

canvas快速入门(一)canvas的基础使用

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1. canvas的两种创建方式及优劣 2. canvas宽高设置及注意事项 3. 简单测例 项目结构&#xff1a; 源码&#xff1a; index.html <!DOCTYPE html> <html lang"en"> <head><meta charset…

先天睡功-守一老师

描述 守一老师&#xff0c;一个富有才华的老师&#xff01; 对于大家的学习有不可多得的帮助。 内容 目前主要的内容以睡觉为主&#xff0c;对于学习睡睡觉有比较大的帮助&#xff01; 但是网络上面错综复杂&#xff0c;很多老旧的版本影响学习&#xff01; 而这里我整理了…

安全防御实验2

一、实验拓扑 二、实验要求 办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器多出口环境基于带宽比例进行选路&#xff0c;但是&#xff0c;办公区…

OZON夏季热卖产品有哪些,OZON夏季热卖新品

OZON平台在夏季的热卖产品种类繁多&#xff0c;涵盖了多个领域&#xff0c;主要包括但不限于以下几个方面&#xff0c;接下来看看OZON夏季热卖产品有哪些&#xff0c;OZON夏季热卖新品&#xff01;Top1 运动套装 Костюм спортивный Victorias Secret 商品id…

【C++】C++入门实战教程(打造属于自己的C++知识库)

目录 目录 写在前面 1.C学习路线 2.本教程框架介绍 一.C基础部分 1.程序编码规范 2.程序运行与编译 3.关键字 4.常用数据类型 5.运算符相关 二.C进阶部分 1.面向对象编程 2.函数编程 3.模板编程 4.多线程与并发 5.STL介绍及使用 6.内存模型与优化 三.C实战部…

美国视觉AI解决方案公司Hayden AI完成9000万美元C轮融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国加利福尼亚州旧金山弗朗西斯科专门为智慧城市提供视觉AI解决方案的Hayden AI&#xff0c;近期宣布已完成9000万美元C轮融资。 本轮融资由The Rise Fund领投&#xff0c;Drawdown Fun…

股指期货存在的风险有哪些?

股指期货因其标的物的特殊性&#xff0c;其面临的风险类型十分复杂&#xff0c;主要面临的一般风险和特有风险如下&#xff1a; 一般风险 从风险是否可控的角度&#xff0c;可以划分为不可控风险和可控风险&#xff1b;从交易环节可分为代理风险、流动性风险、强制平仓风险&…

BUCK外围器件选型,输入电容,输出电容,电感,续流二极管

概述&#xff1a; 一般情况下&#xff0c;电源接口处会有大小不同的电容进行并联&#xff0c;大容量电容是为了防止自身产生干扰影响其他器件&#xff0c;所以叫去耦电容&#xff1b;小容量电容是为了其他高频干扰影响自身&#xff0c;所以叫旁路电容。当然这只是通常情况下。 …