| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | from datetime import datetimeimport numpy as npimport pytestimport pandas as pdfrom pandas import (    Series,    Timestamp,    isna,    notna,)import pandas._testing as tmclass TestSeriesClip:    def test_clip(self, datetime_series):        val = datetime_series.median()        assert datetime_series.clip(lower=val).min() == val        assert datetime_series.clip(upper=val).max() == val        result = datetime_series.clip(-0.5, 0.5)        expected = np.clip(datetime_series, -0.5, 0.5)        tm.assert_series_equal(result, expected)        assert isinstance(expected, Series)    def test_clip_types_and_nulls(self):        sers = [            Series([np.nan, 1.0, 2.0, 3.0]),            Series([None, "a", "b", "c"]),            Series(pd.to_datetime([np.nan, 1, 2, 3], unit="D")),        ]        for s in sers:            thresh = s[2]            lower = s.clip(lower=thresh)            upper = s.clip(upper=thresh)            assert lower[notna(lower)].min() == thresh            assert upper[notna(upper)].max() == thresh            assert list(isna(s)) == list(isna(lower))            assert list(isna(s)) == list(isna(upper))    def test_series_clipping_with_na_values(self, any_numeric_ea_dtype, nulls_fixture):        # Ensure that clipping method can handle NA values with out failing        # GH#40581        if nulls_fixture is pd.NaT:            # constructor will raise, see            #  test_constructor_mismatched_null_nullable_dtype            return        ser = Series([nulls_fixture, 1.0, 3.0], dtype=any_numeric_ea_dtype)        s_clipped_upper = ser.clip(upper=2.0)        s_clipped_lower = ser.clip(lower=2.0)        expected_upper = Series([nulls_fixture, 1.0, 2.0], dtype=any_numeric_ea_dtype)        expected_lower = Series([nulls_fixture, 2.0, 3.0], dtype=any_numeric_ea_dtype)        tm.assert_series_equal(s_clipped_upper, expected_upper)        tm.assert_series_equal(s_clipped_lower, expected_lower)    def test_clip_with_na_args(self):        """Should process np.nan argument as None"""        # GH#17276        s = Series([1, 2, 3])        tm.assert_series_equal(s.clip(np.nan), Series([1, 2, 3]))        tm.assert_series_equal(s.clip(upper=np.nan, lower=np.nan), Series([1, 2, 3]))        # GH#19992        tm.assert_series_equal(s.clip(lower=[0, 4, np.nan]), Series([1, 4, 3]))        tm.assert_series_equal(s.clip(upper=[1, np.nan, 1]), Series([1, 2, 1]))        # GH#40420        s = Series([1, 2, 3])        result = s.clip(0, [np.nan, np.nan, np.nan])        tm.assert_series_equal(s, result)    def test_clip_against_series(self):        # GH#6966        s = Series([1.0, 1.0, 4.0])        lower = Series([1.0, 2.0, 3.0])        upper = Series([1.5, 2.5, 3.5])        tm.assert_series_equal(s.clip(lower, upper), Series([1.0, 2.0, 3.5]))        tm.assert_series_equal(s.clip(1.5, upper), Series([1.5, 1.5, 3.5]))    @pytest.mark.parametrize("inplace", [True, False])    @pytest.mark.parametrize("upper", [[1, 2, 3], np.asarray([1, 2, 3])])    def test_clip_against_list_like(self, inplace, upper):        # GH#15390        original = Series([5, 6, 7])        result = original.clip(upper=upper, inplace=inplace)        expected = Series([1, 2, 3])        if inplace:            result = original        tm.assert_series_equal(result, expected, check_exact=True)    def test_clip_with_datetimes(self):        # GH#11838        # naive and tz-aware datetimes        t = Timestamp("2015-12-01 09:30:30")        s = Series([Timestamp("2015-12-01 09:30:00"), Timestamp("2015-12-01 09:31:00")])        result = s.clip(upper=t)        expected = Series(            [Timestamp("2015-12-01 09:30:00"), Timestamp("2015-12-01 09:30:30")]        )        tm.assert_series_equal(result, expected)        t = Timestamp("2015-12-01 09:30:30", tz="US/Eastern")        s = Series(            [                Timestamp("2015-12-01 09:30:00", tz="US/Eastern"),                Timestamp("2015-12-01 09:31:00", tz="US/Eastern"),            ]        )        result = s.clip(upper=t)        expected = Series(            [                Timestamp("2015-12-01 09:30:00", tz="US/Eastern"),                Timestamp("2015-12-01 09:30:30", tz="US/Eastern"),            ]        )        tm.assert_series_equal(result, expected)    def test_clip_with_timestamps_and_oob_datetimes(self):        # GH-42794        ser = Series([datetime(1, 1, 1), datetime(9999, 9, 9)])        result = ser.clip(lower=Timestamp.min, upper=Timestamp.max)        expected = Series([Timestamp.min, Timestamp.max], dtype="object")        tm.assert_series_equal(result, expected)
 |