LR中的时间戳函数web_save_timestamp_param

本文深入探讨了LoadRunner中用于生成时间戳和保存日期时间的函数,包括web_save_timestamp_param和lr_save_datetime。通过实例解析了如何使用这些函数实现JS缓存管理、防止CSRF攻击,并提供了生成唯一用户名的方法。同时,详细介绍了lr_save_datetime函数的参数说明和使用方法,包括格式化信息、时间偏移量和参数保存的参数名,以及如何利用此函数获取特定日期和时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前真没注意过后面看某个群有人说到这个函数一查,还真有,那么处理时间戳就简单很多了,我们经常在各种网站上看到类似于这样的时间戳

1302245899530
51Testing软件测试网"d bLq!uR&am
做时间戳的目的是为了JS缓存和防止CSRF,在LR中可以简单的使用下面这个函数

web_save_timestamp_param

来生成时间戳
 

 web_save_timestamp_param("tStamp", LAST);  

 lr_output_message("%s",lr_eval_string("{tStamp}"));

 

brokerDetail.c(49): web_save_timestamp_param("web_save_timestamp_param") was successful   [MsgId: MMSG-26392]
brokerDetail.c(53): 1433760182344

 

我想生成唯一的一个用户名。想到用web_save_timestamp_param函数。web_save_timestamp_param function saves the current timestamp to LoadRunner parameter. Timestamp is the number of milliseconds since midnight January 1st, 1970 (also known as Unix Epoch).
说这个函数是存储毫秒级的时间戳。而我刚取到的时间戳是1302245899530,这个时间戳我完全看不懂呀!跟时间不搭边呀现在时间是14:58分钟。

后来才发现取到的时间戳是现在时间减去现在的时间 减去 1970年1月1日0点00 的时间 ,然后换算成毫秒。

 

 

 

 

Lr_save_datetime函数的使用

 

    最近几天在录制测试脚本,希望能有一个方法自动保存系统时间,以便能够更好的进行分辨,于是在LR的帮助函数中查找到了lr_save_datetime函数,一试验,感觉非常不错,满足了我的要求,下面就将lr_save_datetime函数的使用方法记载下来,以便后用:

<!--[if !supportEmptyParas]--> <!--[endif]-->

函数原型:

voidlr_save_datetime(const char *format,intoffset,const char *name);

<!--[if !supportEmptyParas]--> <!--[endif]-->

format期望输出的日期格式比如说%Y、%m、%d、%X等等

<!--[if !supportEmptyParas]--> <!--[endif]-->

offset:类似与表示时间的一些关键字常量,主要有DATE_NOW, TIME_NOW, ONE_DAY, ONE_HOUR, ONE_MIN,他们可以单独使用,也可以联合使用,比如DATE_NOW + TIME_NOW

<!--[if !supportEmptyParas]--> <!--[endif]-->

name:期望将时间保存到的那个参数的名称

<!--[if !supportEmptyParas]--> <!--[endif]-->

举例:

lr_save_datetime(“%Y-%m-%d %x”,DATE_NOW+TIME_NOW,“DateTimeParam”);

lr_output_message(lr_eval_string("Now is {DateTimeParam}"));

 

 

 

 

loadrunner函数 lr_save_datetime



今天到51testing的blog里查看文章《Loadrunner获取当前系统时间》的回复,51testing的网友persist提到了一个lr函数实现的方法也可以实现,在这里非常感谢persist;只有

交流和不断的学习,我们的技术水平才能进步哈!!

本人在51testing的blog全部为原创,转载请注明!!

扯的有点远了,还是看这个函数吧!!

 

【lr_save_datetime】

void lr_save_datetime(const char *format, int offset, const char *name);

中文解释:
lr_save_datetime将当前日期和时间,或具有指定偏移的日期和时间保存在参数中。如果达到MAX_DATETIME_LEN个字符,结果字符串将被截断。

参数说明:
1、const char *format
   格式化信息
   同fopen、lr_message等相同;例如:"the first is %s"

2、int offset
   时间的偏移量
     DATE_NOW(现在的日期)
     TIME_NOW(现在的时间)
     ONE_DAY(一天的时间)
     ONE_HOUR(一小时的时间)
     ONE_MIN(一分钟的时间)

   需要注意的是,时间的偏移量可以使用公式,例如:DATE_NOW+ONE_DAY

   这样,我们就可以取得昨天、明天的日期了
     DATE_NOW-ONE_DAY(昨天)
     DATE_NOW+ONE_DAY(明天)

   那么,我们就可以使用如下表示得到前天的日期
     lr_save_datetime("%Y-%B-%d",DATE_NOW-2*(ONE_DAY),"abc");
     lr_save_datetime("%Y-%B-%d",DATE_NOW-2*24*(ONE_HOUR),"abc");
     lr_save_datetime("%Y-%B-%d",DATE_NOW-2*24*60*(ONE_MIN),"abc");

   当然,我们也可以使用如下表示2个小时后的时间
     lr_save_datetime("%H:%M:%S",TIME_NOW+2*(ONE_HOUR),"ab");   
     lr_save_datetime("%H:%M:%S",TIME_NOW+2*60*(ONE_MIN),"ab");
 

3、const char *name
   参数保存的参数名;使用时lr_eval_string("{参数名}")

示例如下:
===========================================
Action()
{
    lr_save_datetime("%y-%b-%d",DATE_NOW-2*24*(ONE_HOUR),"abc");
     //保存前天的日期到参数abc中
    lr_message("the day before yesterday is:%s",lr_eval_string("{abc}"));
     //输出abc的值
    lr_save_datetime("%H:%M:%S",TIME_NOW+2*(ONE_HOUR),"ab");
     //保存2个小时后的时间到参数ab中
    lr_message("the time after two hour is:%s",lr_eval_string("{ab}"));
     //输入ab的值
    return 0;
}


执行结果如下:
the day before yesterday is:07-七月-04
the time after two hour is:15:33:41
===========================================


附:《lr_save_datetime格式参数表》
%a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

 

import os import time import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import mean_absolute_error, mean_squared_error import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader, TensorDataset from torch.optim.lr_scheduler import ReduceLROnPlateau # 设置随机种子确保结果可复现 torch.manual_seed(42) np.random.seed(42) sns.set_style('whitegrid') # 设备配置 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(f"使用设备: {device}") # 1. 数据加载与预处理函数 # -------------------------------------------------- def load_and_preprocess_data(): """加载并预处理所有数据源""" print("开始数据加载与预处理...") start_time = time.time() # 加载EC气象数据 ec_df = pd.read_csv('阿拉山口风电场_EC_data.csv', parse_dates=['生成日期', '预测日期']) ec_df = ec_df[ec_df['场站名'] == '阿拉山口风电场'] # 计算EC风速和风向 ec_df['EC风速(m/s)'] = np.sqrt(ec_df['U风分量(m/s)']**2 + ec_df['V风分量(m/s)']**2) ec_df['EC风向(度)'] = np.degrees(np.arctan2(ec_df['V风分量(m/s)'], ec_df['U风分量(m/s)'])) % 360 # 添加EC数据可用时间(生成时间+12小时) ec_df['可用时间'] = ec_df['生成日期'] + pd.Timedelta(hours=12) # 选择关键特征 ec_features = [ '可用时间', '预测日期', 'EC风速(m/s)', 'EC风向(度)', '位势高度_850hPa(gpm)', '温度_850hPa(K)', '相对湿度_850hPa(%)', '位势高度_500hPa(gpm)', '温度_500hPa(K)' ] ec_df = ec_df[ec_features] # 加载风机数据 turbine_df = pd.read_csv('阿拉山口风电场风机数据.csv', encoding='gbk', parse_dates=[0]) turbine_df.columns = ['timestamp', 'wind_speed', 'active_power'] # 加载远动数据 scada_df = pd.read_csv('阿拉山口风电场远动数据.csv', encoding='gbk', parse_dates=[0]) scada_df.columns = ['timestamp', 'active_power_total'] # 合并风机和远动数据 power_df = pd.merge(turbine_df[['timestamp', 'wind_speed']], scada_df, on='timestamp', how='outer') # 按时间排序并填充缺失值 power_df.sort_values('timestamp', inplace=True) power_df['active_power_total'].ffill(inplace=True) power_df['wind_speed'].ffill(inplace=True) # 创建完整的时间序列索引(15分钟间隔) full_range = pd.date_range( start=power_df['timestamp'].min(), end=power_df['timestamp'].max(), freq='15T' ) power_df = power_df.set_index('timestamp').reindex(full_range).reset_index() power_df.rename(columns={'index': 'timestamp'}, inplace=True) power_df[['wind_speed', 'active_power_total']] = power_df[['wind_speed', 'active_power_total']].ffill() # 合并EC数据到主数据集 ec_data = [] for idx, row in power_df.iterrows(): ts = row['timestamp'] # 获取可用的EC预测(可用时间 <= 当前时间) available_ec = ec_df[ec_df['可用时间'] <= ts] if not available_ec.empty: # 获取最近发布的EC数据 latest_gen = available_ec['可用时间'].max() latest_ec = available_ec[available_ec['可用时间'] == latest_gen] # 找到最接近当前时间点的预测 time_diff = (latest_ec['预测日期'] - ts).abs() closest_idx = time_diff.idxmin() ec_point = latest_ec.loc[closest_idx].copy() ec_point['timestamp'] = ts ec_data.append(ec_point) # 创建EC数据DataFrame并合并 ec_ts_df = pd.DataFrame(ec_data) merged_df = pd.merge(power_df, ec_ts_df, on='timestamp', how='left') # 填充缺失的EC数据 ec_cols = [col for col in ec_ts_df.columns if col not in ['timestamp', '可用时间', '预测日期']] for col in ec_cols: merged_df[col] = merged_df[col].interpolate(method='time') # 添加时间特征 merged_df['hour'] = merged_df['timestamp'].dt.hour merged_df['day_of_week'] = merged_df['timestamp'].dt.dayofweek merged_df['day_of_year'] = merged_df['timestamp'].dt.dayofyear merged_df['month'] = merged_df['timestamp'].dt.month # 计算实际风向(如果有测风塔数据,这里使用EC风向) merged_df['风向(度)'] = merged_df['EC风向(度)'] # 移除包含NaN的行 merged_df.dropna(inplace=True) # 特征选择 feature_cols = [ 'wind_speed', 'active_power_total', 'EC风速(m/s)', '风向(度)', '位势高度_850hPa(gpm)', '温度_850hPa(K)', '相对湿度_850hPa(%)', '位势高度_500hPa(gpm)', '温度_500hPa(K)', 'hour', 'day_of_week', 'day_of_year', 'month' ] target_col = 'active_power_total' print(f"数据处理完成! 耗时: {time.time()-start_time:.2f}秒") print(f"数据集形状: {merged_df.shape}") print(f"特征数量: {len(feature_cols)}") return merged_df[feature_cols], merged_df[target_col], merged_df['timestamp'] # 2. 数据准备类 (PyTorch Dataset) # -------------------------------------------------- class WindPowerDataset(Dataset): """风功率预测数据集类""" def __init__(self, X, y, look_back, forecast_steps): """ :param X: 特征数据 (n_samples, n_features) :param y: 目标数据 (n_samples,) :param look_back: 回溯时间步长 :param forecast_steps: 预测步长 """ self.X = X self.y = y self.look_back = look_back self.forecast_steps = forecast_steps self.n_samples = len(X) - look_back - forecast_steps + 1 def __len__(self): return self.n_samples def __getitem__(self, idx): # 获取历史序列 x_seq = self.X[idx:idx+self.look_back] # 获取未来目标序列 y_seq = self.y[idx+self.look_back:idx+self.look_back+self.forecast_steps] # 转换为PyTorch张量 x_tensor = torch.tensor(x_seq, dtype=torch.float32) y_tensor = torch.tensor(y_seq, dtype=torch.float32) return x_tensor, y_tensor # 3. LSTM模型 (PyTorch实现) # -------------------------------------------------- class WindPowerLSTM(nn.Module): """风功率预测LSTM模型""" def __init__(self, input_size, hidden_size, num_layers, output_steps): """ :param input_size: 输入特征维度 :param hidden_size: LSTM隐藏层大小 :param num_layers: LSTM层数 :param output_steps: 输出步长 """ super(WindPowerLSTM, self).__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.output_steps = output_steps # LSTM层 self.lstm = nn.LSTM( input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True, dropout=0.2 if num_layers > 1 else 0 ) # 全连接层 self.fc = nn.Sequential( nn.Linear(hidden_size, 128), nn.ReLU(), nn.Dropout(0.3), nn.Linear(128, 64), nn.ReLU(), nn.Dropout(0.2), nn.Linear(64, output_steps) ) def forward(self, x): # 初始化隐藏状态 h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) # 前向传播LSTM out, _ = self.lstm(x, (h0, c0)) # 只取最后一个时间步的输出 out = out[:, -1, :] # 全连接层 out = self.fc(out) return out # 4. 训练和评估函数 # -------------------------------------------------- def train_model(model, train_loader, val_loader, criterion, optimizer, scheduler, epochs, model_name): """训练模型""" print(f"\n开始训练 {model_name} 模型...") start_time = time.time() best_val_loss = float('inf') history = {'train_loss': [], 'val_loss': []} for epoch in range(epochs): # 训练阶段 model.train() train_loss = 0.0 for inputs, targets in train_loader: inputs, targets = inputs.to(device), targets.to(device) # 前向传播 outputs = model(inputs) loss = criterion(outputs, targets) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() train_loss += loss.item() * inputs.size(0) # 验证阶段 model.eval() val_loss = 0.0 with torch.no_grad(): for inputs, targets in val_loader: inputs, targets = inputs.to(device), targets.to(device) outputs = model(inputs) loss = criterion(outputs, targets) val_loss += loss.item() * inputs.size(0) # 计算平均损失 train_loss = train_loss / len(train_loader.dataset) val_loss = val_loss / len(val_loader.dataset) history['train_loss'].append(train_loss) history['val_loss'].append(val_loss) # 更新学习率 if scheduler: scheduler.step(val_loss) # 保存最佳模型 if val_loss < best_val_loss: best_val_loss = val_loss torch.save(model.state_dict(), f'best_{model_name}_model.pth') # 打印进度 if (epoch + 1) % 5 == 0: print(f"Epoch [{epoch+1}/{epochs}] - Train Loss: {train_loss:.6f}, Val Loss: {val_loss:.6f}") print(f"训练完成! 耗时: {time.time()-start_time:.2f}秒") print(f"最佳验证损失: {best_val_loss:.6f}") return history def evaluate_model(model, test_loader, scaler, model_name): """评估模型性能""" model.eval() actuals = [] predictions = [] with torch.no_grad(): for inputs, targets in test_loader: inputs = inputs.to(device) # 预测 outputs = model(inputs) # 反归一化 outputs_np = outputs.cpu().numpy() targets_np = targets.numpy() # 反归一化 outputs_inv = scaler.inverse_transform(outputs_np) targets_inv = scaler.inverse_transform(targets_np.reshape(-1, 1)).flatten() # 收集结果 actuals.extend(targets_inv) predictions.extend(outputs_inv.flatten()) # 转换为numpy数组 actuals = np.array(actuals) predictions = np.array(predictions) # 计算性能指标 mae = mean_absolute_error(actuals, predictions) rmse = np.sqrt(mean_squared_error(actuals, predictions)) print(f"\n{model_name} 模型评估结果:") print(f"MAE: {mae:.2f} kW") print(f"RMSE: {rmse:.2f} kW") return actuals, predictions, mae, rmse # 5. 可视化函数 # -------------------------------------------------- def plot_predictions(actuals, predictions, timestamps, model_name, forecast_steps, mae): """可视化预测结果""" # 创建结果DataFrame results = pd.DataFrame({ 'timestamp': timestamps, 'actual': actuals, 'predicted': predictions }) # 设置时间索引 results.set_index('timestamp', inplace=True) # 选择一段代表性的时间序列展示 sample = results.iloc[1000:1300] plt.figure(figsize=(15, 7)) # 绘制实际值 plt.plot(sample.index, sample['actual'], label='实际功率', color='blue', alpha=0.7, linewidth=2) # 绘制预测值 plt.plot(sample.index, sample['predicted'], label='预测功率', color='red', alpha=0.7, linestyle='--', linewidth=2) plt.title(f'{model_name}风功率预测 (预测步长: {forecast_steps}步, MAE: {mae:.2f} kW)', fontsize=14) plt.xlabel('时间', fontsize=12) plt.ylabel('有功功率 (kW)', fontsize=12) plt.legend(fontsize=12) plt.grid(True, linestyle='--', alpha=0.7) plt.xticks(rotation=45) plt.tight_layout() plt.savefig(f'{model_name}_prediction_plot.png', dpi=300) plt.show() return results def plot_training_history(history, model_name): """绘制训练过程中的损失曲线""" plt.figure(figsize=(12, 6)) # 绘制训练损失 plt.plot(history['train_loss'], label='训练损失') # 绘制验证损失 if 'val_loss' in history: plt.plot(history['val_loss'], label='验证损失') plt.title(f'{model_name} 训练过程', fontsize=14) plt.xlabel('训练轮次', fontsize=12) plt.ylabel('损失 (MSE)', fontsize=12) plt.legend(fontsize=12) plt.grid(True, linestyle='--', alpha=0.7) plt.tight_layout() plt.savefig(f'{model_name}_training_history.png', dpi=300) plt.show() # 6. 主函数 # -------------------------------------------------- def main(): # 加载数据 X, y, timestamps = load_and_preprocess_data() # 定义预测配置 ULTRA_SHORT_CONFIG = { 'name': '超短期', 'look_back': 24, # 6小时历史 (24*15min) 'forecast_steps': 16, # 4小时预测 (16*15min) 'batch_size': 64, 'hidden_size': 128, 'num_layers': 2, 'epochs': 100, 'lr': 0.001 } SHORT_TERM_CONFIG = { 'name': '短期', 'look_back': 96, # 24小时历史 (96*15min) 'forecast_steps': 288, # 72小时预测 (288*15min) 'batch_size': 32, 'hidden_size': 256, 'num_layers': 3, 'epochs': 150, 'lr': 0.0005 } # 准备超短期预测数据集 print("\n准备超短期预测数据集...") # 数据标准化 X_scaler = StandardScaler() y_scaler = StandardScaler() X_scaled = X_scaler.fit_transform(X) y_scaled = y_scaler.fit_transform(y.values.reshape(-1, 1)).flatten() # 创建数据集 dataset = WindPowerDataset(X_scaled, y_scaled, ULTRA_SHORT_CONFIG['look_back'], ULTRA_SHORT_CONFIG['forecast_steps']) # 划分数据集 train_size = int(0.8 * len(dataset)) val_size = int(0.1 * len(dataset)) test_size = len(dataset) - train_size - val_size train_dataset, val_dataset, test_dataset = torch.utils.data.random_split( dataset, [train_size, val_size, test_size] ) # 创建数据加载器 train_loader = DataLoader(train_dataset, batch_size=ULTRA_SHORT_CONFIG['batch_size'], shuffle=True) val_loader = DataLoader(val_dataset, batch_size=ULTRA_SHORT_CONFIG['batch_size']) test_loader = DataLoader(test_dataset, batch_size=ULTRA_SHORT_CONFIG['batch_size']) # 创建模型 model_ultra = WindPowerLSTM( input_size=X.shape[1], hidden_size=ULTRA_SHORT_CONFIG['hidden_size'], num_layers=ULTRA_SHORT_CONFIG['num_layers'], output_steps=ULTRA_SHORT_CONFIG['forecast_steps'] ).to(device) # 损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.Adam(model_ultra.parameters(), lr=ULTRA_SHORT_CONFIG['lr']) scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=5, verbose=True) # 训练模型 history_ultra = train_model( model_ultra, train_loader, val_loader, criterion, optimizer, scheduler, ULTRA_SHORT_CONFIG['epochs'], 'ultra_short' ) # 评估模型 actuals_ultra, preds_ultra, mae_ultra, rmse_ultra = evaluate_model( model_ultra, test_loader, y_scaler, '超短期' ) # 可视化结果 plot_training_history(history_ultra, '超短期模型') # 获取对应的时间戳 ultra_timestamps = timestamps[ULTRA_SHORT_CONFIG['look_back']:][:len(actuals_ultra)] results_ultra = plot_predictions( actuals_ultra, preds_ultra, ultra_timestamps, '超短期', ULTRA_SHORT_CONFIG['forecast_steps'], mae_ultra ) # 准备短期预测数据集 print("\n准备短期预测数据集...") # 创建数据集 dataset_short = WindPowerDataset(X_scaled, y_scaled, SHORT_TERM_CONFIG['look_back'], SHORT_TERM_CONFIG['forecast_steps']) # 划分数据集 train_size_short = int(0.8 * len(dataset_short)) val_size_short = int(0.1 * len(dataset_short)) test_size_short = len(dataset_short) - train_size_short - val_size_short train_dataset_short, val_dataset_short, test_dataset_short = torch.utils.data.random_split( dataset_short, [train_size_short, val_size_short, test_size_short] ) # 创建数据加载器 train_loader_short = DataLoader(train_dataset_short, batch_size=SHORT_TERM_CONFIG['batch_size'], shuffle=True) val_loader_short = DataLoader(val_dataset_short, batch_size=SHORT_TERM_CONFIG['batch_size']) test_loader_short = DataLoader(test_dataset_short, batch_size=SHORT_TERM_CONFIG['batch_size']) # 创建模型 model_short = WindPowerLSTM( input_size=X.shape[1], hidden_size=SHORT_TERM_CONFIG['hidden_size'], num_layers=SHORT_TERM_CONFIG['num_layers'], output_steps=SHORT_TERM_CONFIG['forecast_steps'] ).to(device) # 损失函数和优化器 optimizer_short = optim.Adam(model_short.parameters(), lr=SHORT_TERM_CONFIG['lr']) scheduler_short = ReduceLROnPlateau(optimizer_short, mode='min', factor=0.5, patience=10, verbose=True) # 训练模型 history_short = train_model( model_short, train_loader_short, val_loader_short, criterion, optimizer_short, scheduler_short, SHORT_TERM_CONFIG['epochs'], 'short_term' ) # 评估模型 actuals_short, preds_short, mae_short, rmse_short = evaluate_model( model_short, test_loader_short, y_scaler, '短期' ) # 可视化结果 plot_training_history(history_short, '短期模型') # 获取对应的时间戳 short_timestamps = timestamps[SHORT_TERM_CONFIG['look_back']:][:len(actuals_short)] results_short = plot_predictions( actuals_short, preds_short, short_timestamps, '短期', SHORT_TERM_CONFIG['forecast_steps'], mae_short ) # 最终报告 print("\n" + "="*50) print("风功率预测模型训练完成!") print("="*50) print(f"超短期模型 (4小时预测):") print(f" - 回溯步长: {ULTRA_SHORT_CONFIG['look_back']} (6小时)") print(f" - 预测步长: {ULTRA_SHORT_CONFIG['forecast_steps']} (4小时)") print(f" - 测试集MAE: {mae_ultra:.2f} kW") print(f" - 测试集RMSE: {rmse_ultra:.2f} kW") print(f"\n短期模型 (72小时预测):") print(f" - 回溯步长: {SHORT_TERM_CONFIG['look_back']} (24小时)") print(f" - 预测步长: {SHORT_TERM_CONFIG['forecast_steps']} (72小时)") print(f" - 测试集MAE: {mae_short:.2f} kW") print(f" - 测试集RMSE: {rmse_short:.2f} kW") print("="*50) # 保存预测结果 results_df = pd.DataFrame({ 'timestamp': short_timestamps, '实际功率': actuals_short, '超短期预测': results_ultra['predicted'].values[:len(actuals_short)], '短期预测': preds_short }) results_df.to_csv('风功率预测结果.csv', index=False) print("预测结果已保存到 '风功率预测结果.csv'") if __name__ == "__main__": main() 请在上述的代码基础上修改,本次修改要求只使用"阿拉山口风电场_EC_data"和"阿拉山口风电场风机数据"这两个数据集进行训练和预测。
最新发布
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值