基于Datetime索引的Seaborn热图:年月轴与收益率百分比展示
解决Seaborn热图:按年份X轴、月份Y轴展示收益率的问题
我明白你现在的困扰啦——手里有经过pct_change()处理的收益率序列,索引还是Datetime类型,想做成年份为X轴、月份为Y轴的热图,但试了几种方法都没成功对吧?别慌,咱们一步步把数据捋顺,再画热图就简单了!
核心思路
Seaborn的heatmap()需要二维的表格数据(行对应Y轴、列对应X轴),而咱们的原始数据是一维的时间序列,所以关键步骤是:把Datetime索引拆成年份和月份,然后将数据重塑成透视表格式。
具体步骤&代码
假设你的收益率序列叫returns(已经做过pct_change(),且索引是Datetime对象),咱们这么操作:
拆分时间索引,提取年份和月份
先把索引转成列,然后用Pandas的dt属性提取年份和月份(用月份名称比数字更直观,当然也可以用数字):import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 把一维序列转成DataFrame,索引转成列 returns_df = returns.reset_index() # 提取年份 returns_df['year'] = returns_df['index'].dt.year # 提取月份名称(比如"January"),如果想用数字就换成dt.month returns_df['month'] = returns_df['index'].dt.month_name()转成热图需要的透视表格式
用pivot()把数据转成“行=月份,列=年份,值=收益率”的二维表:# 这里的0是pct_change后的值列名,如果你的列名不是0,换成实际列名 heatmap_data = returns_df.pivot(index='month', columns='year', values=0)调整月份顺序(关键!)
默认情况下,月份会按字母顺序排列(比如April在最前面),这不符合咱们的认知,所以手动指定月份顺序:month_order = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ] heatmap_data = heatmap_data.reindex(month_order)绘制热图
最后调用Seaborn的heatmap(),加上百分比标注、配色等参数:plt.figure(figsize=(12, 8)) # annot=True显示数值,fmt='.2%'按百分比格式显示,cmap选你喜欢的配色 sns.heatmap(heatmap_data, annot=True, fmt='.2%', cmap='coolwarm', cbar=True) plt.title('Monthly Returns by Year') plt.xlabel('Year') plt.ylabel('Month') plt.show()
小提示
- 如果你的数据里有缺失的年月组合,透视表会自动填充
NaN,热图里会显示空白,你可以用heatmap_data.fillna(0)把缺失值换成0,或者根据需求处理。 - 如果想用月份数字(1-12),把
dt.month_name()换成dt.month,然后month_order改成range(1,13)即可。
内容的提问来源于stack exchange,提问作者Merv Merzoug
相关产品推荐
相关产品推荐

