Оценка выражения SymPy, которое относится к переменным, имеющим значения "nan" - PullRequest
0 голосов
/ 23 октября 2018

Я использую parse_expr() функцию SymPy для оценки строковых выражений, которые ссылаются на переменные.Теперь я столкнулся с проблемой разбора выражения, содержащего переменную со значением "nan".Я пытался заменить значение "nan" на 0, передавая что-то вроде {"nan": 0} в качестве параметра local_dict или global_dict, но не смог найти способ заставить его работать.

Как я могу проанализировать и оценить выражение, которое относится к переменным, имеющим "nan" значения?Могу ли я сопоставить "nan" определенному значению, передав параметры в parse_expr()?

>>> from sympy.parsing.sympy_parser import parse_expr
>>> data = {'result': {'a': 'nan', 'b': 123}}
>>> expr = "result['b'] + 123"    # <-- This works well.
>>> parse_expr(expr, data)
>>> 246
>>> expr = "result['a'] + 123"    # <-- This doesn't work.
>>> parse_expr(expr, data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../sympy-1.2rc1-py3.6.egg/sympy/parsing/sympy_parser.py", line 950, in parse_expr
    return eval_expr(code, local_dict, global_dict)
  File ".../sympy-1.2rc1-py3.6.egg/sympy/parsing/sympy_parser.py", line 863, in eval_expr
code, global_dict, local_dict)  # take local objects in preference
  File "<string>", line 1, in <module>
TypeError: must be str, not Integer

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Фактические nan значения понимаются SymPy и обрабатываются соответствующим образом:

from math import nan
data = {'result': {'a': nan, 'b': 123}}
expr = "result['a'] + 123"
parse_expr(expr, local_dict=data)   # returns nan

Результат верный: nan плюс любое число равно nan.

Но ваш словарь содержит строку 'nan', которая не имеет особого значения: она также может быть 'foo'.Это просто неверные данные, поэтому вы должны исправить данные перед их передачей в SymPy:

data = {'result': {'a': 'nan', 'b': 123}}
for key in data['result']:
    if data['result'][key] == 'nan':
        data['result'][key] = 0

Теперь parse_expr(expr, local_dict=data) возвращает 123.

0 голосов
/ 23 октября 2018

Sympy должен быть создан для обработки nan s.Проблема в том, что он не конвертирует 'nan' автоматически с плавающей точкой nan.Например, следующее также не работает:

>>> from sympy.parsing.sympy_parser import parse_expr
>>> data = {'result': {'a': '321', 'b': 123}}
>>> expr = "result['b'] + 123"    # <-- This works well.
>>> parse_expr(expr, data)
246
>>> expr = "result['a'] + 123"    # <-- This doesn't work.
>>> parse_expr(expr, data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/jonathan/anaconda3/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py", line 950, in parse_expr
    return eval_expr(code, local_dict, global_dict)
  File "/home/jonathan/anaconda3/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py", line 863, in eval_expr
    code, global_dict, local_dict)  # take local objects in preference
  File "<string>", line 1, in <module>
TypeError: can only concatenate str (not "Integer") to str

Использование с плавающей точкой nan вместо строки работает:

>>> from sympy.parsing.sympy_parser import parse_expr
>>> from math import nan
>>> data = {'result': {'a': nan, 'b': 123}}
>>> expr = "result['b'] + 123"    # <-- This works well.
>>> parse_expr(expr, data)
246
>>> expr = "result['a'] + 123"    # <-- This also works.
>>> parse_expr(expr, data)
nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...