maxframe 1.3.1__cp311-cp311-win32.whl → 2.0.0__cp311-cp311-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/_utils.cp311-win32.pyd +0 -0
- maxframe/_utils.pyi +21 -0
- maxframe/_utils.pyx +4 -3
- maxframe/codegen/__init__.py +27 -0
- maxframe/{codegen.py → codegen/core.py} +49 -43
- maxframe/codegen/spe/__init__.py +16 -0
- maxframe/codegen/spe/core.py +307 -0
- maxframe/codegen/spe/dataframe/__init__.py +37 -0
- maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +53 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +194 -0
- maxframe/codegen/spe/dataframe/accessors/list_.py +80 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +84 -0
- maxframe/codegen/spe/dataframe/datasource.py +181 -0
- maxframe/codegen/spe/dataframe/datastore.py +204 -0
- maxframe/codegen/spe/dataframe/extensions.py +63 -0
- maxframe/codegen/spe/dataframe/fetch.py +26 -0
- maxframe/codegen/spe/dataframe/groupby.py +224 -0
- maxframe/codegen/spe/dataframe/indexing.py +238 -0
- maxframe/codegen/spe/dataframe/merge.py +73 -0
- maxframe/codegen/spe/dataframe/misc.py +286 -0
- maxframe/codegen/spe/dataframe/missing.py +64 -0
- maxframe/codegen/spe/dataframe/reduction.py +160 -0
- maxframe/codegen/spe/dataframe/sort.py +83 -0
- maxframe/codegen/spe/dataframe/statistics.py +46 -0
- maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +310 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +137 -0
- maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +76 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
- maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +234 -0
- maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
- maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
- maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
- maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
- maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +225 -0
- maxframe/codegen/spe/dataframe/tests/test_merge.py +400 -0
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +104 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +159 -0
- maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
- maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
- maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
- maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
- maxframe/codegen/spe/dataframe/tseries.py +46 -0
- maxframe/codegen/spe/dataframe/udf.py +62 -0
- maxframe/codegen/spe/dataframe/value_counts.py +31 -0
- maxframe/codegen/spe/dataframe/window.py +65 -0
- maxframe/codegen/spe/learn/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +160 -0
- maxframe/codegen/spe/learn/contrib/models.py +41 -0
- maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
- maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
- maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
- maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +98 -0
- maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
- maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
- maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
- maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
- maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
- maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
- maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
- maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
- maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
- maxframe/codegen/spe/learn/utils/__init__.py +15 -0
- maxframe/codegen/spe/learn/utils/checks.py +55 -0
- maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
- maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
- maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
- maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
- maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
- maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
- maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
- maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
- maxframe/codegen/spe/learn/utils/validation.py +35 -0
- maxframe/codegen/spe/objects.py +26 -0
- maxframe/codegen/spe/remote.py +29 -0
- maxframe/codegen/spe/tensor/__init__.py +28 -0
- maxframe/codegen/spe/tensor/arithmetic.py +95 -0
- maxframe/codegen/spe/tensor/core.py +41 -0
- maxframe/codegen/spe/tensor/datasource.py +165 -0
- maxframe/codegen/spe/tensor/extensions.py +35 -0
- maxframe/codegen/spe/tensor/fetch.py +26 -0
- maxframe/codegen/spe/tensor/indexing.py +63 -0
- maxframe/codegen/spe/tensor/linalg.py +63 -0
- maxframe/codegen/spe/tensor/merge.py +31 -0
- maxframe/codegen/spe/tensor/misc.py +121 -0
- maxframe/codegen/spe/tensor/random.py +29 -0
- maxframe/codegen/spe/tensor/reduction.py +39 -0
- maxframe/codegen/spe/tensor/reshape.py +26 -0
- maxframe/codegen/spe/tensor/sort.py +42 -0
- maxframe/codegen/spe/tensor/special.py +35 -0
- maxframe/codegen/spe/tensor/statistics.py +24 -0
- maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
- maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
- maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
- maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
- maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +38 -0
- maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_misc.py +94 -0
- maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
- maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
- maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
- maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
- maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +29 -0
- maxframe/codegen/spe/tests/__init__.py +13 -0
- maxframe/codegen/spe/tests/test_remote.py +29 -0
- maxframe/codegen/spe/tests/test_spe_codegen.py +141 -0
- maxframe/codegen/spe/utils.py +54 -0
- maxframe/codegen/tests/__init__.py +13 -0
- maxframe/{tests → codegen/tests}/test_codegen.py +3 -5
- maxframe/config/__init__.py +1 -1
- maxframe/config/config.py +50 -23
- maxframe/config/tests/test_config.py +4 -12
- maxframe/config/validators.py +5 -0
- maxframe/conftest.py +38 -10
- maxframe/core/__init__.py +1 -0
- maxframe/core/context.py +110 -0
- maxframe/core/entity/__init__.py +1 -0
- maxframe/core/entity/core.py +0 -7
- maxframe/core/entity/objects.py +19 -5
- maxframe/core/entity/output_types.py +11 -0
- maxframe/core/entity/tests/test_objects.py +11 -12
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/entity/utils.py +15 -0
- maxframe/core/graph/__init__.py +6 -1
- maxframe/core/graph/builder/base.py +5 -1
- maxframe/core/graph/core.cp311-win32.pyd +0 -0
- maxframe/core/graph/core.pyx +17 -6
- maxframe/core/graph/entity.py +18 -6
- maxframe/core/operator/__init__.py +8 -3
- maxframe/core/operator/base.py +35 -12
- maxframe/core/operator/core.py +37 -14
- maxframe/core/operator/fetch.py +5 -18
- maxframe/core/operator/objects.py +0 -20
- maxframe/core/operator/shuffle.py +6 -72
- maxframe/dataframe/__init__.py +1 -0
- maxframe/dataframe/accessors/datetime_/core.py +7 -4
- maxframe/dataframe/accessors/string_/core.py +9 -6
- maxframe/dataframe/arithmetic/core.py +31 -20
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +6 -0
- maxframe/dataframe/core.py +98 -91
- maxframe/dataframe/datasource/core.py +8 -1
- maxframe/dataframe/datasource/date_range.py +8 -0
- maxframe/dataframe/datasource/from_index.py +9 -5
- maxframe/dataframe/datasource/from_records.py +9 -2
- maxframe/dataframe/datasource/from_tensor.py +32 -21
- maxframe/dataframe/datasource/read_csv.py +8 -2
- maxframe/dataframe/datasource/read_odps_query.py +109 -19
- maxframe/dataframe/datasource/read_odps_table.py +20 -5
- maxframe/dataframe/datasource/read_parquet.py +8 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +80 -1
- maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
- maxframe/dataframe/datastore/to_csv.py +7 -3
- maxframe/dataframe/datastore/to_odps.py +42 -6
- maxframe/dataframe/extensions/__init__.py +6 -1
- maxframe/dataframe/extensions/apply_chunk.py +96 -136
- maxframe/dataframe/extensions/flatjson.py +3 -2
- maxframe/dataframe/extensions/flatmap.py +15 -7
- maxframe/dataframe/fetch/core.py +12 -1
- maxframe/dataframe/groupby/__init__.py +7 -0
- maxframe/dataframe/groupby/aggregation.py +9 -8
- maxframe/dataframe/groupby/apply.py +50 -74
- maxframe/dataframe/groupby/apply_chunk.py +393 -0
- maxframe/dataframe/groupby/core.py +80 -17
- maxframe/dataframe/groupby/extensions.py +26 -0
- maxframe/dataframe/groupby/fill.py +9 -4
- maxframe/dataframe/groupby/sample.py +7 -7
- maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
- maxframe/dataframe/groupby/transform.py +57 -54
- maxframe/dataframe/indexing/align.py +7 -6
- maxframe/dataframe/indexing/getitem.py +9 -8
- maxframe/dataframe/indexing/iloc.py +28 -23
- maxframe/dataframe/indexing/insert.py +7 -3
- maxframe/dataframe/indexing/loc.py +9 -8
- maxframe/dataframe/indexing/reindex.py +36 -30
- maxframe/dataframe/indexing/rename_axis.py +18 -10
- maxframe/dataframe/indexing/reset_index.py +0 -2
- maxframe/dataframe/indexing/sample.py +13 -9
- maxframe/dataframe/indexing/set_axis.py +9 -6
- maxframe/dataframe/indexing/setitem.py +8 -5
- maxframe/dataframe/indexing/where.py +12 -9
- maxframe/dataframe/merge/__init__.py +0 -1
- maxframe/dataframe/merge/concat.py +10 -31
- maxframe/dataframe/merge/merge.py +2 -24
- maxframe/dataframe/misc/__init__.py +6 -0
- maxframe/dataframe/misc/_duplicate.py +7 -3
- maxframe/dataframe/misc/apply.py +106 -139
- maxframe/dataframe/misc/astype.py +3 -2
- maxframe/dataframe/misc/case_when.py +11 -7
- maxframe/dataframe/misc/cut.py +11 -10
- maxframe/dataframe/misc/describe.py +7 -3
- maxframe/dataframe/misc/drop.py +13 -11
- maxframe/dataframe/misc/eval.py +0 -2
- maxframe/dataframe/misc/get_dummies.py +78 -49
- maxframe/dataframe/misc/isin.py +13 -10
- maxframe/dataframe/misc/map.py +21 -6
- maxframe/dataframe/misc/melt.py +8 -1
- maxframe/dataframe/misc/pivot.py +232 -0
- maxframe/dataframe/misc/pivot_table.py +52 -40
- maxframe/dataframe/misc/rechunk.py +59 -0
- maxframe/dataframe/misc/shift.py +7 -4
- maxframe/dataframe/misc/stack.py +5 -3
- maxframe/dataframe/misc/tests/test_misc.py +167 -1
- maxframe/dataframe/misc/transform.py +63 -65
- maxframe/dataframe/misc/value_counts.py +7 -4
- maxframe/dataframe/missing/dropna.py +16 -7
- maxframe/dataframe/missing/fillna.py +18 -10
- maxframe/dataframe/missing/replace.py +10 -6
- maxframe/dataframe/missing/tests/test_missing.py +2 -2
- maxframe/dataframe/operators.py +1 -27
- maxframe/dataframe/reduction/aggregation.py +65 -3
- maxframe/dataframe/reduction/core.py +3 -1
- maxframe/dataframe/reduction/median.py +1 -1
- maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
- maxframe/dataframe/reduction/unique.py +53 -7
- maxframe/dataframe/statistics/corr.py +9 -6
- maxframe/dataframe/statistics/quantile.py +9 -6
- maxframe/dataframe/tseries/to_datetime.py +6 -4
- maxframe/dataframe/utils.py +219 -31
- maxframe/dataframe/window/rolling.py +7 -4
- maxframe/env.py +1 -0
- maxframe/errors.py +9 -0
- maxframe/extension.py +13 -2
- maxframe/io/objects/core.py +67 -51
- maxframe/io/objects/tensor.py +73 -17
- maxframe/io/objects/tests/test_object_io.py +10 -55
- maxframe/io/odpsio/arrow.py +15 -2
- maxframe/io/odpsio/schema.py +43 -13
- maxframe/io/odpsio/tableio.py +63 -11
- maxframe/io/odpsio/tests/test_arrow.py +1 -2
- maxframe/io/odpsio/tests/test_schema.py +114 -1
- maxframe/io/odpsio/tests/test_tableio.py +42 -0
- maxframe/io/odpsio/tests/test_volumeio.py +21 -58
- maxframe/io/odpsio/volumeio.py +23 -8
- maxframe/learn/__init__.py +2 -2
- maxframe/learn/contrib/__init__.py +2 -2
- maxframe/learn/contrib/graph/connected_components.py +2 -1
- maxframe/learn/contrib/lightgbm/__init__.py +33 -0
- maxframe/learn/contrib/lightgbm/_predict.py +138 -0
- maxframe/learn/contrib/lightgbm/_train.py +163 -0
- maxframe/learn/contrib/lightgbm/callback.py +114 -0
- maxframe/learn/contrib/lightgbm/classifier.py +199 -0
- maxframe/learn/contrib/lightgbm/core.py +372 -0
- maxframe/learn/contrib/lightgbm/dataset.py +153 -0
- maxframe/learn/contrib/lightgbm/regressor.py +29 -0
- maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
- maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
- maxframe/learn/contrib/models.py +38 -9
- maxframe/learn/contrib/utils.py +55 -0
- maxframe/learn/contrib/xgboost/callback.py +86 -0
- maxframe/learn/contrib/xgboost/classifier.py +26 -30
- maxframe/learn/contrib/xgboost/core.py +54 -42
- maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
- maxframe/learn/contrib/xgboost/predict.py +16 -9
- maxframe/learn/contrib/xgboost/regressor.py +28 -27
- maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
- maxframe/learn/contrib/xgboost/train.py +59 -16
- maxframe/learn/core.py +252 -0
- maxframe/learn/datasets/__init__.py +20 -0
- maxframe/learn/datasets/samples_generator.py +628 -0
- maxframe/learn/linear_model/__init__.py +15 -0
- maxframe/learn/linear_model/_base.py +163 -0
- maxframe/learn/linear_model/_lin_reg.py +175 -0
- maxframe/learn/metrics/__init__.py +25 -0
- maxframe/learn/metrics/_check_targets.py +95 -0
- maxframe/learn/metrics/_classification.py +1121 -0
- maxframe/learn/metrics/_regression.py +256 -0
- maxframe/learn/model_selection/__init__.py +15 -0
- maxframe/learn/model_selection/_split.py +451 -0
- maxframe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/learn/model_selection/tests/test_split.py +156 -0
- maxframe/learn/preprocessing/__init__.py +16 -0
- maxframe/learn/preprocessing/_data/__init__.py +17 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
- maxframe/learn/preprocessing/_data/normalize.py +127 -0
- maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
- maxframe/learn/preprocessing/_data/utils.py +79 -0
- maxframe/learn/preprocessing/_label/__init__.py +16 -0
- maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
- maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
- maxframe/learn/utils/__init__.py +4 -0
- maxframe/learn/utils/_encode.py +314 -0
- maxframe/learn/utils/checks.py +161 -0
- maxframe/learn/utils/core.py +33 -0
- maxframe/learn/utils/extmath.py +176 -0
- maxframe/learn/utils/multiclass.py +292 -0
- maxframe/learn/utils/shuffle.py +114 -0
- maxframe/learn/utils/sparsefuncs.py +87 -0
- maxframe/learn/utils/validation.py +775 -0
- maxframe/lib/__init__.py +0 -2
- maxframe/lib/compat.py +145 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/mmh3.cp311-win32.pyd +0 -0
- maxframe/lib/sparse/__init__.py +10 -15
- maxframe/lib/sparse/array.py +45 -33
- maxframe/lib/sparse/core.py +0 -2
- maxframe/lib/sparse/linalg.py +31 -0
- maxframe/lib/sparse/matrix.py +5 -2
- maxframe/lib/sparse/tests/__init__.py +0 -2
- maxframe/lib/sparse/tests/test_sparse.py +53 -53
- maxframe/lib/sparse/vector.py +0 -2
- maxframe/mixin.py +59 -2
- maxframe/opcodes.py +13 -5
- maxframe/protocol.py +67 -14
- maxframe/remote/core.py +16 -14
- maxframe/remote/run_script.py +6 -3
- maxframe/serialization/__init__.py +2 -0
- maxframe/serialization/core.cp311-win32.pyd +0 -0
- maxframe/serialization/core.pxd +3 -0
- maxframe/serialization/core.pyi +3 -1
- maxframe/serialization/core.pyx +82 -4
- maxframe/serialization/pandas.py +5 -1
- maxframe/serialization/serializables/core.py +6 -5
- maxframe/serialization/serializables/field.py +2 -2
- maxframe/serialization/serializables/tests/test_field_type.py +3 -5
- maxframe/serialization/tests/test_serial.py +27 -0
- maxframe/session.py +4 -71
- maxframe/sperunner.py +165 -0
- maxframe/tensor/__init__.py +35 -2
- maxframe/tensor/arithmetic/__init__.py +2 -4
- maxframe/tensor/arithmetic/abs.py +0 -2
- maxframe/tensor/arithmetic/absolute.py +0 -2
- maxframe/tensor/arithmetic/add.py +34 -4
- maxframe/tensor/arithmetic/angle.py +0 -2
- maxframe/tensor/arithmetic/arccos.py +1 -4
- maxframe/tensor/arithmetic/arccosh.py +1 -3
- maxframe/tensor/arithmetic/arcsin.py +0 -2
- maxframe/tensor/arithmetic/arcsinh.py +0 -2
- maxframe/tensor/arithmetic/arctan.py +0 -2
- maxframe/tensor/arithmetic/arctan2.py +0 -2
- maxframe/tensor/arithmetic/arctanh.py +0 -2
- maxframe/tensor/arithmetic/around.py +0 -2
- maxframe/tensor/arithmetic/bitand.py +0 -2
- maxframe/tensor/arithmetic/bitor.py +1 -3
- maxframe/tensor/arithmetic/bitxor.py +1 -3
- maxframe/tensor/arithmetic/cbrt.py +0 -2
- maxframe/tensor/arithmetic/ceil.py +0 -2
- maxframe/tensor/arithmetic/clip.py +13 -13
- maxframe/tensor/arithmetic/conj.py +0 -2
- maxframe/tensor/arithmetic/copysign.py +0 -2
- maxframe/tensor/arithmetic/core.py +47 -39
- maxframe/tensor/arithmetic/cos.py +1 -3
- maxframe/tensor/arithmetic/cosh.py +0 -2
- maxframe/tensor/arithmetic/deg2rad.py +0 -2
- maxframe/tensor/arithmetic/degrees.py +0 -2
- maxframe/tensor/arithmetic/divide.py +0 -2
- maxframe/tensor/arithmetic/equal.py +0 -2
- maxframe/tensor/arithmetic/exp.py +1 -3
- maxframe/tensor/arithmetic/exp2.py +0 -2
- maxframe/tensor/arithmetic/expm1.py +0 -2
- maxframe/tensor/arithmetic/fabs.py +0 -2
- maxframe/tensor/arithmetic/fix.py +0 -2
- maxframe/tensor/arithmetic/float_power.py +0 -2
- maxframe/tensor/arithmetic/floor.py +0 -2
- maxframe/tensor/arithmetic/floordiv.py +0 -2
- maxframe/tensor/arithmetic/fmax.py +0 -2
- maxframe/tensor/arithmetic/fmin.py +0 -2
- maxframe/tensor/arithmetic/fmod.py +0 -2
- maxframe/tensor/arithmetic/frexp.py +6 -2
- maxframe/tensor/arithmetic/greater.py +0 -2
- maxframe/tensor/arithmetic/greater_equal.py +0 -2
- maxframe/tensor/arithmetic/hypot.py +0 -2
- maxframe/tensor/arithmetic/i0.py +1 -3
- maxframe/tensor/arithmetic/imag.py +0 -2
- maxframe/tensor/arithmetic/invert.py +1 -3
- maxframe/tensor/arithmetic/isclose.py +0 -2
- maxframe/tensor/arithmetic/iscomplex.py +0 -2
- maxframe/tensor/arithmetic/isfinite.py +1 -3
- maxframe/tensor/arithmetic/isinf.py +0 -2
- maxframe/tensor/arithmetic/isnan.py +0 -2
- maxframe/tensor/arithmetic/isreal.py +0 -2
- maxframe/tensor/arithmetic/ldexp.py +0 -2
- maxframe/tensor/arithmetic/less.py +0 -2
- maxframe/tensor/arithmetic/less_equal.py +0 -2
- maxframe/tensor/arithmetic/log.py +1 -3
- maxframe/tensor/arithmetic/log10.py +1 -3
- maxframe/tensor/arithmetic/log1p.py +1 -3
- maxframe/tensor/arithmetic/log2.py +1 -3
- maxframe/tensor/arithmetic/logaddexp.py +0 -2
- maxframe/tensor/arithmetic/logaddexp2.py +0 -2
- maxframe/tensor/arithmetic/logical_and.py +0 -2
- maxframe/tensor/arithmetic/logical_not.py +1 -3
- maxframe/tensor/arithmetic/logical_or.py +0 -2
- maxframe/tensor/arithmetic/logical_xor.py +0 -2
- maxframe/tensor/arithmetic/lshift.py +0 -2
- maxframe/tensor/arithmetic/maximum.py +0 -2
- maxframe/tensor/arithmetic/minimum.py +0 -2
- maxframe/tensor/arithmetic/mod.py +0 -2
- maxframe/tensor/arithmetic/modf.py +6 -2
- maxframe/tensor/arithmetic/multiply.py +37 -4
- maxframe/tensor/arithmetic/nan_to_num.py +0 -2
- maxframe/tensor/arithmetic/negative.py +0 -2
- maxframe/tensor/arithmetic/nextafter.py +0 -2
- maxframe/tensor/arithmetic/not_equal.py +0 -2
- maxframe/tensor/arithmetic/positive.py +0 -2
- maxframe/tensor/arithmetic/power.py +0 -2
- maxframe/tensor/arithmetic/rad2deg.py +0 -2
- maxframe/tensor/arithmetic/radians.py +0 -2
- maxframe/tensor/arithmetic/real.py +0 -2
- maxframe/tensor/arithmetic/reciprocal.py +5 -3
- maxframe/tensor/arithmetic/rint.py +1 -3
- maxframe/tensor/arithmetic/rshift.py +0 -2
- maxframe/tensor/arithmetic/setimag.py +0 -2
- maxframe/tensor/arithmetic/setreal.py +0 -2
- maxframe/tensor/arithmetic/sign.py +0 -2
- maxframe/tensor/arithmetic/signbit.py +0 -2
- maxframe/tensor/arithmetic/sin.py +0 -2
- maxframe/tensor/arithmetic/sinc.py +1 -3
- maxframe/tensor/arithmetic/sinh.py +0 -2
- maxframe/tensor/arithmetic/spacing.py +0 -2
- maxframe/tensor/arithmetic/sqrt.py +0 -2
- maxframe/tensor/arithmetic/square.py +0 -2
- maxframe/tensor/arithmetic/subtract.py +4 -2
- maxframe/tensor/arithmetic/tan.py +0 -2
- maxframe/tensor/arithmetic/tanh.py +0 -2
- maxframe/tensor/arithmetic/tests/__init__.py +0 -2
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
- maxframe/tensor/arithmetic/truediv.py +0 -2
- maxframe/tensor/arithmetic/trunc.py +0 -2
- maxframe/tensor/arithmetic/utils.py +32 -6
- maxframe/tensor/array_utils.py +3 -25
- maxframe/tensor/core.py +6 -6
- maxframe/tensor/datasource/__init__.py +10 -2
- maxframe/tensor/datasource/arange.py +0 -2
- maxframe/tensor/datasource/array.py +3 -22
- maxframe/tensor/datasource/core.py +15 -10
- maxframe/tensor/datasource/diag.py +140 -0
- maxframe/tensor/datasource/diagflat.py +69 -0
- maxframe/tensor/datasource/empty.py +0 -2
- maxframe/tensor/datasource/eye.py +95 -0
- maxframe/tensor/datasource/from_dataframe.py +0 -2
- maxframe/tensor/datasource/from_dense.py +0 -17
- maxframe/tensor/datasource/from_sparse.py +0 -2
- maxframe/tensor/datasource/full.py +0 -2
- maxframe/tensor/datasource/identity.py +54 -0
- maxframe/tensor/datasource/indices.py +115 -0
- maxframe/tensor/datasource/linspace.py +140 -0
- maxframe/tensor/datasource/meshgrid.py +135 -0
- maxframe/tensor/datasource/ones.py +8 -3
- maxframe/tensor/datasource/tests/test_datasource.py +32 -1
- maxframe/tensor/datasource/tri_array.py +107 -0
- maxframe/tensor/datasource/zeros.py +7 -3
- maxframe/tensor/extensions/__init__.py +31 -0
- maxframe/tensor/extensions/accessor.py +25 -0
- maxframe/tensor/extensions/apply_chunk.py +137 -0
- maxframe/tensor/indexing/__init__.py +1 -1
- maxframe/tensor/indexing/choose.py +8 -6
- maxframe/tensor/indexing/compress.py +0 -2
- maxframe/tensor/indexing/extract.py +0 -2
- maxframe/tensor/indexing/fill_diagonal.py +9 -6
- maxframe/tensor/indexing/flatnonzero.py +1 -3
- maxframe/tensor/indexing/getitem.py +10 -43
- maxframe/tensor/indexing/nonzero.py +2 -4
- maxframe/tensor/indexing/setitem.py +19 -9
- maxframe/tensor/indexing/slice.py +6 -3
- maxframe/tensor/indexing/take.py +0 -2
- maxframe/tensor/indexing/tests/__init__.py +0 -2
- maxframe/tensor/indexing/tests/test_indexing.py +0 -2
- maxframe/tensor/indexing/unravel_index.py +6 -6
- maxframe/tensor/lib/__init__.py +16 -0
- maxframe/tensor/lib/index_tricks.py +404 -0
- maxframe/tensor/linalg/__init__.py +36 -0
- maxframe/tensor/linalg/dot.py +145 -0
- maxframe/tensor/linalg/inner.py +36 -0
- maxframe/tensor/linalg/inv.py +83 -0
- maxframe/tensor/linalg/lu.py +115 -0
- maxframe/tensor/linalg/matmul.py +225 -0
- maxframe/tensor/linalg/qr.py +124 -0
- maxframe/tensor/linalg/solve_triangular.py +103 -0
- maxframe/tensor/linalg/svd.py +167 -0
- maxframe/tensor/linalg/tensordot.py +213 -0
- maxframe/tensor/linalg/vdot.py +73 -0
- maxframe/tensor/merge/__init__.py +4 -0
- maxframe/tensor/merge/append.py +74 -0
- maxframe/tensor/merge/column_stack.py +63 -0
- maxframe/tensor/merge/concatenate.py +3 -2
- maxframe/tensor/merge/dstack.py +71 -0
- maxframe/tensor/merge/hstack.py +70 -0
- maxframe/tensor/merge/stack.py +0 -2
- maxframe/tensor/merge/tests/test_merge.py +0 -2
- maxframe/tensor/misc/__init__.py +18 -5
- maxframe/tensor/misc/astype.py +10 -8
- maxframe/tensor/misc/broadcast_to.py +1 -1
- maxframe/tensor/misc/copy.py +64 -0
- maxframe/tensor/misc/diff.py +115 -0
- maxframe/tensor/misc/flatten.py +63 -0
- maxframe/tensor/misc/in1d.py +94 -0
- maxframe/tensor/misc/isin.py +130 -0
- maxframe/tensor/misc/ndim.py +53 -0
- maxframe/tensor/misc/ravel.py +0 -2
- maxframe/tensor/misc/repeat.py +129 -0
- maxframe/tensor/misc/searchsorted.py +147 -0
- maxframe/tensor/misc/setdiff1d.py +58 -0
- maxframe/tensor/misc/squeeze.py +117 -0
- maxframe/tensor/misc/swapaxes.py +113 -0
- maxframe/tensor/misc/tests/test_misc.py +0 -2
- maxframe/tensor/misc/transpose.py +8 -4
- maxframe/tensor/misc/trapezoid.py +123 -0
- maxframe/tensor/misc/unique.py +0 -1
- maxframe/tensor/misc/where.py +10 -8
- maxframe/tensor/operators.py +0 -34
- maxframe/tensor/random/__init__.py +3 -5
- maxframe/tensor/random/binomial.py +0 -2
- maxframe/tensor/random/bytes.py +0 -2
- maxframe/tensor/random/chisquare.py +0 -2
- maxframe/tensor/random/choice.py +9 -8
- maxframe/tensor/random/core.py +20 -5
- maxframe/tensor/random/dirichlet.py +0 -2
- maxframe/tensor/random/exponential.py +0 -2
- maxframe/tensor/random/f.py +2 -4
- maxframe/tensor/random/gamma.py +0 -2
- maxframe/tensor/random/geometric.py +0 -2
- maxframe/tensor/random/gumbel.py +0 -2
- maxframe/tensor/random/hypergeometric.py +0 -2
- maxframe/tensor/random/laplace.py +2 -4
- maxframe/tensor/random/logistic.py +0 -2
- maxframe/tensor/random/lognormal.py +0 -2
- maxframe/tensor/random/logseries.py +0 -2
- maxframe/tensor/random/multinomial.py +0 -2
- maxframe/tensor/random/multivariate_normal.py +0 -2
- maxframe/tensor/random/negative_binomial.py +0 -2
- maxframe/tensor/random/noncentral_chisquare.py +0 -2
- maxframe/tensor/random/noncentral_f.py +1 -3
- maxframe/tensor/random/normal.py +0 -2
- maxframe/tensor/random/pareto.py +0 -2
- maxframe/tensor/random/permutation.py +6 -3
- maxframe/tensor/random/poisson.py +0 -2
- maxframe/tensor/random/power.py +0 -2
- maxframe/tensor/random/rand.py +0 -2
- maxframe/tensor/random/randint.py +0 -2
- maxframe/tensor/random/randn.py +0 -2
- maxframe/tensor/random/random_integers.py +0 -2
- maxframe/tensor/random/random_sample.py +0 -2
- maxframe/tensor/random/rayleigh.py +0 -2
- maxframe/tensor/random/standard_cauchy.py +0 -2
- maxframe/tensor/random/standard_exponential.py +0 -2
- maxframe/tensor/random/standard_gamma.py +0 -2
- maxframe/tensor/random/standard_normal.py +0 -2
- maxframe/tensor/random/standard_t.py +0 -2
- maxframe/tensor/random/tests/__init__.py +0 -2
- maxframe/tensor/random/tests/test_random.py +0 -2
- maxframe/tensor/random/triangular.py +0 -2
- maxframe/tensor/random/uniform.py +0 -2
- maxframe/tensor/random/vonmises.py +0 -2
- maxframe/tensor/random/wald.py +0 -2
- maxframe/tensor/random/weibull.py +0 -2
- maxframe/tensor/random/zipf.py +0 -2
- maxframe/tensor/reduction/__init__.py +0 -2
- maxframe/tensor/reduction/all.py +0 -2
- maxframe/tensor/reduction/allclose.py +0 -2
- maxframe/tensor/reduction/any.py +0 -2
- maxframe/tensor/reduction/argmax.py +1 -3
- maxframe/tensor/reduction/argmin.py +1 -3
- maxframe/tensor/reduction/array_equal.py +0 -2
- maxframe/tensor/reduction/core.py +0 -2
- maxframe/tensor/reduction/count_nonzero.py +0 -2
- maxframe/tensor/reduction/cumprod.py +0 -2
- maxframe/tensor/reduction/cumsum.py +0 -2
- maxframe/tensor/reduction/max.py +0 -2
- maxframe/tensor/reduction/mean.py +0 -2
- maxframe/tensor/reduction/min.py +0 -2
- maxframe/tensor/reduction/nanargmax.py +0 -2
- maxframe/tensor/reduction/nanargmin.py +0 -2
- maxframe/tensor/reduction/nancumprod.py +0 -2
- maxframe/tensor/reduction/nancumsum.py +0 -2
- maxframe/tensor/reduction/nanmax.py +0 -2
- maxframe/tensor/reduction/nanmean.py +0 -2
- maxframe/tensor/reduction/nanmin.py +0 -2
- maxframe/tensor/reduction/nanprod.py +0 -2
- maxframe/tensor/reduction/nanstd.py +0 -2
- maxframe/tensor/reduction/nansum.py +0 -2
- maxframe/tensor/reduction/nanvar.py +0 -2
- maxframe/tensor/reduction/prod.py +0 -2
- maxframe/tensor/reduction/std.py +0 -2
- maxframe/tensor/reduction/sum.py +0 -2
- maxframe/tensor/reduction/tests/test_reduction.py +1 -4
- maxframe/tensor/reduction/var.py +0 -2
- maxframe/tensor/reshape/__init__.py +0 -2
- maxframe/tensor/reshape/reshape.py +6 -5
- maxframe/tensor/reshape/tests/__init__.py +0 -2
- maxframe/tensor/reshape/tests/test_reshape.py +0 -2
- maxframe/tensor/sort/__init__.py +16 -0
- maxframe/tensor/sort/argsort.py +150 -0
- maxframe/tensor/sort/sort.py +295 -0
- maxframe/tensor/special/__init__.py +37 -0
- maxframe/tensor/special/core.py +38 -0
- maxframe/tensor/special/misc.py +142 -0
- maxframe/tensor/special/statistical.py +56 -0
- maxframe/tensor/statistics/__init__.py +5 -0
- maxframe/tensor/statistics/average.py +143 -0
- maxframe/tensor/statistics/bincount.py +133 -0
- maxframe/tensor/statistics/quantile.py +10 -8
- maxframe/tensor/ufunc/__init__.py +0 -2
- maxframe/tensor/ufunc/ufunc.py +0 -2
- maxframe/tensor/utils.py +21 -3
- maxframe/tests/test_protocol.py +3 -3
- maxframe/tests/test_utils.py +210 -1
- maxframe/tests/utils.py +59 -1
- maxframe/udf.py +76 -6
- maxframe/utils.py +418 -17
- {maxframe-1.3.1.dist-info → maxframe-2.0.0.dist-info}/METADATA +4 -1
- maxframe-2.0.0.dist-info/RECORD +939 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0.dist-info}/WHEEL +1 -1
- maxframe_client/clients/framedriver.py +19 -3
- maxframe_client/fetcher.py +113 -6
- maxframe_client/session/odps.py +173 -38
- maxframe_client/session/task.py +3 -1
- maxframe_client/tests/test_session.py +41 -5
- maxframe-1.3.1.dist-info/RECORD +0 -705
- {maxframe-1.3.1.dist-info → maxframe-2.0.0.dist-info}/top_level.txt +0 -0
maxframe/utils.py
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import asyncio.events
|
|
16
16
|
import concurrent.futures
|
|
17
17
|
import contextvars
|
|
18
|
+
import copy
|
|
18
19
|
import dataclasses
|
|
19
20
|
import datetime
|
|
20
21
|
import enum
|
|
@@ -23,10 +24,12 @@ import importlib
|
|
|
23
24
|
import inspect
|
|
24
25
|
import io
|
|
25
26
|
import itertools
|
|
27
|
+
import logging
|
|
26
28
|
import numbers
|
|
27
29
|
import os
|
|
28
30
|
import pkgutil
|
|
29
31
|
import random
|
|
32
|
+
import re
|
|
30
33
|
import struct
|
|
31
34
|
import sys
|
|
32
35
|
import threading
|
|
@@ -88,6 +91,8 @@ get_user_call_point = get_user_call_point
|
|
|
88
91
|
_is_ci = (os.environ.get("CI") or "0").lower() in ("1", "true")
|
|
89
92
|
pd_release_version: Tuple[int] = parse_version(pd.__version__).release
|
|
90
93
|
|
|
94
|
+
logger = logging.getLogger(__name__)
|
|
95
|
+
|
|
91
96
|
try:
|
|
92
97
|
from pandas._libs import lib as _pd__libs_lib
|
|
93
98
|
from pandas._libs.lib import NoDefault, no_default
|
|
@@ -162,8 +167,15 @@ class AttributeDict(dict):
|
|
|
162
167
|
|
|
163
168
|
|
|
164
169
|
def on_serialize_shape(shape: Tuple[int]):
|
|
170
|
+
def _to_shape_num(x):
|
|
171
|
+
if np.isnan(x):
|
|
172
|
+
return -1
|
|
173
|
+
if isinstance(x, np.generic):
|
|
174
|
+
return x.item()
|
|
175
|
+
return x
|
|
176
|
+
|
|
165
177
|
if shape:
|
|
166
|
-
return tuple(
|
|
178
|
+
return tuple(_to_shape_num(s) for s in shape)
|
|
167
179
|
return shape
|
|
168
180
|
|
|
169
181
|
|
|
@@ -251,8 +263,14 @@ def copy_tileables(tileables: List[TileableType], **kwargs):
|
|
|
251
263
|
return op.new_tileables(inputs, kws=kws, output_limit=len(kws))
|
|
252
264
|
|
|
253
265
|
|
|
254
|
-
def
|
|
255
|
-
if
|
|
266
|
+
def make_dtype(dtype: Union[np.dtype, pd.api.extensions.ExtensionDtype]):
|
|
267
|
+
if dtype is None:
|
|
268
|
+
return None
|
|
269
|
+
elif (
|
|
270
|
+
isinstance(dtype, str) and dtype == "category"
|
|
271
|
+
) or pd.api.types.is_extension_array_dtype(dtype):
|
|
272
|
+
# return string dtype directly as legacy python version
|
|
273
|
+
# does not support ExtensionDtype
|
|
256
274
|
return dtype
|
|
257
275
|
elif dtype is pd.Timestamp or dtype is datetime.datetime:
|
|
258
276
|
return np.dtype("datetime64[ns]")
|
|
@@ -262,6 +280,28 @@ def get_dtype(dtype: Union[np.dtype, pd.api.extensions.ExtensionDtype]):
|
|
|
262
280
|
return np.dtype(dtype)
|
|
263
281
|
|
|
264
282
|
|
|
283
|
+
def make_dtypes(
|
|
284
|
+
dtypes: Union[
|
|
285
|
+
list, dict, str, np.dtype, pd.Series, pd.api.extensions.ExtensionDtype
|
|
286
|
+
],
|
|
287
|
+
make_series: bool = True,
|
|
288
|
+
):
|
|
289
|
+
if dtypes is None:
|
|
290
|
+
return None
|
|
291
|
+
elif isinstance(dtypes, np.dtype):
|
|
292
|
+
return dtypes
|
|
293
|
+
elif isinstance(dtypes, list):
|
|
294
|
+
val = [make_dtype(dt) for dt in dtypes]
|
|
295
|
+
return val if not make_series else pd.Series(val)
|
|
296
|
+
elif isinstance(dtypes, dict):
|
|
297
|
+
val = {k: make_dtype(v) for k, v in dtypes.items()}
|
|
298
|
+
return val if not make_series else pd.Series(val)
|
|
299
|
+
elif isinstance(dtypes, pd.Series):
|
|
300
|
+
return dtypes.map(make_dtype)
|
|
301
|
+
else:
|
|
302
|
+
return make_dtype(dtypes)
|
|
303
|
+
|
|
304
|
+
|
|
265
305
|
def serialize_serializable(serializable, compress: bool = False):
|
|
266
306
|
from .serialization import serialize
|
|
267
307
|
|
|
@@ -269,7 +309,14 @@ def serialize_serializable(serializable, compress: bool = False):
|
|
|
269
309
|
header, buffers = serialize(serializable)
|
|
270
310
|
buf_sizes = [getattr(buf, "nbytes", len(buf)) for buf in buffers]
|
|
271
311
|
header[0]["buf_sizes"] = buf_sizes
|
|
272
|
-
|
|
312
|
+
|
|
313
|
+
def encode_np_num(obj):
|
|
314
|
+
if isinstance(obj, np.generic) and obj.shape == () and not np.isnan(obj):
|
|
315
|
+
return obj.item()
|
|
316
|
+
return obj
|
|
317
|
+
|
|
318
|
+
s_header = msgpack.dumps(header, default=encode_np_num)
|
|
319
|
+
|
|
273
320
|
bio.write(struct.pack("<Q", len(s_header)))
|
|
274
321
|
bio.write(s_header)
|
|
275
322
|
for buf in buffers:
|
|
@@ -377,6 +424,12 @@ def format_timeout_params(timeout: TimeoutType) -> str:
|
|
|
377
424
|
return f"?wait=1&timeout={timeout}"
|
|
378
425
|
|
|
379
426
|
|
|
427
|
+
def unwrap_partial_function(func):
|
|
428
|
+
while isinstance(func, functools.partial):
|
|
429
|
+
func = func.func
|
|
430
|
+
return func
|
|
431
|
+
|
|
432
|
+
|
|
380
433
|
_PrimitiveType = TypeVar("_PrimitiveType")
|
|
381
434
|
|
|
382
435
|
|
|
@@ -430,6 +483,7 @@ class ToThreadMixin:
|
|
|
430
483
|
*args,
|
|
431
484
|
wait_on_cancel: bool = False,
|
|
432
485
|
timeout: float = None,
|
|
486
|
+
debug_task_name: Optional[str] = None,
|
|
433
487
|
**kwargs,
|
|
434
488
|
) -> _ToThreadRetType:
|
|
435
489
|
if not hasattr(self, "_pool"):
|
|
@@ -443,6 +497,31 @@ class ToThreadMixin:
|
|
|
443
497
|
func_call = functools.partial(ctx.run, func, *args, **kwargs)
|
|
444
498
|
fut = loop.run_in_executor(self._pool, func_call)
|
|
445
499
|
|
|
500
|
+
if loop.get_debug():
|
|
501
|
+
# create a task and mark its name
|
|
502
|
+
default_task_name = None
|
|
503
|
+
try:
|
|
504
|
+
unwrapped = unwrap_partial_function(func)
|
|
505
|
+
default_task_name = unwrapped.__qualname__
|
|
506
|
+
if getattr(unwrapped, "__module__", None):
|
|
507
|
+
default_task_name = unwrapped.__module__ + "#" + default_task_name
|
|
508
|
+
except: # noqa # pragma: no cover
|
|
509
|
+
try:
|
|
510
|
+
default_task_name = repr(func)
|
|
511
|
+
except: # noqa
|
|
512
|
+
pass
|
|
513
|
+
debug_task_name = debug_task_name or default_task_name
|
|
514
|
+
|
|
515
|
+
async def _wait_fut(aio_fut):
|
|
516
|
+
return await aio_fut
|
|
517
|
+
|
|
518
|
+
fut = asyncio.create_task(_wait_fut(fut))
|
|
519
|
+
if sys.version_info[:2] == (3, 7):
|
|
520
|
+
# In Python3.7 we should hack the task name to print it in debug logs.
|
|
521
|
+
setattr(fut, "fd_task_name", debug_task_name)
|
|
522
|
+
else:
|
|
523
|
+
fut.set_name(debug_task_name)
|
|
524
|
+
|
|
446
525
|
try:
|
|
447
526
|
coro = fut
|
|
448
527
|
if wait_on_cancel:
|
|
@@ -547,6 +626,21 @@ def estimate_pandas_size(
|
|
|
547
626
|
return sample_size * len(pd_obj) // max_samples
|
|
548
627
|
|
|
549
628
|
|
|
629
|
+
def estimate_table_size(odps_entry, full_table_name: str, partitions: List[str] = None):
|
|
630
|
+
try:
|
|
631
|
+
data_src = odps_entry.get_table(full_table_name)
|
|
632
|
+
if isinstance(partitions, str):
|
|
633
|
+
partitions = [partitions]
|
|
634
|
+
if not partitions:
|
|
635
|
+
size_mul = 1
|
|
636
|
+
else:
|
|
637
|
+
size_mul = len(partitions)
|
|
638
|
+
data_src = data_src.partitions[partitions[0]]
|
|
639
|
+
return size_mul * data_src.size
|
|
640
|
+
except:
|
|
641
|
+
return float("inf")
|
|
642
|
+
|
|
643
|
+
|
|
550
644
|
class ModulePlaceholder:
|
|
551
645
|
def __init__(self, mod_name: str):
|
|
552
646
|
self._mod_name = mod_name
|
|
@@ -677,7 +771,7 @@ def _get_func_token_values(func):
|
|
|
677
771
|
if hasattr(func, "__code__"):
|
|
678
772
|
tokens = [func.__code__.co_code]
|
|
679
773
|
if func.__closure__ is not None:
|
|
680
|
-
cvars = tuple(
|
|
774
|
+
cvars = tuple(x.cell_contents for x in func.__closure__)
|
|
681
775
|
tokens.append(cvars)
|
|
682
776
|
return tokens
|
|
683
777
|
else:
|
|
@@ -799,7 +893,8 @@ def adapt_docstring(doc: str) -> str:
|
|
|
799
893
|
line = line.replace("np.", "mt.").replace("pd.", "md.")
|
|
800
894
|
elif prev_prompt:
|
|
801
895
|
prev_prompt = False
|
|
802
|
-
if sp:
|
|
896
|
+
if sp and lines[-1].strip().strip("."):
|
|
897
|
+
# need prev line contains chars other than dots
|
|
803
898
|
lines[-1] += ".execute()"
|
|
804
899
|
lines.append(line)
|
|
805
900
|
return "\n".join(lines)
|
|
@@ -821,25 +916,101 @@ def stringify_path(path: Union[str, os.PathLike]) -> str:
|
|
|
821
916
|
|
|
822
917
|
_memory_size_indices = {"": 0, "k": 1, "m": 2, "g": 3, "t": 4}
|
|
823
918
|
|
|
919
|
+
_size_pattern = re.compile(r"^([0-9.-]+)\s*([a-z]*)$")
|
|
920
|
+
|
|
824
921
|
|
|
825
922
|
def parse_readable_size(value: Union[str, int, float]) -> Tuple[float, bool]:
|
|
923
|
+
"""
|
|
924
|
+
Parse a human-readable size representation into a numeric value.
|
|
925
|
+
|
|
926
|
+
This function converts various size formats into their corresponding
|
|
927
|
+
float values. It supports:
|
|
928
|
+
- Raw numbers (e.g., 1024)
|
|
929
|
+
- Percentages (e.g., "50%")
|
|
930
|
+
- Size units (e.g., "10KB", "5.5GB", "2MiB")
|
|
931
|
+
|
|
932
|
+
The function recognizes standard binary prefixes (K, M, G, T, etc.) and
|
|
933
|
+
handles different suffix variations (B, iB, etc.).
|
|
934
|
+
|
|
935
|
+
Parameters
|
|
936
|
+
----------
|
|
937
|
+
value : Union[str, int, float]
|
|
938
|
+
The size value to parse, can be a string, int, or float
|
|
939
|
+
|
|
940
|
+
Returns
|
|
941
|
+
-------
|
|
942
|
+
Tuple[float, bool]
|
|
943
|
+
A tuple of (parsed_value, is_percentage)
|
|
944
|
+
- parsed_value: The parsed numeric value
|
|
945
|
+
- is_percentage: True if the input was a percentage, False otherwise
|
|
946
|
+
"""
|
|
826
947
|
if isinstance(value, numbers.Number):
|
|
827
948
|
return float(value), False
|
|
828
949
|
|
|
950
|
+
if not isinstance(value, str):
|
|
951
|
+
raise TypeError(f"Expected string or number, got {type(value).__name__}")
|
|
952
|
+
|
|
829
953
|
value = value.strip().lower()
|
|
830
|
-
num_pos = 0
|
|
831
|
-
while num_pos < len(value) and value[num_pos] in "0123456789.-":
|
|
832
|
-
num_pos += 1
|
|
833
954
|
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
955
|
+
# Handle percentage values
|
|
956
|
+
if value.endswith("%"):
|
|
957
|
+
return float(value[:-1]) / 100, True
|
|
958
|
+
|
|
959
|
+
# Parse the value into numeric and unit parts
|
|
960
|
+
match = _size_pattern.match(value)
|
|
961
|
+
if not match:
|
|
962
|
+
raise ValueError(f"Cannot parse size value: {value}")
|
|
963
|
+
|
|
964
|
+
number_str, unit = match.groups()
|
|
965
|
+
|
|
966
|
+
# convert to float
|
|
967
|
+
number = float(number_str)
|
|
968
|
+
|
|
969
|
+
# if no unit, return the number
|
|
970
|
+
if not unit:
|
|
971
|
+
return number, False
|
|
972
|
+
|
|
973
|
+
# Validate the unit prefix
|
|
974
|
+
if unit[0] not in _memory_size_indices:
|
|
975
|
+
valid_prefixes = ", ".join(sorted(_memory_size_indices.keys()))
|
|
976
|
+
raise ValueError(
|
|
977
|
+
f"Unknown unit prefix: '{unit[0]}', valid prefixes are {valid_prefixes}"
|
|
978
|
+
)
|
|
838
979
|
|
|
980
|
+
# Check for valid unit suffix
|
|
981
|
+
if len(unit) > 1 and unit[1:] not in ("ib", "b", "i", ""):
|
|
982
|
+
raise ValueError(f"Invalid size unit suffix: {unit}")
|
|
983
|
+
|
|
984
|
+
is_binary_unit = "i" in unit.lower()
|
|
985
|
+
# calc the multiplier
|
|
986
|
+
base = 1024 if is_binary_unit else 1000
|
|
987
|
+
multiplier = base ** _memory_size_indices[unit[0]]
|
|
988
|
+
|
|
989
|
+
return number * multiplier, False
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
def parse_size_to_megabytes(
|
|
993
|
+
value: Union[str, int, float], default_number_unit: str = "GiB"
|
|
994
|
+
) -> float:
|
|
839
995
|
try:
|
|
840
|
-
|
|
841
|
-
except
|
|
842
|
-
|
|
996
|
+
value = float(value)
|
|
997
|
+
except BaseException:
|
|
998
|
+
pass
|
|
999
|
+
|
|
1000
|
+
if isinstance(value, numbers.Number):
|
|
1001
|
+
if not default_number_unit:
|
|
1002
|
+
raise ValueError(
|
|
1003
|
+
"`default_number_unit` must be provided when give a number value"
|
|
1004
|
+
)
|
|
1005
|
+
return parse_size_to_megabytes(
|
|
1006
|
+
f"{value}{default_number_unit}", default_number_unit
|
|
1007
|
+
)
|
|
1008
|
+
|
|
1009
|
+
bytes_number, is_percentage = parse_readable_size(value)
|
|
1010
|
+
if is_percentage:
|
|
1011
|
+
raise ValueError("Percentage size is not supported to parse")
|
|
1012
|
+
|
|
1013
|
+
return bytes_number / (1024**2) # convert to megabytes
|
|
843
1014
|
|
|
844
1015
|
|
|
845
1016
|
def remove_suffix(value: str, suffix: str) -> Tuple[str, bool]:
|
|
@@ -1133,7 +1304,7 @@ def sync_pyodps_options():
|
|
|
1133
1304
|
|
|
1134
1305
|
|
|
1135
1306
|
def str_to_bool(s: Optional[str]) -> Optional[bool]:
|
|
1136
|
-
return s.lower().strip() in ("true", "1") if s
|
|
1307
|
+
return s.lower().strip() in ("true", "1") if isinstance(s, str) else s
|
|
1137
1308
|
|
|
1138
1309
|
|
|
1139
1310
|
def is_empty(val):
|
|
@@ -1142,5 +1313,235 @@ def is_empty(val):
|
|
|
1142
1313
|
return not bool(val)
|
|
1143
1314
|
|
|
1144
1315
|
|
|
1316
|
+
def extract_class_name(cls):
|
|
1317
|
+
return cls.__module__ + "#" + cls.__qualname__
|
|
1318
|
+
|
|
1319
|
+
|
|
1320
|
+
def flatten(nested_iterable: Union[List, Tuple]) -> List:
|
|
1321
|
+
"""
|
|
1322
|
+
Flatten a nested iterable into a list.
|
|
1323
|
+
|
|
1324
|
+
Parameters
|
|
1325
|
+
----------
|
|
1326
|
+
nested_iterable : list or tuple
|
|
1327
|
+
an iterable which can contain other iterables
|
|
1328
|
+
|
|
1329
|
+
Returns
|
|
1330
|
+
-------
|
|
1331
|
+
flattened : list
|
|
1332
|
+
|
|
1333
|
+
Examples
|
|
1334
|
+
--------
|
|
1335
|
+
>>> flatten([[0, 1], [2, 3]])
|
|
1336
|
+
[0, 1, 2, 3]
|
|
1337
|
+
>>> flatten([[0, 1], [[3], [4, 5]]])
|
|
1338
|
+
[0, 1, 3, 4, 5]
|
|
1339
|
+
"""
|
|
1340
|
+
|
|
1341
|
+
flattened = []
|
|
1342
|
+
stack = list(nested_iterable)[::-1]
|
|
1343
|
+
while len(stack) > 0:
|
|
1344
|
+
inp = stack.pop()
|
|
1345
|
+
if isinstance(inp, (tuple, list)):
|
|
1346
|
+
stack.extend(inp[::-1])
|
|
1347
|
+
else:
|
|
1348
|
+
flattened.append(inp)
|
|
1349
|
+
return flattened
|
|
1350
|
+
|
|
1351
|
+
|
|
1352
|
+
def stack_back(flattened: List, raw: Union[List, Tuple]) -> Union[List, Tuple]:
|
|
1353
|
+
"""
|
|
1354
|
+
Organize a new iterable from a flattened list according to raw iterable.
|
|
1355
|
+
|
|
1356
|
+
Parameters
|
|
1357
|
+
----------
|
|
1358
|
+
flattened : list
|
|
1359
|
+
flattened list
|
|
1360
|
+
raw: list
|
|
1361
|
+
raw iterable
|
|
1362
|
+
|
|
1363
|
+
Returns
|
|
1364
|
+
-------
|
|
1365
|
+
ret : list
|
|
1366
|
+
|
|
1367
|
+
Examples
|
|
1368
|
+
--------
|
|
1369
|
+
>>> raw = [[0, 1], [2, [3, 4]]]
|
|
1370
|
+
>>> flattened = flatten(raw)
|
|
1371
|
+
>>> flattened
|
|
1372
|
+
[0, 1, 2, 3, 4]
|
|
1373
|
+
>>> a = [f + 1 for f in flattened]
|
|
1374
|
+
>>> a
|
|
1375
|
+
[1, 2, 3, 4, 5]
|
|
1376
|
+
>>> stack_back(a, raw)
|
|
1377
|
+
[[1, 2], [3, [4, 5]]]
|
|
1378
|
+
"""
|
|
1379
|
+
flattened_iter = iter(flattened)
|
|
1380
|
+
result = list()
|
|
1381
|
+
|
|
1382
|
+
def _stack(container, items):
|
|
1383
|
+
for item in items:
|
|
1384
|
+
if not isinstance(item, (list, tuple)):
|
|
1385
|
+
container.append(next(flattened_iter))
|
|
1386
|
+
else:
|
|
1387
|
+
new_container = list()
|
|
1388
|
+
container.append(new_container)
|
|
1389
|
+
_stack(new_container, item)
|
|
1390
|
+
|
|
1391
|
+
return container
|
|
1392
|
+
|
|
1393
|
+
return _stack(result, raw)
|
|
1394
|
+
|
|
1395
|
+
|
|
1396
|
+
_RetryRetType = TypeVar("_RetryRetType")
|
|
1397
|
+
|
|
1398
|
+
|
|
1399
|
+
def call_with_retry(
|
|
1400
|
+
func: Callable[..., _RetryRetType],
|
|
1401
|
+
*args,
|
|
1402
|
+
retry_times: Optional[int] = None,
|
|
1403
|
+
retry_timeout: TimeoutType = None,
|
|
1404
|
+
delay: TimeoutType = None,
|
|
1405
|
+
reset_func: Optional[Callable] = None,
|
|
1406
|
+
exc_type: Union[
|
|
1407
|
+
Type[BaseException], Tuple[Type[BaseException], ...]
|
|
1408
|
+
] = BaseException,
|
|
1409
|
+
allow_interrupt: bool = True,
|
|
1410
|
+
no_raise: bool = False,
|
|
1411
|
+
is_func_async: Optional[bool] = None,
|
|
1412
|
+
**kwargs,
|
|
1413
|
+
) -> _RetryRetType:
|
|
1414
|
+
"""
|
|
1415
|
+
Retry calling function given specified times or timeout.
|
|
1416
|
+
|
|
1417
|
+
Parameters
|
|
1418
|
+
----------
|
|
1419
|
+
func: Callable
|
|
1420
|
+
function to be retried
|
|
1421
|
+
args
|
|
1422
|
+
arguments to be passed to the function
|
|
1423
|
+
retry_times: Optional[int]
|
|
1424
|
+
times to retry the function
|
|
1425
|
+
retry_timeout: TimeoutType
|
|
1426
|
+
timeout in seconds to retry the function
|
|
1427
|
+
delay: TimeoutType
|
|
1428
|
+
delay in seconds between every trial
|
|
1429
|
+
reset_func: Callable
|
|
1430
|
+
Function to call after every trial
|
|
1431
|
+
exc_type: Type[BaseException] | Tuple[Type[BaseException], ...]
|
|
1432
|
+
Exception type for retrial
|
|
1433
|
+
allow_interrupt: bool
|
|
1434
|
+
If True, KeyboardInterrupt will stop the retry
|
|
1435
|
+
no_raise: bool
|
|
1436
|
+
If True, no exception will be raised even if all trials failed
|
|
1437
|
+
is_func_async: bool
|
|
1438
|
+
If True, func will be treated as async
|
|
1439
|
+
kwargs
|
|
1440
|
+
keyword arguments to be passed to the function
|
|
1441
|
+
|
|
1442
|
+
Returns
|
|
1443
|
+
-------
|
|
1444
|
+
Return value of the original function
|
|
1445
|
+
"""
|
|
1446
|
+
from .config import options
|
|
1447
|
+
|
|
1448
|
+
retry_num = 0
|
|
1449
|
+
retry_times = retry_times if retry_times is not None else options.retry_times
|
|
1450
|
+
delay = delay if delay is not None else options.retry_delay
|
|
1451
|
+
start_time = time.monotonic() if retry_timeout is not None else None
|
|
1452
|
+
|
|
1453
|
+
def raise_or_continue(exc: BaseException):
|
|
1454
|
+
nonlocal retry_num
|
|
1455
|
+
retry_num += 1
|
|
1456
|
+
if allow_interrupt and isinstance(exc, KeyboardInterrupt):
|
|
1457
|
+
raise exc from None
|
|
1458
|
+
if (retry_times is not None and retry_num > retry_times) or (
|
|
1459
|
+
retry_timeout is not None
|
|
1460
|
+
and start_time is not None
|
|
1461
|
+
and time.monotonic() - start_time > retry_timeout
|
|
1462
|
+
):
|
|
1463
|
+
if no_raise:
|
|
1464
|
+
return sys.exc_info()
|
|
1465
|
+
raise exc from None
|
|
1466
|
+
|
|
1467
|
+
async def async_retry():
|
|
1468
|
+
while True:
|
|
1469
|
+
try:
|
|
1470
|
+
return await func(*args, **kwargs)
|
|
1471
|
+
except exc_type as ex:
|
|
1472
|
+
await asyncio.sleep(delay)
|
|
1473
|
+
res = raise_or_continue(ex)
|
|
1474
|
+
if res is not None:
|
|
1475
|
+
return res
|
|
1476
|
+
|
|
1477
|
+
if callable(reset_func):
|
|
1478
|
+
reset_res = reset_func()
|
|
1479
|
+
if asyncio.iscoroutine(reset_res):
|
|
1480
|
+
await reset_res
|
|
1481
|
+
|
|
1482
|
+
def sync_retry():
|
|
1483
|
+
while True:
|
|
1484
|
+
try:
|
|
1485
|
+
return func(*args, **kwargs)
|
|
1486
|
+
except exc_type as ex:
|
|
1487
|
+
time.sleep(delay)
|
|
1488
|
+
res = raise_or_continue(ex)
|
|
1489
|
+
if res is not None:
|
|
1490
|
+
return res
|
|
1491
|
+
if callable(reset_func):
|
|
1492
|
+
reset_func()
|
|
1493
|
+
|
|
1494
|
+
unwrap_func = func
|
|
1495
|
+
if is_func_async is None:
|
|
1496
|
+
# unwrap to get true result if func is async
|
|
1497
|
+
while isinstance(unwrap_func, functools.partial):
|
|
1498
|
+
unwrap_func = unwrap_func.func
|
|
1499
|
+
|
|
1500
|
+
if is_func_async or asyncio.iscoroutinefunction(unwrap_func):
|
|
1501
|
+
return async_retry()
|
|
1502
|
+
else:
|
|
1503
|
+
return sync_retry()
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
def update_wlm_quota_settings(session_id: str, engine_settings: Dict[str, Any]):
|
|
1507
|
+
from .config import options
|
|
1508
|
+
|
|
1509
|
+
engine_quota = engine_settings.get("odps.task.wlm.quota", None)
|
|
1510
|
+
session_quota = options.session.quota_name or None
|
|
1511
|
+
if engine_quota != session_quota and engine_quota:
|
|
1512
|
+
logger.warning(
|
|
1513
|
+
"[Session=%s] Session quota (%s) is different to SubDag engine quota (%s)",
|
|
1514
|
+
session_id,
|
|
1515
|
+
session_quota,
|
|
1516
|
+
engine_quota,
|
|
1517
|
+
)
|
|
1518
|
+
raise ValueError(
|
|
1519
|
+
"Quota name cannot be changed after sessions are created, "
|
|
1520
|
+
f"session_quota={session_quota}, engine_quota={engine_quota}"
|
|
1521
|
+
)
|
|
1522
|
+
|
|
1523
|
+
if session_quota:
|
|
1524
|
+
engine_settings["odps.task.wlm.quota"] = session_quota
|
|
1525
|
+
elif "odps.task.wlm.quota" in engine_settings:
|
|
1526
|
+
engine_settings.pop("odps.task.wlm.quota")
|
|
1527
|
+
|
|
1528
|
+
|
|
1145
1529
|
def get_default_table_properties():
|
|
1146
1530
|
return {"storagestrategy": "archive"}
|
|
1531
|
+
|
|
1532
|
+
|
|
1533
|
+
def copy_if_possible(obj: Any, deep=False) -> Any:
|
|
1534
|
+
try:
|
|
1535
|
+
return copy.deepcopy(obj) if deep else copy.copy(obj)
|
|
1536
|
+
except: # pragma: no cover
|
|
1537
|
+
return obj
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
def cache_tileables(*tileables):
|
|
1541
|
+
from .core import ENTITY_TYPE
|
|
1542
|
+
|
|
1543
|
+
if len(tileables) == 1 and isinstance(tileables[0], (tuple, list)):
|
|
1544
|
+
tileables = tileables[0]
|
|
1545
|
+
for t in tileables:
|
|
1546
|
+
if isinstance(t, ENTITY_TYPE):
|
|
1547
|
+
t.cache = True
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: maxframe
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
4
4
|
Summary: MaxFrame operator-based data analyze framework
|
|
5
5
|
Requires-Dist: numpy<2.0.0,>=1.19.0
|
|
6
6
|
Requires-Dist: pandas>=1.0.0
|
|
@@ -28,6 +28,8 @@ Requires-Dist: pytest-cov>=4.1.0; extra == "test"
|
|
|
28
28
|
Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
|
|
29
29
|
Requires-Dist: pytest-timeout>=2.1.0; extra == "test"
|
|
30
30
|
Requires-Dist: matplotlib>=2.0.0; extra == "test"
|
|
31
|
+
Requires-Dist: lightgbm<4.0.0,>=3.0.0; extra == "test"
|
|
32
|
+
Requires-Dist: scikit-learn>=1.0; extra == "test"
|
|
31
33
|
Requires-Dist: xgboost<3.0.0,>=1.4.0; extra == "test"
|
|
32
34
|
Dynamic: description
|
|
33
35
|
|
|
@@ -104,3 +106,4 @@ License
|
|
|
104
106
|
|
|
105
107
|
Licensed under the `Apache License
|
|
106
108
|
2.0 <https://www.apache.org/licenses/LICENSE-2.0.html>`__.
|
|
109
|
+
|