diff --git a/pandas/_libs/algos_common_helper.pxi.in b/pandas/_libs/algos_common_helper.pxi.in index 0ae8094769f46..c3b0a84067f92 100644 --- a/pandas/_libs/algos_common_helper.pxi.in +++ b/pandas/_libs/algos_common_helper.pxi.in @@ -22,54 +22,55 @@ ctypedef fused out_t: def diff_2d(ndarray[diff_t, ndim=2] arr, ndarray[out_t, ndim=2] out, Py_ssize_t periods, int axis): + cdef: + Py_ssize_t i, j, sx, sy # Disable for unsupported dtype combinations, # see https://github.com/cython/cython/issues/2646 - if out_t is float32_t: - if not (diff_t is float32_t or diff_t is int8_t or diff_t is int16_t): - raise NotImplementedError + if (out_t is float32_t + and not (diff_t is float32_t or diff_t is int8_t or diff_t is int16_t)): + raise NotImplementedError + elif (out_t is float64_t + and (diff_t is float32_t or diff_t is int8_t or diff_t is int16_t)): + raise NotImplementedError else: - if (diff_t is float32_t or diff_t is int8_t or diff_t is int16_t): - raise NotImplementedError - - cdef: - Py_ssize_t i, j, sx, sy - - sx, sy = (arr).shape - if arr.flags.f_contiguous: - if axis == 0: - if periods >= 0: - start, stop = periods, sx + # We put this inside an indented else block to avoid cython build + # warnings about unreachable code + sx, sy = (arr).shape + if arr.flags.f_contiguous: + if axis == 0: + if periods >= 0: + start, stop = periods, sx + else: + start, stop = 0, sx + periods + for j in range(sy): + for i in range(start, stop): + out[i, j] = arr[i, j] - arr[i - periods, j] else: - start, stop = 0, sx + periods - for j in range(sy): - for i in range(start, stop): - out[i, j] = arr[i, j] - arr[i - periods, j] + if periods >= 0: + start, stop = periods, sy + else: + start, stop = 0, sy + periods + for j in range(start, stop): + for i in range(sx): + out[i, j] = arr[i, j] - arr[i, j - periods] else: - if periods >= 0: - start, stop = periods, sy + if axis == 0: + if periods >= 0: + start, stop = periods, sx + else: + start, stop = 0, sx + periods + for i in range(start, stop): + for j in range(sy): + out[i, j] = arr[i, j] - arr[i - periods, j] else: - start, stop = 0, sy + periods - for j in range(start, stop): + if periods >= 0: + start, stop = periods, sy + else: + start, stop = 0, sy + periods for i in range(sx): - out[i, j] = arr[i, j] - arr[i, j - periods] - else: - if axis == 0: - if periods >= 0: - start, stop = periods, sx - else: - start, stop = 0, sx + periods - for i in range(start, stop): - for j in range(sy): - out[i, j] = arr[i, j] - arr[i - periods, j] - else: - if periods >= 0: - start, stop = periods, sy - else: - start, stop = 0, sy + periods - for i in range(sx): - for j in range(start, stop): - out[i, j] = arr[i, j] - arr[i, j - periods] + for j in range(start, stop): + out[i, j] = arr[i, j] - arr[i, j - periods] # ---------------------------------------------------------------------- diff --git a/pandas/_libs/groupby.pyx b/pandas/_libs/groupby.pyx index 6efe5e90f522f..71de80da699e9 100644 --- a/pandas/_libs/groupby.pyx +++ b/pandas/_libs/groupby.pyx @@ -833,6 +833,9 @@ cdef inline bint _treat_as_na(rank_t val, bint is_datetimelike) nogil: elif rank_t is int64_t: return is_datetimelike and val == NPY_NAT + elif rank_t is uint64_t: + # There is no NA value for uint64 + return False else: return val != val @@ -1278,7 +1281,8 @@ def group_max(groupby_t[:, :] out, if groupby_t is uint64_t: runtime_error = True break - out[i, j] = nan_val + else: + out[i, j] = nan_val else: out[i, j] = maxx[i, j] @@ -1349,7 +1353,8 @@ def group_min(groupby_t[:, :] out, if groupby_t is uint64_t: runtime_error = True break - out[i, j] = nan_val + else: + out[i, j] = nan_val else: out[i, j] = minx[i, j] diff --git a/pandas/io/msgpack/_packer.pyx b/pandas/io/msgpack/_packer.pyx index aa71c5cc39667..7c7c8f7b61e60 100644 --- a/pandas/io/msgpack/_packer.pyx +++ b/pandas/io/msgpack/_packer.pyx @@ -235,7 +235,8 @@ cdef class Packer: continue else: raise TypeError("can't serialize {thing!r}".format(thing=o)) - return ret + break + return ret cpdef pack(self, object obj): cdef int ret