如何在Python中实现时间序列的年度堆叠(Annual Stack)?
Python实现年度堆叠(Annual Stack)方法
核心思路
年度堆叠的关键是将不同年份的时间序列按月-日维度对齐,先对单年度数据做归一化,再将各年份数据堆叠展示,对比年度间的时序模式差异。以下是基于pandas和matplotlib的完整实现方案:
完整代码示例
import pandas as pd import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter # ---------------------- 1. 读取并预处理数据 ---------------------- # 读取数据(替换为你的实际数据路径或直接传入数据列表) data = pd.read_csv('your_data.txt', sep=' ', header=None, names=['date', 'value']) # 解析日期为datetime格式 data['date'] = pd.to_datetime(data['date']) # 设置日期为索引 data = data.set_index('date') # ---------------------- 2. 按年份分组并归一化 ---------------------- # 定义min-max归一化函数(可按需替换为z-score等其他方式) def normalize_series(s): return (s - s.min()) / (s.max() - s.min()) # 按年份分组,对每组数据执行归一化 grouped = data.groupby(data.index.year)['value'].apply(normalize_series) # 重置索引,拆分日期维度信息 grouped = grouped.reset_index() grouped['month_day'] = grouped['date'].dt.strftime('%m-%d') # 将月-日转换回datetime格式,方便绘图时的轴处理 grouped['month_day'] = pd.to_datetime(grouped['month_day'], format='%m-%d') # ---------------------- 3. 绘制年度堆叠图 ---------------------- plt.figure(figsize=(12, 6)) # 按年份遍历绘制每条曲线 for year in grouped['date'].dt.year.unique(): year_data = grouped[grouped['date'].dt.year == year] plt.plot(year_data['month_day'], year_data['value'], label=str(year)) # 设置x轴日期格式为月-日 date_form = DateFormatter("%m-%d") plt.gca().xaxis.set_major_formatter(date_form) # 添加图例、标签与标题 plt.legend(title='Year') plt.xlabel('Date (Month-Day)') plt.ylabel('Normalized Value') plt.title('Annual Stack of Normalized Time Series') plt.grid(alpha=0.3) plt.tight_layout() plt.show()
代码说明
- 数据读取:支持从文本文件读取,也可直接传入内存中的数据列表,需确保日期格式被正确解析。
- 归一化:默认使用min-max归一化将数据缩至[0,1]区间,若论文采用z-score归一化,可替换函数为
return (s - s.mean()) / s.std()。 - 堆叠对齐:通过提取
month_day字段实现跨年份的日期对齐,确保不同年份的同日期数据在x轴上对应同一位置。 - 可视化:每条曲线对应一个年份,图例区分不同年度,网格线提升图表可读性。
内容的提问来源于stack exchange,提问作者Lover Coffee
相关产品推荐
相关产品推荐

