maxframe 2.0.0b2__cp311-cp311-win32.whl → 2.2.0__cp311-cp311-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +1 -0
- maxframe/_utils.cp311-win32.pyd +0 -0
- maxframe/_utils.pyx +14 -1
- maxframe/codegen/core.py +6 -6
- maxframe/codegen/spe/core.py +1 -1
- maxframe/codegen/spe/dataframe/__init__.py +1 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
- maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
- maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
- maxframe/codegen/spe/dataframe/groupby.py +88 -0
- maxframe/codegen/spe/dataframe/indexing.py +99 -4
- maxframe/codegen/spe/dataframe/merge.py +34 -1
- maxframe/codegen/spe/dataframe/misc.py +9 -33
- maxframe/codegen/spe/dataframe/reduction.py +14 -9
- maxframe/codegen/spe/dataframe/reshape.py +46 -0
- maxframe/codegen/spe/dataframe/sort.py +30 -17
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
- maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
- maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
- maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
- maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
- maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
- maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
- maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
- maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
- maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
- maxframe/codegen/spe/tensor/__init__.py +3 -0
- maxframe/codegen/spe/tensor/fft.py +74 -0
- maxframe/codegen/spe/tensor/linalg.py +29 -2
- maxframe/codegen/spe/tensor/misc.py +79 -25
- maxframe/codegen/spe/tensor/spatial.py +45 -0
- maxframe/codegen/spe/tensor/statistics.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
- maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
- maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
- maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
- maxframe/codegen/spe/utils.py +2 -0
- maxframe/config/config.py +70 -9
- maxframe/config/tests/test_validators.py +13 -1
- maxframe/config/validators.py +49 -0
- maxframe/conftest.py +44 -17
- maxframe/core/accessor.py +2 -2
- maxframe/core/entity/core.py +5 -0
- maxframe/core/entity/tileables.py +1 -1
- maxframe/core/graph/core.cp311-win32.pyd +0 -0
- maxframe/core/graph/entity.py +1 -2
- maxframe/core/operator/base.py +9 -2
- maxframe/core/operator/core.py +10 -2
- maxframe/core/operator/utils.py +13 -0
- maxframe/dataframe/__init__.py +10 -3
- maxframe/dataframe/accessors/__init__.py +1 -1
- maxframe/dataframe/accessors/compat.py +45 -0
- maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
- maxframe/dataframe/accessors/dict_/contains.py +7 -16
- maxframe/dataframe/accessors/dict_/core.py +48 -0
- maxframe/dataframe/accessors/dict_/getitem.py +17 -21
- maxframe/dataframe/accessors/dict_/length.py +7 -16
- maxframe/dataframe/accessors/dict_/remove.py +6 -18
- maxframe/dataframe/accessors/dict_/setitem.py +8 -18
- maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
- maxframe/dataframe/accessors/list_/__init__.py +2 -2
- maxframe/dataframe/accessors/list_/core.py +48 -0
- maxframe/dataframe/accessors/list_/getitem.py +12 -19
- maxframe/dataframe/accessors/list_/length.py +7 -16
- maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
- maxframe/dataframe/accessors/string_/__init__.py +4 -1
- maxframe/dataframe/accessors/struct_/__init__.py +37 -0
- maxframe/dataframe/accessors/struct_/accessor.py +39 -0
- maxframe/dataframe/accessors/struct_/core.py +43 -0
- maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
- maxframe/dataframe/accessors/struct_/field.py +123 -0
- maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
- maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
- maxframe/dataframe/arithmetic/__init__.py +14 -4
- maxframe/dataframe/arithmetic/between.py +106 -0
- maxframe/dataframe/arithmetic/dot.py +237 -0
- maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
- maxframe/dataframe/core.py +63 -118
- maxframe/dataframe/datasource/__init__.py +18 -0
- maxframe/dataframe/datasource/from_dict.py +124 -0
- maxframe/dataframe/datasource/from_index.py +1 -1
- maxframe/dataframe/datasource/from_records.py +77 -0
- maxframe/dataframe/datasource/from_tensor.py +109 -41
- maxframe/dataframe/datasource/read_csv.py +2 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
- maxframe/dataframe/datastore/__init__.py +5 -1
- maxframe/dataframe/datastore/to_csv.py +29 -41
- maxframe/dataframe/datastore/to_odps.py +30 -4
- maxframe/dataframe/extensions/__init__.py +20 -4
- maxframe/dataframe/extensions/apply_chunk.py +32 -6
- maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
- maxframe/dataframe/extensions/collect_kv.py +126 -0
- maxframe/dataframe/extensions/extract_kv.py +177 -0
- maxframe/dataframe/extensions/map_reduce.py +263 -0
- maxframe/dataframe/extensions/rebalance.py +62 -0
- maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
- maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
- maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
- maxframe/dataframe/groupby/__init__.py +12 -1
- maxframe/dataframe/groupby/aggregation.py +78 -45
- maxframe/dataframe/groupby/apply.py +1 -1
- maxframe/dataframe/groupby/apply_chunk.py +18 -2
- maxframe/dataframe/groupby/core.py +96 -12
- maxframe/dataframe/groupby/cum.py +4 -25
- maxframe/dataframe/groupby/expanding.py +264 -0
- maxframe/dataframe/groupby/fill.py +1 -1
- maxframe/dataframe/groupby/getitem.py +12 -5
- maxframe/dataframe/groupby/head.py +11 -1
- maxframe/dataframe/groupby/rank.py +136 -0
- maxframe/dataframe/groupby/rolling.py +206 -0
- maxframe/dataframe/groupby/shift.py +114 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
- maxframe/dataframe/indexing/__init__.py +20 -1
- maxframe/dataframe/indexing/droplevel.py +195 -0
- maxframe/dataframe/indexing/filter.py +169 -0
- maxframe/dataframe/indexing/get_level_values.py +76 -0
- maxframe/dataframe/indexing/iat.py +45 -0
- maxframe/dataframe/indexing/iloc.py +152 -12
- maxframe/dataframe/indexing/insert.py +1 -1
- maxframe/dataframe/indexing/loc.py +287 -7
- maxframe/dataframe/indexing/reindex.py +14 -5
- maxframe/dataframe/indexing/rename.py +6 -0
- maxframe/dataframe/indexing/rename_axis.py +2 -2
- maxframe/dataframe/indexing/reorder_levels.py +143 -0
- maxframe/dataframe/indexing/reset_index.py +33 -6
- maxframe/dataframe/indexing/sample.py +8 -0
- maxframe/dataframe/indexing/setitem.py +3 -3
- maxframe/dataframe/indexing/swaplevel.py +185 -0
- maxframe/dataframe/indexing/take.py +99 -0
- maxframe/dataframe/indexing/truncate.py +140 -0
- maxframe/dataframe/indexing/where.py +0 -11
- maxframe/dataframe/indexing/xs.py +148 -0
- maxframe/dataframe/merge/__init__.py +12 -1
- maxframe/dataframe/merge/append.py +97 -98
- maxframe/dataframe/merge/combine_first.py +120 -0
- maxframe/dataframe/merge/compare.py +387 -0
- maxframe/dataframe/merge/concat.py +183 -0
- maxframe/dataframe/merge/update.py +271 -0
- maxframe/dataframe/misc/__init__.py +16 -10
- maxframe/dataframe/misc/_duplicate.py +10 -4
- maxframe/dataframe/misc/apply.py +1 -1
- maxframe/dataframe/misc/check_unique.py +51 -0
- maxframe/dataframe/misc/clip.py +145 -0
- maxframe/dataframe/misc/describe.py +175 -9
- maxframe/dataframe/misc/drop_duplicates.py +2 -2
- maxframe/dataframe/misc/duplicated.py +2 -2
- maxframe/dataframe/misc/get_dummies.py +5 -1
- maxframe/dataframe/misc/isin.py +2 -2
- maxframe/dataframe/misc/map.py +94 -0
- maxframe/dataframe/misc/tests/test_misc.py +13 -2
- maxframe/dataframe/misc/to_numeric.py +3 -0
- maxframe/dataframe/misc/transform.py +12 -5
- maxframe/dataframe/misc/transpose.py +13 -1
- maxframe/dataframe/misc/valid_index.py +115 -0
- maxframe/dataframe/misc/value_counts.py +38 -4
- maxframe/dataframe/missing/checkna.py +13 -6
- maxframe/dataframe/missing/dropna.py +5 -0
- maxframe/dataframe/missing/fillna.py +1 -1
- maxframe/dataframe/missing/replace.py +7 -4
- maxframe/dataframe/reduction/__init__.py +29 -15
- maxframe/dataframe/reduction/aggregation.py +38 -9
- maxframe/dataframe/reduction/all.py +2 -2
- maxframe/dataframe/reduction/any.py +2 -2
- maxframe/dataframe/reduction/argmax.py +100 -0
- maxframe/dataframe/reduction/argmin.py +100 -0
- maxframe/dataframe/reduction/core.py +65 -18
- maxframe/dataframe/reduction/count.py +13 -9
- maxframe/dataframe/reduction/cov.py +166 -0
- maxframe/dataframe/reduction/cummax.py +2 -2
- maxframe/dataframe/reduction/cummin.py +2 -2
- maxframe/dataframe/reduction/cumprod.py +2 -2
- maxframe/dataframe/reduction/cumsum.py +2 -2
- maxframe/dataframe/reduction/custom_reduction.py +2 -2
- maxframe/dataframe/reduction/idxmax.py +185 -0
- maxframe/dataframe/reduction/idxmin.py +185 -0
- maxframe/dataframe/reduction/kurtosis.py +37 -30
- maxframe/dataframe/reduction/max.py +2 -2
- maxframe/dataframe/reduction/mean.py +9 -7
- maxframe/dataframe/reduction/median.py +2 -2
- maxframe/dataframe/reduction/min.py +2 -2
- maxframe/dataframe/reduction/nunique.py +9 -8
- maxframe/dataframe/reduction/prod.py +18 -13
- maxframe/dataframe/reduction/reduction_size.py +2 -2
- maxframe/dataframe/reduction/sem.py +13 -9
- maxframe/dataframe/reduction/skew.py +31 -27
- maxframe/dataframe/reduction/str_concat.py +10 -7
- maxframe/dataframe/reduction/sum.py +18 -14
- maxframe/dataframe/reduction/unique.py +20 -3
- maxframe/dataframe/reduction/var.py +16 -12
- maxframe/dataframe/reshape/__init__.py +38 -0
- maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
- maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
- maxframe/dataframe/reshape/unstack.py +114 -0
- maxframe/dataframe/sort/__init__.py +8 -0
- maxframe/dataframe/sort/argsort.py +62 -0
- maxframe/dataframe/sort/core.py +1 -0
- maxframe/dataframe/sort/nlargest.py +238 -0
- maxframe/dataframe/sort/nsmallest.py +228 -0
- maxframe/dataframe/statistics/__init__.py +3 -3
- maxframe/dataframe/statistics/corr.py +1 -0
- maxframe/dataframe/statistics/quantile.py +2 -2
- maxframe/dataframe/tests/test_typing.py +104 -0
- maxframe/dataframe/tests/test_utils.py +66 -2
- maxframe/dataframe/typing_.py +185 -0
- maxframe/dataframe/utils.py +95 -26
- maxframe/dataframe/window/aggregation.py +8 -4
- maxframe/dataframe/window/core.py +14 -1
- maxframe/dataframe/window/ewm.py +1 -3
- maxframe/dataframe/window/expanding.py +37 -35
- maxframe/dataframe/window/rolling.py +49 -39
- maxframe/dataframe/window/tests/test_expanding.py +1 -7
- maxframe/dataframe/window/tests/test_rolling.py +1 -1
- maxframe/env.py +7 -4
- maxframe/errors.py +2 -2
- maxframe/io/odpsio/schema.py +9 -3
- maxframe/io/odpsio/tableio.py +7 -2
- maxframe/io/odpsio/tests/test_schema.py +198 -83
- maxframe/learn/__init__.py +10 -2
- maxframe/learn/cluster/__init__.py +15 -0
- maxframe/learn/cluster/_kmeans.py +782 -0
- maxframe/learn/contrib/llm/core.py +2 -0
- maxframe/learn/contrib/xgboost/core.py +86 -1
- maxframe/learn/contrib/xgboost/train.py +5 -2
- maxframe/learn/core.py +66 -0
- maxframe/learn/linear_model/_base.py +58 -1
- maxframe/learn/linear_model/_lin_reg.py +1 -1
- maxframe/learn/metrics/__init__.py +6 -0
- maxframe/learn/metrics/_classification.py +145 -0
- maxframe/learn/metrics/_ranking.py +477 -0
- maxframe/learn/metrics/_scorer.py +60 -0
- maxframe/learn/metrics/pairwise/__init__.py +21 -0
- maxframe/learn/metrics/pairwise/core.py +77 -0
- maxframe/learn/metrics/pairwise/cosine.py +115 -0
- maxframe/learn/metrics/pairwise/euclidean.py +176 -0
- maxframe/learn/metrics/pairwise/haversine.py +96 -0
- maxframe/learn/metrics/pairwise/manhattan.py +80 -0
- maxframe/learn/metrics/pairwise/pairwise.py +127 -0
- maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
- maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
- maxframe/learn/metrics/tests/__init__.py +13 -0
- maxframe/learn/metrics/tests/test_scorer.py +26 -0
- maxframe/learn/utils/__init__.py +1 -1
- maxframe/learn/utils/checks.py +1 -2
- maxframe/learn/utils/core.py +59 -0
- maxframe/learn/utils/extmath.py +37 -0
- maxframe/learn/utils/odpsio.py +193 -0
- maxframe/learn/utils/validation.py +2 -2
- maxframe/lib/compat.py +40 -0
- maxframe/lib/dtypes_extension/__init__.py +16 -1
- maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
- maxframe/lib/dtypes_extension/blob.py +304 -0
- maxframe/lib/dtypes_extension/dtypes.py +40 -0
- maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
- maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
- maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
- maxframe/lib/filesystem/_oss_lib/common.py +122 -50
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
- maxframe/lib/filesystem/base.py +1 -1
- maxframe/lib/filesystem/core.py +1 -1
- maxframe/lib/filesystem/oss.py +115 -46
- maxframe/lib/filesystem/tests/test_oss.py +74 -36
- maxframe/lib/mmh3.cp311-win32.pyd +0 -0
- maxframe/lib/wrapped_pickle.py +10 -0
- maxframe/opcodes.py +33 -15
- maxframe/protocol.py +12 -0
- maxframe/serialization/__init__.py +11 -2
- maxframe/serialization/arrow.py +38 -13
- maxframe/serialization/blob.py +32 -0
- maxframe/serialization/core.cp311-win32.pyd +0 -0
- maxframe/serialization/core.pyx +39 -1
- maxframe/serialization/exception.py +2 -4
- maxframe/serialization/numpy.py +11 -0
- maxframe/serialization/pandas.py +46 -9
- maxframe/serialization/serializables/core.py +2 -2
- maxframe/serialization/tests/test_serial.py +29 -2
- maxframe/tensor/__init__.py +38 -8
- maxframe/tensor/arithmetic/__init__.py +19 -10
- maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -0
- maxframe/tensor/core.py +3 -2
- maxframe/tensor/datasource/tests/test_datasource.py +2 -1
- maxframe/tensor/extensions/__init__.py +2 -0
- maxframe/tensor/extensions/apply_chunk.py +3 -3
- maxframe/tensor/extensions/rebalance.py +65 -0
- maxframe/tensor/fft/__init__.py +32 -0
- maxframe/tensor/fft/core.py +168 -0
- maxframe/tensor/fft/fft.py +112 -0
- maxframe/tensor/fft/fft2.py +118 -0
- maxframe/tensor/fft/fftfreq.py +80 -0
- maxframe/tensor/fft/fftn.py +123 -0
- maxframe/tensor/fft/fftshift.py +79 -0
- maxframe/tensor/fft/hfft.py +112 -0
- maxframe/tensor/fft/ifft.py +114 -0
- maxframe/tensor/fft/ifft2.py +115 -0
- maxframe/tensor/fft/ifftn.py +123 -0
- maxframe/tensor/fft/ifftshift.py +73 -0
- maxframe/tensor/fft/ihfft.py +93 -0
- maxframe/tensor/fft/irfft.py +118 -0
- maxframe/tensor/fft/irfft2.py +62 -0
- maxframe/tensor/fft/irfftn.py +114 -0
- maxframe/tensor/fft/rfft.py +116 -0
- maxframe/tensor/fft/rfft2.py +63 -0
- maxframe/tensor/fft/rfftfreq.py +87 -0
- maxframe/tensor/fft/rfftn.py +113 -0
- maxframe/tensor/indexing/fill_diagonal.py +1 -7
- maxframe/tensor/linalg/__init__.py +7 -0
- maxframe/tensor/linalg/_einsumfunc.py +1025 -0
- maxframe/tensor/linalg/cholesky.py +117 -0
- maxframe/tensor/linalg/einsum.py +339 -0
- maxframe/tensor/linalg/lstsq.py +100 -0
- maxframe/tensor/linalg/matrix_norm.py +75 -0
- maxframe/tensor/linalg/norm.py +249 -0
- maxframe/tensor/linalg/solve.py +72 -0
- maxframe/tensor/linalg/solve_triangular.py +2 -2
- maxframe/tensor/linalg/vector_norm.py +113 -0
- maxframe/tensor/misc/__init__.py +24 -1
- maxframe/tensor/misc/argwhere.py +72 -0
- maxframe/tensor/misc/array_split.py +46 -0
- maxframe/tensor/misc/broadcast_arrays.py +57 -0
- maxframe/tensor/misc/copyto.py +130 -0
- maxframe/tensor/misc/delete.py +104 -0
- maxframe/tensor/misc/dsplit.py +68 -0
- maxframe/tensor/misc/ediff1d.py +74 -0
- maxframe/tensor/misc/expand_dims.py +85 -0
- maxframe/tensor/misc/flip.py +90 -0
- maxframe/tensor/misc/fliplr.py +64 -0
- maxframe/tensor/misc/flipud.py +68 -0
- maxframe/tensor/misc/hsplit.py +85 -0
- maxframe/tensor/misc/insert.py +139 -0
- maxframe/tensor/misc/moveaxis.py +83 -0
- maxframe/tensor/misc/result_type.py +88 -0
- maxframe/tensor/misc/roll.py +124 -0
- maxframe/tensor/misc/rollaxis.py +77 -0
- maxframe/tensor/misc/shape.py +89 -0
- maxframe/tensor/misc/split.py +190 -0
- maxframe/tensor/misc/tile.py +109 -0
- maxframe/tensor/misc/vsplit.py +74 -0
- maxframe/tensor/reduction/array_equal.py +2 -1
- maxframe/tensor/sort/__init__.py +2 -0
- maxframe/tensor/sort/argpartition.py +98 -0
- maxframe/tensor/sort/partition.py +228 -0
- maxframe/tensor/spatial/__init__.py +15 -0
- maxframe/tensor/spatial/distance/__init__.py +17 -0
- maxframe/tensor/spatial/distance/cdist.py +421 -0
- maxframe/tensor/spatial/distance/pdist.py +398 -0
- maxframe/tensor/spatial/distance/squareform.py +153 -0
- maxframe/tensor/special/__init__.py +159 -21
- maxframe/tensor/special/airy.py +55 -0
- maxframe/tensor/special/bessel.py +199 -0
- maxframe/tensor/special/core.py +65 -4
- maxframe/tensor/special/ellip_func_integrals.py +155 -0
- maxframe/tensor/special/ellip_harm.py +55 -0
- maxframe/tensor/special/err_fresnel.py +223 -0
- maxframe/tensor/special/gamma_funcs.py +303 -0
- maxframe/tensor/special/hypergeometric_funcs.py +69 -0
- maxframe/tensor/special/info_theory.py +189 -0
- maxframe/tensor/special/misc.py +21 -0
- maxframe/tensor/statistics/__init__.py +6 -0
- maxframe/tensor/statistics/corrcoef.py +77 -0
- maxframe/tensor/statistics/cov.py +222 -0
- maxframe/tensor/statistics/digitize.py +126 -0
- maxframe/tensor/statistics/histogram.py +520 -0
- maxframe/tensor/statistics/median.py +85 -0
- maxframe/tensor/statistics/ptp.py +89 -0
- maxframe/tensor/utils.py +3 -3
- maxframe/tests/test_utils.py +43 -1
- maxframe/tests/utils.py +0 -2
- maxframe/typing_.py +2 -0
- maxframe/udf.py +27 -2
- maxframe/utils.py +193 -19
- {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/METADATA +3 -2
- {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/RECORD +391 -236
- maxframe_client/fetcher.py +35 -4
- maxframe_client/session/odps.py +7 -2
- maxframe_client/tests/test_fetcher.py +76 -3
- maxframe_client/tests/test_session.py +4 -1
- /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
- /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/WHEEL +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from .... import opcodes
|
|
16
|
+
from ....core import OutputType
|
|
17
|
+
from ....serialization.serializables import DictField, StringField, TupleField
|
|
18
|
+
from ....utils import no_default
|
|
19
|
+
from ...operators import DataFrameOperator, DataFrameOperatorMixin
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SeriesStructMethod(DataFrameOperator, DataFrameOperatorMixin):
|
|
23
|
+
_op_type_ = opcodes.SERIES_STRUCT_METHOD
|
|
24
|
+
|
|
25
|
+
method = StringField("method", default=None)
|
|
26
|
+
method_args = TupleField("method_args", default_factory=list)
|
|
27
|
+
method_kwargs = DictField("method_kwargs", default_factory=dict)
|
|
28
|
+
|
|
29
|
+
def __init__(self, output_types=None, **kw):
|
|
30
|
+
output_types = output_types or [OutputType.series]
|
|
31
|
+
kw["_output_types"] = kw.get("_output_types") or output_types
|
|
32
|
+
super().__init__(**kw)
|
|
33
|
+
|
|
34
|
+
def __call__(self, inp, dtype=None, name=no_default):
|
|
35
|
+
dtype = dtype if dtype is not None else inp.dtype
|
|
36
|
+
name = inp.name if name is no_default else name
|
|
37
|
+
return self.new_series(
|
|
38
|
+
[inp],
|
|
39
|
+
shape=inp.shape,
|
|
40
|
+
dtype=dtype,
|
|
41
|
+
index_value=inp.index_value,
|
|
42
|
+
name=name,
|
|
43
|
+
)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import pandas as pd
|
|
16
|
+
|
|
17
|
+
from ....lib.dtypes_extension import ArrowDtype
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def struct_dtypes(series):
|
|
21
|
+
"""
|
|
22
|
+
Return the dtype object of each child field of the struct.
|
|
23
|
+
|
|
24
|
+
Returns
|
|
25
|
+
-------
|
|
26
|
+
pandas.Series
|
|
27
|
+
The data type of each child field.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> import maxframe.dataframe as md
|
|
32
|
+
>>> import pandas as pd
|
|
33
|
+
>>> import pyarrow as pa
|
|
34
|
+
>>> s = md.Series(
|
|
35
|
+
... [
|
|
36
|
+
... {"version": 1, "project": "pandas"},
|
|
37
|
+
... {"version": 2, "project": "pandas"},
|
|
38
|
+
... {"version": 1, "project": "numpy"},
|
|
39
|
+
... ],
|
|
40
|
+
... dtype=pd.ArrowDtype(pa.struct(
|
|
41
|
+
... [("version", pa.int64()), ("project", pa.string())]
|
|
42
|
+
... ))
|
|
43
|
+
... )
|
|
44
|
+
>>> s.struct.dtypes.execute()
|
|
45
|
+
version int64[pyarrow]
|
|
46
|
+
project string[pyarrow]
|
|
47
|
+
dtype: object
|
|
48
|
+
"""
|
|
49
|
+
pa_type = series.dtype.pyarrow_dtype
|
|
50
|
+
fields = [pa_type[idx] for idx in range(pa_type.num_fields)]
|
|
51
|
+
dtypes_list = [ArrowDtype(ft.type) for ft in fields]
|
|
52
|
+
dt_name = [ft.name for ft in fields]
|
|
53
|
+
return pd.Series(dtypes_list, index=dt_name)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ....lib.dtypes_extension import ArrowDtype
|
|
16
|
+
from .core import SeriesStructMethod
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def struct_field(series, name_or_index):
|
|
20
|
+
"""
|
|
21
|
+
Extract a child field of a struct as a Series.
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
name_or_index : str | bytes | int | expression | list
|
|
26
|
+
Name or index of the child field to extract.
|
|
27
|
+
|
|
28
|
+
For list-like inputs, this will index into a nested
|
|
29
|
+
struct.
|
|
30
|
+
|
|
31
|
+
Returns
|
|
32
|
+
-------
|
|
33
|
+
pandas.Series
|
|
34
|
+
The data corresponding to the selected child field.
|
|
35
|
+
|
|
36
|
+
See Also
|
|
37
|
+
--------
|
|
38
|
+
Series.struct.explode : Return all child fields as a DataFrame.
|
|
39
|
+
|
|
40
|
+
Notes
|
|
41
|
+
-----
|
|
42
|
+
The name of the resulting Series will be set using the following
|
|
43
|
+
rules:
|
|
44
|
+
|
|
45
|
+
- For string, bytes, or integer `name_or_index` (or a list of these, for
|
|
46
|
+
a nested selection), the Series name is set to the selected
|
|
47
|
+
field's name.
|
|
48
|
+
- For a :class:`pyarrow.compute.Expression`, this is set to
|
|
49
|
+
the string form of the expression.
|
|
50
|
+
- For list-like `name_or_index`, the name will be set to the
|
|
51
|
+
name of the final field selected.
|
|
52
|
+
|
|
53
|
+
Examples
|
|
54
|
+
--------
|
|
55
|
+
>>> import maxframe.dataframe as md
|
|
56
|
+
>>> import pandas as pd
|
|
57
|
+
>>> import pyarrow as pa
|
|
58
|
+
>>> s = md.Series(
|
|
59
|
+
... [
|
|
60
|
+
... {"version": 1, "project": "pandas"},
|
|
61
|
+
... {"version": 2, "project": "pandas"},
|
|
62
|
+
... {"version": 1, "project": "numpy"},
|
|
63
|
+
... ],
|
|
64
|
+
... dtype=pd.ArrowDtype(pa.struct(
|
|
65
|
+
... [("version", pa.int64()), ("project", pa.string())]
|
|
66
|
+
... ))
|
|
67
|
+
... )
|
|
68
|
+
|
|
69
|
+
Extract by field name.
|
|
70
|
+
|
|
71
|
+
>>> s.struct.field("project").execute()
|
|
72
|
+
0 pandas
|
|
73
|
+
1 pandas
|
|
74
|
+
2 numpy
|
|
75
|
+
Name: project, dtype: string[pyarrow]
|
|
76
|
+
|
|
77
|
+
Extract by field index.
|
|
78
|
+
|
|
79
|
+
>>> s.struct.field(0).execute()
|
|
80
|
+
0 1
|
|
81
|
+
1 2
|
|
82
|
+
2 1
|
|
83
|
+
Name: version, dtype: int64[pyarrow]
|
|
84
|
+
|
|
85
|
+
For nested struct types, you can pass a list of values to index
|
|
86
|
+
multiple levels:
|
|
87
|
+
|
|
88
|
+
>>> version_type = pa.struct([
|
|
89
|
+
... ("major", pa.int64()),
|
|
90
|
+
... ("minor", pa.int64()),
|
|
91
|
+
... ])
|
|
92
|
+
>>> s = md.Series(
|
|
93
|
+
... [
|
|
94
|
+
... {"version": {"major": 1, "minor": 5}, "project": "pandas"},
|
|
95
|
+
... {"version": {"major": 2, "minor": 1}, "project": "pandas"},
|
|
96
|
+
... {"version": {"major": 1, "minor": 26}, "project": "numpy"},
|
|
97
|
+
... ],
|
|
98
|
+
... dtype=pd.ArrowDtype(pa.struct(
|
|
99
|
+
... [("version", version_type), ("project", pa.string())]
|
|
100
|
+
... ))
|
|
101
|
+
... )
|
|
102
|
+
>>> s.struct.field(["version", "minor"]).execute()
|
|
103
|
+
0 5
|
|
104
|
+
1 1
|
|
105
|
+
2 26
|
|
106
|
+
Name: minor, dtype: int64[pyarrow]
|
|
107
|
+
>>> s.struct.field([0, 0]).execute()
|
|
108
|
+
0 1
|
|
109
|
+
1 2
|
|
110
|
+
2 1
|
|
111
|
+
Name: major, dtype: int64[pyarrow]
|
|
112
|
+
"""
|
|
113
|
+
op = SeriesStructMethod(
|
|
114
|
+
method="field",
|
|
115
|
+
method_kwargs={"name_or_index": name_or_index},
|
|
116
|
+
)
|
|
117
|
+
names = name_or_index if isinstance(name_or_index, list) else [name_or_index]
|
|
118
|
+
arrow_type = series.dtype.pyarrow_dtype
|
|
119
|
+
arrow_name = None
|
|
120
|
+
for n in names:
|
|
121
|
+
arrow_name = arrow_type[n].name
|
|
122
|
+
arrow_type = arrow_type[n].type
|
|
123
|
+
return op(series, dtype=ArrowDtype(arrow_type), name=arrow_name)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import pandas as pd
|
|
16
|
+
import pyarrow as pa
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from ..... import dataframe as md
|
|
20
|
+
from .....utils import ARROW_DTYPE_NOT_SUPPORTED
|
|
21
|
+
from ..core import SeriesStructMethod
|
|
22
|
+
|
|
23
|
+
pytestmark = pytest.mark.skipif(
|
|
24
|
+
ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture
|
|
29
|
+
def series():
|
|
30
|
+
version_type = pa.struct(
|
|
31
|
+
[
|
|
32
|
+
("major", pa.int64()),
|
|
33
|
+
("minor", pa.int64()),
|
|
34
|
+
]
|
|
35
|
+
)
|
|
36
|
+
return md.Series(
|
|
37
|
+
[
|
|
38
|
+
{"version": {"major": 1, "minor": 5}, "project": "pandas"},
|
|
39
|
+
{"version": {"major": 2, "minor": 1}, "project": "pandas"},
|
|
40
|
+
{"version": {"major": 1, "minor": 26}, "project": "numpy"},
|
|
41
|
+
],
|
|
42
|
+
dtype=pd.ArrowDtype(
|
|
43
|
+
pa.struct([("version", version_type), ("project", pa.string())])
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_dtypes(series):
|
|
49
|
+
pd.testing.assert_series_equal(
|
|
50
|
+
series.struct.dtypes,
|
|
51
|
+
pd.Series(
|
|
52
|
+
[
|
|
53
|
+
pd.ArrowDtype(
|
|
54
|
+
pa.struct([("major", pa.int64()), ("minor", pa.int64())])
|
|
55
|
+
),
|
|
56
|
+
pd.ArrowDtype(pa.string()),
|
|
57
|
+
],
|
|
58
|
+
index=["version", "project"],
|
|
59
|
+
),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_field(series):
|
|
64
|
+
version_type = pa.struct(
|
|
65
|
+
[
|
|
66
|
+
("major", pa.int64()),
|
|
67
|
+
("minor", pa.int64()),
|
|
68
|
+
]
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
s1 = series.struct.field("version")
|
|
72
|
+
assert isinstance(s1, md.Series)
|
|
73
|
+
assert s1.name == "version"
|
|
74
|
+
assert s1.dtype == pd.ArrowDtype(version_type)
|
|
75
|
+
assert s1.shape == (3,)
|
|
76
|
+
assert s1.index_value == series.index_value
|
|
77
|
+
op = s1.op
|
|
78
|
+
assert isinstance(op, SeriesStructMethod)
|
|
79
|
+
assert op.method == "field"
|
|
80
|
+
assert op.method_kwargs["name_or_index"] == "version"
|
|
81
|
+
|
|
82
|
+
s2 = series.struct.field(["version", "major"])
|
|
83
|
+
assert isinstance(s1, md.Series)
|
|
84
|
+
assert s2.name == "major"
|
|
85
|
+
assert s2.dtype == pd.ArrowDtype(pa.int64())
|
|
86
|
+
assert s2.shape == (3,)
|
|
87
|
+
assert s2.index_value == series.index_value
|
|
88
|
+
op = s2.op
|
|
89
|
+
assert isinstance(op, SeriesStructMethod)
|
|
90
|
+
assert op.method == "field"
|
|
91
|
+
assert op.method_kwargs["name_or_index"] == ["version", "major"]
|
|
@@ -29,14 +29,15 @@ from .arcsin import DataFrameArcsin
|
|
|
29
29
|
from .arcsinh import DataFrameArcsinh
|
|
30
30
|
from .arctan import DataFrameArctan
|
|
31
31
|
from .arctanh import DataFrameArctanh
|
|
32
|
-
from .
|
|
32
|
+
from .between import between
|
|
33
33
|
from .bitwise_and import DataFrameAnd, bitand, rbitand
|
|
34
|
-
from .bitwise_or import DataFrameOr, bitor, rbitor
|
|
34
|
+
from .bitwise_or import DataFrameOr, DataFrameTreeOr, bitor, rbitor
|
|
35
35
|
from .bitwise_xor import DataFrameXor, bitxor, rbitxor
|
|
36
36
|
from .ceil import DataFrameCeil
|
|
37
37
|
from .cos import DataFrameCos
|
|
38
38
|
from .cosh import DataFrameCosh
|
|
39
39
|
from .degrees import DataFrameDegrees
|
|
40
|
+
from .dot import DataFrameDot, dot, rdot
|
|
40
41
|
from .equal import DataFrameEqual, eq
|
|
41
42
|
from .exp import DataFrameExp
|
|
42
43
|
from .exp2 import DataFrameExp2
|
|
@@ -58,6 +59,7 @@ from .negative import DataFrameNegative, negative
|
|
|
58
59
|
from .not_equal import DataFrameNotEqual, ne
|
|
59
60
|
from .power import DataFramePower, power, rpower
|
|
60
61
|
from .radians import DataFrameRadians
|
|
62
|
+
from .round import DataFrameRound, round
|
|
61
63
|
from .sin import DataFrameSin
|
|
62
64
|
from .sinh import DataFrameSinh
|
|
63
65
|
from .sqrt import DataFrameSqrt
|
|
@@ -220,7 +222,7 @@ def _install():
|
|
|
220
222
|
DataFrameDegrees,
|
|
221
223
|
DataFrameCeil,
|
|
222
224
|
DataFrameFloor,
|
|
223
|
-
|
|
225
|
+
DataFrameRound,
|
|
224
226
|
DataFrameExp,
|
|
225
227
|
DataFrameExp2,
|
|
226
228
|
DataFrameExpm1,
|
|
@@ -255,7 +257,8 @@ def _install():
|
|
|
255
257
|
for entity in DATAFRAME_TYPE + SERIES_TYPE:
|
|
256
258
|
setattr(entity, "__abs__", abs_)
|
|
257
259
|
setattr(entity, "abs", abs_)
|
|
258
|
-
_register_method(entity, "
|
|
260
|
+
_register_method(entity, "around", round)
|
|
261
|
+
_register_method(entity, "round", round)
|
|
259
262
|
setattr(entity, "__invert__", invert)
|
|
260
263
|
|
|
261
264
|
setattr(entity, "__add__", wrap_notimplemented_exception(add))
|
|
@@ -310,6 +313,10 @@ def _install():
|
|
|
310
313
|
_register_bin_method(entity, "ge", ge)
|
|
311
314
|
_register_bin_method(entity, "le", le)
|
|
312
315
|
|
|
316
|
+
setattr(entity, "__matmul__", dot)
|
|
317
|
+
setattr(entity, "__rmatmul__", rdot)
|
|
318
|
+
_register_method(entity, "dot", dot)
|
|
319
|
+
|
|
313
320
|
setattr(entity, "__and__", wrap_notimplemented_exception(bitand))
|
|
314
321
|
setattr(entity, "__rand__", wrap_notimplemented_exception(rbitand))
|
|
315
322
|
|
|
@@ -321,6 +328,9 @@ def _install():
|
|
|
321
328
|
|
|
322
329
|
setattr(entity, "__neg__", wrap_notimplemented_exception(negative))
|
|
323
330
|
|
|
331
|
+
for entity in SERIES_TYPE:
|
|
332
|
+
setattr(entity, "between", between)
|
|
333
|
+
|
|
324
334
|
for entity in INDEX_TYPE:
|
|
325
335
|
setattr(entity, "__eq__", _wrap_eq())
|
|
326
336
|
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def between(series, left, right, inclusive="both"):
|
|
17
|
+
"""
|
|
18
|
+
Return boolean Series equivalent to left <= series <= right.
|
|
19
|
+
This function returns a boolean vector containing `True` wherever the
|
|
20
|
+
corresponding Series element is between the boundary values `left` and
|
|
21
|
+
`right`. NA values are treated as `False`.
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
left : scalar or list-like
|
|
26
|
+
Left boundary.
|
|
27
|
+
right : scalar or list-like
|
|
28
|
+
Right boundary.
|
|
29
|
+
inclusive : {"both", "neither", "left", "right"}
|
|
30
|
+
Include boundaries. Whether to set each bound as closed or open.
|
|
31
|
+
|
|
32
|
+
Returns
|
|
33
|
+
-------
|
|
34
|
+
Series
|
|
35
|
+
Series representing whether each element is between left and
|
|
36
|
+
right (inclusive).
|
|
37
|
+
|
|
38
|
+
See Also
|
|
39
|
+
--------
|
|
40
|
+
Series.gt : Greater than of series and other.
|
|
41
|
+
Series.lt : Less than of series and other.
|
|
42
|
+
|
|
43
|
+
Notes
|
|
44
|
+
-----
|
|
45
|
+
This function is equivalent to ``(left <= ser) & (ser <= right)``
|
|
46
|
+
|
|
47
|
+
Examples
|
|
48
|
+
--------
|
|
49
|
+
>>> import maxframe.dataframe as md
|
|
50
|
+
>>> s = md.Series([2, 0, 4, 8, np.nan])
|
|
51
|
+
|
|
52
|
+
Boundary values are included by default:
|
|
53
|
+
|
|
54
|
+
>>> s.between(1, 4).execute()
|
|
55
|
+
0 True
|
|
56
|
+
1 False
|
|
57
|
+
2 True
|
|
58
|
+
3 False
|
|
59
|
+
4 False
|
|
60
|
+
dtype: bool
|
|
61
|
+
|
|
62
|
+
With `inclusive` set to ``"neither"`` boundary values are excluded:
|
|
63
|
+
|
|
64
|
+
>>> s.between(1, 4, inclusive="neither").execute()
|
|
65
|
+
0 True
|
|
66
|
+
1 False
|
|
67
|
+
2 False
|
|
68
|
+
3 False
|
|
69
|
+
4 False
|
|
70
|
+
dtype: bool
|
|
71
|
+
|
|
72
|
+
`left` and `right` can be any scalar value:
|
|
73
|
+
|
|
74
|
+
>>> s = md.Series(['Alice', 'Bob', 'Carol', 'Eve'])
|
|
75
|
+
>>> s.between('Anna', 'Daniel').execute()
|
|
76
|
+
0 False
|
|
77
|
+
1 True
|
|
78
|
+
2 True
|
|
79
|
+
3 False
|
|
80
|
+
dtype: bool
|
|
81
|
+
"""
|
|
82
|
+
if isinstance(inclusive, bool): # pragma: no cover
|
|
83
|
+
# for pandas < 1.3.0
|
|
84
|
+
if inclusive:
|
|
85
|
+
inclusive = "both"
|
|
86
|
+
else:
|
|
87
|
+
inclusive = "neither"
|
|
88
|
+
if inclusive == "both":
|
|
89
|
+
lmask = series >= left
|
|
90
|
+
rmask = series <= right
|
|
91
|
+
elif inclusive == "left":
|
|
92
|
+
lmask = series >= left
|
|
93
|
+
rmask = series < right
|
|
94
|
+
elif inclusive == "right":
|
|
95
|
+
lmask = series > left
|
|
96
|
+
rmask = series <= right
|
|
97
|
+
elif inclusive == "neither":
|
|
98
|
+
lmask = series > left
|
|
99
|
+
rmask = series < right
|
|
100
|
+
else:
|
|
101
|
+
raise ValueError(
|
|
102
|
+
"Inclusive has to be either string of 'both',"
|
|
103
|
+
"'left', 'right', or 'neither'."
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
return lmask & rmask
|