You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多时间步预测值与实际值进行透视重排?

优化多时间步预测数据重排的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:26:11