#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
искал входные данные, а не символ!