如何将多时间步预测值与实际值进行透视重排?
优化多时间步预测数据重排的Python方案
原代码的核心需求是将多时间步预测数据重排为:每行包含日期、实际值、预测编号,以及对应4个时间步的预测值。以下是针对代码效率、可读性的优化建议:
一、原代码的核心问题
- 嵌套循环生成预测列,时间复杂度为O(n*k)(n为数据行数,k为预测步长),数据量大时效率极低
- 重排部分通过循环拼接字典列表,逻辑冗余且易出错
- 用空字符串填充NaN,导致数值列变为字符串类型,后续分析会出问题
二、优化后的代码实现
import pandas as pd import numpy as np np.random.seed(42) # 1. 生成基础数据 date_range = pd.date_range(start="2023-01-01", end="2023-01-10", freq='D') actual_values = np.random.randint(90, 110, size=len(date_range)) df = pd.DataFrame({'Date': date_range, 'Actual': actual_values}) prediction_period = 4 # 2. 批量生成所有预测数据 # 创建预测矩阵:每行对应一个起始日期的4步预测 predictions_matrix = np.random.randint(90, 110, size=(len(df), prediction_period)) # 生成预测列名 pred_cols = [f'prediction_{i+1}' for i in range(len(df))] # 将预测矩阵转为DataFrame并与原数据合并 predictions_df = pd.concat([df, pd.DataFrame(predictions_matrix, columns=pred_cols)], axis=1) # 3. 构造重排所需的核心数据 # 生成每个预测编号对应的4个时间步的索引偏移 offset_df = pd.DataFrame({ 'Prediction': np.repeat(pred_cols, prediction_period), 'time_step': np.tile(range(1, prediction_period+1), len(df)), 'row_offset': np.tile(range(prediction_period), len(df)) }) # 合并基础数据与偏移信息,过滤超出数据范围的行 merged = offset_df.merge(df.reset_index(), how='cross') merged = merged[merged['index'] + merged['row_offset'] < len(df)] # 获取对应行的预测值 merged['pred_value'] = merged.apply( lambda x: predictions_df.loc[x['index'] + x['row_offset'], x['Prediction']], axis=1 ) # 4. 透视得到目标格式 reshaped_df = merged.pivot( index=['Date', 'Actual', 'Prediction'], columns='time_step', values='pred_value' ).reset_index() # 重命名时间步列 reshaped_df.columns = ['Date', 'Actual', 'Prediction'] + [f'time_from_actual_{i}' for i in range(1, prediction_period+1)] # 填充超出预测范围的NaN为合适值(这里用NaN,如需空字符串可替换为'') reshaped_df = reshaped_df.fillna(np.nan)
三、关键优化点
- 批量生成预测:用numpy矩阵一次性生成所有预测,避免循环逐行处理,效率提升明显
- 利用pandas的merge/pivot:替代手动循环拼接字典,逻辑更清晰,代码更简洁
- 保留数值类型:不再用空字符串填充NaN,后续可灵活处理缺失值
- 避免重复计算:通过索引偏移统一管理预测行的对应关系,减少冗余操作
四、额外建议
- 如果预测步长或数据量极大,可以考虑用
pd.Series的shift方法生成预测关联,进一步提升效率 - 若需要空字符串而非NaN,可将最后一步的
fillna(np.nan)改为fillna(''),但注意数值类型会转为object
内容的提问来源于stack exchange,提问作者vestland
相关产品推荐
相关产品推荐

