如何用Pandas基于去年同周同工作日生成时间序列朴素预测?
高效实现同周同工作日的去年值预测
要高效实现「上一年同周同工作日」的朴素预测,核心是用向量化的匹配操作替代低效的apply,利用ISO周标识来精准匹配日期,避免闰年、工作日/周末差异带来的问题。具体实现步骤如下:
1. 确保日期列是datetime类型
先将Day列转换为Pandas datetime类型,这是后续日期操作的基础:
df['Day'] = pd.to_datetime(df['Day'])
2. 提取ISO标准的周标识
使用ISO标准的年、周、星期几来作为匹配键,避免普通周数在跨年/闰年场景下的混乱:
# 提取ISO日历信息:year=年份,week=当年周数,weekday=星期几(1=周一,7=周日) iso_calendar = df['Day'].dt.isocalendar() df['year'] = iso_calendar['year'] df['week'] = iso_calendar['week'] df['weekday'] = iso_calendar['weekday']
3. 用Merge实现高效向量化匹配
通过创建去年数据的副本并调整匹配年份,与原表合并实现批量匹配,这比逐行apply效率高得多:
# 复制去年数据,将年份+1作为匹配键(对应原表的当前年份) last_year_data = df.copy() last_year_data['match_year'] = last_year_data['year'] + 1 # 按「当前年份、周数、星期几」匹配去年的对应数据 df = df.merge( last_year_data[['match_year', 'week', 'weekday', 'Value']], left_on=['year', 'week', 'weekday'], right_on=['match_year', 'week', 'weekday'], how='left', suffixes=('', '_pred') ) # 生成预测列并清理临时字段 df['Prediction'] = df['Value_pred'] df.drop(columns=['match_year', 'Value_pred'], inplace=True)
4. 可选:清理辅助字段
如果不需要保留year、week、weekday这些临时列,可最后删除:
df.drop(columns=['year', 'week', 'weekday'], inplace=True)
效果说明
- 第一年的所有行因无对应上一年数据,
Prediction自动为NaN,符合需求; - 后续年份的行将精准匹配上一年同ISO周、同星期几的
Value值,自动区分工作日和周末; - Merge是Pandas的向量化操作,处理百万级行数据的效率远高于apply。
内容的提问来源于stack exchange,提问作者13sen1
相关产品推荐
相关产品推荐

