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
maxframe/serialization/pandas.py
CHANGED
|
@@ -20,6 +20,11 @@ import pandas as pd
|
|
|
20
20
|
from pandas.api.extensions import ExtensionArray
|
|
21
21
|
from pandas.arrays import IntervalArray
|
|
22
22
|
|
|
23
|
+
try:
|
|
24
|
+
from pandas.tseries.offsets import BaseOffset as PdBaseOffset
|
|
25
|
+
except ImportError:
|
|
26
|
+
PdBaseOffset = type("FakeBaseOffset", (), {})
|
|
27
|
+
|
|
23
28
|
from ..utils import no_default
|
|
24
29
|
from .core import Serializer, buffered
|
|
25
30
|
|
|
@@ -39,14 +44,16 @@ class DataFrameSerializer(Serializer):
|
|
|
39
44
|
self, serialized: List, context: Dict, subs: List[Any]
|
|
40
45
|
) -> pd.DataFrame:
|
|
41
46
|
dtypes, idx = subs[:2]
|
|
42
|
-
seriess = [
|
|
47
|
+
seriess = [
|
|
48
|
+
pd.Series(d, name=nm, index=idx).astype(dt)
|
|
49
|
+
for d, (nm, dt) in zip(subs[2:], dtypes.items())
|
|
50
|
+
]
|
|
43
51
|
if seriess:
|
|
44
|
-
df = pd.concat(
|
|
52
|
+
df = pd.concat(seriess, axis=1)
|
|
53
|
+
df.columns = dtypes.index
|
|
45
54
|
else:
|
|
46
55
|
df = pd.DataFrame([], index=idx)
|
|
47
|
-
df
|
|
48
|
-
df.index = idx
|
|
49
|
-
return df.astype(dtypes)
|
|
56
|
+
return df
|
|
50
57
|
|
|
51
58
|
|
|
52
59
|
class SeriesSerializer(Serializer):
|
|
@@ -63,9 +70,26 @@ class SeriesSerializer(Serializer):
|
|
|
63
70
|
return pd.Series(data, index=idx, name=name).astype(dtype)
|
|
64
71
|
|
|
65
72
|
|
|
73
|
+
class PeriodSerializer(Serializer):
|
|
74
|
+
def serial(self, obj: pd.Period, context: Dict):
|
|
75
|
+
return [obj.strftime("%Y-%m-%d %H:%M:%S"), obj.freqstr], [], True
|
|
76
|
+
|
|
77
|
+
def deserial(self, serialized, context: Dict, subs: List):
|
|
78
|
+
return pd.Period(serialized[0], freq=serialized[1])
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class PdOffsetSerializer(Serializer):
|
|
82
|
+
def serial(self, obj: PdBaseOffset, context: Dict):
|
|
83
|
+
return [obj.freqstr], [], True
|
|
84
|
+
|
|
85
|
+
def deserial(self, serialized, context: Dict, subs: List):
|
|
86
|
+
return pd.tseries.frequencies.to_offset(serialized[0])
|
|
87
|
+
|
|
88
|
+
|
|
66
89
|
_TYPE_CHAR_MULTI_INDEX = "M"
|
|
67
90
|
_TYPE_CHAR_RANGE_INDEX = "R"
|
|
68
91
|
_TYPE_CHAR_CATEGORICAL_INDEX = "C"
|
|
92
|
+
_TYPE_CHAR_DATETIME_INDEX = "D"
|
|
69
93
|
|
|
70
94
|
|
|
71
95
|
class IndexSerializer(Serializer):
|
|
@@ -80,6 +104,9 @@ class IndexSerializer(Serializer):
|
|
|
80
104
|
elif isinstance(obj, pd.CategoricalIndex):
|
|
81
105
|
data = [obj.name, obj.values]
|
|
82
106
|
header = [_TYPE_CHAR_CATEGORICAL_INDEX]
|
|
107
|
+
elif isinstance(obj, pd.DatetimeIndex):
|
|
108
|
+
data = [obj.name, obj.values]
|
|
109
|
+
header = [_TYPE_CHAR_DATETIME_INDEX, obj.freqstr, None]
|
|
83
110
|
else:
|
|
84
111
|
if getattr(obj.dtype, "hasobject", False):
|
|
85
112
|
values = obj.tolist()
|
|
@@ -100,6 +127,10 @@ class IndexSerializer(Serializer):
|
|
|
100
127
|
elif header[0] == _TYPE_CHAR_CATEGORICAL_INDEX:
|
|
101
128
|
name, data = subs[:2]
|
|
102
129
|
return pd.CategoricalIndex(data, name=name)
|
|
130
|
+
elif header[0] == _TYPE_CHAR_DATETIME_INDEX:
|
|
131
|
+
name, data = subs[:2]
|
|
132
|
+
freq, tz = header[1:]
|
|
133
|
+
return pd.DatetimeIndex(data, name=name, freq=freq, tz=tz)
|
|
103
134
|
elif header[0] is None: # Normal index
|
|
104
135
|
dtype, name, values = subs
|
|
105
136
|
return pd.Index(values, dtype=dtype, name=name)
|
|
@@ -162,9 +193,12 @@ class PdTimestampSerializer(Serializer):
|
|
|
162
193
|
zone_info = []
|
|
163
194
|
ts = obj.to_pydatetime().timestamp()
|
|
164
195
|
elements = [int(ts), obj.microsecond, obj.nanosecond]
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
196
|
+
for attr in ("unit", "freqstr"):
|
|
197
|
+
if getattr(obj, attr, None):
|
|
198
|
+
elements.append(str(getattr(obj, attr)))
|
|
199
|
+
else:
|
|
200
|
+
elements.append(None)
|
|
201
|
+
return elements, zone_info, not bool(zone_info)
|
|
168
202
|
|
|
169
203
|
def deserial(self, serialized: List, context: Dict, subs: List):
|
|
170
204
|
if subs:
|
|
@@ -196,7 +230,8 @@ class PdTimestampSerializer(Serializer):
|
|
|
196
230
|
"nanosecond": serialized[2],
|
|
197
231
|
}
|
|
198
232
|
if len(serialized) >= 4:
|
|
199
|
-
|
|
233
|
+
ext_kw = dict(zip(("unit", "freq"), serialized[3:]))
|
|
234
|
+
kwargs.update({k: v for k, v in ext_kw.items() if v})
|
|
200
235
|
val = pd.Timestamp(**kwargs)
|
|
201
236
|
return val
|
|
202
237
|
|
|
@@ -238,4 +273,6 @@ CategoricalSerializer.register(pd.Categorical)
|
|
|
238
273
|
ArraySerializer.register(ExtensionArray)
|
|
239
274
|
PdTimestampSerializer.register(pd.Timestamp)
|
|
240
275
|
PdTimedeltaSerializer.register(pd.Timedelta)
|
|
276
|
+
PeriodSerializer.register(pd.Period)
|
|
277
|
+
PdOffsetSerializer.register(PdBaseOffset)
|
|
241
278
|
NoDefaultSerializer.register(type(no_default))
|
|
@@ -453,8 +453,8 @@ class SerializableSerializer(Serializer):
|
|
|
453
453
|
self._set_field_values(obj, primitives, cls_to_prim_key, True)
|
|
454
454
|
if obj_class._NON_PRIMITIVE_FIELDS:
|
|
455
455
|
self._set_field_values(obj, subs[0], cls_to_non_prim_key, False)
|
|
456
|
-
obj.__on_deserialize__()
|
|
457
|
-
return obj
|
|
456
|
+
ret = obj.__on_deserialize__()
|
|
457
|
+
return obj if ret is None else ret
|
|
458
458
|
|
|
459
459
|
|
|
460
460
|
class NoFieldValueSerializer(Serializer):
|
|
@@ -81,6 +81,11 @@ class CustomNamedTuple(NamedTuple):
|
|
|
81
81
|
b"abcd",
|
|
82
82
|
"abcd",
|
|
83
83
|
slice(3, 9, 2),
|
|
84
|
+
slice(3, None, None),
|
|
85
|
+
slice(pd.Timestamp.now(), None, None),
|
|
86
|
+
range(10),
|
|
87
|
+
range(2, 10),
|
|
88
|
+
range(2, 10, 3),
|
|
84
89
|
["uvw", ("mno", "sdaf"), 4, 6.7],
|
|
85
90
|
CustomNamedTuple("abcd", 13451),
|
|
86
91
|
datetime.datetime.now(),
|
|
@@ -173,7 +178,7 @@ def test_timezones(val):
|
|
|
173
178
|
],
|
|
174
179
|
)
|
|
175
180
|
@switch_unpickle
|
|
176
|
-
def
|
|
181
|
+
def test_numpy_arrays(val):
|
|
177
182
|
deserialized = deserialize(*serialize(val))
|
|
178
183
|
assert type(val) == type(deserialized)
|
|
179
184
|
np.testing.assert_equal(val, deserialized)
|
|
@@ -181,6 +186,13 @@ def test_numpy(val):
|
|
|
181
186
|
assert deserialized.flags.f_contiguous
|
|
182
187
|
|
|
183
188
|
|
|
189
|
+
@switch_unpickle
|
|
190
|
+
def test_numpy_random_state():
|
|
191
|
+
rs1 = np.random.RandomState(131)
|
|
192
|
+
rs2 = deserialize(*serialize(rs1))
|
|
193
|
+
assert rs1.rand() == rs2.rand()
|
|
194
|
+
|
|
195
|
+
|
|
184
196
|
@switch_unpickle
|
|
185
197
|
def test_pandas():
|
|
186
198
|
val = pd.Series([1, 2, 3, 4], name="nm")
|
|
@@ -213,16 +225,25 @@ def test_pandas():
|
|
|
213
225
|
val = pd.CategoricalIndex(np.random.choice(list("abcd"), size=(1000,)))
|
|
214
226
|
pd.testing.assert_index_equal(val, deserialize(*serialize(val)))
|
|
215
227
|
|
|
228
|
+
val = pd.DatetimeIndex([pd.Timestamp("2025-08-01 12:31:21")], freq="D")
|
|
229
|
+
pd.testing.assert_index_equal(val, deserialize(*serialize(val)))
|
|
230
|
+
|
|
231
|
+
val = pd.Period("2025-08-01", freq="D")
|
|
232
|
+
assert val == deserialize(*serialize(val))
|
|
233
|
+
|
|
234
|
+
val = pd.tseries.offsets.MonthEnd()
|
|
235
|
+
assert val == deserialize(*serialize(val))
|
|
236
|
+
|
|
216
237
|
|
|
217
238
|
@switch_unpickle
|
|
218
239
|
@pytest.mark.skipif(_arrow_dtype_supported, reason="pandas doesn't support ArrowDtype")
|
|
219
240
|
def test_fake_arrow_dtype_serde():
|
|
220
241
|
serializer = DtypeSerializer()
|
|
221
|
-
payload, data,
|
|
242
|
+
payload, data, is_leaf = serializer.serial(
|
|
222
243
|
FakeArrowDtype(pa.map_(pa.int64(), pa.string())), dict()
|
|
223
244
|
)
|
|
224
245
|
|
|
225
|
-
assert
|
|
246
|
+
assert is_leaf
|
|
226
247
|
assert data == []
|
|
227
248
|
assert payload == ["PA", "map<int64, string>"]
|
|
228
249
|
new_dtype = serializer.deserial(payload, dict(), list())
|
|
@@ -233,6 +254,10 @@ def test_fake_arrow_dtype_serde():
|
|
|
233
254
|
@switch_unpickle
|
|
234
255
|
def test_arrow():
|
|
235
256
|
test_array = np.random.rand(1000)
|
|
257
|
+
test_cplx_array = pa.array(
|
|
258
|
+
[["abc", "def"], ["ghi"], None],
|
|
259
|
+
type=pa.list_(pa.string()),
|
|
260
|
+
)
|
|
236
261
|
test_df = pd.DataFrame(
|
|
237
262
|
{
|
|
238
263
|
"a": np.random.rand(1000),
|
|
@@ -242,14 +267,16 @@ def test_arrow():
|
|
|
242
267
|
)
|
|
243
268
|
test_vals = [
|
|
244
269
|
pa.array(test_array),
|
|
270
|
+
test_cplx_array,
|
|
245
271
|
pa.chunked_array([pa.array(test_array), pa.array(test_array)]),
|
|
272
|
+
pa.chunked_array([test_cplx_array, test_cplx_array]),
|
|
246
273
|
pa.RecordBatch.from_pandas(test_df),
|
|
247
274
|
pa.Table.from_pandas(test_df),
|
|
248
275
|
]
|
|
249
276
|
for val in test_vals:
|
|
250
277
|
deserialized = deserialize(*serialize(val))
|
|
251
278
|
assert type(val) is type(deserialized)
|
|
252
|
-
|
|
279
|
+
assert str(val) == str(deserialized)
|
|
253
280
|
|
|
254
281
|
|
|
255
282
|
@pytest.mark.parametrize(
|
maxframe/tensor/__init__.py
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from . import extensions, fetch, linalg, random, special, statistics
|
|
15
|
+
from . import extensions, fetch, fft, linalg, random, spatial, special, statistics
|
|
16
16
|
from .arithmetic import absolute
|
|
17
17
|
from .arithmetic import absolute as abs
|
|
18
18
|
from .arithmetic import (
|
|
@@ -58,6 +58,7 @@ from .arithmetic import invert as bitwise_not
|
|
|
58
58
|
from .arithmetic import (
|
|
59
59
|
isclose,
|
|
60
60
|
iscomplex,
|
|
61
|
+
iscomplexobj,
|
|
61
62
|
isfinite,
|
|
62
63
|
isinf,
|
|
63
64
|
isnan,
|
|
@@ -152,32 +153,49 @@ from .indexing import (
|
|
|
152
153
|
take,
|
|
153
154
|
unravel_index,
|
|
154
155
|
)
|
|
155
|
-
from .linalg
|
|
156
|
-
from .linalg.inner import inner, innerproduct
|
|
157
|
-
from .linalg.matmul import matmul
|
|
158
|
-
from .linalg.tensordot import tensordot
|
|
159
|
-
from .linalg.vdot import vdot
|
|
156
|
+
from .linalg import dot, einsum, inner, innerproduct, matmul, tensordot, vdot
|
|
160
157
|
from .merge import append, column_stack, concatenate, dstack, hstack, stack, vstack
|
|
161
158
|
from .misc import (
|
|
159
|
+
argwhere,
|
|
160
|
+
array_split,
|
|
162
161
|
astype,
|
|
163
162
|
atleast_1d,
|
|
164
163
|
atleast_2d,
|
|
165
164
|
atleast_3d,
|
|
165
|
+
broadcast_arrays,
|
|
166
166
|
broadcast_to,
|
|
167
167
|
copy,
|
|
168
|
+
copyto,
|
|
169
|
+
delete,
|
|
168
170
|
diff,
|
|
171
|
+
dsplit,
|
|
172
|
+
ediff1d,
|
|
173
|
+
expand_dims,
|
|
174
|
+
flip,
|
|
175
|
+
fliplr,
|
|
176
|
+
flipud,
|
|
177
|
+
hsplit,
|
|
169
178
|
in1d,
|
|
179
|
+
insert,
|
|
170
180
|
isin,
|
|
181
|
+
moveaxis,
|
|
171
182
|
ndim,
|
|
172
183
|
ravel,
|
|
173
184
|
repeat,
|
|
185
|
+
result_type,
|
|
186
|
+
roll,
|
|
187
|
+
rollaxis,
|
|
174
188
|
searchsorted,
|
|
175
189
|
setdiff1d,
|
|
190
|
+
shape,
|
|
191
|
+
split,
|
|
176
192
|
squeeze,
|
|
177
193
|
swapaxes,
|
|
194
|
+
tile,
|
|
178
195
|
transpose,
|
|
179
196
|
trapezoid,
|
|
180
197
|
unique,
|
|
198
|
+
vsplit,
|
|
181
199
|
where,
|
|
182
200
|
)
|
|
183
201
|
from .rechunk import rechunk
|
|
@@ -214,8 +232,20 @@ from .reduction import prod
|
|
|
214
232
|
from .reduction import prod as product
|
|
215
233
|
from .reduction import std, sum, var
|
|
216
234
|
from .reshape import reshape
|
|
217
|
-
from .sort import argsort, sort
|
|
218
|
-
from .statistics import
|
|
235
|
+
from .sort import argpartition, argsort, partition, sort
|
|
236
|
+
from .statistics import (
|
|
237
|
+
average,
|
|
238
|
+
bincount,
|
|
239
|
+
corrcoef,
|
|
240
|
+
cov,
|
|
241
|
+
digitize,
|
|
242
|
+
histogram,
|
|
243
|
+
histogram_bin_edges,
|
|
244
|
+
median,
|
|
245
|
+
percentile,
|
|
246
|
+
ptp,
|
|
247
|
+
quantile,
|
|
248
|
+
)
|
|
219
249
|
from .ufunc import ufunc
|
|
220
250
|
|
|
221
251
|
# isort: off
|
|
@@ -63,6 +63,7 @@ from .imag import TensorImag, imag
|
|
|
63
63
|
from .invert import TensorInvert, invert
|
|
64
64
|
from .isclose import TensorIsclose, isclose
|
|
65
65
|
from .iscomplex import TensorIsComplex, iscomplex
|
|
66
|
+
from .iscomplexobj import iscomplexobj
|
|
66
67
|
from .isfinite import TensorIsFinite, isfinite
|
|
67
68
|
from .isinf import TensorIsInf, isinf
|
|
68
69
|
from .isnan import TensorIsNan, isnan
|
|
@@ -117,14 +118,6 @@ from .truediv import TensorTrueDiv, truediv
|
|
|
117
118
|
from .trunc import TensorTrunc, trunc
|
|
118
119
|
|
|
119
120
|
|
|
120
|
-
def _wrap_iop(func):
|
|
121
|
-
def inner(self, *args, **kwargs):
|
|
122
|
-
kwargs["out"] = self
|
|
123
|
-
return func(self, *args, **kwargs)
|
|
124
|
-
|
|
125
|
-
return inner
|
|
126
|
-
|
|
127
|
-
|
|
128
121
|
def _install():
|
|
129
122
|
from ..core import TENSOR_TYPE, Tensor, TensorData
|
|
130
123
|
from ..datasource import tensor as astensor
|
|
@@ -150,6 +143,22 @@ def _install():
|
|
|
150
143
|
|
|
151
144
|
return eq
|
|
152
145
|
|
|
146
|
+
def _wrap_iop(func):
|
|
147
|
+
def inner(self, *args, **kwargs):
|
|
148
|
+
kwargs["out"] = self
|
|
149
|
+
return func(self, *args, **kwargs)
|
|
150
|
+
|
|
151
|
+
return inner
|
|
152
|
+
|
|
153
|
+
def _wrap_magic(func):
|
|
154
|
+
def inner(lhs, rhs, **kwargs):
|
|
155
|
+
ret = func(lhs, rhs, **kwargs)
|
|
156
|
+
if isinstance(ret, TENSOR_TYPE):
|
|
157
|
+
ret.op.extra_params["magic"] = True
|
|
158
|
+
return ret
|
|
159
|
+
|
|
160
|
+
return inner
|
|
161
|
+
|
|
153
162
|
for cls in TENSOR_TYPE:
|
|
154
163
|
setattr(cls, "__add__", add)
|
|
155
164
|
setattr(cls, "__iadd__", _wrap_iop(add))
|
|
@@ -182,8 +191,8 @@ def _install():
|
|
|
182
191
|
setattr(cls, "__irshift__", _wrap_iop(rshift))
|
|
183
192
|
setattr(cls, "__rrshift__", rrshift)
|
|
184
193
|
|
|
185
|
-
setattr(cls, "__eq__", _wrap_equal(equal))
|
|
186
|
-
setattr(cls, "__ne__", not_equal)
|
|
194
|
+
setattr(cls, "__eq__", _wrap_magic(_wrap_equal(equal)))
|
|
195
|
+
setattr(cls, "__ne__", _wrap_magic(not_equal))
|
|
187
196
|
setattr(cls, "__lt__", less)
|
|
188
197
|
setattr(cls, "__le__", less_equal)
|
|
189
198
|
setattr(cls, "__gt__", greater)
|
|
@@ -415,8 +415,8 @@ class TensorOutBinOp(TensorOperator, TensorElementWiseWithInputs):
|
|
|
415
415
|
dtype = [r.dtype for r in self._fun(np.empty(1, dtype=x.dtype))]
|
|
416
416
|
|
|
417
417
|
out = out or (None, None)
|
|
418
|
-
out1 = out1
|
|
419
|
-
out2 = out2
|
|
418
|
+
out1 = out1 if out1 is not None else out[0]
|
|
419
|
+
out2 = out2 if out2 is not None else out[1]
|
|
420
420
|
x, out1, out2, where = self._process_inputs(x, out1, out2, where)
|
|
421
421
|
shape = x.shape
|
|
422
422
|
order1 = self._calc_order(x, out1)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def iscomplexobj(x):
|
|
19
|
+
"""
|
|
20
|
+
Check for a complex type or an array of complex numbers.
|
|
21
|
+
|
|
22
|
+
The type of the input is checked, not the value. Even if the input
|
|
23
|
+
has an imaginary part equal to zero, `iscomplexobj` evaluates to True.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
x : any
|
|
28
|
+
The input can be of any type and shape.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
iscomplexobj : bool
|
|
33
|
+
The return value, True if `x` is of a complex type or has at least
|
|
34
|
+
one complex element.
|
|
35
|
+
|
|
36
|
+
See Also
|
|
37
|
+
--------
|
|
38
|
+
isrealobj, iscomplex
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import maxframe.tensor as mt
|
|
43
|
+
>>> mt.iscomplexobj(1)
|
|
44
|
+
False
|
|
45
|
+
>>> mt.iscomplexobj(1+0j)
|
|
46
|
+
True
|
|
47
|
+
>>> mt.iscomplexobj([3, 1+0j, True])
|
|
48
|
+
True
|
|
49
|
+
"""
|
|
50
|
+
from ..datasource.array import tensor as astensor
|
|
51
|
+
|
|
52
|
+
t = astensor(x)
|
|
53
|
+
return issubclass(t.dtype.type, np.complexfloating)
|
|
@@ -16,7 +16,6 @@ import numpy as np
|
|
|
16
16
|
import pytest
|
|
17
17
|
import scipy.sparse as sps
|
|
18
18
|
|
|
19
|
-
from ....core import enter_mode
|
|
20
19
|
from ....utils import collect_leaf_operators
|
|
21
20
|
from ...core import SparseTensor, Tensor
|
|
22
21
|
from ...datasource import array, empty, ones, tensor
|
|
@@ -391,14 +390,6 @@ def test_get_set_real():
|
|
|
391
390
|
a.real = [2, 4]
|
|
392
391
|
|
|
393
392
|
|
|
394
|
-
def test_build_mode():
|
|
395
|
-
t1 = ones((2, 3), chunk_size=2)
|
|
396
|
-
assert t1 == 2
|
|
397
|
-
|
|
398
|
-
with enter_mode(build=True):
|
|
399
|
-
assert t1 != 2
|
|
400
|
-
|
|
401
|
-
|
|
402
393
|
def test_unary_op_func_name():
|
|
403
394
|
# make sure all the unary op has defined the func name.
|
|
404
395
|
|
|
@@ -450,3 +441,9 @@ def test_tree_arithmetic():
|
|
|
450
441
|
assert len(t.inputs) == 3
|
|
451
442
|
assert len(t.inputs[0].inputs) == 4
|
|
452
443
|
assert len(t.inputs[-1].inputs) == 2
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
def test_iscomplexobj():
|
|
447
|
+
assert not iscomplexobj(1)
|
|
448
|
+
assert iscomplexobj(1 + 0j)
|
|
449
|
+
assert iscomplexobj([3, 1 + 0j, True])
|
maxframe/tensor/core.py
CHANGED
|
@@ -35,6 +35,7 @@ from ..serialization.serializables import (
|
|
|
35
35
|
Serializable,
|
|
36
36
|
StringField,
|
|
37
37
|
)
|
|
38
|
+
from ..utils import make_dtype
|
|
38
39
|
from .utils import fetch_corner_data, get_chunk_slices
|
|
39
40
|
|
|
40
41
|
logger = logging.getLogger(__name__)
|
|
@@ -73,7 +74,7 @@ class TensorData(HasShapeTileableData, _ExecuteAndFetchMixin):
|
|
|
73
74
|
super().__init__(
|
|
74
75
|
_op=op,
|
|
75
76
|
_shape=shape,
|
|
76
|
-
_dtype=dtype,
|
|
77
|
+
_dtype=make_dtype(dtype),
|
|
77
78
|
_order=order,
|
|
78
79
|
**kw,
|
|
79
80
|
)
|
|
@@ -250,6 +251,9 @@ class Tensor(HasShapeTileable):
|
|
|
250
251
|
def __len__(self):
|
|
251
252
|
return len(self._data)
|
|
252
253
|
|
|
254
|
+
def __bool__(self):
|
|
255
|
+
return True if is_build_mode() else bool(self.to_numpy())
|
|
256
|
+
|
|
253
257
|
@property
|
|
254
258
|
def shape(self):
|
|
255
259
|
return self._data.shape
|
|
@@ -520,7 +524,7 @@ class Tensor(HasShapeTileable):
|
|
|
520
524
|
>>> a.execute()
|
|
521
525
|
array([1, 2, 3, 4])
|
|
522
526
|
"""
|
|
523
|
-
from .
|
|
527
|
+
from .sort import partition
|
|
524
528
|
|
|
525
529
|
self._data = partition(self, kth, axis=axis, kind=kind, order=order, **kw).data
|
|
526
530
|
|
|
@@ -207,7 +207,8 @@ def test_set_tensor_inputs():
|
|
|
207
207
|
assert t3.op.inputs == [t1.data, t2.data]
|
|
208
208
|
assert t3.inputs == [t1.data, t2.data]
|
|
209
209
|
|
|
210
|
-
|
|
210
|
+
msg = "Unexpected StopIteration happened"
|
|
211
|
+
with pytest.raises(RuntimeError, match=msg):
|
|
211
212
|
t3.inputs = []
|
|
212
213
|
|
|
213
214
|
t1 = tensor([1, 2], chunk_size=2)
|
|
@@ -15,12 +15,14 @@
|
|
|
15
15
|
from ...core import CachedAccessor
|
|
16
16
|
from .accessor import TensorMaxFrameAccessor
|
|
17
17
|
from .apply_chunk import apply_chunk
|
|
18
|
+
from .rebalance import rebalance
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
def _install():
|
|
21
22
|
from ..core import TENSOR_TYPE
|
|
22
23
|
|
|
23
24
|
TensorMaxFrameAccessor._register("apply_chunk", apply_chunk)
|
|
25
|
+
TensorMaxFrameAccessor._register("rebalance", rebalance)
|
|
24
26
|
|
|
25
27
|
if TensorMaxFrameAccessor._api_count:
|
|
26
28
|
for t in TENSOR_TYPE:
|
|
@@ -33,9 +33,9 @@ class TensorApplyChunk(TensorOperator, TensorOperatorMixin):
|
|
|
33
33
|
|
|
34
34
|
func = FunctionField("func")
|
|
35
35
|
elementwise = BoolField("elementwise")
|
|
36
|
-
args = TupleField("args")
|
|
37
|
-
kwargs = DictField("kwargs")
|
|
38
|
-
with_chunk_index = BoolField("with_chunk_index")
|
|
36
|
+
args = TupleField("args", default=None)
|
|
37
|
+
kwargs = DictField("kwargs", default=None)
|
|
38
|
+
with_chunk_index = BoolField("with_chunk_index", default=False)
|
|
39
39
|
|
|
40
40
|
@classmethod
|
|
41
41
|
def _set_inputs(cls, op: "TensorApplyChunk", inputs):
|
|
@@ -0,0 +1,65 @@
|
|
|
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 ...serialization.serializables import Float64Field, Int64Field
|
|
17
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class RebalanceMixin:
|
|
21
|
+
def __call__(self, in_obj):
|
|
22
|
+
self._output_types = in_obj.op.output_types
|
|
23
|
+
return self.new_tileable([in_obj], kws=[in_obj.params])
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TensorRebalance(RebalanceMixin, TensorOperatorMixin, TensorOperator):
|
|
27
|
+
_op_type_ = opcodes.REBALANCE
|
|
28
|
+
|
|
29
|
+
axis = Int64Field("axis", default=None)
|
|
30
|
+
factor = Float64Field("factor", default=None)
|
|
31
|
+
num_partitions = Int64Field("num_partitions", default=None)
|
|
32
|
+
|
|
33
|
+
def __init__(self, output_types=None, **kw):
|
|
34
|
+
super().__init__(_output_types=output_types, **kw)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def rebalance(tensor, axis=0, factor=None, num_partitions=None):
|
|
38
|
+
"""
|
|
39
|
+
Make data more balanced across entire cluster.
|
|
40
|
+
|
|
41
|
+
Parameters
|
|
42
|
+
----------
|
|
43
|
+
axis : int
|
|
44
|
+
The axis to rebalance.
|
|
45
|
+
factor : float
|
|
46
|
+
Specified so that number of chunks after balance is
|
|
47
|
+
total number of input chunks * factor.
|
|
48
|
+
num_partitions : int
|
|
49
|
+
Specified so the number of chunks are at most
|
|
50
|
+
num_partitions.
|
|
51
|
+
|
|
52
|
+
Returns
|
|
53
|
+
-------
|
|
54
|
+
Tensor
|
|
55
|
+
Result of tensor after rebalanced.
|
|
56
|
+
"""
|
|
57
|
+
if num_partitions is None and factor is None:
|
|
58
|
+
raise ValueError("Need to specify num_partitions or factor")
|
|
59
|
+
if num_partitions is not None and factor is not None:
|
|
60
|
+
raise ValueError(
|
|
61
|
+
"num_partitions and factor cannot be specified at the same time"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
op = TensorRebalance(axis=axis, factor=factor, num_partitions=num_partitions)
|
|
65
|
+
return op(tensor)
|
|
@@ -0,0 +1,32 @@
|
|
|
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 .fft import TensorFFT, fft
|
|
16
|
+
from .fft2 import TensorFFT2, fft2
|
|
17
|
+
from .fftfreq import TensorFFTFreq, fftfreq
|
|
18
|
+
from .fftn import TensorFFTN, fftn
|
|
19
|
+
from .fftshift import TensorFFTShift, fftshift
|
|
20
|
+
from .hfft import TensorHFFT, hfft
|
|
21
|
+
from .ifft import TensorIFFT, ifft
|
|
22
|
+
from .ifft2 import TensorIFFT2, ifft2
|
|
23
|
+
from .ifftn import TensorIFFTN, ifftn
|
|
24
|
+
from .ifftshift import TensorIFFTShift, ifftshift
|
|
25
|
+
from .ihfft import TensorIHFFT, ihfft
|
|
26
|
+
from .irfft import TensorIRFFT, irfft
|
|
27
|
+
from .irfft2 import TensorIRFFT2, irfft2
|
|
28
|
+
from .irfftn import TensorIRFFTN, irfftn
|
|
29
|
+
from .rfft import TensorRFFT, rfft
|
|
30
|
+
from .rfft2 import TensorRFFT2, rfft2
|
|
31
|
+
from .rfftfreq import TensorRFFTFreq, rfftfreq
|
|
32
|
+
from .rfftn import TensorRFFTN, rfftn
|