-
Notifications
You must be signed in to change notification settings - Fork 665
Description
Modin version checks
-
I have checked that this issue has not already been reported.
-
I have confirmed this bug exists on the latest released version of Modin.
-
I have confirmed this bug exists on the main branch of Modin. (In order to do this you can follow this guide.)
Reproducible Example
import modin.pandas as pd
df = pd.DataFrame([1])
pd.eval('df + 1')
Issue Description
Basic modin.pandas.eval()
invocations produce errors like UndefinedVariableError: name 'df' is not defined
.
Expected Behavior
eval should work as it does in pandas.
Error Logs
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/scope.py:236, in Scope.resolve(self, key, is_local)
235 assert not is_local and not self.has_resolvers
--> 236 return self.scope[key]
237 except KeyError:
File ~/miniconda3/envs/modin-dev/lib/python3.9/collections/__init__.py:941, in ChainMap.__getitem__(self, key)
940 pass
--> 941 return self.__missing__(key)
File ~/miniconda3/envs/modin-dev/lib/python3.9/collections/__init__.py:933, in ChainMap.__missing__(self, key)
932 def __missing__(self, key):
--> 933 raise KeyError(key)
KeyError: 'df'
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/scope.py:242, in Scope.resolve(self, key, is_local)
238 try:
239 # last ditch effort we look in temporaries
240 # these are created when parsing indexing expressions
241 # e.g., df[df > 0]
--> 242 return self.temps[key]
243 except KeyError as err:
KeyError: 'df'
The above exception was the direct cause of the following exception:
UndefinedVariableError Traceback (most recent call last)
Cell In[3], line 1
----> 1 pd.eval('df + 1')
File ~/sources/modin/modin/core/storage_formats/pandas/query_compiler_caster.py:1070, in wrap_function_in_argument_caster.<locals>.f_with_argument_casting(*args, **kwargs)
1056 if len(input_backends) < 2 and (
1057 not AutoSwitchBackend.get() or pin_target_backend is not None
1058 ):
1059 f_to_apply = _get_extension_for_method(
1060 name=name,
1061 extensions=extensions,
(...)
1068 wrapping_function_type=wrapping_function_type,
1069 )
-> 1070 result = f_to_apply(*args, **kwargs)
1071 if (
1072 isinstance(result, QueryCompilerCaster)
1073 and pin_target_backend is not None
1074 ):
1075 result._set_backend_pinned(True, inplace=True)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/eval.py:336, in eval(expr, parser, engine, local_dict, global_dict, resolvers, level, target, inplace)
327 # get our (possibly passed-in) scope
328 env = ensure_scope(
329 level + 1,
330 global_dict=global_dict,
(...)
333 target=target,
334 )
--> 336 parsed_expr = Expr(expr, engine=engine, parser=parser, env=env)
338 if engine == "numexpr" and (
339 is_extension_array_dtype(parsed_expr.terms.return_type)
340 or getattr(parsed_expr.terms, "operand_types", None) is not None
(...)
344 )
345 ):
346 warnings.warn(
347 "Engine has switched to 'python' because numexpr does not support "
348 "extension array dtypes. Please set your engine to python manually.",
349 RuntimeWarning,
350 stacklevel=find_stack_level(),
351 )
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:805, in Expr.__init__(self, expr, engine, parser, env, level)
803 self.parser = parser
804 self._visitor = PARSERS[parser](self.env, self.engine, self.parser)
--> 805 self.terms = self.parse()
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:824, in Expr.parse(self)
820 def parse(self):
821 """
822 Parse an expression.
823 """
--> 824 return self._visitor.visit(self.expr)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:411, in BaseExprVisitor.visit(self, node, **kwargs)
409 method = f"visit_{type(node).__name__}"
410 visitor = getattr(self, method)
--> 411 return visitor(node, **kwargs)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:417, in BaseExprVisitor.visit_Module(self, node, **kwargs)
415 raise SyntaxError("only a single expression is allowed")
416 expr = node.body[0]
--> 417 return self.visit(expr, **kwargs)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:411, in BaseExprVisitor.visit(self, node, **kwargs)
409 method = f"visit_{type(node).__name__}"
410 visitor = getattr(self, method)
--> 411 return visitor(node, **kwargs)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:420, in BaseExprVisitor.visit_Expr(self, node, **kwargs)
419 def visit_Expr(self, node, **kwargs):
--> 420 return self.visit(node.value, **kwargs)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:411, in BaseExprVisitor.visit(self, node, **kwargs)
409 method = f"visit_{type(node).__name__}"
410 visitor = getattr(self, method)
--> 411 return visitor(node, **kwargs)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:531, in BaseExprVisitor.visit_BinOp(self, node, **kwargs)
530 def visit_BinOp(self, node, **kwargs):
--> 531 op, op_class, left, right = self._maybe_transform_eq_ne(node)
532 left, right = self._maybe_downcast_constants(left, right)
533 return self._maybe_evaluate_binop(op, op_class, left, right)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:451, in BaseExprVisitor._maybe_transform_eq_ne(self, node, left, right)
449 def _maybe_transform_eq_ne(self, node, left=None, right=None):
450 if left is None:
--> 451 left = self.visit(node.left, side="left")
452 if right is None:
453 right = self.visit(node.right, side="right")
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:411, in BaseExprVisitor.visit(self, node, **kwargs)
409 method = f"visit_{type(node).__name__}"
410 visitor = getattr(self, method)
--> 411 return visitor(node, **kwargs)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/expr.py:541, in BaseExprVisitor.visit_Name(self, node, **kwargs)
540 def visit_Name(self, node, **kwargs) -> Term:
--> 541 return self.term_type(node.id, self.env, **kwargs)
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/ops.py:91, in Term.__init__(self, name, env, side, encoding)
89 tname = str(name)
90 self.is_local = tname.startswith(LOCAL_TAG) or tname in DEFAULT_GLOBALS
---> 91 self._value = self._resolve_name()
92 self.encoding = encoding
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/ops.py:115, in Term._resolve_name(self)
110 if local_name in self.env.scope and isinstance(
111 self.env.scope[local_name], type
112 ):
113 is_local = False
--> 115 res = self.env.resolve(local_name, is_local=is_local)
116 self.update(res)
118 if hasattr(res, "ndim") and res.ndim > 2:
File ~/miniconda3/envs/modin-dev/lib/python3.9/site-packages/pandas/core/computation/scope.py:244, in Scope.resolve(self, key, is_local)
242 return self.temps[key]
243 except KeyError as err:
--> 244 raise UndefinedVariableError(key, is_local) from err
UndefinedVariableError: name 'df' is not defined
Installed Versions
INSTALLED VERSIONS
commit : 8d468dc
python : 3.9.21
python-bits : 64
OS : Darwin
OS-release : 24.6.0
Version : Darwin Kernel Version 24.6.0: Mon Jul 14 11:30:30 PDT 2025; root:xnu-11417.140.69~1/RELEASE_ARM64_T6020
machine : arm64
processor : arm
byteorder : little
LC_ALL : None
LANG : en_US.UTF-8
LOCALE : en_US.UTF-8
Modin dependencies
modin : 0.35.0+1.g8d468dcb
ray : 2.44.1
dask : 2024.8.0
distributed : 2024.8.0
pandas dependencies
pandas : 2.2.3
numpy : 2.0.2
pytz : 2025.2
dateutil : 2.9.0.post0
pip : 24.2
Cython : None
sphinx : 7.4.7
IPython : 8.18.1
adbc-driver-postgresql: None
adbc-driver-sqlite : None
bs4 : 4.13.4
blosc : None
bottleneck : None
dataframe-api-compat : None
fastparquet : 2024.11.0
fsspec : 2025.3.2
html5lib : None
hypothesis : None
gcsfs : None
jinja2 : 3.1.6
lxml.etree : 5.3.2
matplotlib : 3.9.4
numba : None
numexpr : 2.10.2
odfpy : None
openpyxl : 3.1.5
pandas_gbq : 0.28.0
psycopg2 : 2.9.10
pymysql : None
pyarrow : 18.1.0
pyreadstat : None
pytest : 8.4.0
python-calamine : None
pyxlsb : None
s3fs : 2025.3.2
scipy : 1.13.1
sqlalchemy : 2.0.40
tables : N/A
tabulate : 0.9.0
xarray : 2024.7.0
xlrd : 2.0.1
xlsxwriter : None
zstandard : None
tzdata : 2025.2
qtpy : None
pyqt5 : None