Получение `ValueError: массив не должен содержать infs или NaNs` даже после использования` np.nan_to_num () ` - PullRequest
0 голосов
/ 03 апреля 2020

Я получаю это ValueError: array must not contain infs or NaNs даже после того, как я использовал np.nan_to_num().

Как вы можете видеть в блоке кода ниже, я написал функцию, которая выставляет оценки настроения через функцию logit в получить нормальное распределение. Сначала я получил ValueError выше, поэтому я решил попробовать использовать np.nan_to_num() для оценки настроений, а затем ввести их в функцию pearsonr. Однако даже после этого это все еще создает ошибку. Когда я использую logit и np.nam_to_num() в отдельном модульном тесте и печатаю вывод, значения inf или nan отсутствуют (хотя: до использования np.nam_to_num() были некоторые инфы, вызванные функцией logit, но все они были успешно заменены в отдельном модульном тесте, который был напечатан). Я не уверен, что происходит в 1 oop ниже, хотя. Для справки, 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

Как вы можете видеть, я проверил, чтобы убедиться, что ни в одном из входных массивов для корреляции Пирсона нет значений nan или inf (pearsonr) , Все вернулось ложным. Функция прерывается, когда вызывается функция pearsonr, запускаются функции logit и np.nan_to_num() (я также напечатал их вывод, чтобы убедиться). И все же это все еще поднимает ValueError.

1 Ответ

0 голосов
/ 06 апреля 2020

np.nan_to_num заменяет значения inf на очень большое число, которое может вызвать дополнительные inf в дальнейшем. scipy.stats.pearsonr вычисляет mean входных массивов, и уже двух inf в исходном массиве достаточно, чтобы вызвать дополнительный inf из-за того, что сумма этих больших чисел превышает допустимую плавающую точку диапазон:

>>> np.nan_to_num(np.array([np.inf, np.inf])).mean()
inf

В зависимости от ваших потребностей вы можете либо полностью отбросить их с помощью x[np.isfinite(x)], либо использовать аргументы ключевых слов posinf и neginv для nan_to_num, чтобы заменить inf на меньшие значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...