如何对子集数据执行按月前向填充以确保连续性

星静小哥_6367

星静小哥_6367

2026-07-15

1025人浏览

原创

如何对子集数据执行按月前向填充以确保连续性

本文介绍如何基于原始提交月份对分组数据进行智能前向填充,生成覆盖目标时间范围(如截至当前月)的完整月度序列,适用于销售预测、库存计划等需时间连续性的场景。

本文介绍如何基于原始提交月份对分组数据进行智能前向填充,生成覆盖目标时间范围(如截至当前月)的完整月度序列,适用于销售预测、库存计划等需时间连续性的场景。

在实际业务分析中,常遇到“稀疏提交 + 时间连续性要求”的矛盾:例如某 SKU-区域组合仅在 1 月和 4 月提交过预测数据,但下游系统需要 1–12 月每月均有对应记录。此时不能简单使用 df.fillna(method='ffill'),而需按逻辑分组、按时间轴扩展、再逐组前向填充——即对每个 (sku, location) 组合,将其历史提交视为“快照”,并将该快照向前延展至下一个快照出现前,或直至截止月份(如 2023 年 12 月)。

核心思路是:将数据重塑为以 submissionmonth 为行索引、forecastmonth 为列索引的宽表结构,利用 reindex 补全缺失的提交月份,再通过 ffill() 实现跨行前向填充,最后 stack() 恢复长格式。该方法天然支持多维度分组(无需显式 groupby),且严格保持原始数据的时间语义。

以下为完整实现代码(含关键注释与健壮性增强):

墨狐AI
墨狐AI

一款面向网络小说创作的AI写作工具,可辅助进行故事构思、人物设定和长篇小说内容生成,帮助作者提高创作效率。

下载
import pandas as pd

# 构建原始数据
input_data = pd.DataFrame([
    {"submissionmonth": "Jan-2023", "sku": "A1", "location": "sup1", "forecastmonth": "Jan-2023", "cost": 100},
    {"submissionmonth": "Jan-2023", "sku": "A1", "location": "sup1", "forecastmonth": "Feb-2023", "cost": 105},
    {"submissionmonth": "Jan-2023", "sku": "A1", "location": "sup1", "forecastmonth": "Mar-2023", "cost": 108},
    {"submissionmonth": "Jan-2023", "sku": "A1", "location": "sup1", "forecastmonth": "Apr-2023", "cost": 106},
    {"submissionmonth": "Apr-2023", "sku": "A1", "location": "sup1", "forecastmonth": "Apr-2023", "cost": 101},
    {"submissionmonth": "Apr-2023", "sku": "A1", "location": "sup1", "forecastmonth": "May-2023", "cost": 102},
    {"submissionmonth": "Apr-2023", "sku": "A1", "location": "sup1", "forecastmonth": "Jun-2023", "cost": 109},
    {"submissionmonth": "Apr-2023", "sku": "A1", "location": "sup1", "forecastmonth": "Jul-2023", "cost": 104},
    {"submissionmonth": "Oct-2023", "sku": "A2", "location": "sup2", "forecastmonth": "Oct-2023", "cost": 101},
    {"submissionmonth": "Oct-2023", "sku": "A2", "location": "sup2", "forecastmonth": "Nov-2023", "cost": 102},
    {"submissionmonth": "Oct-2023", "sku": "A2", "location": "sup2", "forecastmonth": "Dec-2023", "cost": 109},
    {"submissionmonth": "Oct-2023", "sku": "A2", "location": "sup2", "forecastmonth": "Jan-2024", "cost": 104},
])

# ✅ 步骤 1:解析并确定时间范围
submission_dt = pd.to_datetime(input_data["submissionmonth"], format="%b-%Y")
forecast_dt = pd.to_datetime(input_data["forecastmonth"], format="%b-%Y")

# 设定截止月份(示例为 2023-12)
cutoff_month = pd.Timestamp("2023-12-01")

# 构建完整提交月份序列:从首个提交月到截止月(含)
full_submission_months = pd.date_range(
    start=submission_dt.min(), 
    end=cutoff_month, 
    freq="MS"  # Month Start,确保 Jan-2023 → 2023-01-01
).strftime("%b-%Y")

# ✅ 步骤 2:重塑 → 填充 → 恢复
output_data = (
    input_data
    .set_index(["submissionmonth", "forecastmonth"])  # 多级索引便于 pivot
    .unstack("forecastmonth")                          # forecastmonth 变为列
    .reindex(full_submission_months, axis=0)           # 补全所有提交月(含中间空缺)
    .ffill()                                           # 按行前向填充(继承最近有效快照)
    .stack("forecastmonth")                            # 列转回行,恢复 forecastmonth 列
    .reset_index(name="cost")                          # 重置索引,cost 作为值列
)

# ✅ 步骤 3:还原原始列顺序(可选但推荐)
output_data = output_data[input_data.columns]

print(f"Original shape: {input_data.shape}")
print(f"Output shape:   {output_data.shape}")
output_data.head(10)

注意事项与最佳实践:

  • 时间格式一致性:务必统一用 pd.to_datetime(..., format="%b-%Y") 解析,避免 Jan-2023 被误判为 2023-01-01 或 2023-01-00;
  • 截止月设定:示例中硬编码 cutoff_month,生产环境建议动态获取:pd.Timestamp.today().replace(day=1);
  • 多维分组保障:本方案隐式满足 (sku, location) 级别独立填充——因 set_index 包含全部标识字段,unstack 后每个组合独占一行;
  • 性能提示:若数据量极大(>100 万行),可先 groupby(['sku','location']) 分块处理,避免宽表内存膨胀;
  • 边界验证:输出中 submissionmonth 应覆盖 Jan-2023 至 Dec-2023,且每个 submissionmonth 对应的 forecastmonth 集合应与该快照原始覆盖范围一致(如 Apr-2023 提交始终带 Apr–Jul-2023 四个月预测)。

此方法兼顾简洁性与鲁棒性,是构建时序连续数据管道的标准范式。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

2025.12.04

280

15

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

2026.01.31

212

21

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

2026.04.13

291

25

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

0

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

0

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

0

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

0

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

0

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

0

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习