maxframe 2.0.0b2__cp38-cp38-win_amd64.whl → 2.2.0__cp38-cp38-win_amd64.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.cp38-win_amd64.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.cp38-win_amd64.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.cp38-win_amd64.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.cp38-win_amd64.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,143 @@
|
|
|
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 ... import opcodes
|
|
18
|
+
from ...core import get_output_types
|
|
19
|
+
from ...serialization.serializables import AnyField, Int32Field
|
|
20
|
+
from ..operators import DataFrameOperator, DataFrameOperatorMixin
|
|
21
|
+
from ..utils import parse_index, validate_axis
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DataFrameReorderLevels(DataFrameOperator, DataFrameOperatorMixin):
|
|
25
|
+
_op_type_ = opcodes.REORDER_LEVELS
|
|
26
|
+
|
|
27
|
+
order = AnyField("order")
|
|
28
|
+
axis = Int32Field("axis", default=0)
|
|
29
|
+
|
|
30
|
+
def __call__(self, df_or_series):
|
|
31
|
+
# Determine output type
|
|
32
|
+
self._output_types = get_output_types(df_or_series)
|
|
33
|
+
|
|
34
|
+
if self.axis == 0:
|
|
35
|
+
src_idx_value = df_or_series.index_value
|
|
36
|
+
else:
|
|
37
|
+
src_idx_value = df_or_series.columns_value
|
|
38
|
+
|
|
39
|
+
# Create reordered index
|
|
40
|
+
pd_index = src_idx_value.to_pandas()
|
|
41
|
+
if not isinstance(pd_index, pd.MultiIndex):
|
|
42
|
+
raise ValueError("reorder_levels can only be used with MultiIndex")
|
|
43
|
+
pd_index = pd_index.reorder_levels(self.order)
|
|
44
|
+
|
|
45
|
+
params = df_or_series.params
|
|
46
|
+
if self.axis == 0:
|
|
47
|
+
params["index_value"] = parse_index(pd_index)
|
|
48
|
+
else:
|
|
49
|
+
params["columns_value"] = parse_index(pd_index, store_data=True)
|
|
50
|
+
return self.new_tileable([df_or_series], **params)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _reorder_levels(df_or_series, order, axis=0):
|
|
54
|
+
axis = validate_axis(axis, df_or_series)
|
|
55
|
+
op = DataFrameReorderLevels(order=order, axis=axis)
|
|
56
|
+
return op(df_or_series)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def df_reorder_levels(df, order, axis=0):
|
|
60
|
+
"""
|
|
61
|
+
Rearrange index levels using input order. May not drop or duplicate levels.
|
|
62
|
+
|
|
63
|
+
Parameters
|
|
64
|
+
----------
|
|
65
|
+
order : list of int or list of str
|
|
66
|
+
List representing new level order. Reference level by number
|
|
67
|
+
(position) or by key (label).
|
|
68
|
+
axis : {0 or 'index', 1 or 'columns'}, default 0
|
|
69
|
+
Where to reorder levels.
|
|
70
|
+
|
|
71
|
+
Returns
|
|
72
|
+
-------
|
|
73
|
+
DataFrame
|
|
74
|
+
|
|
75
|
+
Examples
|
|
76
|
+
--------
|
|
77
|
+
>>> import maxframe.dataframe as md
|
|
78
|
+
>>> data = {
|
|
79
|
+
... "class": ["Mammals", "Mammals", "Reptiles"],
|
|
80
|
+
... "diet": ["Omnivore", "Carnivore", "Carnivore"],
|
|
81
|
+
... "species": ["Humans", "Dogs", "Snakes"],
|
|
82
|
+
... }
|
|
83
|
+
>>> df = md.DataFrame(data, columns=["class", "diet", "species"])
|
|
84
|
+
>>> df = df.set_index(["class", "diet"])
|
|
85
|
+
>>> df.execute()
|
|
86
|
+
species
|
|
87
|
+
class diet
|
|
88
|
+
Mammals Omnivore Humans
|
|
89
|
+
Carnivore Dogs
|
|
90
|
+
Reptiles Carnivore Snakes
|
|
91
|
+
|
|
92
|
+
Let's reorder the levels of the index:
|
|
93
|
+
|
|
94
|
+
>>> df.reorder_levels(["diet", "class"]).execute()
|
|
95
|
+
species
|
|
96
|
+
diet class
|
|
97
|
+
Omnivore Mammals Humans
|
|
98
|
+
Carnivore Mammals Dogs
|
|
99
|
+
Reptiles Snakes
|
|
100
|
+
"""
|
|
101
|
+
return _reorder_levels(df, order, axis=axis)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def series_reorder_levels(series, order):
|
|
105
|
+
"""
|
|
106
|
+
Rearrange index levels using input order.
|
|
107
|
+
|
|
108
|
+
May not drop or duplicate levels.
|
|
109
|
+
|
|
110
|
+
Parameters
|
|
111
|
+
----------
|
|
112
|
+
order : list of int representing new level order
|
|
113
|
+
Reference level by number or key.
|
|
114
|
+
|
|
115
|
+
Returns
|
|
116
|
+
-------
|
|
117
|
+
type of caller (new object)
|
|
118
|
+
|
|
119
|
+
Examples
|
|
120
|
+
--------
|
|
121
|
+
>>> import maxframe.tensor as mt
|
|
122
|
+
>>> import maxframe.dataframe as md
|
|
123
|
+
>>> arrays = [mt.array(["dog", "dog", "cat", "cat", "bird", "bird"]),
|
|
124
|
+
... mt.array(["white", "black", "white", "black", "white", "black"])]
|
|
125
|
+
>>> s = md.Series([1, 2, 3, 3, 5, 2], index=arrays)
|
|
126
|
+
>>> s.execute()
|
|
127
|
+
dog white 1
|
|
128
|
+
black 2
|
|
129
|
+
cat white 3
|
|
130
|
+
black 3
|
|
131
|
+
bird white 5
|
|
132
|
+
black 2
|
|
133
|
+
dtype: int64
|
|
134
|
+
>>> s.reorder_levels([1, 0]).execute()
|
|
135
|
+
white dog 1
|
|
136
|
+
black dog 2
|
|
137
|
+
white cat 3
|
|
138
|
+
black cat 3
|
|
139
|
+
white bird 5
|
|
140
|
+
black bird 2
|
|
141
|
+
dtype: int64
|
|
142
|
+
"""
|
|
143
|
+
return _reorder_levels(series, order)
|
|
@@ -18,10 +18,12 @@ import pandas as pd
|
|
|
18
18
|
from ... import opcodes
|
|
19
19
|
from ...core import OutputType
|
|
20
20
|
from ...serialization.serializables import AnyField, BoolField
|
|
21
|
-
from ...utils import no_default
|
|
21
|
+
from ...utils import no_default, pd_release_version
|
|
22
22
|
from ..operators import DATAFRAME_TYPE, DataFrameOperator, DataFrameOperatorMixin
|
|
23
23
|
from ..utils import build_empty_df, build_empty_series, parse_index
|
|
24
24
|
|
|
25
|
+
_reset_index_has_names = pd_release_version >= (1, 5)
|
|
26
|
+
|
|
25
27
|
|
|
26
28
|
class DataFrameResetIndex(DataFrameOperator, DataFrameOperatorMixin):
|
|
27
29
|
_op_type_ = opcodes.RESET_INDEX
|
|
@@ -29,8 +31,10 @@ class DataFrameResetIndex(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
29
31
|
level = AnyField("level", default=None)
|
|
30
32
|
drop = BoolField("drop", default=False)
|
|
31
33
|
name = AnyField("name", default=None)
|
|
32
|
-
col_level = AnyField("col_level", default=
|
|
33
|
-
col_fill = AnyField("col_fill", default=
|
|
34
|
+
col_level = AnyField("col_level", default=None)
|
|
35
|
+
col_fill = AnyField("col_fill", default=None)
|
|
36
|
+
incremental_index = BoolField("incremental_index", default=False)
|
|
37
|
+
names = AnyField("names", default=None)
|
|
34
38
|
|
|
35
39
|
def __init__(self, output_types=None, **kwargs):
|
|
36
40
|
super().__init__(_output_types=output_types, **kwargs)
|
|
@@ -76,9 +80,26 @@ class DataFrameResetIndex(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
76
80
|
else:
|
|
77
81
|
empty_df = build_empty_df(a.dtypes)
|
|
78
82
|
empty_df.index = a.index_value.to_pandas()[:0]
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
|
|
84
|
+
if self.names and _reset_index_has_names:
|
|
85
|
+
empty_df = empty_df.reset_index(
|
|
86
|
+
level=self.level,
|
|
87
|
+
col_level=self.col_level,
|
|
88
|
+
col_fill=self.col_fill,
|
|
89
|
+
names=self.names,
|
|
90
|
+
)
|
|
91
|
+
else:
|
|
92
|
+
empty_df = empty_df.reset_index(
|
|
93
|
+
level=self.level, col_level=self.col_level, col_fill=self.col_fill
|
|
94
|
+
)
|
|
95
|
+
if self.names:
|
|
96
|
+
names = (
|
|
97
|
+
[self.names] if not isinstance(self.names, list) else self.names
|
|
98
|
+
)
|
|
99
|
+
cols = list(empty_df.columns)
|
|
100
|
+
cols[: len(names)] = names
|
|
101
|
+
empty_df.columns = pd.Index(cols, name=empty_df.columns.name)
|
|
102
|
+
|
|
82
103
|
shape = (a.shape[0], len(empty_df.columns))
|
|
83
104
|
columns_value = parse_index(empty_df.columns, store_data=True)
|
|
84
105
|
dtypes = empty_df.dtypes
|
|
@@ -105,6 +126,8 @@ def df_reset_index(
|
|
|
105
126
|
inplace=False,
|
|
106
127
|
col_level=0,
|
|
107
128
|
col_fill="",
|
|
129
|
+
names=None,
|
|
130
|
+
incremental_index=False,
|
|
108
131
|
):
|
|
109
132
|
"""
|
|
110
133
|
Reset the index, or a level of it.
|
|
@@ -255,6 +278,8 @@ def df_reset_index(
|
|
|
255
278
|
drop=drop,
|
|
256
279
|
col_level=col_level,
|
|
257
280
|
col_fill=col_fill,
|
|
281
|
+
names=names,
|
|
282
|
+
incremental_index=incremental_index,
|
|
258
283
|
output_types=[OutputType.dataframe],
|
|
259
284
|
)
|
|
260
285
|
ret = op(df)
|
|
@@ -270,6 +295,7 @@ def series_reset_index(
|
|
|
270
295
|
drop=False,
|
|
271
296
|
name=no_default,
|
|
272
297
|
inplace=False,
|
|
298
|
+
incremental_index=False,
|
|
273
299
|
):
|
|
274
300
|
"""
|
|
275
301
|
Generate a new DataFrame or Series with the index reset.
|
|
@@ -389,6 +415,7 @@ def series_reset_index(
|
|
|
389
415
|
level=level,
|
|
390
416
|
drop=drop,
|
|
391
417
|
name=name,
|
|
418
|
+
incremental_index=incremental_index,
|
|
392
419
|
output_types=[OutputType.series if drop else OutputType.dataframe],
|
|
393
420
|
)
|
|
394
421
|
ret = op(series)
|
|
@@ -25,6 +25,7 @@ from ...serialization.serializables import (
|
|
|
25
25
|
Float64Field,
|
|
26
26
|
Int8Field,
|
|
27
27
|
Int64Field,
|
|
28
|
+
KeyField,
|
|
28
29
|
)
|
|
29
30
|
from ...tensor.random import RandomStateField
|
|
30
31
|
from ..operators import DataFrameOperator, DataFrameOperatorMixin
|
|
@@ -41,6 +42,11 @@ class DataFrameSample(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
41
42
|
axis = Int8Field("axis", default=None)
|
|
42
43
|
seed = Int64Field("seed", default=None)
|
|
43
44
|
random_state = RandomStateField("random_state", default=None)
|
|
45
|
+
always_multinomial = BoolField("always_multinomial", default=None)
|
|
46
|
+
|
|
47
|
+
# for chunks
|
|
48
|
+
# num of instances for chunks
|
|
49
|
+
chunk_samples = KeyField("chunk_samples", default=None)
|
|
44
50
|
|
|
45
51
|
def __init__(self, random_state=None, seed=None, **kw):
|
|
46
52
|
if random_state is None:
|
|
@@ -54,6 +60,8 @@ class DataFrameSample(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
54
60
|
next(it)
|
|
55
61
|
if isinstance(op.weights, ENTITY_TYPE):
|
|
56
62
|
op.weights = next(it)
|
|
63
|
+
if isinstance(op.chunk_samples, ENTITY_TYPE):
|
|
64
|
+
op.chunk_samples = next(it)
|
|
57
65
|
|
|
58
66
|
def __call__(self, df):
|
|
59
67
|
params = df.params
|
|
@@ -23,7 +23,7 @@ from ...core import EntityData, OutputType
|
|
|
23
23
|
from ...serialization.serializables import AnyField, KeyField
|
|
24
24
|
from ...tensor.core import TENSOR_TYPE
|
|
25
25
|
from ...utils import pd_release_version
|
|
26
|
-
from ..core import DATAFRAME_TYPE, SERIES_TYPE, DataFrame
|
|
26
|
+
from ..core import DATAFRAME_TYPE, ENTITY_TYPE, SERIES_TYPE, DataFrame
|
|
27
27
|
from ..initializer import DataFrame as asframe
|
|
28
28
|
from ..initializer import Series as asseries
|
|
29
29
|
from ..operators import DataFrameOperator, DataFrameOperatorMixin
|
|
@@ -77,7 +77,7 @@ class DataFrameSetitem(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
77
77
|
value_dtype = pd.Series(list(value.dtypes), index=self.indexes)
|
|
78
78
|
elif is_list_like(value) or isinstance(value, TENSOR_TYPE):
|
|
79
79
|
# convert to numpy to get actual dim and shape
|
|
80
|
-
if is_list_like(value):
|
|
80
|
+
if is_list_like(value) and not isinstance(value, ENTITY_TYPE):
|
|
81
81
|
value = np.array(value)
|
|
82
82
|
|
|
83
83
|
if value.ndim == 1:
|
|
@@ -108,7 +108,7 @@ class DataFrameSetitem(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
108
108
|
|
|
109
109
|
try:
|
|
110
110
|
dtypes.loc[self.indexes] = value_dtype
|
|
111
|
-
except KeyError:
|
|
111
|
+
except (AttributeError, KeyError):
|
|
112
112
|
# when some index not exist, try update one by one
|
|
113
113
|
if isinstance(value_dtype, pd.Series):
|
|
114
114
|
for idx in self.indexes:
|
|
@@ -0,0 +1,185 @@
|
|
|
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 ..utils import validate_axis
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _swaplevel(df_or_series, i=-2, j=-1, axis=0):
|
|
21
|
+
axis = validate_axis(axis, df_or_series)
|
|
22
|
+
|
|
23
|
+
if axis == 0:
|
|
24
|
+
src_idx_value = df_or_series.index_value
|
|
25
|
+
else:
|
|
26
|
+
src_idx_value = df_or_series.columns_value
|
|
27
|
+
|
|
28
|
+
pd_index = src_idx_value.to_pandas()
|
|
29
|
+
if not isinstance(pd_index, pd.MultiIndex):
|
|
30
|
+
raise ValueError("swaplevel can only be used with MultiIndex")
|
|
31
|
+
|
|
32
|
+
name_to_idx = {name: idx for idx, name in enumerate(pd_index.names)}
|
|
33
|
+
src_idx, dest_idx = name_to_idx.get(i, i), name_to_idx.get(j, j)
|
|
34
|
+
|
|
35
|
+
new_idxes = list(range(len(pd_index.names)))
|
|
36
|
+
new_idxes[src_idx], new_idxes[dest_idx] = new_idxes[dest_idx], new_idxes[src_idx]
|
|
37
|
+
if df_or_series.ndim == 2:
|
|
38
|
+
return df_or_series.reorder_levels(new_idxes, axis=axis)
|
|
39
|
+
else:
|
|
40
|
+
return df_or_series.reorder_levels(new_idxes)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def df_swaplevel(df, i=-2, j=-1, axis=0):
|
|
44
|
+
"""
|
|
45
|
+
Swap levels i and j in a :class:`MultiIndex`.
|
|
46
|
+
|
|
47
|
+
Default is to swap the two innermost levels of the index.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
i, j : int or str
|
|
52
|
+
Levels of the indices to be swapped. Can pass level name as string.
|
|
53
|
+
axis : {0 or 'index', 1 or 'columns'}, default 0
|
|
54
|
+
The axis to swap levels on. 0 or 'index' for row-wise, 1 or
|
|
55
|
+
'columns' for column-wise.
|
|
56
|
+
|
|
57
|
+
Returns
|
|
58
|
+
-------
|
|
59
|
+
DataFrame
|
|
60
|
+
DataFrame with levels swapped in MultiIndex.
|
|
61
|
+
|
|
62
|
+
Examples
|
|
63
|
+
--------
|
|
64
|
+
>>> import maxframe.dataframe as md
|
|
65
|
+
>>> df = md.DataFrame(
|
|
66
|
+
... {"Grade": ["A", "B", "A", "C"]},
|
|
67
|
+
... index=[
|
|
68
|
+
... ["Final exam", "Final exam", "Coursework", "Coursework"],
|
|
69
|
+
... ["History", "Geography", "History", "Geography"],
|
|
70
|
+
... ["January", "February", "March", "April"],
|
|
71
|
+
... ],
|
|
72
|
+
... )
|
|
73
|
+
>>> df.execute()
|
|
74
|
+
Grade
|
|
75
|
+
Final exam History January A
|
|
76
|
+
Geography February B
|
|
77
|
+
Coursework History March A
|
|
78
|
+
Geography April C
|
|
79
|
+
|
|
80
|
+
In the following example, we will swap the levels of the indices.
|
|
81
|
+
Here, we will swap the levels column-wise, but levels can be swapped row-wise
|
|
82
|
+
in a similar manner. Note that column-wise is the default behaviour.
|
|
83
|
+
By not supplying any arguments for i and j, we swap the last and second to
|
|
84
|
+
last indices.
|
|
85
|
+
|
|
86
|
+
>>> df.swaplevel().execute()
|
|
87
|
+
Grade
|
|
88
|
+
Final exam January History A
|
|
89
|
+
February Geography B
|
|
90
|
+
Coursework March History A
|
|
91
|
+
April Geography C
|
|
92
|
+
|
|
93
|
+
By supplying one argument, we can choose which index to swap the last
|
|
94
|
+
index with. We can for example swap the first index with the last one as
|
|
95
|
+
follows.
|
|
96
|
+
|
|
97
|
+
>>> df.swaplevel(0).execute()
|
|
98
|
+
Grade
|
|
99
|
+
January History Final exam A
|
|
100
|
+
February Geography Final exam B
|
|
101
|
+
March History Coursework A
|
|
102
|
+
April Geography Coursework C
|
|
103
|
+
|
|
104
|
+
We can also define explicitly which indices we want to swap by supplying values
|
|
105
|
+
for both i and j. Here, we for example swap the first and second indices.
|
|
106
|
+
|
|
107
|
+
>>> df.swaplevel(0, 1).execute()
|
|
108
|
+
Grade
|
|
109
|
+
History Final exam January A
|
|
110
|
+
Geography Final exam February B
|
|
111
|
+
History Coursework March A
|
|
112
|
+
Geography Coursework April C
|
|
113
|
+
"""
|
|
114
|
+
return _swaplevel(df, i, j, axis=axis)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def series_swaplevel(series, i=-2, j=-1):
|
|
118
|
+
"""
|
|
119
|
+
Swap levels i and j in a :class:`MultiIndex`.
|
|
120
|
+
|
|
121
|
+
Default is to swap the two innermost levels of the index.
|
|
122
|
+
|
|
123
|
+
Parameters
|
|
124
|
+
----------
|
|
125
|
+
i, j : int or str
|
|
126
|
+
Levels of the indices to be swapped. Can pass level name as string.
|
|
127
|
+
|
|
128
|
+
Returns
|
|
129
|
+
-------
|
|
130
|
+
Series
|
|
131
|
+
Series with levels swapped in MultiIndex.
|
|
132
|
+
|
|
133
|
+
Examples
|
|
134
|
+
--------
|
|
135
|
+
>>> import maxframe.dataframe as md
|
|
136
|
+
>>> s = md.Series(
|
|
137
|
+
... ["A", "B", "A", "C"],
|
|
138
|
+
... index=[
|
|
139
|
+
... ["Final exam", "Final exam", "Coursework", "Coursework"],
|
|
140
|
+
... ["History", "Geography", "History", "Geography"],
|
|
141
|
+
... ["January", "February", "March", "April"],
|
|
142
|
+
... ],
|
|
143
|
+
... )
|
|
144
|
+
>>> s.execute()
|
|
145
|
+
Final exam History January A
|
|
146
|
+
Geography February B
|
|
147
|
+
Coursework History March A
|
|
148
|
+
Geography April C
|
|
149
|
+
dtype: object
|
|
150
|
+
|
|
151
|
+
In the following example, we will swap the levels of the indices.
|
|
152
|
+
Here, we will swap the levels column-wise, but levels can be swapped row-wise
|
|
153
|
+
in a similar manner. Note that column-wise is the default behaviour.
|
|
154
|
+
By not supplying any arguments for i and j, we swap the last and second to
|
|
155
|
+
last indices.
|
|
156
|
+
|
|
157
|
+
>>> s.swaplevel().execute()
|
|
158
|
+
Final exam January History A
|
|
159
|
+
February Geography B
|
|
160
|
+
Coursework March History A
|
|
161
|
+
April Geography C
|
|
162
|
+
dtype: object
|
|
163
|
+
|
|
164
|
+
By supplying one argument, we can choose which index to swap the last
|
|
165
|
+
index with. We can for example swap the first index with the last one as
|
|
166
|
+
follows.
|
|
167
|
+
|
|
168
|
+
>>> s.swaplevel(0).execute()
|
|
169
|
+
January History Final exam A
|
|
170
|
+
February Geography Final exam B
|
|
171
|
+
March History Coursework A
|
|
172
|
+
April Geography Coursework C
|
|
173
|
+
dtype: object
|
|
174
|
+
|
|
175
|
+
We can also define explicitly which indices we want to swap by supplying values
|
|
176
|
+
for both i and j. Here, we for example swap the first and second indices.
|
|
177
|
+
|
|
178
|
+
>>> s.swaplevel(0, 1).execute()
|
|
179
|
+
History Final exam January A
|
|
180
|
+
Geography Final exam February B
|
|
181
|
+
History Coursework March A
|
|
182
|
+
Geography Coursework April C
|
|
183
|
+
dtype: object
|
|
184
|
+
"""
|
|
185
|
+
return _swaplevel(series, i, j)
|
|
@@ -0,0 +1,99 @@
|
|
|
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 ..utils import validate_axis
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def take(df_or_series, indices, axis=0, **kwargs):
|
|
19
|
+
"""
|
|
20
|
+
Return the elements in the given *positional* indices along an axis.
|
|
21
|
+
|
|
22
|
+
This means that we are not indexing according to actual values in
|
|
23
|
+
the index attribute of the object. We are indexing according to the
|
|
24
|
+
actual position of the element in the object.
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
indices : array-like
|
|
29
|
+
An array of ints indicating which positions to take.
|
|
30
|
+
axis : {0 or 'index', 1 or 'columns', None}, default 0
|
|
31
|
+
The axis on which to select elements. ``0`` means that we are
|
|
32
|
+
selecting rows, ``1`` means that we are selecting columns.
|
|
33
|
+
For `Series` this parameter is unused and defaults to 0.
|
|
34
|
+
**kwargs
|
|
35
|
+
For compatibility with :meth:`numpy.take`. Has no effect on the
|
|
36
|
+
output.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
same type as caller
|
|
41
|
+
An array-like containing the elements taken from the object.
|
|
42
|
+
|
|
43
|
+
See Also
|
|
44
|
+
--------
|
|
45
|
+
DataFrame.loc : Select a subset of a DataFrame by labels.
|
|
46
|
+
DataFrame.iloc : Select a subset of a DataFrame by positions.
|
|
47
|
+
numpy.take : Take elements from an array along an axis.
|
|
48
|
+
|
|
49
|
+
Examples
|
|
50
|
+
--------
|
|
51
|
+
>>> import maxframe.tensor as mt
|
|
52
|
+
>>> import maxframe.dataframe as md
|
|
53
|
+
>>> df = md.DataFrame([('falcon', 'bird', 389.0),
|
|
54
|
+
... ('parrot', 'bird', 24.0),
|
|
55
|
+
... ('lion', 'mammal', 80.5),
|
|
56
|
+
... ('monkey', 'mammal', mt.nan)],
|
|
57
|
+
... columns=['name', 'class', 'max_speed'],
|
|
58
|
+
... index=[0, 2, 3, 1])
|
|
59
|
+
>>> df.execute()
|
|
60
|
+
name class max_speed
|
|
61
|
+
0 falcon bird 389.0
|
|
62
|
+
2 parrot bird 24.0
|
|
63
|
+
3 lion mammal 80.5
|
|
64
|
+
1 monkey mammal NaN
|
|
65
|
+
|
|
66
|
+
Take elements at positions 0 and 3 along the axis 0 (default).
|
|
67
|
+
|
|
68
|
+
Note how the actual indices selected (0 and 1) do not correspond to
|
|
69
|
+
our selected indices 0 and 3. That's because we are selecting the 0th
|
|
70
|
+
and 3rd rows, not rows whose indices equal 0 and 3.
|
|
71
|
+
|
|
72
|
+
>>> df.take([0, 3]).execute()
|
|
73
|
+
name class max_speed
|
|
74
|
+
0 falcon bird 389.0
|
|
75
|
+
1 monkey mammal NaN
|
|
76
|
+
|
|
77
|
+
Take elements at indices 1 and 2 along the axis 1 (column selection).
|
|
78
|
+
|
|
79
|
+
>>> df.take([1, 2], axis=1).execute()
|
|
80
|
+
class max_speed
|
|
81
|
+
0 bird 389.0
|
|
82
|
+
2 bird 24.0
|
|
83
|
+
3 mammal 80.5
|
|
84
|
+
1 mammal NaN
|
|
85
|
+
|
|
86
|
+
We may take elements using negative integers for positive indices,
|
|
87
|
+
starting from the end of the object, just like with Python lists.
|
|
88
|
+
|
|
89
|
+
>>> df.take([-1, -2]).execute()
|
|
90
|
+
name class max_speed
|
|
91
|
+
1 monkey mammal NaN
|
|
92
|
+
3 lion mammal 80.5
|
|
93
|
+
"""
|
|
94
|
+
kwargs.clear()
|
|
95
|
+
|
|
96
|
+
axis = validate_axis(axis, df_or_series)
|
|
97
|
+
slc = [slice(None), slice(None)][: df_or_series.ndim]
|
|
98
|
+
slc[axis] = indices
|
|
99
|
+
return df_or_series.iloc[tuple(slc)]
|