You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Datetime索引的Seaborn热图:年月轴与收益率百分比展示

解决Seaborn热图:按年份X轴、月份Y轴展示收益率的问题

我明白你现在的困扰啦——手里有经过pct_change()处理的收益率序列,索引还是Datetime类型,想做成年份为X轴、月份为Y轴的热图,但试了几种方法都没成功对吧?别慌,咱们一步步把数据捋顺,再画热图就简单了!

核心思路

Seaborn的heatmap()需要二维的表格数据(行对应Y轴、列对应X轴),而咱们的原始数据是一维的时间序列,所以关键步骤是:把Datetime索引拆成年份和月份,然后将数据重塑成透视表格式。

具体步骤&代码

假设你的收益率序列叫returns(已经做过pct_change(),且索引是Datetime对象),咱们这么操作:

  1. 拆分时间索引,提取年份和月份
    先把索引转成列,然后用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()
    
  2. 转成热图需要的透视表格式
    用pivot()把数据转成“行=月份,列=年份,值=收益率”的二维表:

    # 这里的0是pct_change后的值列名,如果你的列名不是0,换成实际列名
    heatmap_data = returns_df.pivot(index='month', columns='year', values=0)
    
  3. 调整月份顺序(关键!)
    默认情况下,月份会按字母顺序排列(比如April在最前面),这不符合咱们的认知,所以手动指定月份顺序:

    month_order = [
        'January', 'February', 'March', 'April', 'May', 'June',
        'July', 'August', 'September', 'October', 'November', 'December'
    ]
    heatmap_data = heatmap_data.reindex(month_order)
    
  4. 绘制热图
    最后调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:53:47