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,48 @@
|
|
|
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
|
+
from ..compat import LegacySeriesMethodOperator
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SeriesDictMethod(DataFrameOperator, DataFrameOperatorMixin):
|
|
24
|
+
_op_type_ = opcodes.SERIES_DICT_METHOD
|
|
25
|
+
|
|
26
|
+
method = StringField("method", default=None)
|
|
27
|
+
method_args = TupleField("method_args", default_factory=list)
|
|
28
|
+
method_kwargs = DictField("method_kwargs", default_factory=dict)
|
|
29
|
+
|
|
30
|
+
def __init__(self, output_types=None, **kw):
|
|
31
|
+
output_types = output_types or [OutputType.series]
|
|
32
|
+
kw["_output_types"] = kw.get("_output_types") or output_types
|
|
33
|
+
super().__init__(**kw)
|
|
34
|
+
|
|
35
|
+
def __call__(self, inp, dtype=None, name=no_default):
|
|
36
|
+
dtype = dtype or inp.dtype
|
|
37
|
+
name = inp.name if name is no_default else name
|
|
38
|
+
return self.new_series(
|
|
39
|
+
[inp],
|
|
40
|
+
shape=inp.shape,
|
|
41
|
+
dtype=dtype,
|
|
42
|
+
index_value=inp.index_value,
|
|
43
|
+
name=name,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class LegacySeriesDictOperator(LegacySeriesMethodOperator):
|
|
48
|
+
_method_cls = SeriesDictMethod
|
|
@@ -15,30 +15,18 @@
|
|
|
15
15
|
import pandas as pd
|
|
16
16
|
|
|
17
17
|
from .... import opcodes
|
|
18
|
-
from ....core.entity.output_types import OutputType
|
|
19
18
|
from ....serialization.serializables.field import AnyField, BoolField
|
|
20
|
-
from
|
|
19
|
+
from .core import LegacySeriesDictOperator, SeriesDictMethod
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
class SeriesDictGetItemOperator(
|
|
22
|
+
class SeriesDictGetItemOperator(LegacySeriesDictOperator):
|
|
23
|
+
# operator class deprecated since v2.3.0
|
|
24
24
|
_op_type_ = opcodes.SERIES_DICT_GETITEM
|
|
25
|
+
_method_name = "getitem"
|
|
25
26
|
query_key = AnyField("query_key", default=None)
|
|
26
27
|
default_value = AnyField("default_value", default=None)
|
|
27
28
|
ignore_key_error = BoolField("ignore_key_error", default=False)
|
|
28
29
|
|
|
29
|
-
def __init__(self, **kw):
|
|
30
|
-
super().__init__(_output_types=[OutputType.series], **kw)
|
|
31
|
-
|
|
32
|
-
def __call__(self, series):
|
|
33
|
-
arrow_map_type = series.dtype.pyarrow_dtype
|
|
34
|
-
return self.new_series(
|
|
35
|
-
[series],
|
|
36
|
-
shape=series.shape,
|
|
37
|
-
dtype=pd.ArrowDtype(arrow_map_type.item_type),
|
|
38
|
-
index_value=series.index_value,
|
|
39
|
-
name=str(self.query_key),
|
|
40
|
-
)
|
|
41
|
-
|
|
42
30
|
|
|
43
31
|
def series_dict_getitem(series, query_key, default_value=None):
|
|
44
32
|
"""
|
|
@@ -85,9 +73,14 @@ def series_dict_getitem(series, query_key, default_value=None):
|
|
|
85
73
|
3 <NA>
|
|
86
74
|
Name: k2, dtype: int64[pyarrow]
|
|
87
75
|
"""
|
|
88
|
-
|
|
76
|
+
method_kw = dict(
|
|
89
77
|
query_key=query_key, default_value=default_value, ignore_key_error=True
|
|
90
|
-
)
|
|
78
|
+
)
|
|
79
|
+
arrow_map_type = series.dtype.pyarrow_dtype
|
|
80
|
+
dtype = pd.ArrowDtype(arrow_map_type.item_type)
|
|
81
|
+
return SeriesDictMethod(method="getitem", method_kwargs=method_kw)(
|
|
82
|
+
series, name=str(query_key), dtype=dtype
|
|
83
|
+
)
|
|
91
84
|
|
|
92
85
|
|
|
93
86
|
def series_dict_getitem_with_key_error(series, query_key):
|
|
@@ -139,6 +132,9 @@ def series_dict_getitem_with_key_error(series, query_key):
|
|
|
139
132
|
3 <NA>
|
|
140
133
|
Name: k1, dtype: int64[pyarrow]
|
|
141
134
|
"""
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
135
|
+
method_kw = dict(query_key=query_key, default_value=None, ignore_key_error=False)
|
|
136
|
+
arrow_map_type = series.dtype.pyarrow_dtype
|
|
137
|
+
dtype = pd.ArrowDtype(arrow_map_type.item_type)
|
|
138
|
+
return SeriesDictMethod(method="getitem", method_kwargs=method_kw)(
|
|
139
|
+
series, name=str(query_key), dtype=dtype
|
|
140
|
+
)
|
|
@@ -16,24 +16,13 @@ import pandas as pd
|
|
|
16
16
|
import pyarrow as pa
|
|
17
17
|
|
|
18
18
|
from .... import opcodes
|
|
19
|
-
from
|
|
20
|
-
from ...operators import DataFrameOperator, DataFrameOperatorMixin
|
|
19
|
+
from .core import LegacySeriesDictOperator, SeriesDictMethod
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
class SeriesDictLengthOperator(
|
|
22
|
+
class SeriesDictLengthOperator(LegacySeriesDictOperator):
|
|
23
|
+
# operator class deprecated since v2.3.0
|
|
24
24
|
_op_type_ = opcodes.SERIES_DICT_LENGTH
|
|
25
|
-
|
|
26
|
-
def __init__(self, **kw):
|
|
27
|
-
super().__init__(_output_types=[OutputType.series], **kw)
|
|
28
|
-
|
|
29
|
-
def __call__(self, series):
|
|
30
|
-
return self.new_series(
|
|
31
|
-
[series],
|
|
32
|
-
shape=series.shape,
|
|
33
|
-
index_value=series.index_value,
|
|
34
|
-
dtype=pd.ArrowDtype(pa.int64()),
|
|
35
|
-
name=None,
|
|
36
|
-
)
|
|
25
|
+
_method_name = "len"
|
|
37
26
|
|
|
38
27
|
|
|
39
28
|
def series_dict_length(series):
|
|
@@ -70,4 +59,6 @@ def series_dict_length(series):
|
|
|
70
59
|
3 <NA>
|
|
71
60
|
dtype: int64[pyarrow]
|
|
72
61
|
"""
|
|
73
|
-
return
|
|
62
|
+
return SeriesDictMethod(method="len")(
|
|
63
|
+
series, name=None, dtype=pd.ArrowDtype(pa.int64())
|
|
64
|
+
)
|
|
@@ -13,28 +13,17 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
from .... import opcodes
|
|
16
|
-
from ....core.entity.output_types import OutputType
|
|
17
16
|
from ....serialization.serializables.field import AnyField, BoolField
|
|
18
|
-
from
|
|
17
|
+
from .core import LegacySeriesDictOperator, SeriesDictMethod
|
|
19
18
|
|
|
20
19
|
|
|
21
|
-
class SeriesDictRemoveOperator(
|
|
20
|
+
class SeriesDictRemoveOperator(LegacySeriesDictOperator):
|
|
21
|
+
# operator class deprecated since v2.3.0
|
|
22
22
|
_op_type_ = opcodes.SERIES_DICT_REMOVE
|
|
23
|
+
_method_name = "remove"
|
|
23
24
|
query_key = AnyField("query_key", default=None)
|
|
24
25
|
ignore_key_error = BoolField("ignore_key_error", default=False)
|
|
25
26
|
|
|
26
|
-
def __init__(self, **kw):
|
|
27
|
-
super().__init__(_output_types=[OutputType.series], **kw)
|
|
28
|
-
|
|
29
|
-
def __call__(self, series):
|
|
30
|
-
return self.new_series(
|
|
31
|
-
[series],
|
|
32
|
-
shape=series.shape,
|
|
33
|
-
index_value=series.index_value,
|
|
34
|
-
dtype=series.dtype,
|
|
35
|
-
name=series.name,
|
|
36
|
-
)
|
|
37
|
-
|
|
38
27
|
|
|
39
28
|
def series_dict_remove(series, query_key, ignore_key_error: bool = False):
|
|
40
29
|
"""
|
|
@@ -82,6 +71,5 @@ def series_dict_remove(series, query_key, ignore_key_error: bool = False):
|
|
|
82
71
|
3 <NA>
|
|
83
72
|
dtype: map<string, int64>[pyarrow]
|
|
84
73
|
"""
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
)(series)
|
|
74
|
+
method_kwargs = dict(query_key=query_key, ignore_key_error=ignore_key_error)
|
|
75
|
+
return SeriesDictMethod(method="remove", method_kwargs=method_kwargs)(series)
|
|
@@ -13,30 +13,18 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
from .... import opcodes
|
|
16
|
-
from ....core.entity.output_types import OutputType
|
|
17
16
|
from ....serialization.serializables.field import AnyField
|
|
18
17
|
from ...core import TILEABLE_TYPE
|
|
19
|
-
from
|
|
18
|
+
from .core import LegacySeriesDictOperator, SeriesDictMethod
|
|
20
19
|
|
|
21
20
|
|
|
22
|
-
class SeriesDictSetItemOperator(
|
|
21
|
+
class SeriesDictSetItemOperator(LegacySeriesDictOperator):
|
|
22
|
+
# operator class deprecated since v2.3.0
|
|
23
23
|
_op_type_ = opcodes.SERIES_DICT_SETITEM
|
|
24
|
+
_method_name = "setitem"
|
|
24
25
|
query_key = AnyField("query_key", default=None)
|
|
25
26
|
value = AnyField("default_value", default=None)
|
|
26
27
|
|
|
27
|
-
def __init__(self, **kw):
|
|
28
|
-
super().__init__(_output_types=[OutputType.series], **kw)
|
|
29
|
-
|
|
30
|
-
def __call__(self, series):
|
|
31
|
-
new_series = self.new_series(
|
|
32
|
-
[series],
|
|
33
|
-
shape=series.shape,
|
|
34
|
-
index_value=series.index_value,
|
|
35
|
-
dtype=series.dtype,
|
|
36
|
-
name=series.name,
|
|
37
|
-
)
|
|
38
|
-
series.data = new_series.data
|
|
39
|
-
|
|
40
28
|
|
|
41
29
|
def series_dict_setitem(series, query_key, value):
|
|
42
30
|
"""
|
|
@@ -67,7 +55,7 @@ def series_dict_setitem(series, query_key, value):
|
|
|
67
55
|
>>> s = md.Series(
|
|
68
56
|
... data=[[("k1", 1), ("k2", 2)], [("k1", 3)], None],
|
|
69
57
|
... index=[1, 2, 3],
|
|
70
|
-
... dtype=
|
|
58
|
+
... dtype=dict_(pa.string(), pa.int64()),
|
|
71
59
|
... )
|
|
72
60
|
>>> s.execute()
|
|
73
61
|
1 [('k1', 1), ('k2', 2)]
|
|
@@ -86,4 +74,6 @@ def series_dict_setitem(series, query_key, value):
|
|
|
86
74
|
raise NotImplementedError(
|
|
87
75
|
"Set the value with a dataframe/series is not allowed yet"
|
|
88
76
|
)
|
|
89
|
-
|
|
77
|
+
method_kwargs = dict(query_key=query_key, value=value)
|
|
78
|
+
new_series = SeriesDictMethod(method="setitem", method_kwargs=method_kwargs)(series)
|
|
79
|
+
series.data = new_series.data
|
|
@@ -18,13 +18,15 @@ import pyarrow as pa
|
|
|
18
18
|
import pytest
|
|
19
19
|
|
|
20
20
|
from ..... import dataframe as md
|
|
21
|
+
from .....core import OutputType, TileableGraph, build_fetch
|
|
21
22
|
from .....lib.dtypes_extension import dict_
|
|
22
|
-
from .....utils import
|
|
23
|
-
|
|
23
|
+
from .....utils import (
|
|
24
|
+
ARROW_DTYPE_NOT_SUPPORTED,
|
|
25
|
+
deserialize_serializable,
|
|
26
|
+
serialize_serializable,
|
|
27
|
+
)
|
|
28
|
+
from ..core import SeriesDictMethod
|
|
24
29
|
from ..getitem import SeriesDictGetItemOperator
|
|
25
|
-
from ..length import SeriesDictLengthOperator
|
|
26
|
-
from ..remove import SeriesDictRemoveOperator
|
|
27
|
-
from ..setitem import SeriesDictSetItemOperator
|
|
28
30
|
|
|
29
31
|
pytestmark = pytest.mark.skipif(
|
|
30
32
|
ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
|
|
@@ -58,10 +60,11 @@ def test_getitem(df):
|
|
|
58
60
|
assert s1.shape == (1,)
|
|
59
61
|
assert s1.index_value == df.index_value
|
|
60
62
|
op = s1.op
|
|
61
|
-
assert isinstance(op,
|
|
62
|
-
assert op.
|
|
63
|
-
assert op.
|
|
64
|
-
assert op.
|
|
63
|
+
assert isinstance(op, SeriesDictMethod)
|
|
64
|
+
assert op.method == "getitem"
|
|
65
|
+
assert op.method_kwargs["query_key"] == "k1"
|
|
66
|
+
assert op.method_kwargs["default_value"] is None
|
|
67
|
+
assert op.method_kwargs["ignore_key_error"] is False
|
|
65
68
|
|
|
66
69
|
|
|
67
70
|
def test_getitem_with_default_value(df):
|
|
@@ -72,10 +75,11 @@ def test_getitem_with_default_value(df):
|
|
|
72
75
|
assert s1.shape == (1,)
|
|
73
76
|
assert s1.index_value == df.index_value
|
|
74
77
|
op = s1.op
|
|
75
|
-
assert isinstance(op,
|
|
76
|
-
assert op.
|
|
77
|
-
assert op.
|
|
78
|
-
assert op.
|
|
78
|
+
assert isinstance(op, SeriesDictMethod)
|
|
79
|
+
assert op.method == "getitem"
|
|
80
|
+
assert op.method_kwargs["query_key"] == "k1"
|
|
81
|
+
assert op.method_kwargs["default_value"] == 1
|
|
82
|
+
assert op.method_kwargs["ignore_key_error"] is True
|
|
79
83
|
|
|
80
84
|
|
|
81
85
|
def test_setitem(df):
|
|
@@ -87,9 +91,10 @@ def test_setitem(df):
|
|
|
87
91
|
assert s1.index_value == df.index_value
|
|
88
92
|
assert s1.shape == (1,)
|
|
89
93
|
op = s1.op
|
|
90
|
-
assert isinstance(op,
|
|
91
|
-
assert op.
|
|
92
|
-
assert op.
|
|
94
|
+
assert isinstance(op, SeriesDictMethod)
|
|
95
|
+
assert op.method == "setitem"
|
|
96
|
+
assert op.method_kwargs["query_key"] == "k1"
|
|
97
|
+
assert op.method_kwargs["value"] == "v3"
|
|
93
98
|
|
|
94
99
|
|
|
95
100
|
def test_length(df):
|
|
@@ -100,7 +105,8 @@ def test_length(df):
|
|
|
100
105
|
assert s1.shape == (1,)
|
|
101
106
|
assert s1.index_value == df.index_value
|
|
102
107
|
op = s1.op
|
|
103
|
-
assert
|
|
108
|
+
assert op.method == "len"
|
|
109
|
+
assert isinstance(op, SeriesDictMethod)
|
|
104
110
|
|
|
105
111
|
|
|
106
112
|
def test_remove(df):
|
|
@@ -111,9 +117,10 @@ def test_remove(df):
|
|
|
111
117
|
assert s1.index_value == df.index_value
|
|
112
118
|
assert s1.shape == (1,)
|
|
113
119
|
op = s1.op
|
|
114
|
-
assert isinstance(op,
|
|
115
|
-
assert op.
|
|
116
|
-
assert op.
|
|
120
|
+
assert isinstance(op, SeriesDictMethod)
|
|
121
|
+
assert op.method == "remove"
|
|
122
|
+
assert op.method_kwargs["query_key"] == "k1"
|
|
123
|
+
assert op.method_kwargs["ignore_key_error"] is True
|
|
117
124
|
|
|
118
125
|
|
|
119
126
|
def test_contains(df):
|
|
@@ -124,5 +131,38 @@ def test_contains(df):
|
|
|
124
131
|
assert s1.index_value == df.index_value
|
|
125
132
|
assert s1.shape == (1,)
|
|
126
133
|
op = s1.op
|
|
127
|
-
assert isinstance(op,
|
|
128
|
-
assert op.
|
|
134
|
+
assert isinstance(op, SeriesDictMethod)
|
|
135
|
+
assert op.method == "contains"
|
|
136
|
+
assert op.method_kwargs["query_key"] == "k1"
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_legacy_compatibility(df):
|
|
140
|
+
in_series = df["A"]
|
|
141
|
+
legacy_op = SeriesDictGetItemOperator(
|
|
142
|
+
query_key="k1",
|
|
143
|
+
default_value=1,
|
|
144
|
+
ignore_key_error=True,
|
|
145
|
+
_output_types=[OutputType.series],
|
|
146
|
+
)
|
|
147
|
+
out = legacy_op.new_tileable(
|
|
148
|
+
[in_series],
|
|
149
|
+
shape=in_series.shape,
|
|
150
|
+
index_value=in_series.index_value,
|
|
151
|
+
name="k1",
|
|
152
|
+
dtype=pd.ArrowDtype(pa.int64()),
|
|
153
|
+
)
|
|
154
|
+
fetch_node = build_fetch(in_series).data
|
|
155
|
+
out.op.inputs = [fetch_node]
|
|
156
|
+
|
|
157
|
+
dag = TileableGraph([out.data])
|
|
158
|
+
dag.add_node(fetch_node)
|
|
159
|
+
dag.add_node(out.data)
|
|
160
|
+
dag.add_edge(fetch_node, out.data)
|
|
161
|
+
dag_out = deserialize_serializable(serialize_serializable(dag))
|
|
162
|
+
|
|
163
|
+
out_op = dag_out.results[0].op
|
|
164
|
+
assert isinstance(out_op, SeriesDictMethod)
|
|
165
|
+
assert out_op.method == "getitem"
|
|
166
|
+
assert out_op.method_kwargs["ignore_key_error"] == True
|
|
167
|
+
assert out_op.method_kwargs["default_value"] == 1
|
|
168
|
+
assert out_op.method_kwargs["query_key"] == "k1"
|
|
@@ -20,13 +20,13 @@ def _install():
|
|
|
20
20
|
from .getitem import series_list_getitem, series_list_getitem_with_index_error
|
|
21
21
|
from .length import series_list_length
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
list_method_to_handlers = {
|
|
24
24
|
"__getitem__": series_list_getitem_with_index_error,
|
|
25
25
|
"get": series_list_getitem,
|
|
26
26
|
"len": series_list_length,
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
for name, handler in
|
|
29
|
+
for name, handler in list_method_to_handlers.items():
|
|
30
30
|
ListAccessor._register(name, handler)
|
|
31
31
|
|
|
32
32
|
for series in SERIES_TYPE:
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
from ..compat import LegacySeriesMethodOperator
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SeriesListMethod(DataFrameOperator, DataFrameOperatorMixin):
|
|
24
|
+
_op_type_ = opcodes.SERIES_LIST_METHOD
|
|
25
|
+
|
|
26
|
+
method = StringField("method", default=None)
|
|
27
|
+
method_args = TupleField("method_args", default_factory=list)
|
|
28
|
+
method_kwargs = DictField("method_kwargs", default_factory=dict)
|
|
29
|
+
|
|
30
|
+
def __init__(self, output_types=None, **kw):
|
|
31
|
+
output_types = output_types or [OutputType.series]
|
|
32
|
+
kw["_output_types"] = kw.get("_output_types") or output_types
|
|
33
|
+
super().__init__(**kw)
|
|
34
|
+
|
|
35
|
+
def __call__(self, inp, dtype=None, name=no_default):
|
|
36
|
+
dtype = dtype or inp.dtype
|
|
37
|
+
name = inp.name if name is no_default else name
|
|
38
|
+
return self.new_series(
|
|
39
|
+
[inp],
|
|
40
|
+
shape=inp.shape,
|
|
41
|
+
dtype=dtype,
|
|
42
|
+
index_value=inp.index_value,
|
|
43
|
+
name=name,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class LegacySeriesListOperator(LegacySeriesMethodOperator):
|
|
48
|
+
_method_cls = SeriesListMethod
|
|
@@ -15,28 +15,17 @@
|
|
|
15
15
|
import pandas as pd
|
|
16
16
|
|
|
17
17
|
from .... import opcodes
|
|
18
|
-
from ....core.entity.output_types import OutputType
|
|
19
18
|
from ....serialization.serializables.field import AnyField, BoolField
|
|
20
|
-
from
|
|
19
|
+
from .core import LegacySeriesListOperator, SeriesListMethod
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
class SeriesListGetItemOperator(
|
|
22
|
+
class SeriesListGetItemOperator(LegacySeriesListOperator):
|
|
23
|
+
# operator class deprecated since v2.3.0
|
|
24
24
|
_op_type_ = opcodes.SERIES_LIST_GETITEM
|
|
25
|
+
_method_name = "getitem"
|
|
25
26
|
query_index = AnyField("query_index", default=None)
|
|
26
27
|
ignore_index_error = BoolField("ignore_index_error", default=False)
|
|
27
28
|
|
|
28
|
-
def __init__(self, **kw):
|
|
29
|
-
super().__init__(_output_types=[OutputType.series], **kw)
|
|
30
|
-
|
|
31
|
-
def __call__(self, series):
|
|
32
|
-
arrow_list_type = series.dtype.pyarrow_dtype
|
|
33
|
-
return self.new_series(
|
|
34
|
-
[series],
|
|
35
|
-
shape=series.shape,
|
|
36
|
-
dtype=pd.ArrowDtype(arrow_list_type.value_type),
|
|
37
|
-
index_value=series.index_value,
|
|
38
|
-
)
|
|
39
|
-
|
|
40
29
|
|
|
41
30
|
def series_list_getitem(series, query_index):
|
|
42
31
|
"""
|
|
@@ -77,8 +66,10 @@ def series_list_getitem(series, query_index):
|
|
|
77
66
|
3 <NA>
|
|
78
67
|
dtype: int64[pyarrow]
|
|
79
68
|
"""
|
|
80
|
-
|
|
81
|
-
|
|
69
|
+
kw = dict(query_index=query_index, ignore_index_error=True)
|
|
70
|
+
arrow_list_type = series.dtype.pyarrow_dtype
|
|
71
|
+
return SeriesListMethod(method="getitem", method_kwargs=kw)(
|
|
72
|
+
series, dtype=pd.ArrowDtype(arrow_list_type.value_type)
|
|
82
73
|
)
|
|
83
74
|
|
|
84
75
|
|
|
@@ -130,6 +121,8 @@ def series_list_getitem_with_index_error(series, query_index):
|
|
|
130
121
|
3 <NA>
|
|
131
122
|
dtype: int64[pyarrow]
|
|
132
123
|
"""
|
|
133
|
-
|
|
134
|
-
|
|
124
|
+
kw = dict(query_index=query_index, ignore_index_error=False)
|
|
125
|
+
arrow_list_type = series.dtype.pyarrow_dtype
|
|
126
|
+
return SeriesListMethod(method="getitem", method_kwargs=kw)(
|
|
127
|
+
series, dtype=pd.ArrowDtype(arrow_list_type.value_type)
|
|
135
128
|
)
|
|
@@ -16,24 +16,13 @@ import pandas as pd
|
|
|
16
16
|
import pyarrow as pa
|
|
17
17
|
|
|
18
18
|
from .... import opcodes
|
|
19
|
-
from
|
|
20
|
-
from ...operators import DataFrameOperator, DataFrameOperatorMixin
|
|
19
|
+
from .core import LegacySeriesListOperator, SeriesListMethod
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
class SeriesListLengthOperator(
|
|
22
|
+
class SeriesListLengthOperator(LegacySeriesListOperator):
|
|
23
|
+
# operator class deprecated since v2.3.0
|
|
24
24
|
_op_type_ = opcodes.SERIES_LIST_LENGTH
|
|
25
|
-
|
|
26
|
-
def __init__(self, **kw):
|
|
27
|
-
super().__init__(_output_types=[OutputType.series], **kw)
|
|
28
|
-
|
|
29
|
-
def __call__(self, series):
|
|
30
|
-
return self.new_series(
|
|
31
|
-
[series],
|
|
32
|
-
shape=series.shape,
|
|
33
|
-
index_value=series.index_value,
|
|
34
|
-
dtype=pd.ArrowDtype(pa.int64()),
|
|
35
|
-
name=None,
|
|
36
|
-
)
|
|
25
|
+
_method_name = "len"
|
|
37
26
|
|
|
38
27
|
|
|
39
28
|
def series_list_length(series):
|
|
@@ -70,4 +59,6 @@ def series_list_length(series):
|
|
|
70
59
|
3 <NA>
|
|
71
60
|
dtype: int64[pyarrow]
|
|
72
61
|
"""
|
|
73
|
-
return
|
|
62
|
+
return SeriesListMethod(method="len")(
|
|
63
|
+
series, name=None, dtype=pd.ArrowDtype(pa.int64())
|
|
64
|
+
)
|
|
@@ -20,8 +20,7 @@ import pytest
|
|
|
20
20
|
from ..... import dataframe as md
|
|
21
21
|
from .....lib.dtypes_extension import list_
|
|
22
22
|
from .....utils import ARROW_DTYPE_NOT_SUPPORTED
|
|
23
|
-
from ..
|
|
24
|
-
from ..length import SeriesListLengthOperator
|
|
23
|
+
from ..core import SeriesListMethod
|
|
25
24
|
|
|
26
25
|
pytestmark = pytest.mark.skipif(
|
|
27
26
|
ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
|
|
@@ -52,9 +51,10 @@ def test_getitem(df):
|
|
|
52
51
|
assert s1.shape == (1,)
|
|
53
52
|
assert s1.index_value == df.index_value
|
|
54
53
|
op = s1.op
|
|
55
|
-
assert isinstance(op,
|
|
56
|
-
assert op.
|
|
57
|
-
assert op.
|
|
54
|
+
assert isinstance(op, SeriesListMethod)
|
|
55
|
+
assert op.method == "getitem"
|
|
56
|
+
assert op.method_kwargs["query_index"] == 1
|
|
57
|
+
assert op.method_kwargs["ignore_index_error"] is False
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
def test_getitem_ignore_index_err(df):
|
|
@@ -64,9 +64,10 @@ def test_getitem_ignore_index_err(df):
|
|
|
64
64
|
assert s1.shape == (1,)
|
|
65
65
|
assert s1.index_value == df.index_value
|
|
66
66
|
op = s1.op
|
|
67
|
-
assert isinstance(op,
|
|
68
|
-
assert op.
|
|
69
|
-
assert op.
|
|
67
|
+
assert isinstance(op, SeriesListMethod)
|
|
68
|
+
assert op.method == "getitem"
|
|
69
|
+
assert op.method_kwargs["query_index"] == 1
|
|
70
|
+
assert op.method_kwargs["ignore_index_error"] is True
|
|
70
71
|
|
|
71
72
|
|
|
72
73
|
def test_length(df):
|
|
@@ -76,4 +77,5 @@ def test_length(df):
|
|
|
76
77
|
assert s1.shape == (1,)
|
|
77
78
|
assert s1.index_value == df.index_value
|
|
78
79
|
op = s1.op
|
|
79
|
-
assert isinstance(op,
|
|
80
|
+
assert isinstance(op, SeriesListMethod)
|
|
81
|
+
assert op.method == "len"
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from .core import SeriesStringMethod
|
|
15
|
+
from .core import SeriesStringMethod, string_method_to_handlers
|
|
16
|
+
|
|
17
|
+
methods = set(string_method_to_handlers.keys())
|
|
18
|
+
del string_method_to_handlers
|
|
16
19
|
|
|
17
20
|
|
|
18
21
|
def _install():
|
|
@@ -0,0 +1,37 @@
|
|
|
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 _install():
|
|
17
|
+
from ....core import CachedAccessor
|
|
18
|
+
from ...core import SERIES_TYPE
|
|
19
|
+
from .accessor import StructAccessor
|
|
20
|
+
from .dtypes import struct_dtypes
|
|
21
|
+
from .field import struct_field
|
|
22
|
+
|
|
23
|
+
struct_method_to_handlers = {
|
|
24
|
+
"dtypes": struct_dtypes,
|
|
25
|
+
"field": struct_field,
|
|
26
|
+
}
|
|
27
|
+
property_names = {"dtypes"}
|
|
28
|
+
|
|
29
|
+
for name, handler in struct_method_to_handlers.items():
|
|
30
|
+
StructAccessor._register(name, handler, is_property=name in property_names)
|
|
31
|
+
|
|
32
|
+
for series in SERIES_TYPE:
|
|
33
|
+
series.struct = CachedAccessor("struct", StructAccessor)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
_install()
|
|
37
|
+
del _install
|
|
@@ -0,0 +1,39 @@
|
|
|
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 typing import TYPE_CHECKING
|
|
16
|
+
|
|
17
|
+
import pandas as pd
|
|
18
|
+
import pyarrow as pa
|
|
19
|
+
|
|
20
|
+
from ....core import BaseMaxFrameAccessor
|
|
21
|
+
from ....utils import ARROW_DTYPE_NOT_SUPPORTED
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from ...core import Series
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class StructAccessor(BaseMaxFrameAccessor):
|
|
28
|
+
obj: "Series"
|
|
29
|
+
_api_count: int = 0
|
|
30
|
+
|
|
31
|
+
def __init__(self, series):
|
|
32
|
+
super().__init__(series)
|
|
33
|
+
if ARROW_DTYPE_NOT_SUPPORTED:
|
|
34
|
+
raise ImportError("pd.ArrowDtype is not supported in current environment")
|
|
35
|
+
|
|
36
|
+
if not isinstance(series.dtype, pd.ArrowDtype) or not isinstance(
|
|
37
|
+
series.dtype.pyarrow_dtype, pa.StructType
|
|
38
|
+
):
|
|
39
|
+
raise AttributeError("Can only use .struct accessor with struct values")
|