From 0d6a53de61e5c19711b135bed4d5acfd28249535 Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 10 Jun 2020 09:37:13 -0700 Subject: [PATCH 1/4] CLN: remove get_freq_group --- pandas/_libs/tslibs/dtypes.pxd | 1 + pandas/_libs/tslibs/dtypes.pyx | 27 ++++++++++++++ pandas/_libs/tslibs/frequencies.pyx | 35 ------------------- pandas/_libs/tslibs/period.pyx | 6 ++-- pandas/_libs/tslibs/resolution.pyx | 2 +- pandas/core/indexes/period.py | 5 ++- pandas/plotting/_matplotlib/converter.py | 12 +++---- .../tseries/frequencies/test_freq_code.py | 3 +- 8 files changed, 41 insertions(+), 50 deletions(-) diff --git a/pandas/_libs/tslibs/dtypes.pxd b/pandas/_libs/tslibs/dtypes.pxd index bce071d45c12f..f43bc283d98c7 100644 --- a/pandas/_libs/tslibs/dtypes.pxd +++ b/pandas/_libs/tslibs/dtypes.pxd @@ -1,3 +1,4 @@ +cdef dict attrname_to_abbrevs cdef enum c_FreqGroup: # Mirrors FreqGroup in the .pxy file diff --git a/pandas/_libs/tslibs/dtypes.pyx b/pandas/_libs/tslibs/dtypes.pyx index e38cfe21a65cc..10b0af70e307b 100644 --- a/pandas/_libs/tslibs/dtypes.pyx +++ b/pandas/_libs/tslibs/dtypes.pyx @@ -21,6 +21,11 @@ cdef class PeriodDtypeBase: return False return self.dtype_code == other.dtype_code + @property + def freq_group(self) -> int: + # See also: libperiod.get_freq_group + return (self.dtype_code // 1000) * 1000 + @property def date_offset(self): """ @@ -108,6 +113,23 @@ _period_code_map.update({ }) +# Map attribute-name resolutions to resolution abbreviations +_attrname_to_abbrevs = { + "year": "A", + "quarter": "Q", + "month": "M", + "day": "D", + "hour": "H", + "minute": "T", + "second": "S", + "millisecond": "L", + "microsecond": "U", + "nanosecond": "N", +} +cdef dict attrname_to_abbrevs = _attrname_to_abbrevs + + + class FreqGroup: # Mirrors c_FreqGroup in the .pxd file FR_ANN = 1000 @@ -123,3 +145,8 @@ class FreqGroup: FR_US = 11000 FR_NS = 12000 FR_UND = -10000 # undefined + + @staticmethod + def get_freq_group(code: int) -> int: + # See also: PeriodDtypeBase.freq_group + return (code // 1000) * 1000 diff --git a/pandas/_libs/tslibs/frequencies.pyx b/pandas/_libs/tslibs/frequencies.pyx index 6e525500ec37a..fd28240abd882 100644 --- a/pandas/_libs/tslibs/frequencies.pyx +++ b/pandas/_libs/tslibs/frequencies.pyx @@ -1,43 +1,8 @@ from .dtypes import FreqGroup -# --------------------------------------------------------------------- -# Period codes - - -# Map attribute-name resolutions to resolution abbreviations -_attrname_to_abbrevs = { - "year": "A", - "quarter": "Q", - "month": "M", - "day": "D", - "hour": "H", - "minute": "T", - "second": "S", - "millisecond": "L", - "microsecond": "U", - "nanosecond": "N", -} -cdef dict attrname_to_abbrevs = _attrname_to_abbrevs - - # ---------------------------------------------------------------------- -# TODO: this is now identical to the version in libperiod -def get_freq_group(freq: int) -> int: - """ - Return frequency code group of given frequency str or offset. - - Examples - -------- - >>> get_freq_group(4001) - 4000 - - >>> get_freq_group(4006) - 4000 - """ - return (freq // 1000) * 1000 - cpdef int get_to_timestamp_base(int base): """ diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx index 47ebf139ed496..d14f9d82eb5be 100644 --- a/pandas/_libs/tslibs/period.pyx +++ b/pandas/_libs/tslibs/period.pyx @@ -71,12 +71,10 @@ from pandas._libs.tslibs.dtypes cimport ( FR_MS, FR_US, FR_NS, -) - -from pandas._libs.tslibs.frequencies cimport ( attrname_to_abbrevs, - get_to_timestamp_base, ) + +from pandas._libs.tslibs.frequencies cimport get_to_timestamp_base from pandas._libs.tslibs.parsing cimport get_rule_month from pandas._libs.tslibs.parsing import parse_time_string from pandas._libs.tslibs.nattype cimport ( diff --git a/pandas/_libs/tslibs/resolution.pyx b/pandas/_libs/tslibs/resolution.pyx index 7453933ddbb4f..55522e99459cb 100644 --- a/pandas/_libs/tslibs/resolution.pyx +++ b/pandas/_libs/tslibs/resolution.pyx @@ -5,9 +5,9 @@ from numpy cimport ndarray, int64_t, int32_t from pandas._libs.tslibs.util cimport get_nat +from pandas._libs.tslibs.dtypes cimport attrname_to_abbrevs from pandas._libs.tslibs.np_datetime cimport ( npy_datetimestruct, dt64_to_dtstruct) -from pandas._libs.tslibs.frequencies cimport attrname_to_abbrevs from pandas._libs.tslibs.frequencies import FreqGroup from pandas._libs.tslibs.timezones cimport ( is_utc, is_tzlocal, maybe_get_tz, get_dst_info) diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index 49cb78340d104..7a44c1db4fbb8 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -6,7 +6,6 @@ from pandas._libs import index as libindex from pandas._libs.lib import no_default from pandas._libs.tslibs import Period, Resolution -from pandas._libs.tslibs.frequencies import get_freq_group from pandas._libs.tslibs.parsing import DateParseError, parse_time_string from pandas._typing import DtypeObj, Label from pandas.util._decorators import Appender, cache_readonly, doc @@ -503,7 +502,7 @@ def get_loc(self, key, method=None, tolerance=None): reso = Resolution.from_attrname(reso) grp = reso.freq_group - freqn = get_freq_group(self.dtype.dtype_code) + freqn = self.dtype.freq_group # _get_string_slice will handle cases where grp < freqn assert grp >= freqn @@ -579,7 +578,7 @@ def _parsed_string_to_bounds(self, reso: Resolution, parsed: datetime): def _validate_partial_date_slice(self, reso: Resolution): assert isinstance(reso, Resolution), (type(reso), reso) grp = reso.freq_group - freqn = get_freq_group(self.dtype.dtype_code) + freqn = self.dtype.freq_group if not grp < freqn: # TODO: we used to also check for diff --git a/pandas/plotting/_matplotlib/converter.py b/pandas/plotting/_matplotlib/converter.py index 65f030223c7ca..14b1c574a84dc 100644 --- a/pandas/plotting/_matplotlib/converter.py +++ b/pandas/plotting/_matplotlib/converter.py @@ -10,9 +10,9 @@ import matplotlib.units as units import numpy as np -from pandas._libs import lib, tslibs -from pandas._libs.tslibs import to_offset -from pandas._libs.tslibs.frequencies import FreqGroup, get_freq_group +from pandas._libs import lib +from pandas._libs.tslibs import to_offset, Timestamp +from pandas._libs.tslibs.dtypes import FreqGroup from pandas._libs.tslibs.offsets import BaseOffset from pandas.core.dtypes.common import ( @@ -45,7 +45,7 @@ def get_pairs(): pairs = [ - (tslibs.Timestamp, DatetimeConverter), + (Timestamp, DatetimeConverter), (Period, PeriodConverter), (pydt.datetime, DatetimeConverter), (pydt.date, DatetimeConverter), @@ -281,7 +281,7 @@ def try_parse(values): if isinstance(values, (datetime, pydt.date)): return _dt_to_float_ordinal(values) elif isinstance(values, np.datetime64): - return _dt_to_float_ordinal(tslibs.Timestamp(values)) + return _dt_to_float_ordinal(Timestamp(values)) elif isinstance(values, pydt.time): return dates.date2num(values) elif is_integer(values) or is_float(values): @@ -553,7 +553,7 @@ def _daily_finder(vmin, vmax, freq: BaseOffset): elif dtype_code == FreqGroup.FR_DAY: periodsperyear = 365 periodspermonth = 28 - elif get_freq_group(dtype_code) == FreqGroup.FR_WK: + elif FreqGroup.get_freq_group(dtype_code) == FreqGroup.FR_WK: periodsperyear = 52 periodspermonth = 3 else: # pragma: no cover diff --git a/pandas/tests/tseries/frequencies/test_freq_code.py b/pandas/tests/tseries/frequencies/test_freq_code.py index 189a0cc2171ad..5383c1ff1c2c9 100644 --- a/pandas/tests/tseries/frequencies/test_freq_code.py +++ b/pandas/tests/tseries/frequencies/test_freq_code.py @@ -1,7 +1,8 @@ import pytest from pandas._libs.tslibs import Resolution, to_offset -from pandas._libs.tslibs.frequencies import _attrname_to_abbrevs, get_to_timestamp_base +from pandas._libs.tslibs.dtypes import _attrname_to_abbrevs +from pandas._libs.tslibs.frequencies import get_to_timestamp_base @pytest.mark.parametrize( From f363f12047f536ee74471427c16b590fe317bfd3 Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 10 Jun 2020 09:47:12 -0700 Subject: [PATCH 2/4] remove undefined declaration --- pandas/_libs/tslibs/frequencies.pxd | 2 -- 1 file changed, 2 deletions(-) diff --git a/pandas/_libs/tslibs/frequencies.pxd b/pandas/_libs/tslibs/frequencies.pxd index 896eec77ef4fe..b3ad6e6c19ee3 100644 --- a/pandas/_libs/tslibs/frequencies.pxd +++ b/pandas/_libs/tslibs/frequencies.pxd @@ -1,3 +1 @@ -cdef dict attrname_to_abbrevs - cpdef int get_to_timestamp_base(int base) From eb10c09018ea477b15d3f7443e84559b3088aa5b Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 12 Jun 2020 19:15:31 -0700 Subject: [PATCH 3/4] lint fixup --- pandas/_libs/tslibs/dtypes.pyx | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/_libs/tslibs/dtypes.pyx b/pandas/_libs/tslibs/dtypes.pyx index 10b0af70e307b..0752910317077 100644 --- a/pandas/_libs/tslibs/dtypes.pyx +++ b/pandas/_libs/tslibs/dtypes.pyx @@ -129,7 +129,6 @@ _attrname_to_abbrevs = { cdef dict attrname_to_abbrevs = _attrname_to_abbrevs - class FreqGroup: # Mirrors c_FreqGroup in the .pxd file FR_ANN = 1000 From 17b862eca330bc6df4a7ca938c3d93d0fbabcc0b Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 12 Jun 2020 19:57:44 -0700 Subject: [PATCH 4/4] isort fixup --- pandas/plotting/_matplotlib/converter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/plotting/_matplotlib/converter.py b/pandas/plotting/_matplotlib/converter.py index 14b1c574a84dc..05377e0c240b9 100644 --- a/pandas/plotting/_matplotlib/converter.py +++ b/pandas/plotting/_matplotlib/converter.py @@ -11,7 +11,7 @@ import numpy as np from pandas._libs import lib -from pandas._libs.tslibs import to_offset, Timestamp +from pandas._libs.tslibs import Timestamp, to_offset from pandas._libs.tslibs.dtypes import FreqGroup from pandas._libs.tslibs.offsets import BaseOffset