maxframe 1.3.1__cp39-cp39-win32.whl → 2.0.0b2__cp39-cp39-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.cp39-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.cp39-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.cp39-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.cp39-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.0b2.dist-info}/METADATA +4 -1
- maxframe-2.0.0b2.dist-info/RECORD +939 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.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.0b2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
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 pytest
|
|
16
|
+
|
|
17
|
+
from ....core import SPECodeContext
|
|
18
|
+
from ...indexing import DataFrameSetIndexAdapter
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@pytest.mark.parametrize(
|
|
22
|
+
"keys,drop,append,verify_integrity",
|
|
23
|
+
[
|
|
24
|
+
("A", True, False, False),
|
|
25
|
+
(["C", "D"], True, False, False),
|
|
26
|
+
(["C", "D"], True, True, False),
|
|
27
|
+
(["C", "D"], True, False, True),
|
|
28
|
+
],
|
|
29
|
+
)
|
|
30
|
+
def test_dataframe_set_index(df1, keys, drop, append, verify_integrity):
|
|
31
|
+
_df1 = df1.set_index(
|
|
32
|
+
keys=keys, drop=drop, append=append, verify_integrity=verify_integrity
|
|
33
|
+
)
|
|
34
|
+
context = SPECodeContext()
|
|
35
|
+
adapter = DataFrameSetIndexAdapter()
|
|
36
|
+
results = adapter.generate_code(_df1.op, context)
|
|
37
|
+
|
|
38
|
+
expected_results = [
|
|
39
|
+
f"var_1 = var_0.set_index(keys={repr(keys)}, drop={drop}, append={append}, inplace=False, verify_integrity={verify_integrity})"
|
|
40
|
+
]
|
|
41
|
+
assert results == expected_results
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
from ....core import SPECodeContext
|
|
18
|
+
from ...indexing import DataFrameSetitemAdapter
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_dataframe_setitem_with_scalar_to_one_index(df1):
|
|
22
|
+
df1["A"] = np.intc(100)
|
|
23
|
+
context = SPECodeContext()
|
|
24
|
+
adapter = DataFrameSetitemAdapter()
|
|
25
|
+
results = adapter.generate_code(df1.op, context)
|
|
26
|
+
expected_results = ["var_0['A'] = const_0", "var_1 = var_0"]
|
|
27
|
+
assert context.constants["const_0"] == 100
|
|
28
|
+
assert results == expected_results
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_dataframe_setitem_with_scalar_to_multi_indexes(df1):
|
|
32
|
+
df1[["A", "E"]] = 100
|
|
33
|
+
context = SPECodeContext()
|
|
34
|
+
adapter = DataFrameSetitemAdapter()
|
|
35
|
+
results = adapter.generate_code(df1.op, context)
|
|
36
|
+
expected_results = ["var_0[['A', 'E']] = 100", "var_1 = var_0"]
|
|
37
|
+
assert results == expected_results
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_dataframe_setitem_with_non_scalar(df1):
|
|
41
|
+
df1[["A", "E"]] = df1[["A", "B"]]
|
|
42
|
+
context = SPECodeContext()
|
|
43
|
+
adapter = DataFrameSetitemAdapter()
|
|
44
|
+
results = adapter.generate_code(df1.op, context)
|
|
45
|
+
expected_results = ["var_0[['A', 'E']] = var_1", "var_2 = var_0"]
|
|
46
|
+
assert results == expected_results
|
|
@@ -0,0 +1,13 @@
|
|
|
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.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import pandas as pd
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
from ...... import dataframe as md
|
|
19
|
+
from ....core import SPECodeContext
|
|
20
|
+
from ...misc import DataFrameApplyAdapter
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.fixture
|
|
24
|
+
def df1():
|
|
25
|
+
return md.DataFrame(
|
|
26
|
+
[
|
|
27
|
+
[1, 10, 101],
|
|
28
|
+
[9, 90, 909],
|
|
29
|
+
[2, 20, 202],
|
|
30
|
+
],
|
|
31
|
+
index=pd.MultiIndex.from_arrays(
|
|
32
|
+
[[1, 9, 2], [11, 99, 22], [111, 999, 222]],
|
|
33
|
+
names=("idx_0", "idx_1", "idx_2"),
|
|
34
|
+
),
|
|
35
|
+
columns=list("ABC"),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.fixture
|
|
40
|
+
def s1():
|
|
41
|
+
return md.Series([5, 2, 3, 1], index=[5, 2, 3, 1], name="A")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_series_apply(s1):
|
|
45
|
+
s = s1.apply(lambda x: x + 1, convert_dtype=True)
|
|
46
|
+
adapter = DataFrameApplyAdapter()
|
|
47
|
+
context = SPECodeContext()
|
|
48
|
+
results = adapter.generate_code(s.op, context)
|
|
49
|
+
assert len(context.get_udfs()) == 1
|
|
50
|
+
f = context.get_udfs()[0]
|
|
51
|
+
expected_results = [
|
|
52
|
+
f"var_1_applied = var_0.apply(func={f.name}, convert_dtype=True)",
|
|
53
|
+
"var_1_renamed = var_1_applied.rename('A')",
|
|
54
|
+
"var_1 = var_1_renamed.astype(np.dtype('int64'))",
|
|
55
|
+
]
|
|
56
|
+
assert results == expected_results
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_apply_with_series_dtype_and_name(s1):
|
|
60
|
+
s = s1.apply(
|
|
61
|
+
lambda x: x + 1,
|
|
62
|
+
convert_dtype=False,
|
|
63
|
+
name="X",
|
|
64
|
+
dtype="float32",
|
|
65
|
+
output_type="series",
|
|
66
|
+
)
|
|
67
|
+
adapter = DataFrameApplyAdapter()
|
|
68
|
+
context = SPECodeContext()
|
|
69
|
+
results = adapter.generate_code(s.op, context)
|
|
70
|
+
assert len(context.get_udfs()) == 1
|
|
71
|
+
f = context.get_udfs()[0]
|
|
72
|
+
expected_results = [
|
|
73
|
+
f"var_1_applied = var_0.apply(func={f.name}, convert_dtype=False)",
|
|
74
|
+
"var_1_renamed = var_1_applied.rename('X')",
|
|
75
|
+
"var_1 = var_1_renamed.astype(np.dtype('float32'))",
|
|
76
|
+
]
|
|
77
|
+
assert results == expected_results
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_apply_with_dataframe_dtypes(df1):
|
|
81
|
+
df = df1.apply(
|
|
82
|
+
lambda x: pd.Series([str(x), x + 1]),
|
|
83
|
+
convert_dtype=False,
|
|
84
|
+
dtypes=pd.Series(["object", "float64"], index=["X", "Y"]),
|
|
85
|
+
output_type="dataframe",
|
|
86
|
+
)
|
|
87
|
+
adapter = DataFrameApplyAdapter()
|
|
88
|
+
context = SPECodeContext()
|
|
89
|
+
results = adapter.generate_code(df.op, context)
|
|
90
|
+
assert len(context.get_udfs()) == 1
|
|
91
|
+
f = context.get_udfs()[0]
|
|
92
|
+
expected_results = [
|
|
93
|
+
f"var_1_applied = var_0.apply(func={f.name}, axis=0, raw=False, result_type=None)",
|
|
94
|
+
"var_1_applied.columns = ['X', 'Y']",
|
|
95
|
+
"var_1 = var_1_applied.astype({'X': np.dtype('object'), 'Y': np.dtype('float64')})",
|
|
96
|
+
]
|
|
97
|
+
assert results == expected_results
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_dataframe_apply_column(df1):
|
|
101
|
+
df = df1.apply(lambda x: x + 1, axis=0)
|
|
102
|
+
adapter = DataFrameApplyAdapter()
|
|
103
|
+
context = SPECodeContext()
|
|
104
|
+
results = adapter.generate_code(df.op, context)
|
|
105
|
+
assert len(context.get_udfs()) == 1
|
|
106
|
+
f = context.get_udfs()[0]
|
|
107
|
+
expected_results = [
|
|
108
|
+
f"var_1_applied = var_0.apply(func={f.name}, axis=0, raw=False, result_type=None)",
|
|
109
|
+
"var_1_applied.columns = ['A', 'B', 'C']",
|
|
110
|
+
"var_1 = var_1_applied.astype("
|
|
111
|
+
"{'A': np.dtype('int64'),"
|
|
112
|
+
" 'B': np.dtype('int64'),"
|
|
113
|
+
" 'C': np.dtype('int64')})",
|
|
114
|
+
]
|
|
115
|
+
assert results == expected_results
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def test_dataframe_apply_row(df1):
|
|
119
|
+
df = df1.apply(lambda x: x + 1, 1, True, "expand")
|
|
120
|
+
adapter = DataFrameApplyAdapter()
|
|
121
|
+
context = SPECodeContext()
|
|
122
|
+
results = adapter.generate_code(df.op, context)
|
|
123
|
+
assert len(context.get_udfs()) == 1
|
|
124
|
+
f = context.get_udfs()[0]
|
|
125
|
+
expected_results = [
|
|
126
|
+
f"var_1_applied = var_0.apply(func={f.name}, axis=1, raw=True, result_type='expand')",
|
|
127
|
+
"var_1_applied.columns = ['A', 'B', 'C']",
|
|
128
|
+
"var_1 = var_1_applied.astype("
|
|
129
|
+
"{'A': np.dtype('int64'),"
|
|
130
|
+
" 'B': np.dtype('int64'),"
|
|
131
|
+
" 'C': np.dtype('int64')})",
|
|
132
|
+
]
|
|
133
|
+
assert results == expected_results
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import pandas as pd
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
from ...... import dataframe as md
|
|
19
|
+
from ....core import SPECodeContext
|
|
20
|
+
from ...misc import DropDuplicatesOperatorAdapter
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.fixture
|
|
24
|
+
def df1():
|
|
25
|
+
return md.DataFrame(
|
|
26
|
+
[
|
|
27
|
+
[1, 10, 101],
|
|
28
|
+
[9, 90, 909],
|
|
29
|
+
[2, 20, 202],
|
|
30
|
+
],
|
|
31
|
+
index=pd.MultiIndex.from_arrays(
|
|
32
|
+
[[1, 9, 2], [11, 99, 22], [111, 999, 222]],
|
|
33
|
+
names=("idx_0", "idx_1", "idx_2"),
|
|
34
|
+
),
|
|
35
|
+
columns=list("ABC"),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.fixture
|
|
40
|
+
def s1():
|
|
41
|
+
return md.Series([5, 2, 3, 1], index=[5, 2, 3, 1], name="A")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@pytest.fixture
|
|
45
|
+
def multi_index():
|
|
46
|
+
arrays = [
|
|
47
|
+
["a1", "a2", "a3"],
|
|
48
|
+
["b1", "b2", "b3"],
|
|
49
|
+
["c1", "c2", "c3"],
|
|
50
|
+
["d1", "d2", "d3"],
|
|
51
|
+
["e1", "e2", "e3"],
|
|
52
|
+
]
|
|
53
|
+
return md.Index(
|
|
54
|
+
pd.MultiIndex.from_arrays(
|
|
55
|
+
arrays, names=("idx_a", "idx_b", "idx_c", "idx_d", "idx_e")
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_dataframe_drop_duplicates(df1):
|
|
61
|
+
adapter = DropDuplicatesOperatorAdapter()
|
|
62
|
+
context = SPECodeContext()
|
|
63
|
+
|
|
64
|
+
df = df1.drop_duplicates(["A", "B"], keep=False)
|
|
65
|
+
results = adapter.generate_code(df.op, context)
|
|
66
|
+
expected_results = [
|
|
67
|
+
"var_1 = var_0.drop_duplicates(subset=['A', 'B'], keep=False, "
|
|
68
|
+
"ignore_index=False)"
|
|
69
|
+
]
|
|
70
|
+
assert results == expected_results
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_series_drop_duplicates(s1):
|
|
74
|
+
adapter = DropDuplicatesOperatorAdapter()
|
|
75
|
+
context = SPECodeContext()
|
|
76
|
+
|
|
77
|
+
s = s1.drop_duplicates(keep="first")
|
|
78
|
+
results = adapter.generate_code(s.op, context)
|
|
79
|
+
expected_results = [
|
|
80
|
+
"var_1 = var_0.drop_duplicates(keep='first', ignore_index=False)"
|
|
81
|
+
]
|
|
82
|
+
assert results == expected_results
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_index_drop_duplicates(multi_index):
|
|
86
|
+
adapter = DropDuplicatesOperatorAdapter()
|
|
87
|
+
context = SPECodeContext()
|
|
88
|
+
|
|
89
|
+
df = multi_index.drop_duplicates(keep="first")
|
|
90
|
+
results = adapter.generate_code(df.op, context)
|
|
91
|
+
expected_results = ["var_1 = var_0.drop_duplicates(keep='first')"]
|
|
92
|
+
assert results == expected_results
|
|
@@ -0,0 +1,234 @@
|
|
|
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
|
+
import pandas as pd
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from ...... import dataframe as md
|
|
20
|
+
from ....core import SPECodeContext
|
|
21
|
+
from ...misc import (
|
|
22
|
+
CaseWhenOperatorAdapter,
|
|
23
|
+
DataFrameAstypeAdapter,
|
|
24
|
+
DataFrameCheckMonotonicAdapter,
|
|
25
|
+
DataFrameCutAdapter,
|
|
26
|
+
DataFrameDescribeAdapter,
|
|
27
|
+
DataFrameDiffAdapter,
|
|
28
|
+
DataFrameDropAdapter,
|
|
29
|
+
DataFrameDuplicatedAdapter,
|
|
30
|
+
DataFrameExplodeAdapter,
|
|
31
|
+
DataFrameIsinAdapter,
|
|
32
|
+
DataFrameMapAdapter,
|
|
33
|
+
DataFrameMeltAdapter,
|
|
34
|
+
DataFrameMemoryUsageAdapter,
|
|
35
|
+
DataFramePivotTableAdapter,
|
|
36
|
+
DataFrameShiftAdapter,
|
|
37
|
+
DataFrameStackAdapter,
|
|
38
|
+
DataFrameToNumericAdapter,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@pytest.fixture
|
|
43
|
+
def df1():
|
|
44
|
+
return md.DataFrame(
|
|
45
|
+
np.random.randn(6, 4),
|
|
46
|
+
index=md.Index(["1", "2", "3", "4", "5", "6"], name="test_idx"),
|
|
47
|
+
columns=list("ABCD"),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@pytest.fixture
|
|
52
|
+
def midx_df1():
|
|
53
|
+
return md.DataFrame(
|
|
54
|
+
[
|
|
55
|
+
[1, 10, 101],
|
|
56
|
+
[9, 90, 909],
|
|
57
|
+
[2, 20, 202],
|
|
58
|
+
],
|
|
59
|
+
index=pd.MultiIndex.from_arrays(
|
|
60
|
+
[[1, 9, 2], [11, 99, 22], [111, 999, 222]],
|
|
61
|
+
names=("idx_0", "idx_1", "idx_2"),
|
|
62
|
+
),
|
|
63
|
+
columns=list("ABC"),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_astype(df1):
|
|
68
|
+
v1 = df1.astype({"A": "string"})
|
|
69
|
+
context = SPECodeContext()
|
|
70
|
+
results = DataFrameAstypeAdapter().generate_code(v1.op, context)
|
|
71
|
+
assert results[0] == "var_1 = var_0.astype({'A': 'string'})"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_case_when(df1):
|
|
75
|
+
s = df1.A.case_when([(df1.B > 50, df1.A + 10), (df1.C < 500, 3)])
|
|
76
|
+
context = SPECodeContext()
|
|
77
|
+
results = CaseWhenOperatorAdapter().generate_code(s.op, context)
|
|
78
|
+
expected_results = [
|
|
79
|
+
"var_1 = var_0.case_when(caselist=[(var_2, var_4), (var_3, 3)])"
|
|
80
|
+
]
|
|
81
|
+
assert results == expected_results
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_check_monotonic():
|
|
85
|
+
context = SPECodeContext()
|
|
86
|
+
|
|
87
|
+
v0 = md.Series([1, 2, 3, 4, 5, 6])
|
|
88
|
+
v1 = v0.is_monotonic_increasing
|
|
89
|
+
results = DataFrameCheckMonotonicAdapter().generate_code(v1.op, context)
|
|
90
|
+
assert results[0] == "var_1 = var_0.is_monotonic_increasing"
|
|
91
|
+
|
|
92
|
+
v2 = v0.is_monotonic_decreasing
|
|
93
|
+
results = DataFrameCheckMonotonicAdapter().generate_code(v2.op, context)
|
|
94
|
+
assert results[0] == "var_2 = var_0.is_monotonic_decreasing"
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def test_cut():
|
|
98
|
+
context = SPECodeContext()
|
|
99
|
+
|
|
100
|
+
v0 = md.Series([1, 2, 3, 4, 5, 6])
|
|
101
|
+
v1 = md.cut(v0, 3)
|
|
102
|
+
results = DataFrameCutAdapter().generate_code(v1.op, context)
|
|
103
|
+
assert results[0] == (
|
|
104
|
+
"var_0 = pd.cut(var_1, 3, skip_none=None, right=True, labels=None, "
|
|
105
|
+
"retbins=False, precision=3, include_lowest=False, duplicates='raise', "
|
|
106
|
+
"ordered=True)"
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def test_describe(df1):
|
|
111
|
+
df = df1.describe(include="all")
|
|
112
|
+
context = SPECodeContext()
|
|
113
|
+
results = DataFrameDescribeAdapter().generate_code(df.op, context)
|
|
114
|
+
assert (
|
|
115
|
+
results[0]
|
|
116
|
+
== "var_1 = var_0.describe(percentiles=[0.25, 0.5, 0.75], include='all')"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def test_diff(df1):
|
|
121
|
+
df = df1.diff(periods=1)
|
|
122
|
+
context = SPECodeContext()
|
|
123
|
+
results = DataFrameDiffAdapter().generate_code(df.op, context)
|
|
124
|
+
assert results[0] == "var_1 = var_0.diff(periods=1, axis=0)"
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def test_drop(midx_df1):
|
|
128
|
+
df = midx_df1.drop(index=(1, 11, 111), columns=["A", "C"], errors="ignore")
|
|
129
|
+
adapter = DataFrameDropAdapter()
|
|
130
|
+
context = SPECodeContext()
|
|
131
|
+
results = adapter.generate_code(df.op, context)
|
|
132
|
+
expected_results = [
|
|
133
|
+
"var_1 = var_0.drop(index=(1, 11, 111), columns=['A', 'C'], level=None,"
|
|
134
|
+
" errors='ignore')"
|
|
135
|
+
]
|
|
136
|
+
assert results == expected_results
|
|
137
|
+
|
|
138
|
+
del midx_df1["A"]
|
|
139
|
+
results = adapter.generate_code(midx_df1.op, context)
|
|
140
|
+
expected_results = [
|
|
141
|
+
"var_2 = var_0.drop(index=None, columns='A', level=None, errors='raise')"
|
|
142
|
+
]
|
|
143
|
+
assert results == expected_results
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def test_duplicated(df1):
|
|
147
|
+
df = df1.duplicated(subset=["A", "B"], keep=False)
|
|
148
|
+
context = SPECodeContext()
|
|
149
|
+
results = DataFrameDuplicatedAdapter().generate_code(df.op, context)
|
|
150
|
+
assert results[0] == "var_1 = var_0.duplicated(subset=['A', 'B'], keep=False)"
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def test_explode():
|
|
154
|
+
context = SPECodeContext()
|
|
155
|
+
|
|
156
|
+
v0 = md.Series([[1, 2, 3], [5, 6]])
|
|
157
|
+
v1 = v0.explode(ignore_index=True)
|
|
158
|
+
results = DataFrameExplodeAdapter().generate_code(v1.op, context)
|
|
159
|
+
assert results[0] == "var_1 = var_0.explode(None, ignore_index=True)"
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def test_isin(df1):
|
|
163
|
+
filter_dict = {"A": [0, 1], "B": [2, 3], "E": [99, 100]}
|
|
164
|
+
df = df1.isin(filter_dict)
|
|
165
|
+
context = SPECodeContext()
|
|
166
|
+
results = DataFrameIsinAdapter().generate_code(df.op, context)
|
|
167
|
+
expected_results = [
|
|
168
|
+
"var_1 = var_0.isin({'A': [0, 1], 'B': [2, 3], 'E': [99, 100]})"
|
|
169
|
+
]
|
|
170
|
+
assert results == expected_results
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def test_map(df1):
|
|
174
|
+
v0 = md.Series([1, 2, 3, 4, 5, 6])
|
|
175
|
+
v1 = v0.map(lambda x: x * 2 + 1, dtype="int64")
|
|
176
|
+
context = SPECodeContext()
|
|
177
|
+
results = DataFrameMapAdapter().generate_code(v1.op, context)
|
|
178
|
+
assert len(context.get_udfs()) == 1
|
|
179
|
+
f = context.get_udfs()[0]
|
|
180
|
+
expected_results = [f"var_1 = var_0.map({f.name})"]
|
|
181
|
+
assert results == expected_results
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def test_melt(df1):
|
|
185
|
+
context = SPECodeContext()
|
|
186
|
+
|
|
187
|
+
v1 = df1.melt(id_vars=["A"], value_vars=["B"])
|
|
188
|
+
results = DataFrameMeltAdapter().generate_code(v1.op, context)
|
|
189
|
+
assert (
|
|
190
|
+
results[0]
|
|
191
|
+
== "var_1 = var_0.melt(id_vars=['A'], value_vars=['B'], value_name='value')"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def test_memory_usage(df1):
|
|
196
|
+
context = SPECodeContext()
|
|
197
|
+
v1 = df1.memory_usage(index=False)
|
|
198
|
+
results = DataFrameMemoryUsageAdapter().generate_code(v1.op, context)
|
|
199
|
+
assert results[0] == "var_1 = var_0.memory_usage(index=False, deep=False)"
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def test_pivot_table(midx_df1):
|
|
203
|
+
df = midx_df1.pivot_table(columns="B", values="C")
|
|
204
|
+
context = SPECodeContext()
|
|
205
|
+
results = DataFramePivotTableAdapter().generate_code(df.op, context)
|
|
206
|
+
assert results[0] == (
|
|
207
|
+
"var_1 = var_0.pivot_table(values='C', columns='B', "
|
|
208
|
+
"aggfunc='mean', margins=False, dropna=True, margins_name='All', "
|
|
209
|
+
"sort=True)"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def test_shift(df1):
|
|
214
|
+
df = df1.shift(periods=1)
|
|
215
|
+
context = SPECodeContext()
|
|
216
|
+
results = DataFrameShiftAdapter().generate_code(df.op, context)
|
|
217
|
+
assert results[0] == "var_1 = var_0.shift(periods=1, axis=0)"
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def test_stack(midx_df1):
|
|
221
|
+
df = midx_df1.stack([0])
|
|
222
|
+
context = SPECodeContext()
|
|
223
|
+
results = DataFrameStackAdapter().generate_code(df.op, context)
|
|
224
|
+
assert results[0] == "var_1 = var_0.stack(level=[0], dropna=True)"
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def test_to_numeric():
|
|
228
|
+
v0 = md.Series([1, 2, 3, 4, 5, 6])
|
|
229
|
+
v1 = md.to_numeric(v0, downcast="float")
|
|
230
|
+
context = SPECodeContext()
|
|
231
|
+
results = DataFrameToNumericAdapter().generate_code(v1.op, context)
|
|
232
|
+
assert (
|
|
233
|
+
results[0] == "var_1 = pd.to_numeric(var_0, errors='raise', downcast='float')"
|
|
234
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
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.
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
import pandas as pd
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from ...... import dataframe as md
|
|
20
|
+
from .....core import EngineAcceptance
|
|
21
|
+
from ....core import SPECodeContext
|
|
22
|
+
from ....dataframe.missing import DataFrameCheckNAAdapter
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.fixture
|
|
26
|
+
def df1():
|
|
27
|
+
return md.DataFrame(
|
|
28
|
+
[
|
|
29
|
+
[1, 2, np.Inf, pd.NA],
|
|
30
|
+
[4, 5, np.NaN, pd.NaT],
|
|
31
|
+
[3, None, None, "3000"],
|
|
32
|
+
[4, None, True, None],
|
|
33
|
+
],
|
|
34
|
+
index=md.Index([1, 2, 3, 4], name="test_idx"),
|
|
35
|
+
columns=list("ABCD"),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.fixture
|
|
40
|
+
def ds1():
|
|
41
|
+
return md.Series(pd.Series((1, 2, 3, None, None, None, None)))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@pytest.fixture
|
|
45
|
+
def index1():
|
|
46
|
+
return md.Index(pd.Index([1, 2, None, 4]))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@pytest.mark.parametrize(
|
|
50
|
+
"check_func, expected_condition",
|
|
51
|
+
[("isna", "isna"), ("isnull", "isna"), ("notna", "notna"), ("notnull", "notna")],
|
|
52
|
+
)
|
|
53
|
+
def test_seires(ds1, check_func, expected_condition):
|
|
54
|
+
adapter = DataFrameCheckNAAdapter()
|
|
55
|
+
context = SPECodeContext()
|
|
56
|
+
func = getattr(ds1, check_func)
|
|
57
|
+
ds = func()
|
|
58
|
+
assert adapter.accepts(ds.op) == EngineAcceptance.ACCEPT
|
|
59
|
+
results = adapter.generate_code(ds.op, context)
|
|
60
|
+
expected_results = [f"var_1 = var_0.{expected_condition}()"]
|
|
61
|
+
assert results == expected_results
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@pytest.mark.parametrize(
|
|
65
|
+
"check_func, expected_condition",
|
|
66
|
+
[("isna", "isna"), ("isnull", "isna"), ("notna", "notna"), ("notnull", "notna")],
|
|
67
|
+
)
|
|
68
|
+
def test_maxframe(df1, check_func, expected_condition):
|
|
69
|
+
adapter = DataFrameCheckNAAdapter()
|
|
70
|
+
context = SPECodeContext()
|
|
71
|
+
func = getattr(df1, check_func)
|
|
72
|
+
df = func()
|
|
73
|
+
assert adapter.accepts(df.op) == EngineAcceptance.ACCEPT
|
|
74
|
+
results = adapter.generate_code(df.op, context)
|
|
75
|
+
expected_results = [f"var_1 = var_0.{expected_condition}()"]
|
|
76
|
+
assert results == expected_results
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@pytest.mark.parametrize(
|
|
80
|
+
"check_func, expected_condition",
|
|
81
|
+
[
|
|
82
|
+
("isna", "isna"),
|
|
83
|
+
("notna", "notna"),
|
|
84
|
+
],
|
|
85
|
+
)
|
|
86
|
+
def test_index_isna(index1, check_func, expected_condition):
|
|
87
|
+
adapter = DataFrameCheckNAAdapter()
|
|
88
|
+
context = SPECodeContext()
|
|
89
|
+
func = getattr(index1, check_func)
|
|
90
|
+
di = func()
|
|
91
|
+
assert adapter.accepts(di.op) == EngineAcceptance.ACCEPT
|
|
92
|
+
results = adapter.generate_code(di.op, context)
|
|
93
|
+
expected_results = [f"var_1 = var_0.{expected_condition}()"]
|
|
94
|
+
assert results == expected_results
|