我有两个这样的数据处理程序:
preds_df = pd.DataFrame.from_records ([[ 0.8224], [ 0.7982]])
tgts_df = pd.DataFrame.from_records ([[0.8889], [1.0000]])
并希望计算跨列和跨行的spearman秩相关值:
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
,即使每个行生成的列之一(第三列)在col_wise
中生成了nan
问题3:一般情况下,,为什么得到nan
值?我输入的数据都有实数。
发布于 2019-12-22 22:37:14
问题1:注意,当您想按行计算Spearman相关系数时,您从两个框架(0.8224, 0.8889
)中得到两个一个元素样本,它们对应于系数列表中的第一个元素,和(0.7982,1.0000
)对应的另一个元素。现在看看系数的公式。因为两个样本中都有一个观测值,所以分母等于零,这就是为什么得到NaN
值的原因。
问题2和3:上述问题不适用于您的第二个示例,但是在tgts_df
的最后一栏中有相同值(0.0
)的观察结果,这会导致所谓的平分级别(参见更多在这里)。在获得NaN
值时,通常有三种情况:
1.每个组中只有一个元素的样本。
2.在数据中有联系(观察值相同)。
3.两个数据对象的形状不一样。
如果您有任何进一步的问题/问题,欢迎在CrossValidated上提问。
https://stackoverflow.com/questions/59448190
复制相似问题