diff --git a/pandas/_libs/groupby.pyx b/pandas/_libs/groupby.pyx index 53e66c4b8723d..d5d706650bb34 100644 --- a/pandas/_libs/groupby.pyx +++ b/pandas/_libs/groupby.pyx @@ -9,11 +9,9 @@ cimport numpy as cnp from numpy cimport (ndarray, int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, float32_t, float64_t, complex64_t, complex128_t) +from numpy.math cimport NAN cnp.import_array() -cdef extern from "numpy/npy_math.h": - float64_t NAN "NPY_NAN" - from pandas._libs.util cimport numeric, get_nat from pandas._libs.algos cimport (swap, TiebreakEnumType, TIEBREAK_AVERAGE, diff --git a/pandas/_libs/hashtable.pyx b/pandas/_libs/hashtable.pyx index e80f134290a7e..c3dcbb942d7fe 100644 --- a/pandas/_libs/hashtable.pyx +++ b/pandas/_libs/hashtable.pyx @@ -8,10 +8,9 @@ from libc.stdlib cimport malloc, free import numpy as np cimport numpy as cnp from numpy cimport ndarray, uint8_t, uint32_t, float64_t +from numpy.math cimport NAN cnp.import_array() -cdef extern from "numpy/npy_math.h": - float64_t NAN "NPY_NAN" from pandas._libs.khash cimport ( khiter_t, @@ -54,7 +53,7 @@ from pandas._libs.khash cimport ( ) -cimport pandas._libs.util as util +from pandas._libs cimport util from pandas._libs.missing cimport checknull diff --git a/pandas/_libs/index.pyx b/pandas/_libs/index.pyx index 245c554570ce4..b4dcdaa10d0ef 100644 --- a/pandas/_libs/index.pyx +++ b/pandas/_libs/index.pyx @@ -19,11 +19,10 @@ from numpy cimport ( cnp.import_array() -cimport pandas._libs.util as util +from pandas._libs cimport util -from pandas._libs.tslibs import Period, Timedelta from pandas._libs.tslibs.nattype cimport c_NaT as NaT -from pandas._libs.tslibs.base cimport ABCTimestamp +from pandas._libs.tslibs.base cimport ABCTimestamp, ABCTimedelta, ABCPeriod from pandas._libs.hashtable cimport HashTable @@ -470,7 +469,7 @@ cdef class TimedeltaEngine(DatetimeEngine): return 'm8[ns]' cdef int64_t _unbox_scalar(self, scalar) except? -1: - if not (isinstance(scalar, Timedelta) or scalar is NaT): + if not (isinstance(scalar, ABCTimedelta) or scalar is NaT): raise TypeError(scalar) return scalar.value @@ -480,7 +479,7 @@ cdef class PeriodEngine(Int64Engine): cdef int64_t _unbox_scalar(self, scalar) except? -1: if scalar is NaT: return scalar.value - if isinstance(scalar, Period): + if isinstance(scalar, ABCPeriod): # NB: we assume that we have the correct freq here. return scalar.ordinal raise TypeError(scalar) diff --git a/pandas/_libs/internals.pyx b/pandas/_libs/internals.pyx index 1e53b789aa05c..1aa95e92b73d1 100644 --- a/pandas/_libs/internals.pyx +++ b/pandas/_libs/internals.pyx @@ -1,5 +1,6 @@ -import cython from collections import defaultdict + +import cython from cython import Py_ssize_t from cpython.slice cimport PySlice_GetIndicesEx diff --git a/pandas/_libs/interval.pyx b/pandas/_libs/interval.pyx index 657a2798f7267..3850b24fdf519 100644 --- a/pandas/_libs/interval.pyx +++ b/pandas/_libs/interval.pyx @@ -33,7 +33,7 @@ from numpy cimport ( cnp.import_array() -cimport pandas._libs.util as util +from pandas._libs cimport util from pandas._libs.hashtable cimport Int64Vector from pandas._libs.tslibs.util cimport ( @@ -42,8 +42,7 @@ from pandas._libs.tslibs.util cimport ( is_timedelta64_object, ) -from pandas._libs.tslibs import Timestamp -from pandas._libs.tslibs.timedeltas import Timedelta +from pandas._libs.tslibs.base cimport ABCTimestamp, ABCTimedelta from pandas._libs.tslibs.timezones cimport tz_compare @@ -329,7 +328,7 @@ cdef class Interval(IntervalMixin): raise ValueError(f"invalid option for 'closed': {closed}") if not left <= right: raise ValueError("left side of interval must be <= right side") - if (isinstance(left, Timestamp) and + if (isinstance(left, ABCTimestamp) and not tz_compare(left.tzinfo, right.tzinfo)): # GH 18538 raise ValueError("left and right must have the same time zone, got " @@ -341,7 +340,7 @@ cdef class Interval(IntervalMixin): def _validate_endpoint(self, endpoint): # GH 23013 if not (is_integer_object(endpoint) or is_float_object(endpoint) or - isinstance(endpoint, (Timestamp, Timedelta))): + isinstance(endpoint, (ABCTimestamp, ABCTimedelta))): raise ValueError("Only numeric, Timestamp and Timedelta endpoints " "are allowed when constructing an Interval.") @@ -371,7 +370,7 @@ cdef class Interval(IntervalMixin): right = self.right # TODO: need more general formatting methodology here - if isinstance(left, Timestamp) and isinstance(right, Timestamp): + if isinstance(left, ABCTimestamp) and isinstance(right, ABCTimestamp): left = left._short_repr right = right._short_repr diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index 658f7fb202531..bd623a39010f6 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -1,6 +1,5 @@ from collections import abc from decimal import Decimal - import warnings import cython @@ -63,7 +62,7 @@ cdef extern from "numpy/arrayobject.h": cdef extern from "src/parse_helper.h": int floatify(object, float64_t *result, int *maybe_int) except -1 -cimport pandas._libs.util as util +from pandas._libs cimport util from pandas._libs.util cimport is_nan, UINT64_MAX, INT64_MAX, INT64_MIN from pandas._libs.tslib import array_to_datetime diff --git a/pandas/_libs/missing.pyx b/pandas/_libs/missing.pyx index 6bca5e370ac89..6d4d1e95fe8c3 100644 --- a/pandas/_libs/missing.pyx +++ b/pandas/_libs/missing.pyx @@ -8,7 +8,7 @@ cimport numpy as cnp from numpy cimport ndarray, int64_t, uint8_t, float64_t cnp.import_array() -cimport pandas._libs.util as util +from pandas._libs cimport util from pandas._libs.tslibs.np_datetime cimport get_datetime64_value, get_timedelta64_value diff --git a/pandas/_libs/parsers.pyx b/pandas/_libs/parsers.pyx index 9bb5e10348e47..461419239c730 100644 --- a/pandas/_libs/parsers.pyx +++ b/pandas/_libs/parsers.pyx @@ -34,7 +34,7 @@ cimport numpy as cnp from numpy cimport ndarray, uint8_t, uint64_t, int64_t, float64_t cnp.import_array() -cimport pandas._libs.util as util +from pandas._libs cimport util from pandas._libs.util cimport UINT64_MAX, INT64_MAX, INT64_MIN import pandas._libs.lib as lib diff --git a/pandas/_libs/reduction.pyx b/pandas/_libs/reduction.pyx index a7b2d5d5491d5..0988cd7ff0dde 100644 --- a/pandas/_libs/reduction.pyx +++ b/pandas/_libs/reduction.pyx @@ -14,7 +14,7 @@ from numpy cimport (ndarray, flatiter) cnp.import_array() -cimport pandas._libs.util as util +from pandas._libs cimport util from pandas._libs.lib import maybe_convert_objects, is_scalar @@ -603,7 +603,7 @@ cdef class BlockSlider: arr.shape[1] = 0 -def compute_reduction(arr: np.ndarray, f, axis: int = 0, dummy=None, labels=None): +def compute_reduction(arr: ndarray, f, axis: int = 0, dummy=None, labels=None): """ Parameters diff --git a/pandas/_libs/reshape.pyx b/pandas/_libs/reshape.pyx index aed5e1d612088..da4dd00027395 100644 --- a/pandas/_libs/reshape.pyx +++ b/pandas/_libs/reshape.pyx @@ -15,11 +15,12 @@ from numpy cimport ( uint64_t, ) -cimport numpy as cnp import numpy as np -from pandas._libs.lib cimport c_is_list_like +cimport numpy as cnp cnp.import_array() +from pandas._libs.lib cimport c_is_list_like + ctypedef fused reshape_t: uint8_t uint16_t diff --git a/pandas/_libs/testing.pyx b/pandas/_libs/testing.pyx index 0460a69f366c4..9d3959d0a070a 100644 --- a/pandas/_libs/testing.pyx +++ b/pandas/_libs/testing.pyx @@ -1,4 +1,8 @@ import numpy as np +from numpy cimport import_array +import_array() + +from pandas._libs.util cimport is_array from pandas.core.dtypes.missing import isna, array_equivalent from pandas.core.dtypes.common import is_dtype_equal @@ -116,8 +120,8 @@ cpdef assert_almost_equal(a, b, assert a == b, f"{a} != {b}" return True - a_is_ndarray = isinstance(a, np.ndarray) - b_is_ndarray = isinstance(b, np.ndarray) + a_is_ndarray = is_array(a) + b_is_ndarray = is_array(b) if obj is None: if a_is_ndarray or b_is_ndarray: diff --git a/pandas/_libs/tslibs/offsets.pyx b/pandas/_libs/tslibs/offsets.pyx index 3a9639a700953..e8d602502d6d0 100644 --- a/pandas/_libs/tslibs/offsets.pyx +++ b/pandas/_libs/tslibs/offsets.pyx @@ -19,7 +19,7 @@ cnp.import_array() from pandas._libs.tslibs cimport util -from pandas._libs.tslibs.util cimport is_integer_object +from pandas._libs.tslibs.util cimport is_integer_object, is_datetime64_object from pandas._libs.tslibs.base cimport ABCTick, ABCTimestamp, is_tick_object @@ -161,7 +161,7 @@ def apply_wraps(func): elif isinstance(other, (timedelta, BaseOffset)): # timedelta path return func(self, other) - elif isinstance(other, (np.datetime64, datetime, date)): + elif isinstance(other, (datetime, date)) or is_datetime64_object(other): other = Timestamp(other) else: # This will end up returning NotImplemented back in __add__ diff --git a/pandas/_libs/tslibs/strptime.pyx b/pandas/_libs/tslibs/strptime.pyx index a209f71dd0676..884578df3e00b 100644 --- a/pandas/_libs/tslibs/strptime.pyx +++ b/pandas/_libs/tslibs/strptime.pyx @@ -5,6 +5,8 @@ import locale import calendar import re +from cpython cimport datetime + from _thread import allocate_lock as _thread_allocate_lock import pytz @@ -12,8 +14,6 @@ import pytz import numpy as np from numpy cimport int64_t -cimport cpython.datetime as datetime - from pandas._libs.tslibs.np_datetime cimport ( check_dts_bounds, dtstruct_to_dt64, npy_datetimestruct) diff --git a/pandas/_libs/tslibs/timestamps.pyx b/pandas/_libs/tslibs/timestamps.pyx index ab8f9b6c30eb1..0982cf8e5da33 100644 --- a/pandas/_libs/tslibs/timestamps.pyx +++ b/pandas/_libs/tslibs/timestamps.pyx @@ -25,7 +25,7 @@ from pandas._libs.tslibs.util cimport ( is_timedelta64_object, is_array, ) -from pandas._libs.tslibs.base cimport ABCTimestamp, is_tick_object +from pandas._libs.tslibs.base cimport ABCTimedelta, ABCTimestamp, is_tick_object from pandas._libs.tslibs cimport ccalendar @@ -355,10 +355,10 @@ cdef class _Timestamp(ABCTimestamp): elif PyDelta_Check(other): # logic copied from delta_to_nanoseconds to prevent circular import - if hasattr(other, 'delta'): + if isinstance(other, ABCTimedelta): # pd.Timedelta nanos = other.value - elif PyDelta_Check(other): + else: nanos = (other.days * 24 * 60 * 60 * 1000000 + other.seconds * 1000000 + other.microseconds) * 1000