|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +import numba |
| 4 | +import numpy as np |
| 5 | + |
| 6 | +import pandas._libs_numba.util as util |
| 7 | + |
1 | 8 | # import cython
|
2 | 9 | # from cython import Py_ssize_t
|
3 | 10 |
|
4 | 11 | # from libc.math cimport fabs, sqrt
|
5 | 12 | # from libc.stdlib cimport free, malloc
|
6 | 13 | # from libc.string cimport memmove
|
7 | 14 |
|
8 |
| -# import numpy as np |
9 |
| - |
10 | 15 | # cimport numpy as cnp
|
11 | 16 | # from numpy cimport (
|
12 | 17 | # NPY_FLOAT32,
|
|
36 | 41 |
|
37 | 42 | # cnp.import_array()
|
38 | 43 |
|
39 |
| -import pandas._libs_numba.util as util |
40 | 44 |
|
41 | 45 | # from pandas._libs.khash cimport (
|
42 | 46 | # kh_destroy_int64,
|
|
504 | 508 | # uint8_t
|
505 | 509 |
|
506 | 510 |
|
507 |
| -def validate_limit(nobs: int, limit=None) -> int: |
| 511 | +def _validate_limit(limit: int | None = None) -> None: |
508 | 512 | """
|
509 |
| - Check that the `limit` argument is a positive integer. |
510 |
| -
|
511 |
| - Parameters |
512 |
| - ---------- |
513 |
| - nobs : int |
514 |
| - limit : object |
515 |
| -
|
516 |
| - Returns |
517 |
| - ------- |
518 |
| - int |
519 |
| - The limit. |
| 513 | + Check that the `limit` argument is a positive integer or None. |
520 | 514 | """
|
521 | 515 | if limit is None:
|
522 |
| - lim = nobs |
523 |
| - else: |
524 |
| - if not util.is_integer_object(limit): |
525 |
| - raise ValueError("Limit must be an integer") |
526 |
| - if limit < 1: |
527 |
| - raise ValueError("Limit must be greater than 0") |
528 |
| - lim = limit |
529 |
| - |
530 |
| - return lim |
| 516 | + return |
| 517 | + elif not util.is_integer_object(limit): |
| 518 | + raise ValueError("Limit must be an integer") |
| 519 | + elif limit < 1: |
| 520 | + raise ValueError("Limit must be greater than 0") |
531 | 521 |
|
532 | 522 |
|
533 | 523 | # @cython.boundscheck(False)
|
@@ -587,22 +577,41 @@ def validate_limit(nobs: int, limit=None) -> int:
|
587 | 577 | # return indexer
|
588 | 578 |
|
589 | 579 |
|
590 |
| -def pad_inplace(values, mask, limit=None): |
| 580 | +def pad_inplace(values: np.ndarray, mask: np.ndarray, limit: int | None = None) -> None: |
| 581 | + _validate_limit(limit) |
| 582 | + _pad_inplace(values, mask, limit) |
591 | 583 |
|
592 |
| - fill_count = 0 |
593 | 584 |
|
594 |
| - N = len(values) |
| 585 | +@numba.jit |
| 586 | +def _pad_inplace( |
| 587 | + values: np.ndarray, mask: np.ndarray, limit: int | None = None |
| 588 | +) -> None: |
| 589 | + if len(values): |
| 590 | + if limit is None: |
| 591 | + _pad_inplace_no_limit(values, mask) |
| 592 | + else: |
| 593 | + _pad_inplace_with_limit(values, mask, limit) |
595 | 594 |
|
596 |
| - # GH#2778 |
597 |
| - if N == 0: |
598 |
| - return |
599 | 595 |
|
600 |
| - lim = validate_limit(N, limit) |
| 596 | +@numba.jit |
| 597 | +def _pad_inplace_no_limit(values: np.ndarray, mask: np.ndarray) -> None: |
| 598 | + N = len(values) |
| 599 | + val = values[0] |
| 600 | + for i in range(N): |
| 601 | + if mask[i]: |
| 602 | + values[i] = val |
| 603 | + else: |
| 604 | + val = values[i] |
| 605 | + |
601 | 606 |
|
| 607 | +@numba.jit |
| 608 | +def _pad_inplace_with_limit(values: np.ndarray, mask: np.ndarray, limit: int) -> None: |
| 609 | + N = len(values) |
| 610 | + fill_count = 0 |
602 | 611 | val = values[0]
|
603 | 612 | for i in range(N):
|
604 | 613 | if mask[i]:
|
605 |
| - if fill_count >= lim: |
| 614 | + if fill_count >= limit: |
606 | 615 | continue
|
607 | 616 | fill_count += 1
|
608 | 617 | values[i] = val
|
|
0 commit comments