提取全部变量,并且生成时间序列预测所需的数据
import numpy as np
import xarray as xr
data = xr.open_dataset('/data2/dataset/kc/My_project/data_stream-wave.nc')
for var in variables:
# 只处理维度是 (744, 47, 51) 的变量,跳过其他维度不匹配的变量
if data[var].shape == (744, 47, 51):
data_vars.append(data[var].values)
# 假设你的数据是 data,形状为 [744, 47, 51]
data_combined = np.stack(data_vars, axis=-1) [744, 47, 51, 43]
# 用于生成时间序列预测数据
def create_time_series_multivar(data, input_length=12, pred_length=6, step=1):
"""
生成用于时间序列预测的样本对,支持多变量输入
data: 原始四维数据 (744, 47, 51, num_vars)
input_length: 用于输入的时间步数 (例如:12)
pred_length: 要预测的未来时间步数 (例如:6)
step: 滑动窗口的步长
"""
num_samples = (data.shape[0] - input_length - pred_length) // step + 1
X = np.zeros((num_samples, input_length, data.shape[1], data.shape[2], data.shape[3]))
y = np.zeros((num_samples, pred_length, data.shape[1], data.shape[2], data.shape[3]))
for i in range(num_samples):
X[i] = data[i*step:i*step + input_length, :, :, :]
y[i] = data[i*step + input_length:i*step + input_length + pred_length, :, :, :]
return X, y
# 生成多变量的时间序列数据
X, y = create_time_series_multivar(data_combined, input_length=12, pred_length=6, step=1)
# 输入数据形状: (727, 12, 47, 51, 43), 输出数据形状: (727, 6, 47, 51, 43)
找到对应变量的索引
import numpy as np
def find_variable_index(data, var_name):
"""
根据变量名查找索引
data: xarray Dataset
var_name: 变量名(例如 'mwd')
"""
# 获取所有变量的名字
variables = list(data.data_vars) # 获取所有变量的名字列表
if var_name in variables:
return variables.index(var_name)
else:
raise ValueError(f"变量 {var_name} 不存在于数据集中")
# 查找 mwd 的索引
mwd_index = find_variable_index(data, 'mwd')
print(f"mwd 的索引为: {mwd_index}")
构建合适的时间序列数据
def create_time_series_multivar(data, input_length=12, pred_length=6, step=1):
"""
生成用于时间序列预测的样本对,支持多变量输入
data: 原始四维数据 (744, 47, 51, num_vars)
input_length: 用于输入的时间步数 (例如:12)
pred_length: 要预测的未来时间步数 (例如:6)
step: 滑动窗口的步长
"""
data = data.sortby('valid_time')
num_samples = (data['valid_time'].size - input_length - pred_length) // step + 1
input_data = data.drop_vars('mwd')
target_data = data['mwd'].values
variables = list(input_data.data_vars)
# 遍历提取每个变量,并确保每个变量的形状为 (744, 47, 51)
data_vars = []
for var in variables:
# 只处理维度是 (744, 47, 51) 的变量,跳过其他维度不匹配的变量
if data[var].shape == (744, 47, 51):
data_vars.append(data[var].values)
# 假设你的数据是 data,形状为 [744, 47, 51],data_combined(744, 47, 51, 43)
data_combined = np.stack(data_vars, axis=-1)
X = np.zeros((num_samples, input_length, data_combined.shape[1], data_combined.shape[2], data_combined.shape[3]))
y = np.zeros((num_samples, pred_length, target_data.shape[1], target_data.shape[2]))
for i in range(num_samples):
X[i] = data_combined[i*step:i*step + input_length, :, :, :]
y[i] = target_data[i*step + input_length:i*step + input_length + pred_length, :, :]
return X, y
# 存在问题是,可能开始没有按照时间顺序排序
# 生成多变量的时间序列数据
X, y = create_time_series_multivar(data, input_length=12, pred_length=6, step=1)
# 查看生成的输入 X 和目标 y 的形状
print(f"输入数据形状: {X.shape}, 输出数据形状: {y.shape}")