如何计算DataFrame中各国逐年相关系数,生成21个72×72相关矩阵
解决方法
你之前的所有尝试出错的核心原因是混淆了Series.corr()和DataFrame.corr()的用法:
Series.corr(other):用于计算两个一维序列的相关系数,返回单个数值,必须传入第二个序列作为参数DataFrame.corr():用于计算DataFrame所有列两两的相关系数,返回n×n的矩阵(n为列数)
错误原因梳理
- 前两种尝试:你每次取
dfpivot[x]得到的是单年份的72个国家值,属于Series类型,直接调用corr()没有传入第二个对比序列,所以报缺少参数的错误。 - 第三种尝试:你传入的对比序列是同一列,自身和自身计算相关系数结果自然全为1。
- 第四种尝试:你每次都是拿两个单年份的Series计算相关,返回单个数值,所以最终字典里只存储了每个年份的单个相关值,没有得到矩阵。
正确实现代码
你只需要把原DataFrame转置,让年份作为行、国家作为列,每次取相邻两年的两行数据调用corr()即可得到72×72的相关矩阵:
import pandas as pd # 先转置原数据,转置后形状为(22,72),行是年份,列是国家 df_T = dfpivot.T # 存储结果的字典,key为对应当年的年份,value为72×72相关矩阵 corr_matrices = {} # 遍历所有相邻年份对,共21组 for idx in range(1, len(df_T)): # 取前一年和当年的两行数据 two_year_slice = df_T.iloc[[idx-1, idx]] # 计算相关矩阵,可根据需要加min_periods参数处理空值 curr_matrix = two_year_slice.corr(min_periods=1) # 存入字典,用当年的年份作为key curr_year = df_T.index[idx] corr_matrices[curr_year] = curr_matrix
如果对空值处理有特殊要求,可以调整corr()方法的参数适配你的场景。
内容的提问来源于stack exchange,提问作者Bigboss01
相关产品推荐
相关产品推荐

