maxframe 2.0.0b2__cp38-cp38-win32.whl → 2.2.0__cp38-cp38-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.cp38-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.cp38-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.cp38-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.cp38-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
|
@@ -12,15 +12,27 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from typing import List
|
|
15
|
+
from typing import List, Union
|
|
16
16
|
|
|
17
17
|
from ....dataframe.core import DATAFRAME_TYPE, INDEX_TYPE
|
|
18
18
|
from ....dataframe.indexing.align import DataFrameAlign
|
|
19
|
+
from ....dataframe.indexing.droplevel import DataFrameDropLevel
|
|
20
|
+
from ....dataframe.indexing.filter import DataFrameFilter
|
|
21
|
+
from ....dataframe.indexing.get_level_values import IndexGetLevelValues
|
|
19
22
|
from ....dataframe.indexing.getitem import DataFrameIndex, SeriesIndex
|
|
20
|
-
from ....dataframe.indexing.iloc import
|
|
23
|
+
from ....dataframe.indexing.iloc import (
|
|
24
|
+
DataFrameIlocGetItem,
|
|
25
|
+
DataFrameIlocSetItem,
|
|
26
|
+
IndexIlocGetItem,
|
|
27
|
+
SeriesIlocGetItem,
|
|
28
|
+
SeriesIlocSetItem,
|
|
29
|
+
)
|
|
21
30
|
from ....dataframe.indexing.insert import DataFrameInsert
|
|
31
|
+
from ....dataframe.indexing.loc import DataFrameLocGetItem, DataFrameLocSetItem
|
|
22
32
|
from ....dataframe.indexing.reindex import DataFrameReindex
|
|
23
33
|
from ....dataframe.indexing.rename import DataFrameRename
|
|
34
|
+
from ....dataframe.indexing.rename_axis import DataFrameRenameAxis
|
|
35
|
+
from ....dataframe.indexing.reorder_levels import DataFrameReorderLevels
|
|
24
36
|
from ....dataframe.indexing.reset_index import DataFrameResetIndex
|
|
25
37
|
from ....dataframe.indexing.sample import DataFrameSample
|
|
26
38
|
from ....dataframe.indexing.set_axis import DataFrameSetAxis
|
|
@@ -52,6 +64,12 @@ class DataFrameAlignAdapter(SPEOperatorAdapter):
|
|
|
52
64
|
return [f"{out_lhs_var}, {out_rhs_var} = {input_var}.align({args_str})"]
|
|
53
65
|
|
|
54
66
|
|
|
67
|
+
DataFrameDropLevelAdapter = build_method_call_adapter(
|
|
68
|
+
DataFrameDropLevel, "droplevel", skip_none=True, kw_keys=["level", "axis"]
|
|
69
|
+
)
|
|
70
|
+
IndexGetLevelValuesAdapter = build_method_call_adapter(
|
|
71
|
+
IndexGetLevelValues, "get_level_values", "level"
|
|
72
|
+
)
|
|
55
73
|
DataFrameInsertAdapter = build_method_call_adapter(
|
|
56
74
|
DataFrameInsert, "insert", kw_keys=["loc", "column", "value"], allow_duplicates=None
|
|
57
75
|
)
|
|
@@ -134,10 +152,12 @@ class DataFrameSetitemAdapter(SPEOperatorAdapter):
|
|
|
134
152
|
]
|
|
135
153
|
|
|
136
154
|
|
|
137
|
-
@register_op_adapter([SeriesIlocGetItem,
|
|
155
|
+
@register_op_adapter([DataFrameIlocGetItem, SeriesIlocGetItem, IndexIlocGetItem])
|
|
138
156
|
class DataFrameIlocGetItemAdapter(SPEOperatorAdapter):
|
|
139
157
|
def generate_code(
|
|
140
|
-
self,
|
|
158
|
+
self,
|
|
159
|
+
op: Union[DataFrameIlocGetItem, SeriesIlocGetItem, IndexIlocGetItem],
|
|
160
|
+
context: SPECodeContext,
|
|
141
161
|
) -> List[str]:
|
|
142
162
|
input_var = context.get_input_tileable_variable(op.inputs[0])
|
|
143
163
|
output_var = context.get_output_tileable_variable(op.outputs[0])
|
|
@@ -148,6 +168,62 @@ class DataFrameIlocGetItemAdapter(SPEOperatorAdapter):
|
|
|
148
168
|
return [f"{output_var} = {input_var}.iloc[{row_exp}{col_exp}]"]
|
|
149
169
|
|
|
150
170
|
|
|
171
|
+
@register_op_adapter([DataFrameIlocSetItem, SeriesIlocSetItem])
|
|
172
|
+
class DataFrameIlocSetItemAdapter(SPEOperatorAdapter):
|
|
173
|
+
def generate_code(
|
|
174
|
+
self,
|
|
175
|
+
op: Union[DataFrameIlocSetItem, SeriesIlocSetItem],
|
|
176
|
+
context: SPECodeContext,
|
|
177
|
+
) -> List[str]:
|
|
178
|
+
input_var = context.get_input_tileable_variable(op.inputs[0])
|
|
179
|
+
output_var = context.get_output_tileable_variable(op.outputs[0])
|
|
180
|
+
value_exp = self.translate_var(context, op.value)
|
|
181
|
+
row_exp = self.translate_var(context, op.indexes[0])
|
|
182
|
+
col_exp = ""
|
|
183
|
+
if len(op.indexes) > 1:
|
|
184
|
+
col_exp = f", {self.translate_var(context, op.indexes[1])}"
|
|
185
|
+
return [
|
|
186
|
+
f"{output_var} = {input_var}.copy()",
|
|
187
|
+
f"{output_var}.iloc[{row_exp}{col_exp}] = {value_exp}",
|
|
188
|
+
]
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@register_op_adapter(DataFrameLocGetItem)
|
|
192
|
+
class DataFrameLocGetItemAdapter(SPEOperatorAdapter):
|
|
193
|
+
def generate_code(
|
|
194
|
+
self,
|
|
195
|
+
op: DataFrameLocGetItem,
|
|
196
|
+
context: SPECodeContext,
|
|
197
|
+
) -> List[str]:
|
|
198
|
+
input_var = context.get_input_tileable_variable(op.inputs[0])
|
|
199
|
+
output_var = context.get_output_tileable_variable(op.outputs[0])
|
|
200
|
+
row_exp = self.translate_var(context, op.indexes[0])
|
|
201
|
+
col_exp = ""
|
|
202
|
+
if len(op.indexes) > 1:
|
|
203
|
+
col_exp = f", {self.translate_var(context, op.indexes[1])}"
|
|
204
|
+
return [f"{output_var} = {input_var}.loc[{row_exp}{col_exp}]"]
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@register_op_adapter(DataFrameLocSetItem)
|
|
208
|
+
class DataFrameLocSetItemAdapter(SPEOperatorAdapter):
|
|
209
|
+
def generate_code(
|
|
210
|
+
self,
|
|
211
|
+
op: DataFrameLocSetItem,
|
|
212
|
+
context: SPECodeContext,
|
|
213
|
+
) -> List[str]:
|
|
214
|
+
input_var = context.get_input_tileable_variable(op.inputs[0])
|
|
215
|
+
output_var = context.get_output_tileable_variable(op.outputs[0])
|
|
216
|
+
value_exp = self.translate_var(context, op.value)
|
|
217
|
+
row_exp = self.translate_var(context, op.indexes[0])
|
|
218
|
+
col_exp = ""
|
|
219
|
+
if len(op.indexes) > 1:
|
|
220
|
+
col_exp = f", {self.translate_var(context, op.indexes[1])}"
|
|
221
|
+
return [
|
|
222
|
+
f"{output_var} = {input_var}.copy()",
|
|
223
|
+
f"{output_var}.loc[{row_exp}{col_exp}] = {value_exp}",
|
|
224
|
+
]
|
|
225
|
+
|
|
226
|
+
|
|
151
227
|
@register_op_adapter(DataFrameSample)
|
|
152
228
|
class DataFrameSampleAdapter(SPEOperatorAdapter):
|
|
153
229
|
def generate_code(self, op: DataFrameSample, context: SPECodeContext) -> List[str]:
|
|
@@ -236,3 +312,22 @@ DataFrameReindexAdapter = build_method_call_adapter(
|
|
|
236
312
|
"limit",
|
|
237
313
|
],
|
|
238
314
|
)
|
|
315
|
+
|
|
316
|
+
DataFrameFilterAdapter = build_method_call_adapter(
|
|
317
|
+
DataFrameFilter,
|
|
318
|
+
"filter",
|
|
319
|
+
skip_none=True,
|
|
320
|
+
kw_keys=["items", "like", "regex", "axis"],
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
DataFrameReorderLevelsAdapter = build_method_call_adapter(
|
|
325
|
+
DataFrameReorderLevels, "reorder_levels", kw_keys=["order", "axis"]
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
DataFrameRenameAxisAdapter = build_method_call_adapter(
|
|
329
|
+
DataFrameRenameAxis,
|
|
330
|
+
"rename_axis",
|
|
331
|
+
skip_none=True,
|
|
332
|
+
kw_keys=["mapper", "index", "columns", "axis", "copy", "level", "inplace"],
|
|
333
|
+
)
|
|
@@ -14,8 +14,20 @@
|
|
|
14
14
|
|
|
15
15
|
from typing import List
|
|
16
16
|
|
|
17
|
-
from ....dataframe.merge import
|
|
17
|
+
from ....dataframe.merge import (
|
|
18
|
+
DataFrameCompare,
|
|
19
|
+
DataFrameConcat,
|
|
20
|
+
DataFrameMerge,
|
|
21
|
+
DataFrameUpdate,
|
|
22
|
+
)
|
|
18
23
|
from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
|
|
24
|
+
from ..utils import build_method_call_adapter
|
|
25
|
+
|
|
26
|
+
DataFrameCompareAdapter = build_method_call_adapter(
|
|
27
|
+
DataFrameCompare,
|
|
28
|
+
"compare",
|
|
29
|
+
kw_keys=["align_axis", "keep_shape", "keep_equal", "result_names"],
|
|
30
|
+
)
|
|
19
31
|
|
|
20
32
|
|
|
21
33
|
@register_op_adapter(DataFrameMerge)
|
|
@@ -71,3 +83,24 @@ class DataFrameConcatAdapter(SPEOperatorAdapter):
|
|
|
71
83
|
)
|
|
72
84
|
context.register_import("pandas", "pd")
|
|
73
85
|
return [f"{res_var_name} = pd.concat({args})"]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@register_op_adapter(DataFrameUpdate)
|
|
89
|
+
class DataFrameUpdateAdapter(SPEOperatorAdapter):
|
|
90
|
+
def generate_code(self, op: DataFrameUpdate, context: SPECodeContext) -> List[str]:
|
|
91
|
+
input_var = context.get_input_tileable_variable(op.inputs[0])
|
|
92
|
+
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
93
|
+
context.register_import("pandas", "pd")
|
|
94
|
+
if op.join == "outer":
|
|
95
|
+
method = "combine_first"
|
|
96
|
+
args = self.generate_call_args_with_attributes(op, context, 1)
|
|
97
|
+
return [f"{res_var_name} = {input_var}.{method}({args})"]
|
|
98
|
+
else:
|
|
99
|
+
method = "update"
|
|
100
|
+
args = self.generate_call_args_with_attributes(
|
|
101
|
+
op, context, 1, kw_keys=["join", "overwrite", "filter_func", "errors"]
|
|
102
|
+
)
|
|
103
|
+
return [
|
|
104
|
+
f"{res_var_name} = {input_var}.copy()",
|
|
105
|
+
f"{res_var_name}.{method}({args})",
|
|
106
|
+
]
|
|
@@ -19,6 +19,7 @@ from ....dataframe.misc.apply import DataFrameApply
|
|
|
19
19
|
from ....dataframe.misc.astype import DataFrameAstype
|
|
20
20
|
from ....dataframe.misc.case_when import DataFrameCaseWhen
|
|
21
21
|
from ....dataframe.misc.check_monotonic import DataFrameCheckMonotonic
|
|
22
|
+
from ....dataframe.misc.clip import DataFrameClip
|
|
22
23
|
from ....dataframe.misc.cut import DataFrameCut
|
|
23
24
|
from ....dataframe.misc.describe import DataFrameDescribe
|
|
24
25
|
from ....dataframe.misc.diff import DataFrameDiff
|
|
@@ -30,14 +31,10 @@ from ....dataframe.misc.explode import DataFrameExplode
|
|
|
30
31
|
from ....dataframe.misc.get_dummies import DataFrameGetDummies
|
|
31
32
|
from ....dataframe.misc.isin import DataFrameIsin
|
|
32
33
|
from ....dataframe.misc.map import DataFrameMap
|
|
33
|
-
from ....dataframe.misc.melt import DataFrameMelt
|
|
34
34
|
from ....dataframe.misc.memory_usage import DataFrameMemoryUsage
|
|
35
|
-
from ....dataframe.misc.pivot import DataFramePivot
|
|
36
|
-
from ....dataframe.misc.pivot_table import DataFramePivotTable
|
|
37
35
|
from ....dataframe.misc.shift import DataFrameShift
|
|
38
|
-
from ....dataframe.misc.stack import DataFrameStack
|
|
39
36
|
from ....dataframe.misc.to_numeric import DataFrameToNumeric
|
|
40
|
-
from ....dataframe.misc.transform import
|
|
37
|
+
from ....dataframe.misc.transform import DataFrameTransform
|
|
41
38
|
from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
|
|
42
39
|
from ..utils import build_method_call_adapter
|
|
43
40
|
|
|
@@ -60,6 +57,11 @@ class DataFrameCheckMonotonicAdapter(SPEOperatorAdapter):
|
|
|
60
57
|
return [f"{res_var_name} = {inst_var_name}.{prop}"]
|
|
61
58
|
|
|
62
59
|
|
|
60
|
+
DataFrameClipAdapter = build_method_call_adapter(
|
|
61
|
+
DataFrameClip, "clip", skip_none=True, kw_keys=["lower", "upper", "axis"]
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
63
65
|
@register_op_adapter(DataFrameCut)
|
|
64
66
|
class DataFrameCutAdapter(SPEOperatorAdapter):
|
|
65
67
|
def generate_code(self, op: DataFrameCut, context: SPECodeContext) -> List[str]:
|
|
@@ -108,11 +110,6 @@ class DataFrameEvalAdapter(SPEOperatorAdapter):
|
|
|
108
110
|
DataFrameExplodeAdapter = build_method_call_adapter(
|
|
109
111
|
DataFrameExplode, "explode", "column", ignore_index=None
|
|
110
112
|
)
|
|
111
|
-
DataFrameMeltAdapter = build_method_call_adapter(
|
|
112
|
-
DataFrameMelt,
|
|
113
|
-
"melt",
|
|
114
|
-
kw_keys=["id_vars", "value_vars", "var_name", "value_name", "col_level"],
|
|
115
|
-
)
|
|
116
113
|
DataFrameMemoryUsageAdapter = build_method_call_adapter(
|
|
117
114
|
DataFrameMemoryUsage, "memory_usage", kw_keys=["index", "deep"]
|
|
118
115
|
)
|
|
@@ -133,27 +130,6 @@ DataFrameMapAdapter = build_method_call_adapter(
|
|
|
133
130
|
DataFrameShiftAdapter = build_method_call_adapter(
|
|
134
131
|
DataFrameShift, "shift", kw_keys=["periods", "freq", "axis", "fill_value"]
|
|
135
132
|
)
|
|
136
|
-
DataFrameStackAdapter = build_method_call_adapter(
|
|
137
|
-
DataFrameStack, "stack", kw_keys=["level", "dropna"]
|
|
138
|
-
)
|
|
139
|
-
DataFramePivotAdapter = build_method_call_adapter(
|
|
140
|
-
DataFramePivot, "pivot", kw_keys=["columns", "index", "values"]
|
|
141
|
-
)
|
|
142
|
-
DataFramePivotTableAdapter = build_method_call_adapter(
|
|
143
|
-
DataFramePivotTable,
|
|
144
|
-
"pivot_table",
|
|
145
|
-
kw_keys=[
|
|
146
|
-
"values",
|
|
147
|
-
"index",
|
|
148
|
-
"columns",
|
|
149
|
-
"aggfunc",
|
|
150
|
-
"fill_value",
|
|
151
|
-
"margins",
|
|
152
|
-
"dropna",
|
|
153
|
-
"margins_name",
|
|
154
|
-
"sort",
|
|
155
|
-
],
|
|
156
|
-
)
|
|
157
133
|
|
|
158
134
|
|
|
159
135
|
@register_op_adapter(DataFrameToNumeric)
|
|
@@ -171,10 +147,10 @@ class DataFrameToNumericAdapter(SPEOperatorAdapter):
|
|
|
171
147
|
return [f"{res_var_name} = pd.to_numeric({args})"]
|
|
172
148
|
|
|
173
149
|
|
|
174
|
-
@register_op_adapter(
|
|
150
|
+
@register_op_adapter(DataFrameTransform)
|
|
175
151
|
class TransformOperatorAdapter(SPEOperatorAdapter):
|
|
176
152
|
def generate_code(
|
|
177
|
-
self, op:
|
|
153
|
+
self, op: DataFrameTransform, context: SPECodeContext
|
|
178
154
|
) -> List[str]:
|
|
179
155
|
input_var = context.get_input_tileable_variable(op.inputs[0])
|
|
180
156
|
output_var = context.get_output_tileable_variable(op.outputs[0])
|
|
@@ -18,7 +18,11 @@ from ....dataframe.reduction import (
|
|
|
18
18
|
DataFrameAggregate,
|
|
19
19
|
DataFrameAll,
|
|
20
20
|
DataFrameAny,
|
|
21
|
+
DataFrameArgMax,
|
|
22
|
+
DataFrameArgMin,
|
|
21
23
|
DataFrameCount,
|
|
24
|
+
DataFrameIdxMax,
|
|
25
|
+
DataFrameIdxMin,
|
|
22
26
|
DataFrameKurtosis,
|
|
23
27
|
DataFrameMax,
|
|
24
28
|
DataFrameMean,
|
|
@@ -32,21 +36,18 @@ from ....dataframe.reduction import (
|
|
|
32
36
|
DataFrameUnique,
|
|
33
37
|
DataFrameVar,
|
|
34
38
|
)
|
|
35
|
-
from ....dataframe.reduction.core import
|
|
36
|
-
DataFrameCumReductionOperator,
|
|
37
|
-
DataFrameReductionOperator,
|
|
38
|
-
)
|
|
39
|
+
from ....dataframe.reduction.core import DataFrameCumReduction, DataFrameReduction
|
|
39
40
|
from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
|
|
40
41
|
|
|
41
42
|
|
|
42
|
-
@register_op_adapter(
|
|
43
|
+
@register_op_adapter(DataFrameCumReduction)
|
|
43
44
|
class DataFrameCumsumAdapter(SPEOperatorAdapter):
|
|
44
45
|
"""
|
|
45
46
|
TODO: Refine this in window functions
|
|
46
47
|
"""
|
|
47
48
|
|
|
48
49
|
def generate_code(
|
|
49
|
-
self, op:
|
|
50
|
+
self, op: DataFrameCumReduction, context: SPECodeContext
|
|
50
51
|
) -> List[str]:
|
|
51
52
|
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
52
53
|
args = []
|
|
@@ -78,7 +79,11 @@ class DataFrameAggregateAdapter(SPEOperatorAdapter):
|
|
|
78
79
|
[
|
|
79
80
|
DataFrameAll,
|
|
80
81
|
DataFrameAny,
|
|
82
|
+
DataFrameArgMax,
|
|
83
|
+
DataFrameArgMin,
|
|
81
84
|
DataFrameCount,
|
|
85
|
+
DataFrameIdxMax,
|
|
86
|
+
DataFrameIdxMin,
|
|
82
87
|
DataFrameMax,
|
|
83
88
|
DataFrameMean,
|
|
84
89
|
DataFrameMedian,
|
|
@@ -90,13 +95,13 @@ class DataFrameAggregateAdapter(SPEOperatorAdapter):
|
|
|
90
95
|
class DataFrameReductionAdapter(SPEOperatorAdapter):
|
|
91
96
|
_common_args = ["axis", "skipna", "numeric_only", "bool_only", "level", "min_count"]
|
|
92
97
|
|
|
93
|
-
def extra_args(self, op:
|
|
98
|
+
def extra_args(self, op: DataFrameReduction) -> Dict[str, Any]:
|
|
94
99
|
"""
|
|
95
100
|
Get the extra arguments of the API call.
|
|
96
101
|
|
|
97
102
|
Parameters
|
|
98
103
|
----------
|
|
99
|
-
op :
|
|
104
|
+
op : DataFrameReduction
|
|
100
105
|
The DataFrameReductionOperator instance.
|
|
101
106
|
|
|
102
107
|
Returns
|
|
@@ -107,7 +112,7 @@ class DataFrameReductionAdapter(SPEOperatorAdapter):
|
|
|
107
112
|
return dict()
|
|
108
113
|
|
|
109
114
|
def generate_code(
|
|
110
|
-
self, op:
|
|
115
|
+
self, op: DataFrameReduction, context: SPECodeContext
|
|
111
116
|
) -> List[str]:
|
|
112
117
|
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
113
118
|
kwargs = dict()
|
|
@@ -0,0 +1,46 @@
|
|
|
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 ....dataframe.reshape.melt import DataFrameMelt
|
|
16
|
+
from ....dataframe.reshape.pivot import DataFramePivot
|
|
17
|
+
from ....dataframe.reshape.pivot_table import DataFramePivotTable
|
|
18
|
+
from ....dataframe.reshape.stack import DataFrameStack
|
|
19
|
+
from ..utils import build_method_call_adapter
|
|
20
|
+
|
|
21
|
+
DataFrameMeltAdapter = build_method_call_adapter(
|
|
22
|
+
DataFrameMelt,
|
|
23
|
+
"melt",
|
|
24
|
+
kw_keys=["id_vars", "value_vars", "var_name", "value_name", "col_level"],
|
|
25
|
+
)
|
|
26
|
+
DataFrameStackAdapter = build_method_call_adapter(
|
|
27
|
+
DataFrameStack, "stack", kw_keys=["level", "dropna"]
|
|
28
|
+
)
|
|
29
|
+
DataFramePivotAdapter = build_method_call_adapter(
|
|
30
|
+
DataFramePivot, "pivot", kw_keys=["columns", "index", "values"]
|
|
31
|
+
)
|
|
32
|
+
DataFramePivotTableAdapter = build_method_call_adapter(
|
|
33
|
+
DataFramePivotTable,
|
|
34
|
+
"pivot_table",
|
|
35
|
+
kw_keys=[
|
|
36
|
+
"values",
|
|
37
|
+
"index",
|
|
38
|
+
"columns",
|
|
39
|
+
"aggfunc",
|
|
40
|
+
"fill_value",
|
|
41
|
+
"margins",
|
|
42
|
+
"dropna",
|
|
43
|
+
"margins_name",
|
|
44
|
+
"sort",
|
|
45
|
+
],
|
|
46
|
+
)
|
|
@@ -26,17 +26,27 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
|
|
|
26
26
|
self, op: DataFrameSortOperator, context: SPECodeContext
|
|
27
27
|
) -> List[str]:
|
|
28
28
|
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
if op.keep_kind == "head" or not op.nrows:
|
|
30
|
+
args = []
|
|
31
|
+
kwargs = {
|
|
32
|
+
"axis": op.axis,
|
|
33
|
+
"ascending": op.ascending,
|
|
34
|
+
"inplace": op.inplace,
|
|
35
|
+
"na_position": op.na_position,
|
|
36
|
+
"ignore_index": op.ignore_index,
|
|
37
|
+
}
|
|
38
|
+
else:
|
|
39
|
+
args = [op.nrows]
|
|
40
|
+
kwargs = {"keep": op.keep_kind}
|
|
36
41
|
kwargs.update(self.extra_args(op, context))
|
|
37
|
-
args_str = ", ".join(self._translate_call_args(context, **kwargs))
|
|
42
|
+
args_str = ", ".join(self._translate_call_args(context, *args, **kwargs))
|
|
38
43
|
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
39
|
-
|
|
44
|
+
ret = [
|
|
45
|
+
f"{res_var_name} = {input_var_name}.{self.get_method_name(op)}({args_str})"
|
|
46
|
+
]
|
|
47
|
+
if op.keep_kind == "head" and op.nrows:
|
|
48
|
+
ret.append(f"{res_var_name} = {res_var_name}.head({op.nrows})")
|
|
49
|
+
return ret
|
|
40
50
|
|
|
41
51
|
@abstractmethod
|
|
42
52
|
def extra_args(
|
|
@@ -44,9 +54,8 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
|
|
|
44
54
|
) -> Dict[str, Any]:
|
|
45
55
|
raise NotImplementedError
|
|
46
56
|
|
|
47
|
-
@property
|
|
48
57
|
@abstractmethod
|
|
49
|
-
def
|
|
58
|
+
def get_method_name(self, op: DataFrameSortOperator) -> str:
|
|
50
59
|
raise NotImplementedError
|
|
51
60
|
|
|
52
61
|
|
|
@@ -54,8 +63,7 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
|
|
|
54
63
|
class DataFrameSortIndexAdapter(_DataFrameSortAdapter):
|
|
55
64
|
_method_name = "sort_index"
|
|
56
65
|
|
|
57
|
-
|
|
58
|
-
def method_name(self) -> str:
|
|
66
|
+
def get_method_name(self, op: DataFrameSortIndex) -> str:
|
|
59
67
|
return self._method_name
|
|
60
68
|
|
|
61
69
|
def extra_args(
|
|
@@ -71,13 +79,18 @@ class DataFrameSortIndexAdapter(_DataFrameSortAdapter):
|
|
|
71
79
|
class DataFrameSortValuesAdapter(_DataFrameSortAdapter):
|
|
72
80
|
_method_name = "sort_values"
|
|
73
81
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
82
|
+
def get_method_name(self, op: DataFrameSortValues) -> str:
|
|
83
|
+
if op.keep_kind == "head" or not op.nrows:
|
|
84
|
+
return self._method_name
|
|
85
|
+
else:
|
|
86
|
+
return "nsmallest" if op.ascending else "nlargest"
|
|
77
87
|
|
|
78
88
|
def extra_args(
|
|
79
89
|
self, op: DataFrameSortValues, context: SPECodeContext
|
|
80
90
|
) -> Dict[str, Any]:
|
|
81
91
|
if isinstance(op.outputs[0], DATAFRAME_TYPE):
|
|
82
|
-
|
|
92
|
+
if op.keep_kind == "head" or not op.nrows:
|
|
93
|
+
return {"by": op.by}
|
|
94
|
+
else:
|
|
95
|
+
return {"columns": op.by}
|
|
83
96
|
return {}
|
|
@@ -21,13 +21,7 @@ from ...... import dataframe as md
|
|
|
21
21
|
from ......lib.dtypes_extension import dict_
|
|
22
22
|
from ......utils import ARROW_DTYPE_NOT_SUPPORTED
|
|
23
23
|
from ....core import SPECodeContext
|
|
24
|
-
from ...accessors.dict_ import
|
|
25
|
-
SeriesDictContainsOperatorAdapter,
|
|
26
|
-
SeriesDictGetItemOperatorAdapter,
|
|
27
|
-
SeriesDictLengthOperatorAdapter,
|
|
28
|
-
SeriesDictRemoveOperatorAdapter,
|
|
29
|
-
SeriesDictSetItemOperatorAdapter,
|
|
30
|
-
)
|
|
24
|
+
from ...accessors.dict_ import SeriesDictMethodAdapter
|
|
31
25
|
|
|
32
26
|
pytestmark = pytest.mark.skipif(
|
|
33
27
|
ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
|
|
@@ -66,7 +60,7 @@ def md_df_1(pd_df_1):
|
|
|
66
60
|
def test_getitem(md_df_1, pd_df_1):
|
|
67
61
|
s1 = md_df_1["A"].dict["k1"]
|
|
68
62
|
context = SPECodeContext()
|
|
69
|
-
adapter =
|
|
63
|
+
adapter = SeriesDictMethodAdapter()
|
|
70
64
|
results = adapter.generate_code(s1.op, context)
|
|
71
65
|
|
|
72
66
|
expected_results = [
|
|
@@ -102,7 +96,7 @@ var_1.name = 'k1'
|
|
|
102
96
|
def test_getitem_with_default_value(md_df_1, pd_df_1):
|
|
103
97
|
s1 = md_df_1["A"].dict.get("k2", 9)
|
|
104
98
|
context = SPECodeContext()
|
|
105
|
-
adapter =
|
|
99
|
+
adapter = SeriesDictMethodAdapter()
|
|
106
100
|
results = adapter.generate_code(s1.op, context)
|
|
107
101
|
|
|
108
102
|
expected_results = [
|
|
@@ -137,7 +131,7 @@ var_1.name = 'k2'
|
|
|
137
131
|
def test_getitem_with_key_error(md_df_1, pd_df_1):
|
|
138
132
|
s1 = md_df_1["A"].dict["k2"]
|
|
139
133
|
context = SPECodeContext()
|
|
140
|
-
adapter =
|
|
134
|
+
adapter = SeriesDictMethodAdapter()
|
|
141
135
|
results = adapter.generate_code(s1.op, context)
|
|
142
136
|
|
|
143
137
|
expected_results = [
|
|
@@ -167,7 +161,7 @@ def test_setitem(md_df_1, pd_df_1):
|
|
|
167
161
|
s1 = md_df_1["A"]
|
|
168
162
|
s1.dict["k2"] = 9
|
|
169
163
|
context = SPECodeContext()
|
|
170
|
-
adapter =
|
|
164
|
+
adapter = SeriesDictMethodAdapter()
|
|
171
165
|
results = adapter.generate_code(s1.op, context)
|
|
172
166
|
|
|
173
167
|
expected_results = [
|
|
@@ -207,7 +201,7 @@ var_1 = var_0.map(_inner_set, na_action="ignore").astype(const_0)
|
|
|
207
201
|
def test_length(md_df_1, pd_df_1):
|
|
208
202
|
s1 = md_df_1["A"].dict.len()
|
|
209
203
|
context = SPECodeContext()
|
|
210
|
-
adapter =
|
|
204
|
+
adapter = SeriesDictMethodAdapter()
|
|
211
205
|
results = adapter.generate_code(s1.op, context)
|
|
212
206
|
|
|
213
207
|
expected_results = [
|
|
@@ -227,7 +221,7 @@ var_1.name = None
|
|
|
227
221
|
def test_remove_with_ignore_key_error(md_df_1, pd_df_1):
|
|
228
222
|
s1 = md_df_1["A"].dict.remove("k2", ignore_key_error=True)
|
|
229
223
|
context = SPECodeContext()
|
|
230
|
-
adapter =
|
|
224
|
+
adapter = SeriesDictMethodAdapter()
|
|
231
225
|
results = adapter.generate_code(s1.op, context)
|
|
232
226
|
|
|
233
227
|
expected_results = [
|
|
@@ -262,7 +256,7 @@ var_1 = var_0.map(_inner_remove, na_action="ignore").astype(const_0)
|
|
|
262
256
|
def test_remove_with_key_error(md_df_1, pd_df_1):
|
|
263
257
|
s1 = md_df_1["A"].dict.remove("k2", ignore_key_error=False)
|
|
264
258
|
context = SPECodeContext()
|
|
265
|
-
adapter =
|
|
259
|
+
adapter = SeriesDictMethodAdapter()
|
|
266
260
|
results = adapter.generate_code(s1.op, context)
|
|
267
261
|
|
|
268
262
|
expected_results = [
|
|
@@ -290,7 +284,7 @@ var_1 = var_0.map(_inner_remove, na_action="ignore").astype(const_0)
|
|
|
290
284
|
def test_contains(md_df_1, pd_df_1):
|
|
291
285
|
s1 = md_df_1["A"].dict.contains("k2")
|
|
292
286
|
context = SPECodeContext()
|
|
293
|
-
adapter =
|
|
287
|
+
adapter = SeriesDictMethodAdapter()
|
|
294
288
|
results = adapter.generate_code(s1.op, context)
|
|
295
289
|
|
|
296
290
|
expected_results = [
|
|
@@ -21,10 +21,7 @@ from ...... import dataframe as md
|
|
|
21
21
|
from ......lib.dtypes_extension import list_
|
|
22
22
|
from ......utils import ARROW_DTYPE_NOT_SUPPORTED
|
|
23
23
|
from ....core import SPECodeContext
|
|
24
|
-
from ...accessors.list_ import
|
|
25
|
-
SeriesListGetItemOperatorAdapter,
|
|
26
|
-
SeriesListLengthOperatorAdapter,
|
|
27
|
-
)
|
|
24
|
+
from ...accessors.list_ import SeriesListMethodAdapter
|
|
28
25
|
|
|
29
26
|
pytestmark = pytest.mark.skipif(
|
|
30
27
|
ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
|
|
@@ -63,7 +60,7 @@ def md_df_1(pd_df_1):
|
|
|
63
60
|
def test_getitem(md_df_1, pd_df_1):
|
|
64
61
|
s1 = md_df_1["A"].list.get(0)
|
|
65
62
|
context = SPECodeContext()
|
|
66
|
-
adapter =
|
|
63
|
+
adapter = SeriesListMethodAdapter()
|
|
67
64
|
results = adapter.generate_code(s1.op, context)
|
|
68
65
|
|
|
69
66
|
expected_results = [
|
|
@@ -94,7 +91,7 @@ var_1.name = None
|
|
|
94
91
|
def test_getitem_with_index_error(md_df_1, pd_df_1):
|
|
95
92
|
s1 = md_df_1["A"].list[3]
|
|
96
93
|
context = SPECodeContext()
|
|
97
|
-
adapter =
|
|
94
|
+
adapter = SeriesListMethodAdapter()
|
|
98
95
|
results = adapter.generate_code(s1.op, context)
|
|
99
96
|
|
|
100
97
|
expected_results = [
|
|
@@ -120,7 +117,7 @@ var_1.name = None
|
|
|
120
117
|
def test_length(md_df_1, pd_df_1):
|
|
121
118
|
s1 = md_df_1["A"].list.len()
|
|
122
119
|
context = SPECodeContext()
|
|
123
|
-
adapter =
|
|
120
|
+
adapter = SeriesListMethodAdapter()
|
|
124
121
|
results = adapter.generate_code(s1.op, context)
|
|
125
122
|
|
|
126
123
|
expected_results = [
|
|
@@ -0,0 +1,75 @@
|
|
|
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 SPECodeContext
|
|
22
|
+
from ...accessors.struct_ import SeriesStructMethodAdapter
|
|
23
|
+
|
|
24
|
+
pytestmark = pytest.mark.skipif(
|
|
25
|
+
ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _run_generated_code(
|
|
30
|
+
code: str, ctx: SPECodeContext, input_val: pd.DataFrame
|
|
31
|
+
) -> dict:
|
|
32
|
+
local_vars = ctx.constants.copy()
|
|
33
|
+
local_vars["var_0"] = input_val
|
|
34
|
+
import_code = "import pandas as pd\nimport numpy as np\n"
|
|
35
|
+
exec(import_code + code, local_vars, local_vars)
|
|
36
|
+
return local_vars
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.fixture
|
|
40
|
+
def series():
|
|
41
|
+
version_type = pa.struct(
|
|
42
|
+
[
|
|
43
|
+
("major", pa.int64()),
|
|
44
|
+
("minor", pa.int64()),
|
|
45
|
+
]
|
|
46
|
+
)
|
|
47
|
+
return md.Series(
|
|
48
|
+
[
|
|
49
|
+
{"version": {"major": 1, "minor": 5}, "project": "pandas"},
|
|
50
|
+
{"version": {"major": 2, "minor": 1}, "project": "pandas"},
|
|
51
|
+
{"version": {"major": 1, "minor": 26}, "project": "numpy"},
|
|
52
|
+
],
|
|
53
|
+
dtype=pd.ArrowDtype(
|
|
54
|
+
pa.struct([("version", version_type), ("project", pa.string())])
|
|
55
|
+
),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_field(series):
|
|
60
|
+
s1 = series.struct.field(["version", "minor"])
|
|
61
|
+
context = SPECodeContext()
|
|
62
|
+
adapter = SeriesStructMethodAdapter()
|
|
63
|
+
results = adapter.generate_code(s1.op, context)
|
|
64
|
+
|
|
65
|
+
expected_results = [
|
|
66
|
+
"""
|
|
67
|
+
var_1 = var_0.struct.field(['version', 'minor'])
|
|
68
|
+
"""
|
|
69
|
+
]
|
|
70
|
+
assert results == expected_results
|
|
71
|
+
local_vars = _run_generated_code(results[0], context, series.op.data)
|
|
72
|
+
expected_series = pd.Series(
|
|
73
|
+
[5, 1, 26], dtype=pd.ArrowDtype(pa.int64()), name="minor"
|
|
74
|
+
)
|
|
75
|
+
pd.testing.assert_series_equal(expected_series, local_vars["var_1"])
|