【发布时间】:2020-07-15 07:40:53
【问题描述】:
即使在我使用了np.nan_to_num() 之后,我也收到了这个ValueError: array must not contain infs or NaNs。
正如您在下面的代码块中所见,我编写了一个函数,它通过logit 函数将情绪得分置于正态分布中。我最初得到了上面的ValueError,所以我决定尝试在情绪分数上使用np.nan_to_num(),然后将它们输入到pearsonr 函数中。但是,即使在那之后它仍然会产生错误。当我在单独的单元测试中使用 logit 和 np.nam_to_num() 并打印输出时,没有 inf 或 nan 值(注意:虽然在使用 np.nam_to_num() 之前有一些 infs,但由 logit 函数引起,但它们都在打印的单独单元测试中被成功替换)。我不确定下面的循环中发生了什么。作为参考,new_all_data 只是我用来存储所有各种信息的 pandas 数据框。任何帮助表示赞赏!
from scipy import special, stats
import numpy as np
def logit_correlate(sentiments, percent_changes):
normalised_sentiments = special.logit(sentiments)
normalised_sentiments_fixed = np.nan_to_num(normalised_sentiments)
r, p_value = stats.pearsonr(normalised_sentiments_fixed, percent_changes)
return r, p_value
for sentiment in ['weighted_sentiments', 'unweighted_sentiments', 'weighted_sentiments_DBSCAN', 'full_mean', 'full_mean_unrounded', 'full_mode']:
r_1yr, p_value_1yr = logit_correlate(new_all_data[sentiment], new_all_data['% change 1 year'])
print(f'{sentiment:10} 1 year r={r_1yr:10} p={p_value_1yr:10}')
编辑:我进行了另一项测试以确保我没有失去理智。这是修改后的logit_correlate函数:
def logit_correlate(sentiments, percent_changes):
normalised_sentiments = special.logit(sentiments)
normalised_sentiments_fixed = np.nan_to_num(normalised_sentiments)
print(np.isnan(normalised_sentiments_fixed).any())
print(np.isinf(normalised_sentiments_fixed).any())
print(np.isnan(percent_changes.values).any())
print(np.isinf(percent_changes.values).any())
r, p_value = stats.pearsonr(normalised_sentiments_fixed, percent_changes)
return r, p_value
如您所见,我检查以确保 pearson 相关 (pearsonr) 的任一输入数组中都没有 nan 或 inf 值。一切都返回错误。当调用 pearsonr 函数时,函数会中断,logit 和 np.nan_to_num() 函数都会运行(我也打印了它们的输出以确保)。然而它仍然在提高ValueError。
【问题讨论】:
-
我不确定是不是这个问题,但您在打印出
percent_changes.values时传递了percent_changes。 -
我使用 .values 是因为它是 pandas 系列,我希望打印所有值。但是 pearsonr 函数接受任何类似数组的东西,所以怀疑这就是问题所在。
-
请包含完整的回溯。
np.nan_to_num用一些非常大的数字替换无穷大值,因此根据pearsonr执行的数学运算,这些大数字可能会导致额外的infs 出现。检查如果您删除它们或通过posinf=..., neginf=...关键字手动设置它们会发生什么。 -
如果您提供minimal, reproducible example,别人会更容易帮助您。
-
@a_guest
np.nan_to_num肯定会创建一些大数字(e308 和 e-308),也许这些是导致错误的原因,即使它们实际上不是 inf?我可以尝试手动设置谢谢!另外,您能解释一下包含完整回溯的意思吗? @Warren Weckesser 我将尝试使用虚拟数据创建一个可重现的最小示例。