diff --git a/pandas/conftest.py b/pandas/conftest.py index fb281cb9def81..b24606f8007d2 100644 --- a/pandas/conftest.py +++ b/pandas/conftest.py @@ -30,7 +30,6 @@ from decimal import Decimal import operator import os -from pathlib import Path from typing import ( TYPE_CHECKING, Callable, @@ -775,23 +774,6 @@ def series_with_simple_index(index) -> Series: return _create_series(index) -@pytest.fixture -def series_with_multilevel_index() -> Series: - """ - Fixture with a Series with a 2-level MultiIndex. - """ - arrays = [ - ["bar", "bar", "baz", "baz", "qux", "qux", "foo", "foo"], - ["one", "two", "one", "two", "one", "two", "one", "two"], - ] - tuples = zip(*arrays) - index = MultiIndex.from_tuples(tuples) - data = np.random.default_rng(2).standard_normal(8) - ser = Series(data, index=index) - ser.iloc[3] = np.nan - return ser - - _narrow_series = { f"{dtype.__name__}-series": tm.make_rand_series(name="a", dtype=dtype) for dtype in tm.NARROW_NP_DTYPES @@ -865,35 +847,6 @@ def int_frame() -> DataFrame: return DataFrame(tm.getSeriesData()).astype("int64") -@pytest.fixture -def datetime_frame() -> DataFrame: - """ - Fixture for DataFrame of floats with DatetimeIndex - - Columns are ['A', 'B', 'C', 'D'] - - A B C D - 2000-01-03 -1.122153 0.468535 0.122226 1.693711 - 2000-01-04 0.189378 0.486100 0.007864 -1.216052 - 2000-01-05 0.041401 -0.835752 -0.035279 -0.414357 - 2000-01-06 0.430050 0.894352 0.090719 0.036939 - 2000-01-07 -0.620982 -0.668211 -0.706153 1.466335 - 2000-01-10 -0.752633 0.328434 -0.815325 0.699674 - 2000-01-11 -2.236969 0.615737 -0.829076 -1.196106 - ... ... ... ... ... - 2000-02-03 1.642618 -0.579288 0.046005 1.385249 - 2000-02-04 -0.544873 -1.160962 -0.284071 -1.418351 - 2000-02-07 -2.656149 -0.601387 1.410148 0.444150 - 2000-02-08 -1.201881 -1.289040 0.772992 -1.445300 - 2000-02-09 1.377373 0.398619 1.008453 -0.928207 - 2000-02-10 0.473194 -0.636677 0.984058 0.511519 - 2000-02-11 -0.965556 0.408313 -1.312844 -0.381948 - - [30 rows x 4 columns] - """ - return DataFrame(tm.getTimeSeriesData()) - - @pytest.fixture def float_frame() -> DataFrame: """ @@ -923,24 +876,6 @@ def float_frame() -> DataFrame: return DataFrame(tm.getSeriesData()) -@pytest.fixture -def mixed_type_frame() -> DataFrame: - """ - Fixture for DataFrame of float/int/string columns with RangeIndex - Columns are ['a', 'b', 'c', 'float32', 'int32']. - """ - return DataFrame( - { - "a": 1.0, - "b": 2, - "c": "foo", - "float32": np.array([1.0] * 10, dtype="float32"), - "int32": np.array([1] * 10, dtype="int32"), - }, - index=np.arange(10), - ) - - @pytest.fixture def rand_series_with_duplicate_datetimeindex() -> Series: """ @@ -1174,16 +1109,6 @@ def strict_data_files(pytestconfig): return pytestconfig.getoption("--no-strict-data-files") -@pytest.fixture -def tests_path() -> Path: - return Path(__file__).parent / "tests" - - -@pytest.fixture -def tests_io_data_path(tests_path) -> Path: - return tests_path / "io" / "data" - - @pytest.fixture def datapath(strict_data_files: str) -> Callable[..., str]: """ @@ -1218,14 +1143,6 @@ def deco(*args): return deco -@pytest.fixture -def iris(datapath) -> DataFrame: - """ - The iris dataset as a DataFrame. - """ - return pd.read_csv(datapath("io", "data", "csv", "iris.csv")) - - # ---------------------------------------------------------------- # Time zones # ---------------------------------------------------------------- @@ -1905,28 +1822,6 @@ def sort_by_key(request): return request.param -@pytest.fixture() -def fsspectest(): - pytest.importorskip("fsspec") - from fsspec import register_implementation - from fsspec.implementations.memory import MemoryFileSystem - from fsspec.registry import _registry as registry - - class TestMemoryFS(MemoryFileSystem): - protocol = "testmem" - test = [None] - - def __init__(self, **kwargs) -> None: - self.test[0] = kwargs.pop("test", None) - super().__init__(**kwargs) - - register_implementation("testmem", TestMemoryFS, clobber=True) - yield TestMemoryFS() - registry.pop("testmem", None) - TestMemoryFS.test[0] = None - TestMemoryFS.store.clear() - - @pytest.fixture( params=[ ("foo", None, None), diff --git a/pandas/tests/apply/conftest.py b/pandas/tests/apply/conftest.py deleted file mode 100644 index acccdd845b53c..0000000000000 --- a/pandas/tests/apply/conftest.py +++ /dev/null @@ -1,30 +0,0 @@ -import numpy as np -import pytest - -from pandas import DataFrame - - -@pytest.fixture -def int_frame_const_col(): - """ - Fixture for DataFrame of ints which are constant per column - - Columns are ['A', 'B', 'C'], with values (per column): [1, 2, 3] - """ - df = DataFrame( - np.tile(np.arange(3, dtype="int64"), 6).reshape(6, -1) + 1, - columns=["A", "B", "C"], - ) - return df - - -@pytest.fixture(params=["python", pytest.param("numba", marks=pytest.mark.single_cpu)]) -def engine(request): - if request.param == "numba": - pytest.importorskip("numba") - return request.param - - -@pytest.fixture(params=[0, 1]) -def apply_axis(request): - return request.param diff --git a/pandas/tests/apply/test_frame_apply.py b/pandas/tests/apply/test_frame_apply.py index 24f8a99235b70..2d7549e09a986 100644 --- a/pandas/tests/apply/test_frame_apply.py +++ b/pandas/tests/apply/test_frame_apply.py @@ -18,6 +18,27 @@ from pandas.tests.frame.common import zip_frames +@pytest.fixture +def int_frame_const_col(): + """ + Fixture for DataFrame of ints which are constant per column + + Columns are ['A', 'B', 'C'], with values (per column): [1, 2, 3] + """ + df = DataFrame( + np.tile(np.arange(3, dtype="int64"), 6).reshape(6, -1) + 1, + columns=["A", "B", "C"], + ) + return df + + +@pytest.fixture(params=["python", pytest.param("numba", marks=pytest.mark.single_cpu)]) +def engine(request): + if request.param == "numba": + pytest.importorskip("numba") + return request.param + + def test_apply(float_frame, engine, request): if engine == "numba": mark = pytest.mark.xfail(reason="numba engine not supporting numpy ufunc yet") @@ -269,7 +290,7 @@ def test_apply_raw_float_frame_no_reduction(float_frame, engine): @pytest.mark.parametrize("axis", [0, 1]) -def test_apply_raw_mixed_type_frame(mixed_type_frame, axis, engine): +def test_apply_raw_mixed_type_frame(axis, engine): if engine == "numba": pytest.skip("isinstance check doesn't work with numba") @@ -278,7 +299,17 @@ def _assert_raw(x): assert x.ndim == 1 # Mixed dtype (GH-32423) - mixed_type_frame.apply(_assert_raw, axis=axis, engine=engine, raw=True) + df = DataFrame( + { + "a": 1.0, + "b": 2, + "c": "foo", + "float32": np.array([1.0] * 10, dtype="float32"), + "int32": np.array([1] * 10, dtype="int32"), + }, + index=np.arange(10), + ) + df.apply(_assert_raw, axis=axis, engine=engine, raw=True) def test_apply_axis1(float_frame): diff --git a/pandas/tests/apply/test_invalid_arg.py b/pandas/tests/apply/test_invalid_arg.py index 44829c598253d..9f5157181843e 100644 --- a/pandas/tests/apply/test_invalid_arg.py +++ b/pandas/tests/apply/test_invalid_arg.py @@ -24,9 +24,12 @@ @pytest.mark.parametrize("result_type", ["foo", 1]) -def test_result_type_error(result_type, int_frame_const_col): +def test_result_type_error(result_type): # allowed result_type - df = int_frame_const_col + df = DataFrame( + np.tile(np.arange(3, dtype="int64"), 6).reshape(6, -1) + 1, + columns=["A", "B", "C"], + ) msg = ( "invalid value for result_type, must be one of " @@ -282,8 +285,11 @@ def test_transform_none_to_type(): lambda x: Series([1, 2]), ], ) -def test_apply_broadcast_error(int_frame_const_col, func): - df = int_frame_const_col +def test_apply_broadcast_error(func): + df = DataFrame( + np.tile(np.arange(3, dtype="int64"), 6).reshape(6, -1) + 1, + columns=["A", "B", "C"], + ) # > 1 ndim msg = "too many dims to broadcast|cannot broadcast result" diff --git a/pandas/tests/apply/test_numba.py b/pandas/tests/apply/test_numba.py index 3924d8e74e156..ee239568d057d 100644 --- a/pandas/tests/apply/test_numba.py +++ b/pandas/tests/apply/test_numba.py @@ -12,6 +12,11 @@ pytestmark = [td.skip_if_no("numba"), pytest.mark.single_cpu] +@pytest.fixture(params=[0, 1]) +def apply_axis(request): + return request.param + + def test_numba_vs_python_noop(float_frame, apply_axis): func = lambda x: x result = float_frame.apply(func, engine="numba", axis=apply_axis) diff --git a/pandas/tests/arithmetic/conftest.py b/pandas/tests/arithmetic/conftest.py index f77b81574e1c1..c7703b34a5e38 100644 --- a/pandas/tests/arithmetic/conftest.py +++ b/pandas/tests/arithmetic/conftest.py @@ -2,11 +2,7 @@ import pytest import pandas as pd -from pandas import ( - Index, - RangeIndex, -) -import pandas._testing as tm +from pandas import Index @pytest.fixture(params=[1, np.array(1, dtype=np.int64)]) @@ -63,27 +59,6 @@ def zero(request): return request.param -# ------------------------------------------------------------------ -# Vector Fixtures - - -@pytest.fixture( - params=[ - # TODO: add more dtypes here - Index(np.arange(5, dtype="float64")), - Index(np.arange(5, dtype="int64")), - Index(np.arange(5, dtype="uint64")), - RangeIndex(5), - ], - ids=lambda x: type(x).__name__, -) -def numeric_idx(request): - """ - Several types of numeric-dtypes Index objects - """ - return request.param - - # ------------------------------------------------------------------ # Scalar Fixtures @@ -148,22 +123,6 @@ def two_hours(request): ] -@pytest.fixture( - params=[ - pd.Timedelta(minutes=30).to_pytimedelta(), - np.timedelta64(30, "s"), - pd.Timedelta(seconds=30), - ] - + _common_mismatch -) -def not_hourly(request): - """ - Several timedelta-like and DateOffset instances that are _not_ - compatible with Hourly frequencies. - """ - return request.param - - @pytest.fixture( params=[ np.timedelta64(4, "h"), @@ -178,33 +137,3 @@ def not_daily(request): compatible with Daily frequencies. """ return request.param - - -@pytest.fixture( - params=[ - np.timedelta64(365, "D"), - pd.Timedelta(days=365).to_pytimedelta(), - pd.Timedelta(days=365), - ] - + _common_mismatch -) -def mismatched_freq(request): - """ - Several timedelta-like and DateOffset instances that are _not_ - compatible with Monthly or Annual frequencies. - """ - return request.param - - -# ------------------------------------------------------------------ - - -@pytest.fixture( - params=[Index, pd.Series, tm.to_array, np.array, list], ids=lambda x: x.__name__ -) -def box_1d_array(request): - """ - Fixture to test behavior for Index, Series, tm.to_array, numpy Array and list - classes - """ - return request.param diff --git a/pandas/tests/arithmetic/test_numeric.py b/pandas/tests/arithmetic/test_numeric.py index c2fba3c775de9..f89711c0edee7 100644 --- a/pandas/tests/arithmetic/test_numeric.py +++ b/pandas/tests/arithmetic/test_numeric.py @@ -44,6 +44,34 @@ def box_pandas_1d_array(request): return request.param +@pytest.fixture( + params=[ + # TODO: add more dtypes here + Index(np.arange(5, dtype="float64")), + Index(np.arange(5, dtype="int64")), + Index(np.arange(5, dtype="uint64")), + RangeIndex(5), + ], + ids=lambda x: type(x).__name__, +) +def numeric_idx(request): + """ + Several types of numeric-dtypes Index objects + """ + return request.param + + +@pytest.fixture( + params=[Index, Series, tm.to_array, np.array, list], ids=lambda x: x.__name__ +) +def box_1d_array(request): + """ + Fixture to test behavior for Index, Series, tm.to_array, numpy Array and list + classes + """ + return request.param + + def adjust_negative_zero(zero, expected): """ Helper to adjust the expected result if we are dividing by -0.0 diff --git a/pandas/tests/arithmetic/test_period.py b/pandas/tests/arithmetic/test_period.py index 68d245bcffce2..88c633f5e747f 100644 --- a/pandas/tests/arithmetic/test_period.py +++ b/pandas/tests/arithmetic/test_period.py @@ -31,6 +31,45 @@ get_upcast_box, ) +_common_mismatch = [ + pd.offsets.YearBegin(2), + pd.offsets.MonthBegin(1), + pd.offsets.Minute(), +] + + +@pytest.fixture( + params=[ + Timedelta(minutes=30).to_pytimedelta(), + np.timedelta64(30, "s"), + Timedelta(seconds=30), + ] + + _common_mismatch +) +def not_hourly(request): + """ + Several timedelta-like and DateOffset instances that are _not_ + compatible with Hourly frequencies. + """ + return request.param + + +@pytest.fixture( + params=[ + np.timedelta64(365, "D"), + Timedelta(days=365).to_pytimedelta(), + Timedelta(days=365), + ] + + _common_mismatch +) +def mismatched_freq(request): + """ + Several timedelta-like and DateOffset instances that are _not_ + compatible with Monthly or Annual frequencies. + """ + return request.param + + # ------------------------------------------------------------------ # Comparisons diff --git a/pandas/tests/arrays/categorical/conftest.py b/pandas/tests/arrays/categorical/conftest.py index d5b49e3e5e8c8..37249210f28f4 100644 --- a/pandas/tests/arrays/categorical/conftest.py +++ b/pandas/tests/arrays/categorical/conftest.py @@ -3,12 +3,6 @@ from pandas import Categorical -@pytest.fixture(params=[True, False]) -def allow_fill(request): - """Boolean 'allow_fill' parameter for Categorical.take""" - return request.param - - @pytest.fixture def factor(): """Fixture returning a Categorical object""" diff --git a/pandas/tests/arrays/categorical/test_take.py b/pandas/tests/arrays/categorical/test_take.py index fb79fe4923522..373f1b30a13c2 100644 --- a/pandas/tests/arrays/categorical/test_take.py +++ b/pandas/tests/arrays/categorical/test_take.py @@ -5,6 +5,12 @@ import pandas._testing as tm +@pytest.fixture(params=[True, False]) +def allow_fill(request): + """Boolean 'allow_fill' parameter for Categorical.take""" + return request.param + + class TestTake: # https://github.com/pandas-dev/pandas/issues/20664 diff --git a/pandas/tests/frame/conftest.py b/pandas/tests/frame/conftest.py index fb2df0b82e5f4..f7ed5180b46d9 100644 --- a/pandas/tests/frame/conftest.py +++ b/pandas/tests/frame/conftest.py @@ -10,75 +10,32 @@ @pytest.fixture -def float_frame_with_na(): +def datetime_frame() -> DataFrame: """ - Fixture for DataFrame of floats with index of unique strings + Fixture for DataFrame of floats with DatetimeIndex - Columns are ['A', 'B', 'C', 'D']; some entries are missing + Columns are ['A', 'B', 'C', 'D'] A B C D - ABwBzA0ljw -1.128865 -0.897161 0.046603 0.274997 - DJiRzmbyQF 0.728869 0.233502 0.722431 -0.890872 - neMgPD5UBF 0.486072 -1.027393 -0.031553 1.449522 - 0yWA4n8VeX -1.937191 -1.142531 0.805215 -0.462018 - 3slYUbbqU1 0.153260 1.164691 1.489795 -0.545826 - soujjZ0A08 NaN NaN NaN NaN - 7W6NLGsjB9 NaN NaN NaN NaN + 2000-01-03 -1.122153 0.468535 0.122226 1.693711 + 2000-01-04 0.189378 0.486100 0.007864 -1.216052 + 2000-01-05 0.041401 -0.835752 -0.035279 -0.414357 + 2000-01-06 0.430050 0.894352 0.090719 0.036939 + 2000-01-07 -0.620982 -0.668211 -0.706153 1.466335 + 2000-01-10 -0.752633 0.328434 -0.815325 0.699674 + 2000-01-11 -2.236969 0.615737 -0.829076 -1.196106 ... ... ... ... ... - uhfeaNkCR1 -0.231210 -0.340472 0.244717 -0.901590 - n6p7GYuBIV -0.419052 1.922721 -0.125361 -0.727717 - ZhzAeY6p1y 1.234374 -1.425359 -0.827038 -0.633189 - uWdPsORyUh 0.046738 -0.980445 -1.102965 0.605503 - 3DJA6aN590 -0.091018 -1.684734 -1.100900 0.215947 - 2GBPAzdbMk -2.883405 -1.021071 1.209877 1.633083 - sHadBoyVHw -2.223032 -0.326384 0.258931 0.245517 + 2000-02-03 1.642618 -0.579288 0.046005 1.385249 + 2000-02-04 -0.544873 -1.160962 -0.284071 -1.418351 + 2000-02-07 -2.656149 -0.601387 1.410148 0.444150 + 2000-02-08 -1.201881 -1.289040 0.772992 -1.445300 + 2000-02-09 1.377373 0.398619 1.008453 -0.928207 + 2000-02-10 0.473194 -0.636677 0.984058 0.511519 + 2000-02-11 -0.965556 0.408313 -1.312844 -0.381948 [30 rows x 4 columns] """ - df = DataFrame(tm.getSeriesData()) - # set some NAs - df.iloc[5:10] = np.nan - df.iloc[15:20, -2:] = np.nan - return df - - -@pytest.fixture -def bool_frame_with_na(): - """ - Fixture for DataFrame of booleans with index of unique strings - - Columns are ['A', 'B', 'C', 'D']; some entries are missing - - A B C D - zBZxY2IDGd False False False False - IhBWBMWllt False True True True - ctjdvZSR6R True False True True - AVTujptmxb False True False True - G9lrImrSWq False False False True - sFFwdIUfz2 NaN NaN NaN NaN - s15ptEJnRb NaN NaN NaN NaN - ... ... ... ... ... - UW41KkDyZ4 True True False False - l9l6XkOdqV True False False False - X2MeZfzDYA False True False False - xWkIKU7vfX False True False True - QOhL6VmpGU False False False True - 22PwkRJdat False True False False - kfboQ3VeIK True False True False - - [30 rows x 4 columns] - """ - df = DataFrame(tm.getSeriesData()) > 0 - df = df.astype(object) - # set some NAs - df.iloc[5:10] = np.nan - df.iloc[15:20, -2:] = np.nan - - # For `any` tests we need to have at least one True before the first NaN - # in each column - for i in range(4): - df.iloc[i, i] = True - return df + return DataFrame(tm.getTimeSeriesData()) @pytest.fixture @@ -202,60 +159,3 @@ def timezone_frame(): df.iloc[1, 1] = NaT df.iloc[1, 2] = NaT return df - - -@pytest.fixture -def uint64_frame(): - """ - Fixture for DataFrame with uint64 values - - Columns are ['A', 'B'] - """ - return DataFrame( - {"A": np.arange(3), "B": [2**63, 2**63 + 5, 2**63 + 10]}, dtype=np.uint64 - ) - - -@pytest.fixture -def simple_frame(): - """ - Fixture for simple 3x3 DataFrame - - Columns are ['one', 'two', 'three'], index is ['a', 'b', 'c']. - - one two three - a 1.0 2.0 3.0 - b 4.0 5.0 6.0 - c 7.0 8.0 9.0 - """ - arr = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) - - return DataFrame(arr, columns=["one", "two", "three"], index=["a", "b", "c"]) - - -@pytest.fixture -def frame_of_index_cols(): - """ - Fixture for DataFrame of columns that can be used for indexing - - Columns are ['A', 'B', 'C', 'D', 'E', ('tuple', 'as', 'label')]; - 'A' & 'B' contain duplicates (but are jointly unique), the rest are unique. - - A B C D E (tuple, as, label) - 0 foo one a 0.608477 -0.012500 -1.664297 - 1 foo two b -0.633460 0.249614 -0.364411 - 2 foo three c 0.615256 2.154968 -0.834666 - 3 bar one d 0.234246 1.085675 0.718445 - 4 bar two e 0.533841 -0.005702 -3.533912 - """ - df = DataFrame( - { - "A": ["foo", "foo", "foo", "bar", "bar"], - "B": ["one", "two", "three", "one", "two"], - "C": ["a", "b", "c", "d", "e"], - "D": np.random.default_rng(2).standard_normal(5), - "E": np.random.default_rng(2).standard_normal(5), - ("tuple", "as", "label"): np.random.default_rng(2).standard_normal(5), - } - ) - return df diff --git a/pandas/tests/frame/indexing/test_indexing.py b/pandas/tests/frame/indexing/test_indexing.py index 10068b504b1b7..3cad2e73d3d9d 100644 --- a/pandas/tests/frame/indexing/test_indexing.py +++ b/pandas/tests/frame/indexing/test_indexing.py @@ -1569,8 +1569,11 @@ def test_setitem_value_coercing_dtypes(self, indexer, idx): class TestDataFrameIndexingUInt64: - def test_setitem(self, uint64_frame): - df = uint64_frame + def test_setitem(self): + df = DataFrame( + {"A": np.arange(3), "B": [2**63, 2**63 + 5, 2**63 + 10]}, + dtype=np.uint64, + ) idx = df["A"].rename("foo") # setitem diff --git a/pandas/tests/frame/methods/test_astype.py b/pandas/tests/frame/methods/test_astype.py index eac10d307c61c..2578dfb622fbf 100644 --- a/pandas/tests/frame/methods/test_astype.py +++ b/pandas/tests/frame/methods/test_astype.py @@ -67,9 +67,19 @@ def test_astype_mixed_float(self, mixed_float_frame): casted = mixed_float_frame.reindex(columns=["A", "B"]).astype("float16") _check_cast(casted, "float16") - def test_astype_mixed_type(self, mixed_type_frame): + def test_astype_mixed_type(self): # mixed casting - mn = mixed_type_frame._get_numeric_data().copy() + df = DataFrame( + { + "a": 1.0, + "b": 2, + "c": "foo", + "float32": np.array([1.0] * 10, dtype="float32"), + "int32": np.array([1] * 10, dtype="int32"), + }, + index=np.arange(10), + ) + mn = df._get_numeric_data().copy() mn["little_float"] = np.array(12345.0, dtype="float16") mn["big_float"] = np.array(123456789101112.0, dtype="float64") diff --git a/pandas/tests/frame/methods/test_clip.py b/pandas/tests/frame/methods/test_clip.py index ed8ccaea92c58..f783a388d7517 100644 --- a/pandas/tests/frame/methods/test_clip.py +++ b/pandas/tests/frame/methods/test_clip.py @@ -94,9 +94,13 @@ def test_clip_against_series(self, inplace): (1, [[2.0, 3.0, 4.0], [4.0, 5.0, 6.0], [5.0, 6.0, 7.0]]), ], ) - def test_clip_against_list_like(self, simple_frame, inplace, lower, axis, res): + def test_clip_against_list_like(self, inplace, lower, axis, res): # GH#15390 - original = simple_frame.copy(deep=True) + arr = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) + + original = DataFrame( + arr, columns=["one", "two", "three"], index=["a", "b", "c"] + ) result = original.clip(lower=lower, upper=[5, 6, 7], axis=axis, inplace=inplace) diff --git a/pandas/tests/frame/methods/test_set_index.py b/pandas/tests/frame/methods/test_set_index.py index 9b87ffb0241ef..98113b6c41821 100644 --- a/pandas/tests/frame/methods/test_set_index.py +++ b/pandas/tests/frame/methods/test_set_index.py @@ -24,6 +24,34 @@ import pandas._testing as tm +@pytest.fixture +def frame_of_index_cols(): + """ + Fixture for DataFrame of columns that can be used for indexing + + Columns are ['A', 'B', 'C', 'D', 'E', ('tuple', 'as', 'label')]; + 'A' & 'B' contain duplicates (but are jointly unique), the rest are unique. + + A B C D E (tuple, as, label) + 0 foo one a 0.608477 -0.012500 -1.664297 + 1 foo two b -0.633460 0.249614 -0.364411 + 2 foo three c 0.615256 2.154968 -0.834666 + 3 bar one d 0.234246 1.085675 0.718445 + 4 bar two e 0.533841 -0.005702 -3.533912 + """ + df = DataFrame( + { + "A": ["foo", "foo", "foo", "bar", "bar"], + "B": ["one", "two", "three", "one", "two"], + "C": ["a", "b", "c", "d", "e"], + "D": np.random.default_rng(2).standard_normal(5), + "E": np.random.default_rng(2).standard_normal(5), + ("tuple", "as", "label"): np.random.default_rng(2).standard_normal(5), + } + ) + return df + + class TestSetIndex: def test_set_index_multiindex(self): # segfault in GH#3308 diff --git a/pandas/tests/frame/methods/test_transpose.py b/pandas/tests/frame/methods/test_transpose.py index 50fc6fe6984e7..f96f4e0558fa6 100644 --- a/pandas/tests/frame/methods/test_transpose.py +++ b/pandas/tests/frame/methods/test_transpose.py @@ -87,9 +87,13 @@ def test_transpose_object_to_tzaware_mixed_tz(self): res2 = df2.T assert (res2.dtypes == object).all() - def test_transpose_uint64(self, uint64_frame): - result = uint64_frame.T - expected = DataFrame(uint64_frame.values.T) + def test_transpose_uint64(self): + df = DataFrame( + {"A": np.arange(3), "B": [2**63, 2**63 + 5, 2**63 + 10]}, + dtype=np.uint64, + ) + result = df.T + expected = DataFrame(df.values.T) expected.index = ["A", "B"] tm.assert_frame_equal(result, expected) diff --git a/pandas/tests/frame/test_arithmetic.py b/pandas/tests/frame/test_arithmetic.py index 9e3ee7c69b637..8083795a69413 100644 --- a/pandas/tests/frame/test_arithmetic.py +++ b/pandas/tests/frame/test_arithmetic.py @@ -28,6 +28,23 @@ ) +@pytest.fixture +def simple_frame(): + """ + Fixture for simple 3x3 DataFrame + + Columns are ['one', 'two', 'three'], index is ['a', 'b', 'c']. + + one two three + a 1.0 2.0 3.0 + b 4.0 5.0 6.0 + c 7.0 8.0 9.0 + """ + arr = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) + + return DataFrame(arr, columns=["one", "two", "three"], index=["a", "b", "c"]) + + @pytest.fixture(autouse=True, params=[0, 100], ids=["numexpr", "python"]) def switch_numexpr_min_elements(request, monkeypatch): with monkeypatch.context() as m: diff --git a/pandas/tests/frame/test_reductions.py b/pandas/tests/frame/test_reductions.py index fc7c1b0f01fed..20ad93e6dce4d 100644 --- a/pandas/tests/frame/test_reductions.py +++ b/pandas/tests/frame/test_reductions.py @@ -147,6 +147,78 @@ def wrapper(x): tm.assert_series_equal(r1, expected) +@pytest.fixture +def bool_frame_with_na(): + """ + Fixture for DataFrame of booleans with index of unique strings + + Columns are ['A', 'B', 'C', 'D']; some entries are missing + + A B C D + zBZxY2IDGd False False False False + IhBWBMWllt False True True True + ctjdvZSR6R True False True True + AVTujptmxb False True False True + G9lrImrSWq False False False True + sFFwdIUfz2 NaN NaN NaN NaN + s15ptEJnRb NaN NaN NaN NaN + ... ... ... ... ... + UW41KkDyZ4 True True False False + l9l6XkOdqV True False False False + X2MeZfzDYA False True False False + xWkIKU7vfX False True False True + QOhL6VmpGU False False False True + 22PwkRJdat False True False False + kfboQ3VeIK True False True False + + [30 rows x 4 columns] + """ + df = DataFrame(tm.getSeriesData()) > 0 + df = df.astype(object) + # set some NAs + df.iloc[5:10] = np.nan + df.iloc[15:20, -2:] = np.nan + + # For `any` tests we need to have at least one True before the first NaN + # in each column + for i in range(4): + df.iloc[i, i] = True + return df + + +@pytest.fixture +def float_frame_with_na(): + """ + Fixture for DataFrame of floats with index of unique strings + + Columns are ['A', 'B', 'C', 'D']; some entries are missing + + A B C D + ABwBzA0ljw -1.128865 -0.897161 0.046603 0.274997 + DJiRzmbyQF 0.728869 0.233502 0.722431 -0.890872 + neMgPD5UBF 0.486072 -1.027393 -0.031553 1.449522 + 0yWA4n8VeX -1.937191 -1.142531 0.805215 -0.462018 + 3slYUbbqU1 0.153260 1.164691 1.489795 -0.545826 + soujjZ0A08 NaN NaN NaN NaN + 7W6NLGsjB9 NaN NaN NaN NaN + ... ... ... ... ... + uhfeaNkCR1 -0.231210 -0.340472 0.244717 -0.901590 + n6p7GYuBIV -0.419052 1.922721 -0.125361 -0.727717 + ZhzAeY6p1y 1.234374 -1.425359 -0.827038 -0.633189 + uWdPsORyUh 0.046738 -0.980445 -1.102965 0.605503 + 3DJA6aN590 -0.091018 -1.684734 -1.100900 0.215947 + 2GBPAzdbMk -2.883405 -1.021071 1.209877 1.633083 + sHadBoyVHw -2.223032 -0.326384 0.258931 0.245517 + + [30 rows x 4 columns] + """ + df = DataFrame(tm.getSeriesData()) + # set some NAs + df.iloc[5:10] = np.nan + df.iloc[15:20, -2:] = np.nan + return df + + class TestDataFrameAnalytics: # --------------------------------------------------------------------- # Reductions diff --git a/pandas/tests/groupby/aggregate/test_aggregate.py b/pandas/tests/groupby/aggregate/test_aggregate.py index 78b99a00d43ce..45884a4b3c20f 100644 --- a/pandas/tests/groupby/aggregate/test_aggregate.py +++ b/pandas/tests/groupby/aggregate/test_aggregate.py @@ -178,8 +178,8 @@ def test_agg_grouping_is_list_tuple(ts): tm.assert_frame_equal(result, expected) -def test_agg_python_multiindex(mframe): - grouped = mframe.groupby(["A", "B"]) +def test_agg_python_multiindex(multiindex_dataframe_random_data): + grouped = multiindex_dataframe_random_data.groupby(["A", "B"]) result = grouped.agg("mean") expected = grouped.mean() diff --git a/pandas/tests/groupby/conftest.py b/pandas/tests/groupby/conftest.py index 49fa9dc51f0d3..b8fb3b7fff676 100644 --- a/pandas/tests/groupby/conftest.py +++ b/pandas/tests/groupby/conftest.py @@ -24,21 +24,11 @@ def dropna(request): return request.param -@pytest.fixture(params=[True, False]) -def skipna(request): - return request.param - - @pytest.fixture(params=[True, False]) def observed(request): return request.param -@pytest.fixture -def mframe(multiindex_dataframe_random_data): - return multiindex_dataframe_random_data - - @pytest.fixture def df(): return DataFrame( @@ -57,25 +47,8 @@ def ts(): @pytest.fixture -def tsd(): - return tm.getTimeSeriesData() - - -@pytest.fixture -def tsframe(tsd): - return DataFrame(tsd) - - -@pytest.fixture -def df_mixed_floats(): - return DataFrame( - { - "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"], - "B": ["one", "one", "two", "three", "two", "two", "one", "three"], - "C": np.random.default_rng(2).standard_normal(8), - "D": np.array(np.random.default_rng(2).standard_normal(8), dtype="float32"), - } - ) +def tsframe(): + return DataFrame(tm.getTimeSeriesData()) @pytest.fixture diff --git a/pandas/tests/groupby/methods/test_describe.py b/pandas/tests/groupby/methods/test_describe.py index c2ffcb04caa60..ee8f93bf3b549 100644 --- a/pandas/tests/groupby/methods/test_describe.py +++ b/pandas/tests/groupby/methods/test_describe.py @@ -11,8 +11,8 @@ import pandas._testing as tm -def test_apply_describe_bug(mframe): - grouped = mframe.groupby(level="first") +def test_apply_describe_bug(multiindex_dataframe_random_data): + grouped = multiindex_dataframe_random_data.groupby(level="first") grouped.describe() # it works! diff --git a/pandas/tests/groupby/methods/test_nth.py b/pandas/tests/groupby/methods/test_nth.py index 4a5571d0daa42..e39cfd520ba1a 100644 --- a/pandas/tests/groupby/methods/test_nth.py +++ b/pandas/tests/groupby/methods/test_nth.py @@ -122,8 +122,15 @@ def test_first_last_with_None_expanded(method, df, expected): tm.assert_frame_equal(result, expected) -def test_first_last_nth_dtypes(df_mixed_floats): - df = df_mixed_floats.copy() +def test_first_last_nth_dtypes(): + df = DataFrame( + { + "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"], + "B": ["one", "one", "two", "three", "two", "two", "one", "three"], + "C": np.random.default_rng(2).standard_normal(8), + "D": np.array(np.random.default_rng(2).standard_normal(8), dtype="float32"), + } + ) df["E"] = True df["F"] = 1 diff --git a/pandas/tests/groupby/test_api.py b/pandas/tests/groupby/test_api.py index 1a030841ba3ab..3066825352fa7 100644 --- a/pandas/tests/groupby/test_api.py +++ b/pandas/tests/groupby/test_api.py @@ -24,8 +24,8 @@ ) -def test_tab_completion(mframe): - grp = mframe.groupby(level="second") +def test_tab_completion(multiindex_dataframe_random_data): + grp = multiindex_dataframe_random_data.groupby(level="second") results = {v for v in dir(grp) if not v.startswith("_")} expected = { "A", @@ -98,9 +98,13 @@ def test_tab_completion(mframe): assert results == expected -def test_all_methods_categorized(mframe): - grp = mframe.groupby(mframe.iloc[:, 0]) - names = {_ for _ in dir(grp) if not _.startswith("_")} - set(mframe.columns) +def test_all_methods_categorized(multiindex_dataframe_random_data): + grp = multiindex_dataframe_random_data.groupby( + multiindex_dataframe_random_data.iloc[:, 0] + ) + names = {_ for _ in dir(grp) if not _.startswith("_")} - set( + multiindex_dataframe_random_data.columns + ) new_names = set(names) new_names -= reduction_kernels new_names -= transformation_kernels diff --git a/pandas/tests/groupby/test_groupby.py b/pandas/tests/groupby/test_groupby.py index 693650274cd23..c61d9fab0435e 100644 --- a/pandas/tests/groupby/test_groupby.py +++ b/pandas/tests/groupby/test_groupby.py @@ -136,18 +136,27 @@ def test_basic_aggregations(dtype): grouped.aggregate(lambda x: x * 2) -def test_groupby_nonobject_dtype(mframe, df_mixed_floats): - key = mframe.index.codes[0] - grouped = mframe.groupby(key) +def test_groupby_nonobject_dtype(multiindex_dataframe_random_data): + key = multiindex_dataframe_random_data.index.codes[0] + grouped = multiindex_dataframe_random_data.groupby(key) result = grouped.sum() - expected = mframe.groupby(key.astype("O")).sum() + expected = multiindex_dataframe_random_data.groupby(key.astype("O")).sum() assert result.index.dtype == np.int8 assert expected.index.dtype == np.int64 tm.assert_frame_equal(result, expected, check_index_type=False) + +def test_groupby_nonobject_dtype_mixed(): # GH 3911, mixed frame non-conversion - df = df_mixed_floats.copy() + df = DataFrame( + { + "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"], + "B": ["one", "one", "two", "three", "two", "two", "one", "three"], + "C": np.random.default_rng(2).standard_normal(8), + "D": np.array(np.random.default_rng(2).standard_normal(8), dtype="float32"), + } + ) df["value"] = range(len(df)) def max_value(group): @@ -1052,7 +1061,7 @@ def test_raise_on_nuisance_python_multiple(three_group): grouped.mean() -def test_empty_groups_corner(mframe): +def test_empty_groups_corner(multiindex_dataframe_random_data): # handle empty groups df = DataFrame( { @@ -1069,7 +1078,7 @@ def test_empty_groups_corner(mframe): expected = grouped.mean(numeric_only=True) tm.assert_frame_equal(result, expected) - grouped = mframe[3:5].groupby(level=0) + grouped = multiindex_dataframe_random_data[3:5].groupby(level=0) agged = grouped.apply(lambda x: x.mean()) agged_A = grouped["A"].apply("mean") tm.assert_series_equal(agged["A"], agged_A) @@ -1083,8 +1092,8 @@ def test_nonsense_func(): df.groupby(lambda x: x + "foo") -def test_wrap_aggregated_output_multindex(mframe): - df = mframe.T +def test_wrap_aggregated_output_multindex(multiindex_dataframe_random_data): + df = multiindex_dataframe_random_data.T df["baz", "two"] = "peekaboo" keys = [np.array([0, 0, 1]), np.array([0, 0, 1])] @@ -1103,24 +1112,24 @@ def aggfun(ser): df.groupby(keys).aggregate(aggfun) -def test_groupby_level_apply(mframe): - result = mframe.groupby(level=0).count() +def test_groupby_level_apply(multiindex_dataframe_random_data): + result = multiindex_dataframe_random_data.groupby(level=0).count() assert result.index.name == "first" - result = mframe.groupby(level=1).count() + result = multiindex_dataframe_random_data.groupby(level=1).count() assert result.index.name == "second" - result = mframe["A"].groupby(level=0).count() + result = multiindex_dataframe_random_data["A"].groupby(level=0).count() assert result.index.name == "first" -def test_groupby_level_mapper(mframe): - deleveled = mframe.reset_index() +def test_groupby_level_mapper(multiindex_dataframe_random_data): + deleveled = multiindex_dataframe_random_data.reset_index() mapper0 = {"foo": 0, "bar": 0, "baz": 1, "qux": 1} mapper1 = {"one": 0, "two": 0, "three": 1} - result0 = mframe.groupby(mapper0, level=0).sum() - result1 = mframe.groupby(mapper1, level=1).sum() + result0 = multiindex_dataframe_random_data.groupby(mapper0, level=0).sum() + result1 = multiindex_dataframe_random_data.groupby(mapper1, level=1).sum() mapped_level0 = np.array( [mapper0.get(x) for x in deleveled["first"]], dtype=np.int64 @@ -1128,8 +1137,8 @@ def test_groupby_level_mapper(mframe): mapped_level1 = np.array( [mapper1.get(x) for x in deleveled["second"]], dtype=np.int64 ) - expected0 = mframe.groupby(mapped_level0).sum() - expected1 = mframe.groupby(mapped_level1).sum() + expected0 = multiindex_dataframe_random_data.groupby(mapped_level0).sum() + expected1 = multiindex_dataframe_random_data.groupby(mapped_level1).sum() expected0.index.name, expected1.index.name = "first", "second" tm.assert_frame_equal(result0, expected0) diff --git a/pandas/tests/groupby/test_grouping.py b/pandas/tests/groupby/test_grouping.py index 3e52476be9dbd..e3cc41afa4679 100644 --- a/pandas/tests/groupby/test_grouping.py +++ b/pandas/tests/groupby/test_grouping.py @@ -534,22 +534,24 @@ def test_multiindex_passthru(self): result = gb.first() tm.assert_frame_equal(result, df) - def test_multiindex_negative_level(self, mframe): + def test_multiindex_negative_level(self, multiindex_dataframe_random_data): # GH 13901 - result = mframe.groupby(level=-1).sum() - expected = mframe.groupby(level="second").sum() + result = multiindex_dataframe_random_data.groupby(level=-1).sum() + expected = multiindex_dataframe_random_data.groupby(level="second").sum() tm.assert_frame_equal(result, expected) - result = mframe.groupby(level=-2).sum() - expected = mframe.groupby(level="first").sum() + result = multiindex_dataframe_random_data.groupby(level=-2).sum() + expected = multiindex_dataframe_random_data.groupby(level="first").sum() tm.assert_frame_equal(result, expected) - result = mframe.groupby(level=[-2, -1]).sum() - expected = mframe.sort_index() + result = multiindex_dataframe_random_data.groupby(level=[-2, -1]).sum() + expected = multiindex_dataframe_random_data.sort_index() tm.assert_frame_equal(result, expected) - result = mframe.groupby(level=[-1, "first"]).sum() - expected = mframe.groupby(level=["second", "first"]).sum() + result = multiindex_dataframe_random_data.groupby(level=[-1, "first"]).sum() + expected = multiindex_dataframe_random_data.groupby( + level=["second", "first"] + ).sum() tm.assert_frame_equal(result, expected) def test_multifunc_select_col_integer_cols(self, df): @@ -641,9 +643,9 @@ def test_groupby_multiindex_partial_indexing_equivalence(self): tm.assert_dict_equal(expected_groups, result_groups) @pytest.mark.parametrize("sort", [True, False]) - def test_groupby_level(self, sort, mframe, df): + def test_groupby_level(self, sort, multiindex_dataframe_random_data, df): # GH 17537 - frame = mframe + frame = multiindex_dataframe_random_data deleveled = frame.reset_index() result0 = frame.groupby(level=0, sort=sort).sum() @@ -724,9 +726,9 @@ def test_groupby_level_with_nas(self, sort): expected = Series([6.0, 18.0], index=[0.0, 1.0]) tm.assert_series_equal(result, expected) - def test_groupby_args(self, mframe): + def test_groupby_args(self, multiindex_dataframe_random_data): # PR8618 and issue 8015 - frame = mframe + frame = multiindex_dataframe_random_data msg = "You have to supply one of 'by' and 'level'" with pytest.raises(TypeError, match=msg): @@ -743,14 +745,16 @@ def test_groupby_args(self, mframe): [False, [0, 0, 0, 1, 1, 2, 2, 3, 3, 3]], ], ) - def test_level_preserve_order(self, sort, labels, mframe): + def test_level_preserve_order(self, sort, labels, multiindex_dataframe_random_data): # GH 17537 - grouped = mframe.groupby(level=0, sort=sort) + grouped = multiindex_dataframe_random_data.groupby(level=0, sort=sort) exp_labels = np.array(labels, np.intp) tm.assert_almost_equal(grouped.grouper.codes[0], exp_labels) - def test_grouping_labels(self, mframe): - grouped = mframe.groupby(mframe.index.get_level_values(0)) + def test_grouping_labels(self, multiindex_dataframe_random_data): + grouped = multiindex_dataframe_random_data.groupby( + multiindex_dataframe_random_data.index.get_level_values(0) + ) exp_labels = np.array([2, 2, 2, 0, 0, 1, 1, 3, 3, 3], dtype=np.intp) tm.assert_almost_equal(grouped.grouper.codes[0], exp_labels) diff --git a/pandas/tests/indexes/conftest.py b/pandas/tests/indexes/conftest.py index 808a1687390ff..bfb7acdcf4812 100644 --- a/pandas/tests/indexes/conftest.py +++ b/pandas/tests/indexes/conftest.py @@ -5,7 +5,6 @@ Series, array, ) -import pandas._testing as tm @pytest.fixture(params=[None, False]) @@ -40,22 +39,3 @@ def listlike_box(request): Types that may be passed as the indexer to searchsorted. """ return request.param - - -@pytest.fixture( - params=tm.ALL_REAL_NUMPY_DTYPES - + [ - "object", - "category", - "datetime64[ns]", - "timedelta64[ns]", - ] -) -def any_dtype_for_small_pos_integer_indexes(request): - """ - Dtypes that can be given to an Index with small positive integers. - - This means that for any dtype `x` in the params list, `Index([1, 2, 3], dtype=x)` is - valid and gives the correct Index (sub-)class. - """ - return request.param diff --git a/pandas/tests/indexes/multi/conftest.py b/pandas/tests/indexes/multi/conftest.py index 3cc4fa4713831..15062aee56e3a 100644 --- a/pandas/tests/indexes/multi/conftest.py +++ b/pandas/tests/indexes/multi/conftest.py @@ -1,7 +1,6 @@ import numpy as np import pytest -import pandas as pd from pandas import ( Index, MultiIndex, @@ -26,52 +25,3 @@ def idx(): verify_integrity=False, ) return mi - - -@pytest.fixture -def idx_dup(): - # compare tests/indexes/multi/conftest.py - major_axis = Index(["foo", "bar", "baz", "qux"]) - minor_axis = Index(["one", "two"]) - - major_codes = np.array([0, 0, 1, 0, 1, 1]) - minor_codes = np.array([0, 1, 0, 1, 0, 1]) - index_names = ["first", "second"] - mi = MultiIndex( - levels=[major_axis, minor_axis], - codes=[major_codes, minor_codes], - names=index_names, - verify_integrity=False, - ) - return mi - - -@pytest.fixture -def index_names(): - # names that match those in the idx fixture for testing equality of - # names assigned to the idx - return ["first", "second"] - - -@pytest.fixture -def narrow_multi_index(): - """ - Return a MultiIndex that is narrower than the display (<80 characters). - """ - n = 1000 - ci = pd.CategoricalIndex(list("a" * n) + (["abc"] * n)) - dti = pd.date_range("2000-01-01", freq="s", periods=n * 2) - return MultiIndex.from_arrays([ci, ci.codes + 9, dti], names=["a", "b", "dti"]) - - -@pytest.fixture -def wide_multi_index(): - """ - Return a MultiIndex that is wider than the display (>80 characters). - """ - n = 1000 - ci = pd.CategoricalIndex(list("a" * n) + (["abc"] * n)) - dti = pd.date_range("2000-01-01", freq="s", periods=n * 2) - levels = [ci, ci.codes + 9, dti, dti, dti] - names = ["a", "b", "dti_1", "dti_2", "dti_3"] - return MultiIndex.from_arrays(levels, names=names) diff --git a/pandas/tests/indexes/multi/test_duplicates.py b/pandas/tests/indexes/multi/test_duplicates.py index ee1edaa27f804..a69248cf038f8 100644 --- a/pandas/tests/indexes/multi/test_duplicates.py +++ b/pandas/tests/indexes/multi/test_duplicates.py @@ -11,12 +11,31 @@ from pandas import ( NA, DatetimeIndex, + Index, MultiIndex, Series, ) import pandas._testing as tm +@pytest.fixture +def idx_dup(): + # compare tests/indexes/multi/conftest.py + major_axis = Index(["foo", "bar", "baz", "qux"]) + minor_axis = Index(["one", "two"]) + + major_codes = np.array([0, 0, 1, 0, 1, 1]) + minor_codes = np.array([0, 1, 0, 1, 0, 1]) + index_names = ["first", "second"] + mi = MultiIndex( + levels=[major_axis, minor_axis], + codes=[major_codes, minor_codes], + names=index_names, + verify_integrity=False, + ) + return mi + + @pytest.mark.parametrize("names", [None, ["first", "second"]]) def test_unique(names): mi = MultiIndex.from_arrays([[1, 2, 1, 2], [1, 1, 1, 2]], names=names) diff --git a/pandas/tests/indexes/multi/test_formats.py b/pandas/tests/indexes/multi/test_formats.py index 1736f65e355fb..52ff3109128f2 100644 --- a/pandas/tests/indexes/multi/test_formats.py +++ b/pandas/tests/indexes/multi/test_formats.py @@ -139,8 +139,11 @@ def test_repr(self, idx): names=['first', ...], length=6)""" assert result == expected - def test_rjust(self, narrow_multi_index): - mi = narrow_multi_index + def test_rjust(self): + n = 1000 + ci = pd.CategoricalIndex(list("a" * n) + (["abc"] * n)) + dti = pd.date_range("2000-01-01", freq="s", periods=n * 2) + mi = MultiIndex.from_arrays([ci, ci.codes + 9, dti], names=["a", "b", "dti"]) result = mi[:1].__repr__() expected = """\ MultiIndex([('a', 9, '2000-01-01 00:00:00')], @@ -182,8 +185,13 @@ def test_rjust(self, narrow_multi_index): names=['a', 'b', 'dti'], length=2000)""" assert result == expected - def test_tuple_width(self, wide_multi_index): - mi = wide_multi_index + def test_tuple_width(self): + n = 1000 + ci = pd.CategoricalIndex(list("a" * n) + (["abc"] * n)) + dti = pd.date_range("2000-01-01", freq="s", periods=n * 2) + levels = [ci, ci.codes + 9, dti, dti, dti] + names = ["a", "b", "dti_1", "dti_2", "dti_3"] + mi = MultiIndex.from_arrays(levels, names=names) result = mi[:1].__repr__() expected = """MultiIndex([('a', 9, '2000-01-01 00:00:00', '2000-01-01 00:00:00', ...)], names=['a', 'b', 'dti_1', 'dti_2', 'dti_3'])""" # noqa: E501 diff --git a/pandas/tests/indexes/multi/test_get_set.py b/pandas/tests/indexes/multi/test_get_set.py index 0720a1e1c648c..e362fc8a05a46 100644 --- a/pandas/tests/indexes/multi/test_get_set.py +++ b/pandas/tests/indexes/multi/test_get_set.py @@ -95,8 +95,9 @@ def test_get_level_number_out_of_bounds(multiindex_dataframe_random_data): frame.index._get_level_number(-3) -def test_set_name_methods(idx, index_names): +def test_set_name_methods(idx): # so long as these are synonyms, we don't need to test set_names + index_names = ["first", "second"] assert idx.rename == idx.set_names new_names = [name + "SUFFIX" for name in index_names] ind = idx.set_names(new_names) diff --git a/pandas/tests/indexes/multi/test_names.py b/pandas/tests/indexes/multi/test_names.py index 8ae643eb3626d..45f19b4d70fb9 100644 --- a/pandas/tests/indexes/multi/test_names.py +++ b/pandas/tests/indexes/multi/test_names.py @@ -83,11 +83,11 @@ def test_copy_names(): multi_idx.copy(names=[["mario"], ["luigi"]]) -def test_names(idx, index_names): +def test_names(idx): # names are assigned in setup - assert index_names == ["first", "second"] + assert idx.names == ["first", "second"] level_names = [level.name for level in idx.levels] - assert level_names == index_names + assert level_names == idx.names # setting bad names on existing index = idx diff --git a/pandas/tests/indexes/test_setops.py b/pandas/tests/indexes/test_setops.py index d126d32e627cd..1f328c06b483b 100644 --- a/pandas/tests/indexes/test_setops.py +++ b/pandas/tests/indexes/test_setops.py @@ -30,6 +30,25 @@ ) +@pytest.fixture( + params=tm.ALL_REAL_NUMPY_DTYPES + + [ + "object", + "category", + "datetime64[ns]", + "timedelta64[ns]", + ] +) +def any_dtype_for_small_pos_integer_indexes(request): + """ + Dtypes that can be given to an Index with small positive integers. + + This means that for any dtype `x` in the params list, `Index([1, 2, 3], dtype=x)` is + valid and gives the correct Index (sub-)class. + """ + return request.param + + def test_union_same_types(index): # Union with a non-unique, non-monotonic index raises error # Only needed for bool index factory diff --git a/pandas/tests/io/data/gbq_fake_job.txt b/pandas/tests/io/data/gbq_fake_job.txt deleted file mode 100644 index b0995222292e4..0000000000000 --- a/pandas/tests/io/data/gbq_fake_job.txt +++ /dev/null @@ -1 +0,0 @@ -{'status': {'state': 'DONE'}, 'kind': 'bigquery#job', 'statistics': {'query': {'cacheHit': True, 'totalBytesProcessed': '0'}, 'endTime': '1377668744674', 'totalBytesProcessed': '0', 'startTime': '1377668744466'}, 'jobReference': {'projectId': '57288129629', 'jobId': 'bqjob_r5f956972f0190bdf_00000140c374bf42_2'}, 'etag': '"4PTsVxg68bQkQs1RJ1Ndewqkgg4/oO4VmgFrAku4N6FWci9s7iFIftc"', 'configuration': {'query': {'createDisposition': 'CREATE_IF_NEEDED', 'query': 'SELECT * FROM [publicdata:samples.shakespeare]', 'writeDisposition': 'WRITE_TRUNCATE', 'destinationTable': {'projectId': '57288129629', 'tableId': 'anonb5ec450da88eeeb78a27784ea482ee75a146d442', 'datasetId': '_d0b4f5f0d50dc68a3eb0fa6cba66a9a8687d9253'}}}, 'id': '57288129629:bqjob_r5f956972f0190bdf_00000140c374bf42_2', 'selfLink': 'https://www.googleapis.com/bigquery/v2/projects/57288129629/jobs/bqjob_r5f956972f0190bdf_00000140c374bf42_2'} \ No newline at end of file diff --git a/pandas/tests/io/excel/conftest.py b/pandas/tests/io/excel/conftest.py deleted file mode 100644 index 15ff52d5bea48..0000000000000 --- a/pandas/tests/io/excel/conftest.py +++ /dev/null @@ -1,41 +0,0 @@ -import pytest - -import pandas._testing as tm - -from pandas.io.parsers import read_csv - - -@pytest.fixture -def frame(float_frame): - """ - Returns the first ten items in fixture "float_frame". - """ - return float_frame[:10] - - -@pytest.fixture -def tsframe(): - return tm.makeTimeDataFrame()[:5] - - -@pytest.fixture(params=[True, False]) -def merge_cells(request): - return request.param - - -@pytest.fixture -def df_ref(datapath): - """ - Obtain the reference data from read_csv with the Python engine. - """ - filepath = datapath("io", "data", "csv", "test1.csv") - df_ref = read_csv(filepath, index_col=0, parse_dates=True, engine="python") - return df_ref - - -@pytest.fixture(params=[".xls", ".xlsx", ".xlsm", ".ods", ".xlsb"]) -def read_ext(request): - """ - Valid extensions for reading Excel files. - """ - return request.param diff --git a/pandas/tests/io/excel/test_odswriter.py b/pandas/tests/io/excel/test_odswriter.py index ecee58362f8a9..271353a173d2a 100644 --- a/pandas/tests/io/excel/test_odswriter.py +++ b/pandas/tests/io/excel/test_odswriter.py @@ -13,7 +13,10 @@ odf = pytest.importorskip("odf") -pytestmark = pytest.mark.parametrize("ext", [".ods"]) + +@pytest.fixture +def ext(): + return ".ods" def test_write_append_mode_raises(ext): diff --git a/pandas/tests/io/excel/test_openpyxl.py b/pandas/tests/io/excel/test_openpyxl.py index 53cbd1ce3cceb..2df9ec9e53516 100644 --- a/pandas/tests/io/excel/test_openpyxl.py +++ b/pandas/tests/io/excel/test_openpyxl.py @@ -17,10 +17,13 @@ openpyxl = pytest.importorskip("openpyxl") -pytestmark = pytest.mark.parametrize("ext", [".xlsx"]) +@pytest.fixture +def ext(): + return ".xlsx" -def test_to_excel_styleconverter(ext): + +def test_to_excel_styleconverter(): from openpyxl import styles hstyle = { diff --git a/pandas/tests/io/excel/test_readers.py b/pandas/tests/io/excel/test_readers.py index 74fe5166df65f..abbdb77efad0e 100644 --- a/pandas/tests/io/excel/test_readers.py +++ b/pandas/tests/io/excel/test_readers.py @@ -22,6 +22,7 @@ Index, MultiIndex, Series, + read_csv, ) import pandas._testing as tm from pandas.core.arrays import ( @@ -117,6 +118,16 @@ def read_ext(engine_and_read_ext): return read_ext +@pytest.fixture +def df_ref(datapath): + """ + Obtain the reference data from read_csv with the Python engine. + """ + filepath = datapath("io", "data", "csv", "test1.csv") + df_ref = read_csv(filepath, index_col=0, parse_dates=True, engine="python") + return df_ref + + def adjust_expected(expected: DataFrame, read_ext: str) -> None: expected.index.name = None diff --git a/pandas/tests/io/excel/test_writers.py b/pandas/tests/io/excel/test_writers.py index b9ea440b3e859..22cd0621fd4c4 100644 --- a/pandas/tests/io/excel/test_writers.py +++ b/pandas/tests/io/excel/test_writers.py @@ -34,6 +34,19 @@ from pandas.io.excel._util import _writers +@pytest.fixture +def frame(float_frame): + """ + Returns the first ten items in fixture "float_frame". + """ + return float_frame[:10] + + +@pytest.fixture(params=[True, False]) +def merge_cells(request): + return request.param + + @pytest.fixture def path(ext): """ @@ -444,8 +457,8 @@ def test_mixed(self, frame, path): recons = pd.read_excel(reader, sheet_name="test1", index_col=0) tm.assert_frame_equal(mixed_frame, recons) - def test_ts_frame(self, tsframe, path): - df = tsframe + def test_ts_frame(self, path): + df = tm.makeTimeDataFrame()[:5] # freq doesn't round-trip index = pd.DatetimeIndex(np.asarray(df.index), freq=None) @@ -516,8 +529,9 @@ def test_inf_roundtrip(self, path): tm.assert_frame_equal(df, recons) - def test_sheets(self, frame, tsframe, path): + def test_sheets(self, frame, path): # freq doesn't round-trip + tsframe = tm.makeTimeDataFrame()[:5] index = pd.DatetimeIndex(np.asarray(tsframe.index), freq=None) tsframe.index = index @@ -633,10 +647,11 @@ def test_excel_roundtrip_indexname(self, merge_cells, path): tm.assert_frame_equal(result, df) assert result.index.name == "foo" - def test_excel_roundtrip_datetime(self, merge_cells, tsframe, path): + def test_excel_roundtrip_datetime(self, merge_cells, path): # datetime.date, not sure what to test here exactly # freq does not round-trip + tsframe = tm.makeTimeDataFrame()[:5] index = pd.DatetimeIndex(np.asarray(tsframe.index), freq=None) tsframe.index = index @@ -751,8 +766,8 @@ def test_to_excel_timedelta(self, path): recons = pd.read_excel(reader, sheet_name="test1", index_col=0) tm.assert_frame_equal(expected, recons) - def test_to_excel_periodindex(self, tsframe, path): - xp = tsframe.resample("ME", kind="period").mean() + def test_to_excel_periodindex(self, path): + xp = tm.makeTimeDataFrame()[:5].resample("ME", kind="period").mean() xp.to_excel(path, sheet_name="sht1") @@ -814,8 +829,9 @@ def test_to_excel_multiindex_cols(self, merge_cells, frame, path): frame.columns = [".".join(map(str, q)) for q in zip(*fm)] tm.assert_frame_equal(frame, df) - def test_to_excel_multiindex_dates(self, merge_cells, tsframe, path): + def test_to_excel_multiindex_dates(self, merge_cells, path): # try multiindex with dates + tsframe = tm.makeTimeDataFrame()[:5] new_index = [tsframe.index, np.arange(len(tsframe.index), dtype=np.int64)] tsframe.index = MultiIndex.from_arrays(new_index) diff --git a/pandas/tests/io/excel/test_xlsxwriter.py b/pandas/tests/io/excel/test_xlsxwriter.py index c4d02d71390cc..94f6bdfaf069c 100644 --- a/pandas/tests/io/excel/test_xlsxwriter.py +++ b/pandas/tests/io/excel/test_xlsxwriter.py @@ -9,7 +9,10 @@ xlsxwriter = pytest.importorskip("xlsxwriter") -pytestmark = pytest.mark.parametrize("ext", [".xlsx"]) + +@pytest.fixture +def ext(): + return ".xlsx" def test_column_format(ext): diff --git a/pandas/tests/io/json/conftest.py b/pandas/tests/io/json/conftest.py index f3736252e850a..4e848cd48b42d 100644 --- a/pandas/tests/io/json/conftest.py +++ b/pandas/tests/io/json/conftest.py @@ -7,10 +7,3 @@ def orient(request): Fixture for orients excluding the table format. """ return request.param - - -@pytest.fixture(params=["ujson", "pyarrow"]) -def engine(request): - if request.param == "pyarrow": - pytest.importorskip("pyarrow.json") - return request.param diff --git a/pandas/tests/io/json/test_readlines.py b/pandas/tests/io/json/test_readlines.py index f5342e0ab1a38..d96ccb4b94cc2 100644 --- a/pandas/tests/io/json/test_readlines.py +++ b/pandas/tests/io/json/test_readlines.py @@ -25,6 +25,13 @@ def lines_json_df(): return df.to_json(lines=True, orient="records") +@pytest.fixture(params=["ujson", "pyarrow"]) +def engine(request): + if request.param == "pyarrow": + pytest.importorskip("pyarrow.json") + return request.param + + def test_read_jsonl(): # GH9180 result = read_json(StringIO('{"a": 1, "b": 2}\n{"b":2, "a" :1}\n'), lines=True) diff --git a/pandas/tests/io/parser/usecols/test_usecols_basic.py b/pandas/tests/io/parser/usecols/test_usecols_basic.py index 15b321c4616ca..23138f2710caf 100644 --- a/pandas/tests/io/parser/usecols/test_usecols_basic.py +++ b/pandas/tests/io/parser/usecols/test_usecols_basic.py @@ -98,7 +98,7 @@ def test_usecols_with_names(all_parsers): @pytest.mark.parametrize( "names,usecols", [(["b", "c"], [1, 2]), (["a", "b", "c"], ["b", "c"])] ) -def test_usecols_relative_to_names(all_parsers, names, usecols, request): +def test_usecols_relative_to_names(all_parsers, names, usecols): data = """\ 1,2,3 4,5,6 diff --git a/pandas/tests/io/test_fsspec.py b/pandas/tests/io/test_fsspec.py index 8726d44c9c3ed..a1dec8a2d05b4 100644 --- a/pandas/tests/io/test_fsspec.py +++ b/pandas/tests/io/test_fsspec.py @@ -23,6 +23,28 @@ ) +@pytest.fixture +def fsspectest(): + pytest.importorskip("fsspec") + from fsspec import register_implementation + from fsspec.implementations.memory import MemoryFileSystem + from fsspec.registry import _registry as registry + + class TestMemoryFS(MemoryFileSystem): + protocol = "testmem" + test = [None] + + def __init__(self, **kwargs) -> None: + self.test[0] = kwargs.pop("test", None) + super().__init__(**kwargs) + + register_implementation("testmem", TestMemoryFS, clobber=True) + yield TestMemoryFS() + registry.pop("testmem", None) + TestMemoryFS.test[0] = None + TestMemoryFS.store.clear() + + @pytest.fixture def df1(): return DataFrame( diff --git a/pandas/tests/io/xml/conftest.py b/pandas/tests/io/xml/conftest.py index c88616eb78029..aafda0ff62bbd 100644 --- a/pandas/tests/io/xml/conftest.py +++ b/pandas/tests/io/xml/conftest.py @@ -1,9 +1,11 @@ +from pathlib import Path + import pytest @pytest.fixture -def xml_data_path(tests_io_data_path, datapath): - return tests_io_data_path / "xml" +def xml_data_path(): + return Path(__file__).parent.parent / "data" / "xml" @pytest.fixture diff --git a/pandas/tests/plotting/test_misc.py b/pandas/tests/plotting/test_misc.py index 84f9cd87db97c..56028249fe517 100644 --- a/pandas/tests/plotting/test_misc.py +++ b/pandas/tests/plotting/test_misc.py @@ -15,6 +15,7 @@ interval_range, period_range, plotting, + read_csv, ) import pandas._testing as tm from pandas.tests.plotting.common import ( @@ -30,6 +31,14 @@ cm = pytest.importorskip("matplotlib.cm") +@pytest.fixture +def iris(datapath) -> DataFrame: + """ + The iris dataset as a DataFrame. + """ + return read_csv(datapath("io", "data", "csv", "iris.csv")) + + @td.skip_if_installed("matplotlib") def test_import_error_message(): # GH-19810 diff --git a/pandas/tests/resample/conftest.py b/pandas/tests/resample/conftest.py index 90c2a91a22158..1033d908eb22d 100644 --- a/pandas/tests/resample/conftest.py +++ b/pandas/tests/resample/conftest.py @@ -1,5 +1,4 @@ from datetime import datetime -import warnings import numpy as np import pytest @@ -8,8 +7,6 @@ DataFrame, Series, ) -from pandas.core.indexes.datetimes import date_range -from pandas.core.indexes.period import period_range # The various methods we support downsample_methods = [ @@ -44,40 +41,6 @@ def resample_method(request): return request.param -@pytest.fixture -def simple_date_range_series(): - """ - Series with date range index and random data for test purposes. - """ - - def _simple_date_range_series(start, end, freq="D"): - rng = date_range(start, end, freq=freq) - return Series(np.random.default_rng(2).standard_normal(len(rng)), index=rng) - - return _simple_date_range_series - - -@pytest.fixture -def simple_period_range_series(): - """ - Series with period range index and random data for test purposes. - """ - - def _simple_period_range_series(start, end, freq="D"): - with warnings.catch_warnings(): - # suppress Period[B] deprecation warning - msg = "|".join(["Period with BDay freq", r"PeriodDtype\[B\] is deprecated"]) - warnings.filterwarnings( - "ignore", - msg, - category=FutureWarning, - ) - rng = period_range(start, end, freq=freq) - return Series(np.random.default_rng(2).standard_normal(len(rng)), index=rng) - - return _simple_period_range_series - - @pytest.fixture def _index_start(): """Fixture for parametrization of index, series and frame.""" diff --git a/pandas/tests/resample/test_datetime_index.py b/pandas/tests/resample/test_datetime_index.py index 2bb114593fcd5..554dc92d8508e 100644 --- a/pandas/tests/resample/test_datetime_index.py +++ b/pandas/tests/resample/test_datetime_index.py @@ -53,6 +53,19 @@ def unit(request): return request.param +@pytest.fixture +def simple_date_range_series(): + """ + Series with date range index and random data for test purposes. + """ + + def _simple_date_range_series(start, end, freq="D"): + rng = date_range(start, end, freq=freq) + return Series(np.random.default_rng(2).standard_normal(len(rng)), index=rng) + + return _simple_date_range_series + + def test_custom_grouper(index, unit): dti = index.as_unit(unit) s = Series(np.array([1] * len(dti)), index=dti, dtype="int64") @@ -1208,14 +1221,6 @@ def test_corner_cases(unit): tm.assert_index_equal(result.index, ex_index) -def test_corner_cases_period(simple_period_range_series): - # miscellaneous test coverage - len0pts = simple_period_range_series("2007-01", "2010-05", freq="M")[:0] - # it works - result = len0pts.resample("Y-DEC").mean() - assert len(result) == 0 - - def test_corner_cases_date(simple_date_range_series, unit): # resample to periods ts = simple_date_range_series("2000-04-28", "2000-04-30 11:00", freq="h") diff --git a/pandas/tests/resample/test_period_index.py b/pandas/tests/resample/test_period_index.py index f3d095bf4b5ed..2e1b0033fd447 100644 --- a/pandas/tests/resample/test_period_index.py +++ b/pandas/tests/resample/test_period_index.py @@ -1,4 +1,5 @@ from datetime import datetime +import warnings import dateutil import numpy as np @@ -40,6 +41,27 @@ def _series_name(): return "pi" +@pytest.fixture +def simple_period_range_series(): + """ + Series with period range index and random data for test purposes. + """ + + def _simple_period_range_series(start, end, freq="D"): + with warnings.catch_warnings(): + # suppress Period[B] deprecation warning + msg = "|".join(["Period with BDay freq", r"PeriodDtype\[B\] is deprecated"]) + warnings.filterwarnings( + "ignore", + msg, + category=FutureWarning, + ) + rng = period_range(start, end, freq=freq) + return Series(np.random.default_rng(2).standard_normal(len(rng)), index=rng) + + return _simple_period_range_series + + class TestPeriodIndex: @pytest.mark.parametrize("freq", ["2D", "1h", "2h"]) @pytest.mark.parametrize("kind", ["period", None, "timestamp"]) @@ -942,3 +964,11 @@ def test_resample_frequency_ME_QE_error_message(series_and_frame, freq_depr): obj = series_and_frame with pytest.raises(ValueError, match=msg): obj.resample(freq_depr) + + +def test_corner_cases_period(simple_period_range_series): + # miscellaneous test coverage + len0pts = simple_period_range_series("2007-01", "2010-05", freq="M")[:0] + # it works + result = len0pts.resample("Y-DEC").mean() + assert len(result) == 0 diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index bb5ad8cc5a25a..9e6b4ce0df1d6 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -136,8 +136,16 @@ def test_reset_index_drop_errors(self): with pytest.raises(KeyError, match="not found"): s.reset_index("wrong", drop=True) - def test_reset_index_with_drop(self, series_with_multilevel_index): - ser = series_with_multilevel_index + def test_reset_index_with_drop(self): + arrays = [ + ["bar", "bar", "baz", "baz", "qux", "qux", "foo", "foo"], + ["one", "two", "one", "two", "one", "two", "one", "two"], + ] + tuples = zip(*arrays) + index = MultiIndex.from_tuples(tuples) + data = np.random.default_rng(2).standard_normal(8) + ser = Series(data, index=index) + ser.iloc[3] = np.nan deleveled = ser.reset_index() assert isinstance(deleveled, DataFrame) diff --git a/pandas/tests/strings/conftest.py b/pandas/tests/strings/conftest.py index 868b5f1283128..036e4de20ba53 100644 --- a/pandas/tests/strings/conftest.py +++ b/pandas/tests/strings/conftest.py @@ -1,4 +1,3 @@ -import numpy as np import pytest from pandas import Series @@ -131,53 +130,3 @@ def any_string_method(request): ... method(*args, **kwargs) """ return request.param - - -# subset of the full set from pandas/conftest.py -_any_allowed_skipna_inferred_dtype = [ - ("string", ["a", np.nan, "c"]), - ("bytes", [b"a", np.nan, b"c"]), - ("empty", [np.nan, np.nan, np.nan]), - ("empty", []), - ("mixed-integer", ["a", np.nan, 2]), -] -ids, _ = zip(*_any_allowed_skipna_inferred_dtype) # use inferred type as id - - -@pytest.fixture(params=_any_allowed_skipna_inferred_dtype, ids=ids) -def any_allowed_skipna_inferred_dtype(request): - """ - Fixture for all (inferred) dtypes allowed in StringMethods.__init__ - - The covered (inferred) types are: - * 'string' - * 'empty' - * 'bytes' - * 'mixed' - * 'mixed-integer' - - Returns - ------- - inferred_dtype : str - The string for the inferred dtype from _libs.lib.infer_dtype - values : np.ndarray - An array of object dtype that will be inferred to have - `inferred_dtype` - - Examples - -------- - >>> from pandas._libs import lib - >>> - >>> def test_something(any_allowed_skipna_inferred_dtype): - ... inferred_dtype, values = any_allowed_skipna_inferred_dtype - ... # will pass - ... assert lib.infer_dtype(values, skipna=True) == inferred_dtype - ... - ... # constructor for .str-accessor will also pass - ... Series(values).str - """ - inferred_dtype, values = request.param - values = np.array(values, dtype=object) # object dtype to avoid casting - - # correctness of inference tested in tests/dtypes/test_inference.py - return inferred_dtype, values diff --git a/pandas/tests/strings/test_api.py b/pandas/tests/strings/test_api.py index 0d2f220e70c56..2914b22a52e94 100644 --- a/pandas/tests/strings/test_api.py +++ b/pandas/tests/strings/test_api.py @@ -1,3 +1,4 @@ +import numpy as np import pytest from pandas import ( @@ -9,6 +10,55 @@ ) from pandas.core.strings.accessor import StringMethods +# subset of the full set from pandas/conftest.py +_any_allowed_skipna_inferred_dtype = [ + ("string", ["a", np.nan, "c"]), + ("bytes", [b"a", np.nan, b"c"]), + ("empty", [np.nan, np.nan, np.nan]), + ("empty", []), + ("mixed-integer", ["a", np.nan, 2]), +] +ids, _ = zip(*_any_allowed_skipna_inferred_dtype) # use inferred type as id + + +@pytest.fixture(params=_any_allowed_skipna_inferred_dtype, ids=ids) +def any_allowed_skipna_inferred_dtype(request): + """ + Fixture for all (inferred) dtypes allowed in StringMethods.__init__ + + The covered (inferred) types are: + * 'string' + * 'empty' + * 'bytes' + * 'mixed' + * 'mixed-integer' + + Returns + ------- + inferred_dtype : str + The string for the inferred dtype from _libs.lib.infer_dtype + values : np.ndarray + An array of object dtype that will be inferred to have + `inferred_dtype` + + Examples + -------- + >>> from pandas._libs import lib + >>> + >>> def test_something(any_allowed_skipna_inferred_dtype): + ... inferred_dtype, values = any_allowed_skipna_inferred_dtype + ... # will pass + ... assert lib.infer_dtype(values, skipna=True) == inferred_dtype + ... + ... # constructor for .str-accessor will also pass + ... Series(values).str + """ + inferred_dtype, values = request.param + values = np.array(values, dtype=object) # object dtype to avoid casting + + # correctness of inference tested in tests/dtypes/test_inference.py + return inferred_dtype, values + def test_api(any_string_dtype): # GH 6106, GH 9322 diff --git a/pandas/tests/tseries/offsets/conftest.py b/pandas/tests/tseries/offsets/conftest.py index c9c4d6c456c53..2fc846353dcb5 100644 --- a/pandas/tests/tseries/offsets/conftest.py +++ b/pandas/tests/tseries/offsets/conftest.py @@ -3,35 +3,6 @@ import pytest from pandas._libs.tslibs import Timestamp -from pandas._libs.tslibs.offsets import MonthOffset - -from pandas.tseries import offsets - - -@pytest.fixture( - params=[ - getattr(offsets, o) for o in offsets.__all__ if o not in ("Tick", "BaseOffset") - ] -) -def offset_types(request): - """ - Fixture for all the datetime offsets available for a time series. - """ - return request.param - - -@pytest.fixture( - params=[ - getattr(offsets, o) - for o in offsets.__all__ - if issubclass(getattr(offsets, o), MonthOffset) and o != "MonthOffset" - ] -) -def month_classes(request): - """ - Fixture for month based datetime offsets available for a time series. - """ - return request.param @pytest.fixture diff --git a/pandas/tests/tseries/offsets/test_offsets.py b/pandas/tests/tseries/offsets/test_offsets.py index bc20e840b7c61..8a881e1b30b10 100644 --- a/pandas/tests/tseries/offsets/test_offsets.py +++ b/pandas/tests/tseries/offsets/test_offsets.py @@ -102,6 +102,33 @@ def _create_offset(klass, value=1, normalize=False): return klass +@pytest.fixture( + params=[ + getattr(offsets, o) + for o in offsets.__all__ + if issubclass(getattr(offsets, o), liboffsets.MonthOffset) + and o != "MonthOffset" + ] +) +def month_classes(request): + """ + Fixture for month based datetime offsets available for a time series. + """ + return request.param + + +@pytest.fixture( + params=[ + getattr(offsets, o) for o in offsets.__all__ if o not in ("Tick", "BaseOffset") + ] +) +def offset_types(request): + """ + Fixture for all the datetime offsets available for a time series. + """ + return request.param + + @pytest.fixture def dt(): return Timestamp(datetime(2008, 1, 2))