maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-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.cp37-win32.pyd +0 -0
- maxframe/_utils.pyx +14 -1
- maxframe/codegen/core.py +9 -8
- 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 +38 -1
- maxframe/codegen/spe/dataframe/misc.py +11 -33
- maxframe/codegen/spe/dataframe/reduction.py +32 -9
- maxframe/codegen/spe/dataframe/reshape.py +46 -0
- maxframe/codegen/spe/dataframe/sort.py +39 -18
- 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_reduction.py +13 -0
- maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
- maxframe/codegen/spe/dataframe/tseries.py +9 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
- 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/datasource.py +1 -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 +73 -9
- maxframe/config/tests/test_validators.py +13 -1
- maxframe/config/validators.py +49 -0
- maxframe/conftest.py +54 -17
- maxframe/core/accessor.py +2 -2
- maxframe/core/base.py +2 -1
- maxframe/core/entity/core.py +5 -0
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/graph/core.cp37-win32.pyd +0 -0
- maxframe/core/graph/entity.py +8 -3
- maxframe/core/mode.py +6 -1
- 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 +12 -5
- 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 +18 -4
- maxframe/dataframe/arithmetic/between.py +106 -0
- maxframe/dataframe/arithmetic/dot.py +237 -0
- maxframe/dataframe/arithmetic/maximum.py +33 -0
- maxframe/dataframe/arithmetic/minimum.py +33 -0
- maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
- maxframe/dataframe/core.py +161 -224
- maxframe/dataframe/datasource/__init__.py +18 -0
- maxframe/dataframe/datasource/core.py +6 -0
- maxframe/dataframe/datasource/direct.py +57 -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 +21 -14
- maxframe/dataframe/datasource/read_odps_query.py +29 -6
- maxframe/dataframe/datasource/read_odps_table.py +32 -10
- maxframe/dataframe/datasource/read_parquet.py +38 -39
- maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
- maxframe/dataframe/datastore/__init__.py +11 -1
- maxframe/dataframe/datastore/direct.py +268 -0
- maxframe/dataframe/datastore/to_csv.py +29 -41
- maxframe/dataframe/datastore/to_odps.py +36 -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/flatjson.py +2 -1
- 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 +17 -2
- maxframe/dataframe/groupby/aggregation.py +86 -49
- maxframe/dataframe/groupby/apply.py +1 -1
- maxframe/dataframe/groupby/apply_chunk.py +19 -5
- maxframe/dataframe/groupby/core.py +116 -16
- 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 +22 -2
- 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 +46 -18
- 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 +15 -1
- maxframe/dataframe/merge/append.py +97 -98
- maxframe/dataframe/merge/combine.py +244 -0
- 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 +28 -11
- maxframe/dataframe/misc/_duplicate.py +10 -4
- maxframe/dataframe/misc/apply.py +1 -1
- maxframe/dataframe/misc/check_unique.py +82 -0
- maxframe/dataframe/misc/clip.py +145 -0
- maxframe/dataframe/misc/describe.py +175 -9
- maxframe/dataframe/misc/drop.py +31 -0
- 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/infer_dtypes.py +251 -0
- maxframe/dataframe/misc/isin.py +2 -2
- maxframe/dataframe/misc/map.py +125 -18
- maxframe/dataframe/misc/repeat.py +159 -0
- maxframe/dataframe/misc/tests/test_misc.py +48 -3
- 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 +14 -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 +35 -16
- maxframe/dataframe/reduction/aggregation.py +43 -14
- maxframe/dataframe/reduction/all.py +2 -2
- maxframe/dataframe/reduction/any.py +2 -2
- maxframe/dataframe/reduction/argmax.py +103 -0
- maxframe/dataframe/reduction/argmin.py +103 -0
- maxframe/dataframe/reduction/core.py +80 -24
- 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/mode.py +144 -0
- maxframe/dataframe/reduction/nunique.py +19 -11
- 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/tests/test_reduction.py +12 -0
- 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 +16 -1
- maxframe/dataframe/sort/argsort.py +68 -0
- maxframe/dataframe/sort/core.py +2 -1
- maxframe/dataframe/sort/nlargest.py +238 -0
- maxframe/dataframe/sort/nsmallest.py +228 -0
- maxframe/dataframe/sort/rank.py +147 -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/tseries/__init__.py +19 -0
- maxframe/dataframe/tseries/at_time.py +61 -0
- maxframe/dataframe/tseries/between_time.py +122 -0
- maxframe/dataframe/typing_.py +185 -0
- maxframe/dataframe/utils.py +125 -52
- 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 +18 -7
- maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/config.py +221 -0
- maxframe/learn/contrib/llm/deploy/core.py +247 -0
- maxframe/learn/contrib/llm/deploy/framework.py +35 -0
- maxframe/learn/contrib/llm/deploy/loader.py +360 -0
- maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
- maxframe/learn/contrib/llm/models/__init__.py +1 -0
- maxframe/learn/contrib/llm/models/dashscope.py +12 -6
- maxframe/learn/contrib/llm/models/managed.py +76 -11
- maxframe/learn/contrib/llm/models/openai.py +72 -0
- maxframe/learn/contrib/llm/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/tests/test_core.py +34 -0
- maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
- maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
- maxframe/learn/contrib/llm/text.py +348 -42
- maxframe/learn/contrib/models.py +4 -1
- maxframe/learn/contrib/xgboost/classifier.py +2 -0
- maxframe/learn/contrib/xgboost/core.py +113 -4
- maxframe/learn/contrib/xgboost/predict.py +4 -2
- maxframe/learn/contrib/xgboost/regressor.py +5 -0
- maxframe/learn/contrib/xgboost/train.py +7 -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/preprocessing/_data/min_max_scaler.py +34 -23
- maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
- maxframe/learn/utils/__init__.py +2 -1
- maxframe/learn/utils/checks.py +1 -2
- maxframe/learn/utils/core.py +59 -0
- maxframe/learn/utils/extmath.py +79 -9
- maxframe/learn/utils/odpsio.py +262 -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 +124 -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.cp37-win32.pyd +0 -0
- maxframe/lib/wrapped_pickle.py +10 -0
- maxframe/opcodes.py +41 -15
- maxframe/protocol.py +12 -0
- maxframe/remote/core.py +4 -0
- maxframe/serialization/__init__.py +11 -2
- maxframe/serialization/arrow.py +38 -13
- maxframe/serialization/blob.py +32 -0
- maxframe/serialization/core.cp37-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 +31 -4
- maxframe/tensor/__init__.py +38 -8
- maxframe/tensor/arithmetic/__init__.py +19 -10
- maxframe/tensor/arithmetic/core.py +2 -2
- maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
- maxframe/tensor/core.py +6 -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_udf.py +61 -0
- maxframe/tests/test_utils.py +51 -6
- maxframe/tests/utils.py +0 -2
- maxframe/typing_.py +2 -0
- maxframe/udf.py +130 -9
- maxframe/utils.py +254 -27
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
- maxframe_client/fetcher.py +35 -4
- maxframe_client/session/odps.py +7 -2
- maxframe_client/session/task.py +8 -1
- maxframe_client/tests/test_fetcher.py +76 -3
- maxframe_client/tests/test_session.py +28 -1
- maxframe/dataframe/arrays.py +0 -864
- /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
- /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
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 Any, Dict, List, NamedTuple, Optional, Set
|
|
16
|
+
|
|
17
|
+
from odps import ODPS
|
|
18
|
+
|
|
19
|
+
from ... import opcodes
|
|
20
|
+
from ...core import ENTITY_TYPE, EntityData, OutputType
|
|
21
|
+
from ...core.operator import ObjectOperator
|
|
22
|
+
from ...serialization.serializables import (
|
|
23
|
+
AnyField,
|
|
24
|
+
BoolField,
|
|
25
|
+
DictField,
|
|
26
|
+
Int32Field,
|
|
27
|
+
StringField,
|
|
28
|
+
)
|
|
29
|
+
from ...utils import find_objects, replace_objects
|
|
30
|
+
from ..core import LearnOperatorMixin
|
|
31
|
+
|
|
32
|
+
_odps_model_classes: Set["ODPSModelMixin"] = set()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def register_odps_model(model_cls: "ODPSModelMixin"):
|
|
36
|
+
_odps_model_classes.add(model_cls)
|
|
37
|
+
return model_cls
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ReadODPSModel(ObjectOperator, LearnOperatorMixin):
|
|
41
|
+
_op_type_ = opcodes.READ_ODPS_MODEL
|
|
42
|
+
|
|
43
|
+
model_name = StringField("model_name", default=None)
|
|
44
|
+
model_version = StringField("model_version", default=None)
|
|
45
|
+
format = StringField("format", default=None)
|
|
46
|
+
location = StringField("location", default=None)
|
|
47
|
+
storage_options = DictField("storage_options", default=None)
|
|
48
|
+
|
|
49
|
+
def has_custom_code(self) -> bool:
|
|
50
|
+
return True
|
|
51
|
+
|
|
52
|
+
def __call__(self):
|
|
53
|
+
if not self.format.startswith("BOOSTED_TREE_"):
|
|
54
|
+
# todo support more model formats
|
|
55
|
+
raise ValueError("Only support boosted tree format")
|
|
56
|
+
for model_cls in _odps_model_classes:
|
|
57
|
+
ret = model_cls._build_odps_source_model(self)
|
|
58
|
+
if ret is not None:
|
|
59
|
+
return ret
|
|
60
|
+
raise ValueError(f"Model {self.model_name} not supported")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class ToODPSModel(ObjectOperator, LearnOperatorMixin):
|
|
64
|
+
_op_type_ = opcodes.TO_ODPS_MODEL
|
|
65
|
+
|
|
66
|
+
model_name = StringField("model_name", default=None)
|
|
67
|
+
model_version = StringField("model_version", default=None)
|
|
68
|
+
training_info = AnyField("training_info", default=None)
|
|
69
|
+
params = AnyField("params", default=None)
|
|
70
|
+
format = StringField("format", default=None)
|
|
71
|
+
lifecycle = Int32Field("lifecycle", default=None)
|
|
72
|
+
version_lifecycle = Int32Field("version_lifecycle", default=None)
|
|
73
|
+
description = StringField("description", default=None)
|
|
74
|
+
version_description = StringField("version_description", default=None)
|
|
75
|
+
create_model = BoolField("create_model", default=True)
|
|
76
|
+
set_default_version = BoolField("set_default_version", default=True)
|
|
77
|
+
location = StringField("location", default=None)
|
|
78
|
+
storage_options = DictField("storage_options", default=None)
|
|
79
|
+
|
|
80
|
+
def __init__(self, **kw):
|
|
81
|
+
super().__init__(_output_types=[OutputType.object], **kw)
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def _set_inputs(cls, op: "ToODPSModel", inputs: List[EntityData]):
|
|
85
|
+
super()._set_inputs(op, inputs)
|
|
86
|
+
|
|
87
|
+
if isinstance(op.training_info, ENTITY_TYPE):
|
|
88
|
+
has_training_info = True
|
|
89
|
+
op.training_info = inputs[0]
|
|
90
|
+
else:
|
|
91
|
+
has_training_info = False
|
|
92
|
+
|
|
93
|
+
tileables = find_objects([op.params], ENTITY_TYPE)
|
|
94
|
+
param_pos = int(has_training_info)
|
|
95
|
+
replaces = dict(zip(tileables, inputs[param_pos:]))
|
|
96
|
+
[op.params] = replace_objects([op.params], replaces)
|
|
97
|
+
|
|
98
|
+
def __call__(self, training_info, params):
|
|
99
|
+
inputs = []
|
|
100
|
+
if isinstance(training_info, ENTITY_TYPE):
|
|
101
|
+
inputs.append(training_info)
|
|
102
|
+
|
|
103
|
+
self.training_info = training_info
|
|
104
|
+
self.params = params
|
|
105
|
+
inputs.extend(find_objects([params], ENTITY_TYPE))
|
|
106
|
+
return self.new_tileable(inputs, shape=())
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class ODPSModelMixin:
|
|
110
|
+
class ODPSModelInfo(NamedTuple):
|
|
111
|
+
model_format: str
|
|
112
|
+
model_params: Any
|
|
113
|
+
|
|
114
|
+
@classmethod
|
|
115
|
+
def _build_odps_source_model(cls, op: ReadODPSModel) -> Any:
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
def _get_odps_model_info(self) -> ODPSModelInfo:
|
|
119
|
+
raise NotImplementedError
|
|
120
|
+
|
|
121
|
+
def to_odps_model(
|
|
122
|
+
self,
|
|
123
|
+
model_name: str,
|
|
124
|
+
model_version: str = None,
|
|
125
|
+
schema: str = None,
|
|
126
|
+
project: str = None,
|
|
127
|
+
lifecycle: Optional[int] = None,
|
|
128
|
+
version_lifecycle: Optional[int] = None,
|
|
129
|
+
description: Optional[str] = None,
|
|
130
|
+
version_description: Optional[str] = None,
|
|
131
|
+
create_model: bool = True,
|
|
132
|
+
set_default_version: bool = False,
|
|
133
|
+
location: Optional[str] = None,
|
|
134
|
+
storage_options: Dict[str, Any] = None,
|
|
135
|
+
):
|
|
136
|
+
"""
|
|
137
|
+
Save trained model to MaxCompute.
|
|
138
|
+
|
|
139
|
+
Parameters
|
|
140
|
+
----------
|
|
141
|
+
model_name : str, optional
|
|
142
|
+
Name of the model. Can be a fully qualified name with format
|
|
143
|
+
"project.schema.model" or just "model" if project and schema are
|
|
144
|
+
specified separately.
|
|
145
|
+
model_version : str, optional
|
|
146
|
+
Version of the model. If not provided, a default version will be used.
|
|
147
|
+
schema : str, optional
|
|
148
|
+
Schema name where the model will be stored. If not provided and
|
|
149
|
+
project is specified, "default" schema will be used.
|
|
150
|
+
project : str, optional
|
|
151
|
+
Project name where the model will be stored.
|
|
152
|
+
lifecycle : int, optional
|
|
153
|
+
Lifecycle of the model in days. After this period, the model will
|
|
154
|
+
be automatically deleted.
|
|
155
|
+
version_lifecycle : int, optional
|
|
156
|
+
Lifecycle of the model version in days. After this period, the
|
|
157
|
+
model version will be automatically deleted.
|
|
158
|
+
description : str, optional
|
|
159
|
+
Description of the model.
|
|
160
|
+
version_description : str, optional
|
|
161
|
+
Description of the model version.
|
|
162
|
+
create_model : bool, default True
|
|
163
|
+
Whether to create the model if it doesn't exist.
|
|
164
|
+
set_default_version : bool, default False
|
|
165
|
+
Whether to set this version as the default version of the model.
|
|
166
|
+
location : str, optional
|
|
167
|
+
Storage location for the model. If specified, the model can be stored
|
|
168
|
+
into a customized location. Can be an OSS path with format
|
|
169
|
+
oss://endpoint/bucket/path.
|
|
170
|
+
storage_options : dict, optional
|
|
171
|
+
Extra options for storage, such as role_arn or policy for OSS storage.
|
|
172
|
+
|
|
173
|
+
Returns
|
|
174
|
+
-------
|
|
175
|
+
Scalar
|
|
176
|
+
A scalar that can be executed to save the model.
|
|
177
|
+
|
|
178
|
+
Examples
|
|
179
|
+
--------
|
|
180
|
+
First we fit an XGBoost model.
|
|
181
|
+
|
|
182
|
+
>>> import maxframe.dataframe as md
|
|
183
|
+
>>> from maxframe.learn.datasets import make_classification
|
|
184
|
+
>>> from maxframe.learn.contrib.xgboost import XGBClassifier
|
|
185
|
+
>>> X, y = make_classification(1000, n_features=10, n_classes=2)
|
|
186
|
+
>>> cols = [f"f{idx}" for idx in range(10)]
|
|
187
|
+
>>> clf = XGBClassifier(n_estimators=10)
|
|
188
|
+
>>> X_df = md.DataFrame(X, columns=cols)
|
|
189
|
+
>>> clf.fit(X_df, y)
|
|
190
|
+
|
|
191
|
+
Trigger execution and save model with fully qualified name.
|
|
192
|
+
|
|
193
|
+
>>> clf.to_odps_model(model_name="project.schema.my_model",
|
|
194
|
+
... model_version="v1.0").execute()
|
|
195
|
+
|
|
196
|
+
You can also save model with a customized path. Need to change `<my_bucket>`
|
|
197
|
+
and `<user_id>` into your own bucket and user ID.
|
|
198
|
+
|
|
199
|
+
>>> clf.to_odps_model(model_name="project.schema.my_model",
|
|
200
|
+
... model_version="v1.0",
|
|
201
|
+
... location="oss://oss-cn-shanghai.aliyuncs.com/<my_bucket>/model_name",
|
|
202
|
+
... storage_options={
|
|
203
|
+
... "role_arn": "acs:ram::<user_id>:role/aliyunodpsdefaultrole"
|
|
204
|
+
... }).execute()
|
|
205
|
+
"""
|
|
206
|
+
model_name = _build_odps_model_name(model_name, schema, project)
|
|
207
|
+
model_info = self._get_odps_model_info()
|
|
208
|
+
|
|
209
|
+
op = ToODPSModel(
|
|
210
|
+
model_name=model_name,
|
|
211
|
+
model_version=model_version,
|
|
212
|
+
format=model_info.model_format,
|
|
213
|
+
lifecycle=lifecycle,
|
|
214
|
+
version_lifecycle=version_lifecycle,
|
|
215
|
+
description=description,
|
|
216
|
+
version_description=version_description,
|
|
217
|
+
create_model=create_model,
|
|
218
|
+
set_default_version=set_default_version,
|
|
219
|
+
location=location,
|
|
220
|
+
storage_options=storage_options,
|
|
221
|
+
)
|
|
222
|
+
return op(getattr(self, "training_info_"), model_info.model_params)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _build_odps_model_name(model_name: str, schema: str, project: str = None):
|
|
226
|
+
if "." not in model_name:
|
|
227
|
+
if project and not schema:
|
|
228
|
+
schema = "default"
|
|
229
|
+
if schema:
|
|
230
|
+
model_name = f"{schema}.{model_name}"
|
|
231
|
+
if project:
|
|
232
|
+
model_name = f"{project}.{model_name}"
|
|
233
|
+
return model_name
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def read_odps_model(
|
|
237
|
+
model_name: str,
|
|
238
|
+
schema: str = None,
|
|
239
|
+
project: str = None,
|
|
240
|
+
model_version: str = None,
|
|
241
|
+
odps_entry: ODPS = None,
|
|
242
|
+
):
|
|
243
|
+
odps_entry = odps_entry or ODPS.from_global() or ODPS.from_environments()
|
|
244
|
+
if not hasattr(odps_entry, "get_model"):
|
|
245
|
+
raise RuntimeError("Need to install pyodps>=0.11.5 to use read_odps_model")
|
|
246
|
+
|
|
247
|
+
model_obj = odps_entry.get_model(model_name, project, schema)
|
|
248
|
+
if model_version:
|
|
249
|
+
model_obj = model_obj.versions[model_version]
|
|
250
|
+
# check if model exists
|
|
251
|
+
model_obj.reload()
|
|
252
|
+
|
|
253
|
+
full_model_name = _build_odps_model_name(model_name, schema, project)
|
|
254
|
+
location = model_obj.path
|
|
255
|
+
format = model_obj.type.value
|
|
256
|
+
op = ReadODPSModel(
|
|
257
|
+
model_name=full_model_name,
|
|
258
|
+
model_version=model_version,
|
|
259
|
+
location=location,
|
|
260
|
+
format=format,
|
|
261
|
+
)
|
|
262
|
+
return op()
|
|
@@ -695,9 +695,9 @@ def _check_sample_weight(
|
|
|
695
695
|
dtype = np.float64
|
|
696
696
|
|
|
697
697
|
if sample_weight is None:
|
|
698
|
-
sample_weight =
|
|
698
|
+
sample_weight = mt.ones(n_samples, dtype=dtype)
|
|
699
699
|
elif isinstance(sample_weight, numbers.Number):
|
|
700
|
-
sample_weight =
|
|
700
|
+
sample_weight = mt.full(n_samples, sample_weight, dtype=dtype)
|
|
701
701
|
else:
|
|
702
702
|
if dtype is None:
|
|
703
703
|
dtype = [np.float64, np.float32]
|
maxframe/lib/compat.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import functools
|
|
1
3
|
from typing import TYPE_CHECKING, Callable, List, Sequence, Tuple, Union
|
|
2
4
|
|
|
3
5
|
import numpy as np
|
|
@@ -143,3 +145,41 @@ def case_when(
|
|
|
143
145
|
def patch_pandas():
|
|
144
146
|
if not hasattr(pd.Series, "case_when"):
|
|
145
147
|
pd.Series.case_when = case_when
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class cached_property:
|
|
151
|
+
"""
|
|
152
|
+
A property that is only computed once per instance and then replaces itself
|
|
153
|
+
with an ordinary attribute. Deleting the attribute resets the property.
|
|
154
|
+
Source: https://github.com/bottlepy/bottle/commit/fa7733e075da0d790d809aa3d2f53071897e6f76
|
|
155
|
+
""" # noqa
|
|
156
|
+
|
|
157
|
+
def __init__(self, func):
|
|
158
|
+
self.__doc__ = getattr(func, "__doc__")
|
|
159
|
+
self.func = func
|
|
160
|
+
|
|
161
|
+
def __get__(self, obj, cls):
|
|
162
|
+
if obj is None:
|
|
163
|
+
return self
|
|
164
|
+
|
|
165
|
+
if asyncio.iscoroutinefunction(self.func):
|
|
166
|
+
return self._wrap_in_coroutine(obj)
|
|
167
|
+
|
|
168
|
+
value = obj.__dict__[self.func.__name__] = self.func(obj)
|
|
169
|
+
return value
|
|
170
|
+
|
|
171
|
+
def _wrap_in_coroutine(self, obj):
|
|
172
|
+
@functools.wraps(obj)
|
|
173
|
+
def wrapper():
|
|
174
|
+
future = asyncio.ensure_future(self.func(obj))
|
|
175
|
+
obj.__dict__[self.func.__name__] = future
|
|
176
|
+
return future
|
|
177
|
+
|
|
178
|
+
return wrapper()
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
# isort: off
|
|
182
|
+
try:
|
|
183
|
+
from functools import cached_property # noqa: F811, F401
|
|
184
|
+
except ImportError:
|
|
185
|
+
pass
|
|
@@ -12,4 +12,19 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from .
|
|
15
|
+
from .blob import (
|
|
16
|
+
ArrowBlobType,
|
|
17
|
+
ExternalBlobDtype,
|
|
18
|
+
ExternalBlobExtensionArray,
|
|
19
|
+
SolidBlob,
|
|
20
|
+
new_blob,
|
|
21
|
+
)
|
|
22
|
+
from .dtypes import (
|
|
23
|
+
ArrowDtype,
|
|
24
|
+
dict_,
|
|
25
|
+
is_list_dtype,
|
|
26
|
+
is_map_dtype,
|
|
27
|
+
is_struct_dtype,
|
|
28
|
+
list_,
|
|
29
|
+
struct_,
|
|
30
|
+
)
|