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

如何按年份生成DataFrame中Qentrada与Qsalida的相关矩阵?

按年份分组计算月度数据的相关矩阵并可视化

步骤1:确保索引为datetime类型

首先确认你的FECHA索引是datetime格式,若不是先转换:

corr.index = pd.to_datetime(corr.index)

步骤2:按年份分组计算相关矩阵

使用groupby按年份拆分数据,对每个分组应用.corr()生成年度相关矩阵:

# 生成带年份索引的年度相关矩阵
yearly_corr = corr.groupby(corr.index.year).corr()

输出结果为多层索引结构,外层是年份,内层是列名,示例如下:

Qentrada   Qsalida
2017 Qentrada  1.000000  0.234567
     Qsalida   0.234567  1.000000
2018 Qentrada  1.000000  0.567890
     Qsalida   0.567890  1.000000
...

如果只需要提取Qentrada和Qsalida的交叉相关系数(非对角线值),可以用以下代码直接生成年度相关系数序列:

yearly_cross_corr = corr.groupby(corr.index.year).apply(lambda x: x['Qentrada'].corr(x['Qsalida']))

步骤3:可视化实现

方式1:热力图展示年度相关矩阵

将多层索引的结果转换为宽格式,用seaborn绘制热力图:

import seaborn as sns
import matplotlib.pyplot as plt

# 转换为宽格式表格
corr_matrix_df = yearly_corr.unstack(level=0)

# 绘制热力图
plt.figure(figsize=(10, 6))
sns.heatmap(corr_matrix_df, annot=True, cmap='coolwarm', fmt='.4f')
plt.title('各年份Qentrada与Qsalida相关矩阵')
plt.show()

方式2:折线图展示相关系数年度变化

聚焦两个变量的相关系数变化趋势,用折线图更直观:

plt.figure(figsize=(10, 6))
yearly_cross_corr.plot(kind='line', marker='o', color='#2e86de')
plt.title('Qentrada与Qsalida年度相关系数变化')
plt.xlabel('年份')
plt.ylabel('Pearson相关系数')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

方式3:子图展示单个年度相关矩阵

若需要单独查看每一年的相关矩阵,可生成子图布局:

years = corr.index.year.unique()
n_cols = 3
n_rows = (len(years) + n_cols - 1) // n_cols

fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, 10))
axes = axes.flatten()

for i, year in enumerate(years):
    year_data = corr[corr.index.year == year]
    corr_matrix = year_data.corr()
    sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.4f', ax=axes[i])
    axes[i].set_title(f'{year}年相关矩阵')

# 隐藏多余子图
for j in range(i+1, len(axes)):
    axes[j].axis('off')

plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者Guille GL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:35:18