Python Ошибка: TypeError: неподдерживаемые типы операндов для -: 'int' и 'function' - PullRequest
0 голосов
/ 19 июня 2020

Я работаю над заданием. Я продолжаю получать TypeError: неподдерживаемые типы операндов для -: 'int' и 'function' даже после исследования ошибки и применения предложенных исправлений. Я не ищу кого-нибудь, чтобы дать мне решение, но я был бы признателен за второй взгляд. Я что-то упускаю, но не знаю что. Это раздел кода, с которым у меня проблемы:

accuracies = [calculate_accuracy(df['Close'].iloc[-test_size:].values, r) for r in results]

plt.figure(figsize = (15, 5))
for no, r in enumerate(results):
    plt.plot(r, label = 'forecast %d'%(no + 1))
plt.plot(df['Close'].iloc[-test_size:].values, label = 'true trend', c = 'black')
plt.legend()
plt.title('average accuracy: %.4f'%(np.mean(accuracies)))
plt.show()

И полученный код ответа:

<ipython-input-109-bece89ad4cea> in <listcomp>(.0)
----> 1 accuracies = [calculate_accuracy(df['Close'].iloc[-test_size:].values, r) for r in results]
      2 
      3 plt.figure(figsize = (15, 5))
      4 for no, r in enumerate(results):
      5     plt.plot(r, label = 'forecast %d'%(no + 1))

<ipython-input-105-f18f06dc1a5f> in calculate_accuracy(real, predict)
     60 def calculate_accuracy(real, predict):
     61     real = np.array(real) + 1
---> 62     predict = np.array(predict) + 1
     63     percentage = 1 - np.sqrt(np.mean(np.square((real - predict) / real)))
     64     return percentage * 100

TypeError: unsupported operand type(s) for +: 'function' and 'int'

Если у вас есть какое-либо представление об этом, мы будем очень признательны. !

Ответы [ 3 ]

0 голосов
/ 19 июня 2020

Вот часть кода, которая вызвала ошибку:

calculate_accuracy(df['Close'].iloc[-test_size:].values

В конце строки вы видите .value.
value - это функция, которая возвращает массив всех значений из указанного словаря,
и, как и любую другую функцию, вам нужно () для ее вызова, иначе вы будете только ссылаться на нее.

Если вы print(calculate_accuracy(df['Close'].iloc[-test_size:].values),
вы получите что-то вроде:

<built-in method values of dict object at 0x02AD2AF0>

Исправленный код будет:

calculate_accuracy(df['Close'].iloc[-test_size:].values()
0 голосов
/ 19 июня 2020

Все были сосредоточены на values. Но values - допустимое использование для DataFrame. values() - использование словаря.

Более внимательно посмотрите на трассировку:

<ipython-input-109-bece89ad4cea> in <listcomp>(.0)
----> 1 accuracies = [calculate_accuracy(df['Close'].iloc[-test_size:].values, r) for r in results]
...
<ipython-input-105-f18f06dc1a5f> in calculate_accuracy(real, predict)
     60 def calculate_accuracy(real, predict):
     61     real = np.array(real) + 1
---> 62     predict = np.array(predict) + 1
...

TypeError: unsupported operand type(s) for +: 'function' and 'int'

Проблема с predict, вторым аргументом для calculate_accuracy, элементом r с results. Первый аргумент real в порядке.

Тем не менее, я не могу представить, как np.array(predict) даст function.

Что такое results? Как это производится? Ошибка предполагает, что это список функций. Почему?

Возможно, вы также захотите показать функцию calculate_accuracy, но мы, вероятно, увидим достаточно ее в трассировке ошибок.

0 голосов
/ 19 июня 2020

values ​​- это имя функции, если вы хотите получить значение значений, следует вызвать ее с помощью values ​​().

Следует заменить

calculate_accuracy(df['Close'].iloc[-test_size:].values

на

calculate_accuracy(df['Close'].iloc[-test_size:].values()
...