From ec0592958b8c6d934a57a041b7aaf4d0a3450d72 Mon Sep 17 00:00:00 2001 From: Matthew Roeschke <10647082+mroeschke@users.noreply.github.com> Date: Sat, 25 Feb 2023 13:41:52 -0800 Subject: [PATCH] Remove setup/teardown_class --- pandas/tests/frame/test_query_eval.py | 164 +++++++++++--------------- 1 file changed, 68 insertions(+), 96 deletions(-) diff --git a/pandas/tests/frame/test_query_eval.py b/pandas/tests/frame/test_query_eval.py index fc0c81339de08..db68c4cd2546b 100644 --- a/pandas/tests/frame/test_query_eval.py +++ b/pandas/tests/frame/test_query_eval.py @@ -385,17 +385,15 @@ def to_series(mi, level): @td.skip_if_no_ne class TestDataFrameQueryNumExprPandas: - @classmethod - def setup_class(cls): - cls.engine = "numexpr" - cls.parser = "pandas" + @pytest.fixture + def engine(self): + return "numexpr" - @classmethod - def teardown_class(cls): - del cls.engine, cls.parser + @pytest.fixture + def parser(self): + return "pandas" - def test_date_query_with_attribute_access(self): - engine, parser = self.engine, self.parser + def test_date_query_with_attribute_access(self, engine, parser): skip_if_no_pandas_parser(parser) df = DataFrame(np.random.randn(5, 3)) df["dates1"] = date_range("1/1/2012", periods=5) @@ -407,8 +405,7 @@ def test_date_query_with_attribute_access(self): expec = df[(df.dates1 < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_query_no_attribute_access(self): - engine, parser = self.engine, self.parser + def test_date_query_no_attribute_access(self, engine, parser): df = DataFrame(np.random.randn(5, 3)) df["dates1"] = date_range("1/1/2012", periods=5) df["dates2"] = date_range("1/1/2013", periods=5) @@ -417,8 +414,7 @@ def test_date_query_no_attribute_access(self): expec = df[(df.dates1 < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_query_with_NaT(self): - engine, parser = self.engine, self.parser + def test_date_query_with_NaT(self, engine, parser): n = 10 df = DataFrame(np.random.randn(n, 3)) df["dates1"] = date_range("1/1/2012", periods=n) @@ -430,8 +426,7 @@ def test_date_query_with_NaT(self): expec = df[(df.dates1 < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_index_query(self): - engine, parser = self.engine, self.parser + def test_date_index_query(self, engine, parser): n = 10 df = DataFrame(np.random.randn(n, 3)) df["dates1"] = date_range("1/1/2012", periods=n) @@ -442,8 +437,7 @@ def test_date_index_query(self): expec = df[(df.index < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_index_query_with_NaT(self): - engine, parser = self.engine, self.parser + def test_date_index_query_with_NaT(self, engine, parser): n = 10 # Cast to object to avoid implicit cast when setting entry to pd.NaT below df = DataFrame(np.random.randn(n, 3)).astype({0: object}) @@ -456,8 +450,7 @@ def test_date_index_query_with_NaT(self): expec = df[(df.index < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_index_query_with_NaT_duplicates(self): - engine, parser = self.engine, self.parser + def test_date_index_query_with_NaT_duplicates(self, engine, parser): n = 10 d = {} d["dates1"] = date_range("1/1/2012", periods=n) @@ -470,9 +463,7 @@ def test_date_index_query_with_NaT_duplicates(self): expec = df[(df.index.to_series() < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_query_with_non_date(self): - engine, parser = self.engine, self.parser - + def test_date_query_with_non_date(self, engine, parser): n = 10 df = DataFrame( {"dates": date_range("1/1/2012", periods=n), "nondate": np.arange(n)} @@ -489,15 +480,13 @@ def test_date_query_with_non_date(self): with pytest.raises(TypeError, match=msg): df.query(f"dates {op} nondate", parser=parser, engine=engine) - def test_query_syntax_error(self): - engine, parser = self.engine, self.parser + def test_query_syntax_error(self, engine, parser): df = DataFrame({"i": range(10), "+": range(3, 13), "r": range(4, 14)}) msg = "invalid syntax" with pytest.raises(SyntaxError, match=msg): df.query("i - +", engine=engine, parser=parser) - def test_query_scope(self): - engine, parser = self.engine, self.parser + def test_query_scope(self, engine, parser): skip_if_no_pandas_parser(parser) df = DataFrame(np.random.randn(20, 2), columns=list("ab")) @@ -521,8 +510,7 @@ def test_query_scope(self): with pytest.raises(UndefinedVariableError, match="name 'c' is not defined"): df.query("@a > b > c", engine=engine, parser=parser) - def test_query_doesnt_pickup_local(self): - engine, parser = self.engine, self.parser + def test_query_doesnt_pickup_local(self, engine, parser): n = m = 10 df = DataFrame(np.random.randint(m, size=(n, 3)), columns=list("abc")) @@ -530,9 +518,7 @@ def test_query_doesnt_pickup_local(self): with pytest.raises(UndefinedVariableError, match="name 'sin' is not defined"): df.query("sin > 5", engine=engine, parser=parser) - def test_query_builtin(self): - engine, parser = self.engine, self.parser - + def test_query_builtin(self, engine, parser): n = m = 10 df = DataFrame(np.random.randint(m, size=(n, 3)), columns=list("abc")) @@ -541,8 +527,7 @@ def test_query_builtin(self): with pytest.raises(NumExprClobberingError, match=msg): df.query("sin > 5", engine=engine, parser=parser) - def test_query(self): - engine, parser = self.engine, self.parser + def test_query(self, engine, parser): df = DataFrame(np.random.randn(10, 3), columns=["a", "b", "c"]) tm.assert_frame_equal( @@ -553,8 +538,7 @@ def test_query(self): df[df.a + df.b > df.b * df.c], ) - def test_query_index_with_name(self): - engine, parser = self.engine, self.parser + def test_query_index_with_name(self, engine, parser): df = DataFrame( np.random.randint(10, size=(10, 3)), index=Index(range(10), name="blob"), @@ -569,8 +553,7 @@ def test_query_index_with_name(self): tm.assert_frame_equal(res, expec) - def test_query_index_without_name(self): - engine, parser = self.engine, self.parser + def test_query_index_without_name(self, engine, parser): df = DataFrame( np.random.randint(10, size=(10, 3)), index=range(10), @@ -587,10 +570,7 @@ def test_query_index_without_name(self): expec = df[df.index < 5] tm.assert_frame_equal(res, expec) - def test_nested_scope(self): - engine = self.engine - parser = self.parser - + def test_nested_scope(self, engine, parser): skip_if_no_pandas_parser(parser) df = DataFrame(np.random.randn(5, 3)) @@ -613,17 +593,16 @@ def test_nested_scope(self): expected = df.query("(@df>0) & (@df2>0)", engine=engine, parser=parser) tm.assert_frame_equal(result, expected) - def test_nested_raises_on_local_self_reference(self): + def test_nested_raises_on_local_self_reference(self, engine, parser): df = DataFrame(np.random.randn(5, 3)) # can't reference ourself b/c we're a local so @ is necessary with pytest.raises(UndefinedVariableError, match="name 'df' is not defined"): - df.query("df > 0", engine=self.engine, parser=self.parser) + df.query("df > 0", engine=engine, parser=parser) - def test_local_syntax(self): - skip_if_no_pandas_parser(self.parser) + def test_local_syntax(self, engine, parser): + skip_if_no_pandas_parser(parser) - engine, parser = self.engine, self.parser df = DataFrame(np.random.randn(100, 10), columns=list("abcdefghij")) b = 1 expect = df[df.a < b] @@ -634,9 +613,8 @@ def test_local_syntax(self): result = df.query("a < b", engine=engine, parser=parser) tm.assert_frame_equal(result, expect) - def test_chained_cmp_and_in(self): - skip_if_no_pandas_parser(self.parser) - engine, parser = self.engine, self.parser + def test_chained_cmp_and_in(self, engine, parser): + skip_if_no_pandas_parser(parser) cols = list("abc") df = DataFrame(np.random.randn(100, len(cols)), columns=cols) res = df.query( @@ -646,8 +624,7 @@ def test_chained_cmp_and_in(self): expec = df[ind] tm.assert_frame_equal(res, expec) - def test_local_variable_with_in(self): - engine, parser = self.engine, self.parser + def test_local_variable_with_in(self, engine, parser): skip_if_no_pandas_parser(parser) a = Series(np.random.randint(3, size=15), name="a") b = Series(np.random.randint(10, size=15), name="b") @@ -662,8 +639,7 @@ def test_local_variable_with_in(self): result = df.query("@b - 1 in a", engine=engine, parser=parser) tm.assert_frame_equal(expected, result) - def test_at_inside_string(self): - engine, parser = self.engine, self.parser + def test_at_inside_string(self, engine, parser): skip_if_no_pandas_parser(parser) c = 1 # noqa:F841 df = DataFrame({"a": ["a", "a", "b", "b", "@c", "@c"]}) @@ -681,39 +657,41 @@ def test_query_undefined_local(self): ): df.query("a == @c", engine=engine, parser=parser) - def test_index_resolvers_come_after_columns_with_the_same_name(self): + def test_index_resolvers_come_after_columns_with_the_same_name( + self, engine, parser + ): n = 1 # noqa:F841 a = np.r_[20:101:20] df = DataFrame({"index": a, "b": np.random.randn(a.size)}) df.index.name = "index" - result = df.query("index > 5", engine=self.engine, parser=self.parser) + result = df.query("index > 5", engine=engine, parser=parser) expected = df[df["index"] > 5] tm.assert_frame_equal(result, expected) df = DataFrame({"index": a, "b": np.random.randn(a.size)}) - result = df.query("ilevel_0 > 5", engine=self.engine, parser=self.parser) + result = df.query("ilevel_0 > 5", engine=engine, parser=parser) expected = df.loc[df.index[df.index > 5]] tm.assert_frame_equal(result, expected) df = DataFrame({"a": a, "b": np.random.randn(a.size)}) df.index.name = "a" - result = df.query("a > 5", engine=self.engine, parser=self.parser) + result = df.query("a > 5", engine=engine, parser=parser) expected = df[df.a > 5] tm.assert_frame_equal(result, expected) - result = df.query("index > 5", engine=self.engine, parser=self.parser) + result = df.query("index > 5", engine=engine, parser=parser) expected = df.loc[df.index[df.index > 5]] tm.assert_frame_equal(result, expected) @pytest.mark.parametrize("op, f", [["==", operator.eq], ["!=", operator.ne]]) - def test_inf(self, op, f): + def test_inf(self, op, f, engine, parser): n = 10 df = DataFrame({"a": np.random.rand(n), "b": np.random.rand(n)}) df.loc[::2, 0] = np.inf q = f"a {op} inf" expected = df[f(df.a, np.inf)] - result = df.query(q, engine=self.engine, parser=self.parser) + result = df.query(q, engine=engine, parser=parser) tm.assert_frame_equal(result, expected) def test_check_tz_aware_index_query(self, tz_aware_fixture): @@ -731,14 +709,12 @@ def test_check_tz_aware_index_query(self, tz_aware_fixture): result = df.reset_index().query('"2018-01-03 00:00:00+00" < time') tm.assert_frame_equal(result, expected) - def test_method_calls_in_query(self): + def test_method_calls_in_query(self, engine, parser): # https://github.com/pandas-dev/pandas/issues/22435 n = 10 df = DataFrame({"a": 2 * np.random.rand(n), "b": np.random.rand(n)}) expected = df[df["a"].astype("int") == 0] - result = df.query( - "a.astype('int') == 0", engine=self.engine, parser=self.parser - ) + result = df.query("a.astype('int') == 0", engine=engine, parser=parser) tm.assert_frame_equal(result, expected) df = DataFrame( @@ -748,20 +724,21 @@ def test_method_calls_in_query(self): } ) expected = df[df["a"].notnull()] - result = df.query("a.notnull()", engine=self.engine, parser=self.parser) + result = df.query("a.notnull()", engine=engine, parser=parser) tm.assert_frame_equal(result, expected) @td.skip_if_no_ne class TestDataFrameQueryNumExprPython(TestDataFrameQueryNumExprPandas): - @classmethod - def setup_class(cls): - super().setup_class() - cls.engine = "numexpr" - cls.parser = "python" + @pytest.fixture + def engine(self): + return "numexpr" - def test_date_query_no_attribute_access(self): - engine, parser = self.engine, self.parser + @pytest.fixture + def parser(self): + return "python" + + def test_date_query_no_attribute_access(self, engine, parser): df = DataFrame(np.random.randn(5, 3)) df["dates1"] = date_range("1/1/2012", periods=5) df["dates2"] = date_range("1/1/2013", periods=5) @@ -772,8 +749,7 @@ def test_date_query_no_attribute_access(self): expec = df[(df.dates1 < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_query_with_NaT(self): - engine, parser = self.engine, self.parser + def test_date_query_with_NaT(self, engine, parser): n = 10 df = DataFrame(np.random.randn(n, 3)) df["dates1"] = date_range("1/1/2012", periods=n) @@ -787,8 +763,7 @@ def test_date_query_with_NaT(self): expec = df[(df.dates1 < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_index_query(self): - engine, parser = self.engine, self.parser + def test_date_index_query(self, engine, parser): n = 10 df = DataFrame(np.random.randn(n, 3)) df["dates1"] = date_range("1/1/2012", periods=n) @@ -801,8 +776,7 @@ def test_date_index_query(self): expec = df[(df.index < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_index_query_with_NaT(self): - engine, parser = self.engine, self.parser + def test_date_index_query_with_NaT(self, engine, parser): n = 10 # Cast to object to avoid implicit cast when setting entry to pd.NaT below df = DataFrame(np.random.randn(n, 3)).astype({0: object}) @@ -817,8 +791,7 @@ def test_date_index_query_with_NaT(self): expec = df[(df.index < "20130101") & ("20130101" < df.dates3)] tm.assert_frame_equal(res, expec) - def test_date_index_query_with_NaT_duplicates(self): - engine, parser = self.engine, self.parser + def test_date_index_query_with_NaT_duplicates(self, engine, parser): n = 10 df = DataFrame(np.random.randn(n, 3)) df["dates1"] = date_range("1/1/2012", periods=n) @@ -830,9 +803,7 @@ def test_date_index_query_with_NaT_duplicates(self): with pytest.raises(NotImplementedError, match=msg): df.query("index < 20130101 < dates3", engine=engine, parser=parser) - def test_nested_scope(self): - engine = self.engine - parser = self.parser + def test_nested_scope(self, engine, parser): # smoke test x = 1 # noqa:F841 result = pd.eval("x + 1", engine=engine, parser=parser) @@ -877,15 +848,15 @@ def test_query_numexpr_with_min_and_max_columns(self): class TestDataFrameQueryPythonPandas(TestDataFrameQueryNumExprPandas): - @classmethod - def setup_class(cls): - super().setup_class() - cls.engine = "python" - cls.parser = "pandas" + @pytest.fixture + def engine(self): + return "python" - def test_query_builtin(self): - engine, parser = self.engine, self.parser + @pytest.fixture + def parser(self): + return "pandas" + def test_query_builtin(self, engine, parser): n = m = 10 df = DataFrame(np.random.randint(m, size=(n, 3)), columns=list("abc")) @@ -896,14 +867,15 @@ def test_query_builtin(self): class TestDataFrameQueryPythonPython(TestDataFrameQueryNumExprPython): - @classmethod - def setup_class(cls): - super().setup_class() - cls.engine = cls.parser = "python" + @pytest.fixture + def engine(self): + return "python" - def test_query_builtin(self): - engine, parser = self.engine, self.parser + @pytest.fixture + def parser(self): + return "python" + def test_query_builtin(self, engine, parser): n = m = 10 df = DataFrame(np.random.randint(m, size=(n, 3)), columns=list("abc"))