Python/Pandas时间序列预测:基于两个DataFrame构建时序数据集
时间序列特征加工实现方案(Pandas 版本)
步骤1:基础数据合并
先统一两个表的日期格式,再按Date、store_id、product_id三个键关联,把订单量字段合并到销售额表中:
import pandas as pd # 统一日期字段为datetime格式,避免匹配失败 DF1['Date'] = pd.to_datetime(DF1['Date']) DF2['Date'] = pd.to_datetime(DF2['Date']) # 左连接保留DF1的全部记录,不需要的话可以改成inner内连接 merged_df = pd.merge( DF1, DF2, on=['Date', 'store_id', 'product_id'], how='left' ) # 无订单的日期填充订单量为0,可根据业务逻辑调整填充规则 merged_df['Orders'] = merged_df['Orders'].fillna(0)
步骤2:生成前n日历史订单滞后特征
必须按store_id+product_id分组后再做位移,避免不同门店、商品的时间序列混淆:
# 先按分组+日期升序排序,保证时间序列顺序正确 merged_df = merged_df.sort_values(by=['store_id', 'product_id', 'Date']).reset_index(drop=True) n = 7 # 自定义需要的滞后天数,比如要前3天就设为3 for lag_day in range(1, n+1): merged_df[f'Orders_lag_{lag_day}'] = merged_df.groupby(['store_id', 'product_id'])['Orders'].shift(lag_day) # 可选:删除前n天无足够历史数据的样本,避免特征缺失 merged_df = merged_df.dropna(subset=[f'Orders_lag_{i}' for i in range(1, n+1)])
步骤3:生成最终模型输入表
删除不需要的原始订单量字段,保留需要的输出字段:
model_input = merged_df.drop(columns=['Orders'])
输出的model_input就包含要求的Date、Sales、store_id、product_id,以及Orders_lag_1到Orders_lag_n的前n日历史订单特征。
补充说明:如果你的数据存在日期断档(比如部分门店/商品部分日期无记录),需要先补全连续日期再做滞后,否则滞后得到的是前i条记录而不是自然日的前i天数据,补全参考代码:
# 生成覆盖全周期的连续日期 all_dates = pd.date_range(start=merged_df['Date'].min(), end=merged_df['Date'].max(), freq='D') # 生成日期、门店、商品的全组合笛卡尔积 full_keys = pd.MultiIndex.from_product( [all_dates, merged_df['store_id'].unique(), merged_df['product_id'].unique()], names=['Date', 'store_id', 'product_id'] ) # 重索引补全缺失的日期记录 merged_df = merged_df.set_index(['Date', 'store_id', 'product_id']).reindex(full_keys).reset_index() # 补全后填充缺失值 merged_df['Orders'] = merged_df['Orders'].fillna(0) merged_df['Sales'] = merged_df['Sales'].fillna(0)
注意事项
- 合并的连接方式可根据业务需求调整:如果只要两个表都存在的日期记录,把
how='left'改为how='inner'即可 - 滞后特征的缺失值填充规则可以灵活调整,不需要丢弃样本的话也可以用0、均值或者时序填充方法处理
内容的提问来源于stack exchange,提问作者redwolf_cr7
相关产品推荐
相关产品推荐

