理解 pandas.DataFrame.corrwith 列式和行式 spearman 秩相关计算的方法
Understanding pandas.DataFrame.corrwith method for spearman rank correlation calculation column-wise and row-wise
我有两个这样的数据框:
preds_df = pd.DataFrame.from_records ([[ 0.8224], [ 0.7982]])
tgts_df = pd.DataFrame.from_records ([[0.8889], [1.0000]])
并且想要计算跨列和跨行的斯皮尔曼等级相关值:
col_wise = preds_df.corrwith(tgts_df,method='spearman',axis=0).values.tolist()
row_wise = preds_df.corrwith(tgts_df,method='spearman',axis=1).values.tolist()
打印这些值得到:
print(col_wise)
[-0.9999999999999999]
print(row_wise)
[nan, nan]
问题 1: col_wise
产生了一些结果,但为什么 row_wise
会为每一行产生 nan
,因为每一行都恰好包含一个列并且为 col_wise
获得的值不是 nan
?
如果我进一步扩展这些数据集(保留原始列但再添加两列),这样
preds_df = pd.DataFrame.from_records ([[0.8224, 0.5371, 0.1009], [0.7982, 0.5890, 0.0962]])
tgts_df = pd.DataFrame.from_records ([[0.8889, 0.5556, 0.0000], [1.0000, 0.7778, 0.0000]])
获得的值为:
col_wise = preds_df.corrwith(tgts_df,method='spearman',axis=0).values.tolist()
print(col_wise)
[-0.9999999999999999, 0.9999999999999999, nan]
row_wise = preds_df.corrwith(tgts_df,method='spearman',axis=1).values.tolist()
print(row_wise)
[1.0, 1.0]
问题 2:为什么 row_wise
不包含 nan
,即使构成每一行的列之一(第三列)已经产生nan
在 col_wise
?
问题三:一般情况下,为什么会得到nan
个值?我的输入数据帧中都有实数。
问题 1:
请注意,当您想要逐行计算 Spearman 相关系数时,您会从两个帧 (0.8224, 0.8889
) 中获得两个单元素样本,对应于系数列表中的第一个元素和 (0.7982,1.0000
)对应另一个。现在查看 formula 的系数。因为您在两个样本中都有一个观察值,所以分母等于零,这就是您得到 NaN
值的原因。
问题2和3:
上述问题不适用于您的第二个示例,但您在 tgts_df
的最后一列中有具有相同值 (0.0
) 的观察结果,这导致了所谓的并列排名(参见 more here).一般在三种情况下要得到NaN
个值:
1. 您的样本每组中只有一个元素。
2.数据中存在联系(具有相同值的观察值)。
3.两个dataframe对象的形状不一样。
如果您有任何进一步的 issues/questions,请随时在 CrossValidated 上提问。
我有两个这样的数据框:
preds_df = pd.DataFrame.from_records ([[ 0.8224], [ 0.7982]])
tgts_df = pd.DataFrame.from_records ([[0.8889], [1.0000]])
并且想要计算跨列和跨行的斯皮尔曼等级相关值:
col_wise = preds_df.corrwith(tgts_df,method='spearman',axis=0).values.tolist()
row_wise = preds_df.corrwith(tgts_df,method='spearman',axis=1).values.tolist()
打印这些值得到:
print(col_wise)
[-0.9999999999999999]
print(row_wise)
[nan, nan]
问题 1: col_wise
产生了一些结果,但为什么 row_wise
会为每一行产生 nan
,因为每一行都恰好包含一个列并且为 col_wise
获得的值不是 nan
?
如果我进一步扩展这些数据集(保留原始列但再添加两列),这样
preds_df = pd.DataFrame.from_records ([[0.8224, 0.5371, 0.1009], [0.7982, 0.5890, 0.0962]])
tgts_df = pd.DataFrame.from_records ([[0.8889, 0.5556, 0.0000], [1.0000, 0.7778, 0.0000]])
获得的值为:
col_wise = preds_df.corrwith(tgts_df,method='spearman',axis=0).values.tolist()
print(col_wise)
[-0.9999999999999999, 0.9999999999999999, nan]
row_wise = preds_df.corrwith(tgts_df,method='spearman',axis=1).values.tolist()
print(row_wise)
[1.0, 1.0]
问题 2:为什么 row_wise
不包含 nan
,即使构成每一行的列之一(第三列)已经产生nan
在 col_wise
?
问题三:一般情况下,为什么会得到nan
个值?我的输入数据帧中都有实数。
问题 1:
请注意,当您想要逐行计算 Spearman 相关系数时,您会从两个帧 (0.8224, 0.8889
) 中获得两个单元素样本,对应于系数列表中的第一个元素和 (0.7982,1.0000
)对应另一个。现在查看 formula 的系数。因为您在两个样本中都有一个观察值,所以分母等于零,这就是您得到 NaN
值的原因。
问题2和3:
上述问题不适用于您的第二个示例,但您在 tgts_df
的最后一列中有具有相同值 (0.0
) 的观察结果,这导致了所谓的并列排名(参见 more here).一般在三种情况下要得到NaN
个值:
1. 您的样本每组中只有一个元素。
2.数据中存在联系(具有相同值的观察值)。
3.两个dataframe对象的形状不一样。
如果您有任何进一步的 issues/questions,请随时在 CrossValidated 上提问。