Numexpr в Python не распознает объявленный символ

#python #sympy #numexpr

#python #sympy #numexpr

Вопрос:

Я пытаюсь сделать некоторые графики некоторых символьных данных. У меня есть некоторое выражение из регрессии в форме:

 expr =  '(((((((((1.0)*(2.0)))-(ER)))-(-0.37419122066665467))*0.006633039574629684)*(0.006633039574629684*((((T)-(((1.0) (P)))))-(P)))) 0.1451920626347467)'
  

Где expr здесь есть некоторое предсказание : f = f(T, P, ER) . Я знаю, что этот конкретный пример — сумасшедшее выражение, но на самом деле это не очень важно. В принципе, предположим, что у меня есть некоторый фрейм данных, plotdata , я пытаюсь создавать графики с:

 import pandas
import sympy
import numexpr
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

expr =  '(((((((((1.0)*(2.0)))-(ER)))-(-0.37419122066665467))*0.006633039574629684)*(0.006633039574629684*((((T)-(((1.0) (P)))))-(P)))) 0.1451920626347467)'

#Extract some data for surface plot but fixing one variable
plotdata = plotdata.loc[(plotdata.P == 1)]

#Extract data as lists for plotting
x = list(plotdata['T'])
y = list(plotdata['ER'])
f_real = list(plotdata['f'])

T_sympy = sympy.Symbol('T')
P_sympy = sympy.Symbol('P')
ER_sympy = sympy.Symbol('ER')
f_pred = numexpr.evaluate(expr)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(x,y,f_real, alpha = 0.3)
ax.plot_surface(x,y,f_pred)
  

Однако я получаю сообщение об ошибке f_pred .

 numexpr.evaluate(expr)
Traceback (most recent call last):

  File "/anaconda3/lib/python3.7/site-packages/numexpr/necompiler.py", line 744, in getArguments
    a = local_dict[name]

KeyError: 'ER'


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "<ipython-input-100-c765b0f1e5ce>", line 1, in <module>
    numexpr.evaluate(expr)

  File "/anaconda3/lib/python3.7/site-packages/numexpr/necompiler.py", line 818, in evaluate
    arguments = getArguments(names, local_dict, global_dict)

  File "/anaconda3/lib/python3.7/site-packages/numexpr/necompiler.py", line 746, in getArguments
    a = global_dict[name]

KeyError: 'ER'
  

Я не очень хорошо знаком с numexpr пакетом. Тем не менее, я перешел от одномерной регрессии к трехмерной регрессии. ER была моей переменной 1D и работала нормально. Я, очевидно, немного изменил свой код со времени случая 1D, но я все еще немного не понимаю, почему появляется эта ошибка.

Любые указатели будут высоко оценены.

Комментарии:

1. Я не вижу expr в вашем коде. Ваш разговор о создании из рабочего 1d-случая не помогает нам (не помогает вам), поскольку вы не показываете рабочий случай или не указываете, что нового. Помните, у вас есть код, работающий или нет, а не у нас!

2. Да, хорошие моменты. Я не уверен, как четко и лаконично представить изменения. Фактический код несколько длинный и сложный. Однако единственным реальным изменением должно быть то, что есть еще два символа, T и P поверх ER того, который был изначально в выражении. Действительно, остальная часть кода работает нормально, только этот один вызов, который я использую для построения графика, выходит из строя. expr однако отображается в верхнем окне. Я отредактирую свой вопрос, чтобы сделать его более понятным.

Ответ №1:

Я понял это. Довольно глупая ошибка в конце. Мне нужно было изменить:

 #Extract data as lists for plotting
x = list(plotdata['T'])
y = list(plotdata['ER'])
  

Для:

 T = list(plotdata['T'])
ER = list(plotdata['ER'])
P = list(plotdata['P'])
  

т.е. numexpr.evaluate искал входные данные, а не символ!