maxframe 1.1.1__cp311-cp311-win32.whl → 1.2.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/__init__.py +1 -1
- maxframe/_utils.cp311-win32.pyd +0 -0
- maxframe/_utils.pxd +1 -1
- maxframe/_utils.pyx +1 -1
- maxframe/codegen.py +14 -7
- maxframe/config/__init__.py +1 -1
- maxframe/config/config.py +10 -1
- maxframe/config/tests/__init__.py +1 -1
- maxframe/config/tests/test_config.py +1 -1
- maxframe/config/tests/test_validators.py +1 -1
- maxframe/config/validators.py +1 -1
- maxframe/conftest.py +1 -1
- maxframe/core/__init__.py +2 -1
- maxframe/core/accessor.py +44 -0
- maxframe/core/base.py +1 -1
- maxframe/core/entity/__init__.py +1 -1
- maxframe/core/entity/core.py +1 -1
- maxframe/core/entity/executable.py +1 -1
- maxframe/core/entity/objects.py +1 -1
- maxframe/core/entity/output_types.py +1 -1
- maxframe/core/entity/tests/__init__.py +1 -1
- maxframe/core/entity/tests/test_objects.py +1 -1
- maxframe/core/entity/tileables.py +1 -1
- maxframe/core/entity/utils.py +1 -1
- maxframe/core/graph/__init__.py +1 -1
- maxframe/core/graph/builder/__init__.py +1 -1
- maxframe/core/graph/builder/base.py +1 -1
- maxframe/core/graph/builder/tileable.py +1 -1
- maxframe/core/graph/builder/utils.py +1 -1
- maxframe/core/graph/core.cp311-win32.pyd +0 -0
- maxframe/core/graph/core.pyx +1 -1
- maxframe/core/graph/entity.py +1 -1
- maxframe/core/graph/tests/__init__.py +1 -1
- maxframe/core/graph/tests/test_graph.py +1 -1
- maxframe/core/mode.py +1 -1
- maxframe/core/operator/__init__.py +1 -1
- maxframe/core/operator/base.py +1 -1
- maxframe/core/operator/core.py +1 -1
- maxframe/core/operator/fetch.py +1 -1
- maxframe/core/operator/objects.py +1 -1
- maxframe/core/operator/shuffle.py +1 -1
- maxframe/core/operator/tests/__init__.py +1 -1
- maxframe/core/operator/tests/test_core.py +1 -1
- maxframe/core/operator/utils.py +1 -1
- maxframe/core/tests/__init__.py +1 -1
- maxframe/core/tests/test_mode.py +1 -1
- maxframe/dataframe/__init__.py +3 -3
- maxframe/dataframe/accessors/__init__.py +15 -0
- maxframe/dataframe/accessors/datetime_/__init__.py +32 -0
- maxframe/dataframe/accessors/datetime_/accessor.py +67 -0
- maxframe/dataframe/{misc/datetimes.py → accessors/datetime_/core.py} +9 -9
- maxframe/dataframe/{plotting → accessors/datetime_}/tests/__init__.py +1 -1
- maxframe/dataframe/accessors/datetime_/tests/test_datetime_accessor.py +41 -0
- maxframe/dataframe/accessors/dict_/__init__.py +43 -0
- maxframe/dataframe/accessors/dict_/accessor.py +38 -0
- maxframe/dataframe/accessors/dict_/contains.py +81 -0
- maxframe/dataframe/accessors/dict_/getitem.py +144 -0
- maxframe/dataframe/accessors/dict_/length.py +72 -0
- maxframe/dataframe/accessors/dict_/remove.py +87 -0
- maxframe/dataframe/accessors/dict_/setitem.py +88 -0
- maxframe/dataframe/accessors/dict_/tests/__init__.py +13 -0
- maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +130 -0
- maxframe/dataframe/{plotting → accessors/plotting}/__init__.py +4 -6
- maxframe/dataframe/{plotting → accessors/plotting}/core.py +3 -3
- maxframe/dataframe/accessors/plotting/tests/__init__.py +13 -0
- maxframe/dataframe/{plotting/tests/test_plotting.py → accessors/plotting/tests/test_plotting_accessor.py} +6 -6
- maxframe/dataframe/accessors/string_/__init__.py +32 -0
- maxframe/dataframe/{misc → accessors/string_}/accessor.py +4 -65
- maxframe/dataframe/{misc/string_.py → accessors/string_/core.py} +20 -20
- maxframe/dataframe/accessors/string_/tests/__init__.py +13 -0
- maxframe/dataframe/accessors/string_/tests/test_string_accessor.py +73 -0
- maxframe/dataframe/arithmetic/__init__.py +1 -1
- maxframe/dataframe/arithmetic/abs.py +1 -1
- maxframe/dataframe/arithmetic/add.py +1 -1
- maxframe/dataframe/arithmetic/arccos.py +1 -1
- maxframe/dataframe/arithmetic/arccosh.py +1 -1
- maxframe/dataframe/arithmetic/arcsin.py +1 -1
- maxframe/dataframe/arithmetic/arcsinh.py +1 -1
- maxframe/dataframe/arithmetic/arctan.py +1 -1
- maxframe/dataframe/arithmetic/arctanh.py +1 -1
- maxframe/dataframe/arithmetic/around.py +1 -1
- maxframe/dataframe/arithmetic/bitwise_and.py +1 -1
- maxframe/dataframe/arithmetic/bitwise_or.py +1 -1
- maxframe/dataframe/arithmetic/bitwise_xor.py +1 -1
- maxframe/dataframe/arithmetic/ceil.py +1 -1
- maxframe/dataframe/arithmetic/core.py +1 -1
- maxframe/dataframe/arithmetic/cos.py +1 -1
- maxframe/dataframe/arithmetic/cosh.py +1 -1
- maxframe/dataframe/arithmetic/degrees.py +1 -1
- maxframe/dataframe/arithmetic/docstring.py +1 -1
- maxframe/dataframe/arithmetic/equal.py +1 -1
- maxframe/dataframe/arithmetic/exp.py +1 -1
- maxframe/dataframe/arithmetic/exp2.py +1 -1
- maxframe/dataframe/arithmetic/expm1.py +1 -1
- maxframe/dataframe/arithmetic/floor.py +1 -1
- maxframe/dataframe/arithmetic/floordiv.py +1 -1
- maxframe/dataframe/arithmetic/greater.py +1 -1
- maxframe/dataframe/arithmetic/greater_equal.py +1 -1
- maxframe/dataframe/arithmetic/invert.py +1 -1
- maxframe/dataframe/arithmetic/is_ufuncs.py +1 -1
- maxframe/dataframe/arithmetic/less.py +1 -1
- maxframe/dataframe/arithmetic/less_equal.py +1 -1
- maxframe/dataframe/arithmetic/log.py +1 -1
- maxframe/dataframe/arithmetic/log10.py +1 -1
- maxframe/dataframe/arithmetic/log2.py +1 -1
- maxframe/dataframe/arithmetic/mod.py +1 -1
- maxframe/dataframe/arithmetic/multiply.py +1 -1
- maxframe/dataframe/arithmetic/negative.py +1 -1
- maxframe/dataframe/arithmetic/not_equal.py +1 -1
- maxframe/dataframe/arithmetic/power.py +1 -1
- maxframe/dataframe/arithmetic/radians.py +1 -1
- maxframe/dataframe/arithmetic/sin.py +1 -1
- maxframe/dataframe/arithmetic/sinh.py +1 -1
- maxframe/dataframe/arithmetic/sqrt.py +1 -1
- maxframe/dataframe/arithmetic/subtract.py +1 -1
- maxframe/dataframe/arithmetic/tan.py +1 -1
- maxframe/dataframe/arithmetic/tanh.py +1 -1
- maxframe/dataframe/arithmetic/tests/__init__.py +1 -1
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +1 -1
- maxframe/dataframe/arithmetic/truediv.py +1 -1
- maxframe/dataframe/arithmetic/trunc.py +1 -1
- maxframe/dataframe/arrays.py +1 -1
- maxframe/dataframe/core.py +1 -1
- maxframe/dataframe/datasource/__init__.py +1 -1
- maxframe/dataframe/datasource/core.py +1 -1
- maxframe/dataframe/datasource/dataframe.py +1 -1
- maxframe/dataframe/datasource/date_range.py +1 -1
- maxframe/dataframe/datasource/from_index.py +1 -1
- maxframe/dataframe/datasource/from_records.py +1 -1
- maxframe/dataframe/datasource/from_tensor.py +1 -1
- maxframe/dataframe/datasource/index.py +1 -1
- maxframe/dataframe/datasource/read_csv.py +1 -1
- maxframe/dataframe/datasource/read_odps_query.py +45 -16
- maxframe/dataframe/datasource/read_odps_table.py +1 -1
- maxframe/dataframe/datasource/read_parquet.py +1 -1
- maxframe/dataframe/datasource/series.py +1 -1
- maxframe/dataframe/datasource/tests/__init__.py +1 -1
- maxframe/dataframe/datasource/tests/test_datasource.py +55 -8
- maxframe/dataframe/datastore/__init__.py +1 -1
- maxframe/dataframe/datastore/core.py +1 -1
- maxframe/dataframe/datastore/tests/__init__.py +1 -1
- maxframe/dataframe/datastore/tests/test_to_odps.py +1 -1
- maxframe/dataframe/datastore/to_csv.py +1 -1
- maxframe/dataframe/datastore/to_odps.py +1 -1
- maxframe/dataframe/extensions/__init__.py +2 -2
- maxframe/dataframe/extensions/accessor.py +6 -22
- maxframe/dataframe/extensions/apply_chunk.py +86 -1
- maxframe/dataframe/extensions/flatjson.py +1 -1
- maxframe/dataframe/extensions/flatmap.py +1 -1
- maxframe/dataframe/extensions/reshuffle.py +1 -1
- maxframe/dataframe/extensions/tests/__init__.py +1 -1
- maxframe/dataframe/extensions/tests/test_apply_chunk.py +1 -1
- maxframe/dataframe/extensions/tests/test_extensions.py +1 -1
- maxframe/dataframe/fetch/__init__.py +1 -1
- maxframe/dataframe/fetch/core.py +1 -1
- maxframe/dataframe/groupby/__init__.py +1 -1
- maxframe/dataframe/groupby/aggregation.py +1 -1
- maxframe/dataframe/groupby/apply.py +1 -1
- maxframe/dataframe/groupby/core.py +1 -1
- maxframe/dataframe/groupby/cum.py +1 -1
- maxframe/dataframe/groupby/fill.py +1 -1
- maxframe/dataframe/groupby/getitem.py +1 -1
- maxframe/dataframe/groupby/head.py +1 -1
- maxframe/dataframe/groupby/sample.py +1 -1
- maxframe/dataframe/groupby/tests/__init__.py +1 -1
- maxframe/dataframe/groupby/tests/test_groupby.py +1 -1
- maxframe/dataframe/groupby/transform.py +1 -1
- maxframe/dataframe/indexing/__init__.py +1 -1
- maxframe/dataframe/indexing/add_prefix_suffix.py +1 -1
- maxframe/dataframe/indexing/align.py +1 -1
- maxframe/dataframe/indexing/at.py +1 -1
- maxframe/dataframe/indexing/getitem.py +1 -1
- maxframe/dataframe/indexing/iat.py +1 -1
- maxframe/dataframe/indexing/iloc.py +1 -1
- maxframe/dataframe/indexing/insert.py +1 -1
- maxframe/dataframe/indexing/loc.py +1 -1
- maxframe/dataframe/indexing/reindex.py +1 -1
- maxframe/dataframe/indexing/rename.py +1 -1
- maxframe/dataframe/indexing/rename_axis.py +1 -1
- maxframe/dataframe/indexing/reset_index.py +1 -1
- maxframe/dataframe/indexing/sample.py +1 -1
- maxframe/dataframe/indexing/set_axis.py +1 -1
- maxframe/dataframe/indexing/set_index.py +1 -1
- maxframe/dataframe/indexing/setitem.py +1 -1
- maxframe/dataframe/indexing/tests/__init__.py +1 -1
- maxframe/dataframe/indexing/tests/test_indexing.py +1 -1
- maxframe/dataframe/indexing/where.py +1 -1
- maxframe/dataframe/initializer.py +1 -1
- maxframe/dataframe/merge/__init__.py +1 -1
- maxframe/dataframe/merge/append.py +1 -1
- maxframe/dataframe/merge/concat.py +1 -1
- maxframe/dataframe/merge/merge.py +1 -1
- maxframe/dataframe/merge/tests/__init__.py +1 -1
- maxframe/dataframe/merge/tests/test_merge.py +1 -1
- maxframe/dataframe/misc/__init__.py +1 -16
- maxframe/dataframe/misc/_duplicate.py +1 -1
- maxframe/dataframe/misc/apply.py +74 -1
- maxframe/dataframe/misc/astype.py +1 -1
- maxframe/dataframe/misc/case_when.py +1 -1
- maxframe/dataframe/misc/check_monotonic.py +1 -1
- maxframe/dataframe/misc/cut.py +6 -4
- maxframe/dataframe/misc/describe.py +1 -1
- maxframe/dataframe/misc/diff.py +1 -1
- maxframe/dataframe/misc/drop.py +1 -1
- maxframe/dataframe/misc/drop_duplicates.py +7 -4
- maxframe/dataframe/misc/duplicated.py +1 -1
- maxframe/dataframe/misc/eval.py +1 -1
- maxframe/dataframe/misc/explode.py +1 -1
- maxframe/dataframe/misc/get_dummies.py +1 -1
- maxframe/dataframe/misc/isin.py +1 -1
- maxframe/dataframe/misc/map.py +1 -1
- maxframe/dataframe/misc/melt.py +1 -1
- maxframe/dataframe/misc/memory_usage.py +1 -1
- maxframe/dataframe/misc/pct_change.py +1 -1
- maxframe/dataframe/misc/pivot_table.py +1 -1
- maxframe/dataframe/misc/qcut.py +1 -1
- maxframe/dataframe/misc/select_dtypes.py +1 -1
- maxframe/dataframe/misc/shift.py +1 -1
- maxframe/dataframe/misc/stack.py +1 -1
- maxframe/dataframe/misc/tests/__init__.py +1 -1
- maxframe/dataframe/misc/tests/test_misc.py +1 -76
- maxframe/dataframe/misc/to_numeric.py +1 -1
- maxframe/dataframe/misc/transform.py +1 -1
- maxframe/dataframe/misc/transpose.py +1 -1
- maxframe/dataframe/misc/value_counts.py +1 -1
- maxframe/dataframe/missing/__init__.py +1 -1
- maxframe/dataframe/missing/checkna.py +1 -1
- maxframe/dataframe/missing/dropna.py +1 -1
- maxframe/dataframe/missing/fillna.py +1 -1
- maxframe/dataframe/missing/replace.py +1 -1
- maxframe/dataframe/missing/tests/__init__.py +1 -1
- maxframe/dataframe/missing/tests/test_missing.py +1 -1
- maxframe/dataframe/operators.py +1 -1
- maxframe/dataframe/reduction/__init__.py +1 -1
- maxframe/dataframe/reduction/aggregation.py +1 -1
- maxframe/dataframe/reduction/all.py +1 -1
- maxframe/dataframe/reduction/any.py +1 -1
- maxframe/dataframe/reduction/core.py +1 -1
- maxframe/dataframe/reduction/count.py +1 -1
- maxframe/dataframe/reduction/cummax.py +1 -1
- maxframe/dataframe/reduction/cummin.py +1 -1
- maxframe/dataframe/reduction/cumprod.py +1 -1
- maxframe/dataframe/reduction/cumsum.py +1 -1
- maxframe/dataframe/reduction/custom_reduction.py +1 -1
- maxframe/dataframe/reduction/kurtosis.py +1 -1
- maxframe/dataframe/reduction/max.py +1 -1
- maxframe/dataframe/reduction/mean.py +1 -1
- maxframe/dataframe/reduction/median.py +1 -1
- maxframe/dataframe/reduction/min.py +1 -1
- maxframe/dataframe/reduction/nunique.py +1 -1
- maxframe/dataframe/reduction/prod.py +1 -1
- maxframe/dataframe/reduction/reduction_size.py +1 -1
- maxframe/dataframe/reduction/sem.py +1 -1
- maxframe/dataframe/reduction/skew.py +1 -1
- maxframe/dataframe/reduction/std.py +1 -1
- maxframe/dataframe/reduction/str_concat.py +1 -1
- maxframe/dataframe/reduction/sum.py +1 -1
- maxframe/dataframe/reduction/tests/__init__.py +1 -1
- maxframe/dataframe/reduction/tests/test_reduction.py +1 -1
- maxframe/dataframe/reduction/unique.py +1 -1
- maxframe/dataframe/reduction/var.py +1 -1
- maxframe/dataframe/sort/__init__.py +1 -1
- maxframe/dataframe/sort/core.py +1 -1
- maxframe/dataframe/sort/sort_index.py +1 -1
- maxframe/dataframe/sort/sort_values.py +1 -1
- maxframe/dataframe/sort/tests/__init__.py +1 -1
- maxframe/dataframe/sort/tests/test_sort.py +1 -1
- maxframe/dataframe/statistics/__init__.py +1 -1
- maxframe/dataframe/statistics/corr.py +1 -1
- maxframe/dataframe/statistics/quantile.py +1 -1
- maxframe/dataframe/statistics/tests/__init__.py +1 -1
- maxframe/dataframe/statistics/tests/test_statistics.py +1 -1
- maxframe/dataframe/tests/__init__.py +1 -1
- maxframe/dataframe/tests/test_initializer.py +1 -1
- maxframe/dataframe/tests/test_utils.py +36 -2
- maxframe/dataframe/tseries/__init__.py +1 -1
- maxframe/dataframe/tseries/tests/__init__.py +1 -1
- maxframe/dataframe/tseries/tests/test_tseries.py +1 -1
- maxframe/dataframe/tseries/to_datetime.py +1 -1
- maxframe/dataframe/ufunc/__init__.py +1 -1
- maxframe/dataframe/ufunc/tensor.py +1 -1
- maxframe/dataframe/ufunc/ufunc.py +1 -1
- maxframe/dataframe/utils.py +22 -2
- maxframe/dataframe/window/__init__.py +1 -1
- maxframe/dataframe/window/aggregation.py +1 -1
- maxframe/dataframe/window/core.py +1 -1
- maxframe/dataframe/window/ewm.py +1 -1
- maxframe/dataframe/window/expanding.py +1 -1
- maxframe/dataframe/window/rolling.py +1 -1
- maxframe/dataframe/window/tests/__init__.py +1 -1
- maxframe/dataframe/window/tests/test_ewm.py +1 -1
- maxframe/dataframe/window/tests/test_expanding.py +1 -1
- maxframe/dataframe/window/tests/test_rolling.py +1 -1
- maxframe/env.py +1 -1
- maxframe/errors.py +5 -1
- maxframe/extension.py +5 -2
- maxframe/io/__init__.py +1 -1
- maxframe/io/objects/__init__.py +1 -1
- maxframe/io/objects/core.py +1 -1
- maxframe/io/objects/tensor.py +1 -1
- maxframe/io/objects/tests/__init__.py +1 -1
- maxframe/io/objects/tests/test_object_io.py +1 -1
- maxframe/io/odpsio/__init__.py +1 -1
- maxframe/io/odpsio/arrow.py +8 -4
- maxframe/io/odpsio/schema.py +75 -3
- maxframe/io/odpsio/tableio.py +10 -4
- maxframe/io/odpsio/tests/__init__.py +1 -1
- maxframe/io/odpsio/tests/test_arrow.py +46 -1
- maxframe/io/odpsio/tests/test_schema.py +19 -1
- maxframe/io/odpsio/tests/test_tableio.py +1 -1
- maxframe/io/odpsio/tests/test_volumeio.py +1 -1
- maxframe/io/odpsio/volumeio.py +1 -1
- maxframe/learn/__init__.py +1 -1
- maxframe/learn/contrib/__init__.py +1 -1
- maxframe/learn/contrib/graph/__init__.py +1 -1
- maxframe/learn/contrib/graph/connected_components.py +1 -1
- maxframe/learn/contrib/graph/tests/__init__.py +1 -1
- maxframe/learn/contrib/graph/tests/test_connected_components.py +1 -1
- maxframe/learn/contrib/llm/__init__.py +1 -1
- maxframe/learn/contrib/llm/core.py +1 -1
- maxframe/learn/contrib/llm/models/__init__.py +1 -1
- maxframe/learn/contrib/llm/models/dashscope.py +1 -1
- maxframe/learn/contrib/llm/multi_modal.py +1 -1
- maxframe/learn/contrib/llm/text.py +1 -1
- maxframe/learn/contrib/pytorch/__init__.py +1 -1
- maxframe/learn/contrib/pytorch/run_function.py +1 -1
- maxframe/learn/contrib/pytorch/run_script.py +1 -1
- maxframe/learn/contrib/pytorch/tests/__init__.py +1 -1
- maxframe/learn/contrib/pytorch/tests/test_pytorch.py +1 -1
- maxframe/learn/contrib/utils.py +1 -1
- maxframe/learn/contrib/xgboost/__init__.py +1 -1
- maxframe/learn/contrib/xgboost/classifier.py +1 -1
- maxframe/learn/contrib/xgboost/core.py +1 -1
- maxframe/learn/contrib/xgboost/dmatrix.py +5 -2
- maxframe/learn/contrib/xgboost/predict.py +1 -1
- maxframe/learn/contrib/xgboost/regressor.py +1 -1
- maxframe/learn/contrib/xgboost/tests/__init__.py +1 -1
- maxframe/learn/contrib/xgboost/tests/test_core.py +1 -1
- maxframe/learn/contrib/xgboost/train.py +1 -1
- maxframe/learn/core.py +1 -1
- maxframe/learn/utils/__init__.py +1 -1
- maxframe/learn/utils/core.py +1 -1
- maxframe/lib/__init__.py +1 -1
- maxframe/lib/aio/__init__.py +1 -1
- maxframe/lib/aio/_runners.py +1 -1
- maxframe/lib/aio/_threads.py +1 -1
- maxframe/lib/aio/base.py +1 -1
- maxframe/lib/aio/file.py +1 -1
- maxframe/lib/aio/isolation.py +1 -1
- maxframe/lib/aio/lru.py +1 -1
- maxframe/lib/aio/parallelism.py +1 -1
- maxframe/lib/aio/tests/__init__.py +1 -1
- maxframe/lib/aio/tests/test_aio_file.py +1 -1
- maxframe/lib/compression.py +1 -1
- maxframe/lib/cython/__init__.py +1 -1
- maxframe/lib/cython/libcpp.pxd +1 -1
- maxframe/lib/dtypes_extension/__init__.py +14 -0
- maxframe/lib/dtypes_extension/dtypes.py +91 -0
- maxframe/lib/dtypes_extension/tests/__init__.py +13 -0
- maxframe/lib/dtypes_extension/tests/test_dtypes.py +68 -0
- maxframe/lib/filesystem/__init__.py +1 -1
- maxframe/lib/filesystem/_glob.py +1 -1
- maxframe/lib/filesystem/_oss_lib/__init__.py +1 -1
- maxframe/lib/filesystem/_oss_lib/common.py +1 -1
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/filesystem/_oss_lib/handle.py +1 -1
- maxframe/lib/filesystem/arrow.py +1 -1
- maxframe/lib/filesystem/base.py +1 -1
- maxframe/lib/filesystem/core.py +1 -1
- maxframe/lib/filesystem/fsmap.py +1 -1
- maxframe/lib/filesystem/hdfs.py +1 -1
- maxframe/lib/filesystem/local.py +1 -1
- maxframe/lib/filesystem/oss.py +1 -1
- maxframe/lib/filesystem/tests/__init__.py +1 -1
- maxframe/lib/filesystem/tests/test_filesystem.py +6 -4
- maxframe/lib/filesystem/tests/test_oss.py +1 -1
- maxframe/lib/functools_compat.py +1 -1
- maxframe/lib/mmh3.cp311-win32.pyd +0 -0
- maxframe/lib/mmh3.pyi +1 -1
- maxframe/lib/sparse/__init__.py +1 -1
- maxframe/lib/sparse/array.py +1 -1
- maxframe/lib/sparse/core.py +1 -1
- maxframe/lib/sparse/matrix.py +1 -1
- maxframe/lib/sparse/tests/__init__.py +1 -1
- maxframe/lib/sparse/tests/test_sparse.py +1 -1
- maxframe/lib/sparse/vector.py +1 -1
- maxframe/lib/tests/__init__.py +1 -1
- maxframe/lib/tests/test_wrapped_pickle.py +1 -1
- maxframe/lib/version.py +1 -1
- maxframe/lib/wrapped_pickle.py +1 -1
- maxframe/mixin.py +1 -1
- maxframe/opcodes.py +6 -1
- maxframe/protocol.py +1 -1
- maxframe/remote/__init__.py +1 -1
- maxframe/remote/core.py +1 -1
- maxframe/remote/run_script.py +1 -1
- maxframe/serialization/__init__.py +1 -1
- maxframe/serialization/arrow.py +1 -1
- maxframe/serialization/core.cp311-win32.pyd +0 -0
- maxframe/serialization/core.pxd +1 -1
- maxframe/serialization/core.pyi +1 -1
- maxframe/serialization/core.pyx +9 -6
- maxframe/serialization/exception.py +1 -1
- maxframe/serialization/maxframe_objects.py +1 -1
- maxframe/serialization/numpy.py +1 -1
- maxframe/serialization/pandas.py +1 -1
- maxframe/serialization/scipy.py +1 -1
- maxframe/serialization/serializables/__init__.py +1 -1
- maxframe/serialization/serializables/core.py +95 -90
- maxframe/serialization/serializables/field.py +1 -1
- maxframe/serialization/serializables/field_type.py +1 -1
- maxframe/serialization/serializables/tests/__init__.py +1 -1
- maxframe/serialization/serializables/tests/test_field_type.py +1 -1
- maxframe/serialization/serializables/tests/test_serializable.py +1 -1
- maxframe/serialization/tests/__init__.py +1 -1
- maxframe/serialization/tests/test_serial.py +21 -3
- maxframe/session.py +1 -1
- maxframe/tensor/__init__.py +1 -1
- maxframe/tensor/arithmetic/__init__.py +1 -1
- maxframe/tensor/arithmetic/abs.py +1 -1
- maxframe/tensor/arithmetic/absolute.py +1 -1
- maxframe/tensor/arithmetic/add.py +1 -1
- maxframe/tensor/arithmetic/angle.py +1 -1
- maxframe/tensor/arithmetic/arccos.py +1 -1
- maxframe/tensor/arithmetic/arccosh.py +1 -1
- maxframe/tensor/arithmetic/arcsin.py +1 -1
- maxframe/tensor/arithmetic/arcsinh.py +1 -1
- maxframe/tensor/arithmetic/arctan.py +1 -1
- maxframe/tensor/arithmetic/arctan2.py +1 -1
- maxframe/tensor/arithmetic/arctanh.py +1 -1
- maxframe/tensor/arithmetic/around.py +1 -1
- maxframe/tensor/arithmetic/bitand.py +1 -1
- maxframe/tensor/arithmetic/bitor.py +1 -1
- maxframe/tensor/arithmetic/bitxor.py +1 -1
- maxframe/tensor/arithmetic/cbrt.py +1 -1
- maxframe/tensor/arithmetic/ceil.py +1 -1
- maxframe/tensor/arithmetic/clip.py +1 -1
- maxframe/tensor/arithmetic/conj.py +1 -1
- maxframe/tensor/arithmetic/copysign.py +1 -1
- maxframe/tensor/arithmetic/core.py +1 -1
- maxframe/tensor/arithmetic/cos.py +1 -1
- maxframe/tensor/arithmetic/cosh.py +1 -1
- maxframe/tensor/arithmetic/deg2rad.py +1 -1
- maxframe/tensor/arithmetic/degrees.py +1 -1
- maxframe/tensor/arithmetic/divide.py +1 -1
- maxframe/tensor/arithmetic/equal.py +1 -1
- maxframe/tensor/arithmetic/exp.py +1 -1
- maxframe/tensor/arithmetic/exp2.py +1 -1
- maxframe/tensor/arithmetic/expm1.py +1 -1
- maxframe/tensor/arithmetic/fabs.py +1 -1
- maxframe/tensor/arithmetic/fix.py +1 -1
- maxframe/tensor/arithmetic/float_power.py +1 -1
- maxframe/tensor/arithmetic/floor.py +1 -1
- maxframe/tensor/arithmetic/floordiv.py +1 -1
- maxframe/tensor/arithmetic/fmax.py +1 -1
- maxframe/tensor/arithmetic/fmin.py +1 -1
- maxframe/tensor/arithmetic/fmod.py +1 -1
- maxframe/tensor/arithmetic/frexp.py +1 -1
- maxframe/tensor/arithmetic/greater.py +1 -1
- maxframe/tensor/arithmetic/greater_equal.py +1 -1
- maxframe/tensor/arithmetic/hypot.py +1 -1
- maxframe/tensor/arithmetic/i0.py +1 -1
- maxframe/tensor/arithmetic/imag.py +1 -1
- maxframe/tensor/arithmetic/invert.py +1 -1
- maxframe/tensor/arithmetic/isclose.py +1 -1
- maxframe/tensor/arithmetic/iscomplex.py +1 -1
- maxframe/tensor/arithmetic/isfinite.py +1 -1
- maxframe/tensor/arithmetic/isinf.py +1 -1
- maxframe/tensor/arithmetic/isnan.py +1 -1
- maxframe/tensor/arithmetic/isreal.py +1 -1
- maxframe/tensor/arithmetic/ldexp.py +1 -1
- maxframe/tensor/arithmetic/less.py +1 -1
- maxframe/tensor/arithmetic/less_equal.py +1 -1
- maxframe/tensor/arithmetic/log.py +1 -1
- maxframe/tensor/arithmetic/log10.py +1 -1
- maxframe/tensor/arithmetic/log1p.py +1 -1
- maxframe/tensor/arithmetic/log2.py +1 -1
- maxframe/tensor/arithmetic/logaddexp.py +1 -1
- maxframe/tensor/arithmetic/logaddexp2.py +1 -1
- maxframe/tensor/arithmetic/logical_and.py +1 -1
- maxframe/tensor/arithmetic/logical_not.py +1 -1
- maxframe/tensor/arithmetic/logical_or.py +1 -1
- maxframe/tensor/arithmetic/logical_xor.py +1 -1
- maxframe/tensor/arithmetic/lshift.py +1 -1
- maxframe/tensor/arithmetic/maximum.py +1 -1
- maxframe/tensor/arithmetic/minimum.py +1 -1
- maxframe/tensor/arithmetic/mod.py +1 -1
- maxframe/tensor/arithmetic/modf.py +1 -1
- maxframe/tensor/arithmetic/multiply.py +1 -1
- maxframe/tensor/arithmetic/nan_to_num.py +1 -1
- maxframe/tensor/arithmetic/negative.py +1 -1
- maxframe/tensor/arithmetic/nextafter.py +1 -1
- maxframe/tensor/arithmetic/not_equal.py +1 -1
- maxframe/tensor/arithmetic/positive.py +1 -1
- maxframe/tensor/arithmetic/power.py +1 -1
- maxframe/tensor/arithmetic/rad2deg.py +1 -1
- maxframe/tensor/arithmetic/radians.py +1 -1
- maxframe/tensor/arithmetic/real.py +1 -1
- maxframe/tensor/arithmetic/reciprocal.py +1 -1
- maxframe/tensor/arithmetic/rint.py +1 -1
- maxframe/tensor/arithmetic/rshift.py +1 -1
- maxframe/tensor/arithmetic/setimag.py +1 -1
- maxframe/tensor/arithmetic/setreal.py +1 -1
- maxframe/tensor/arithmetic/sign.py +1 -1
- maxframe/tensor/arithmetic/signbit.py +1 -1
- maxframe/tensor/arithmetic/sin.py +1 -1
- maxframe/tensor/arithmetic/sinc.py +1 -1
- maxframe/tensor/arithmetic/sinh.py +1 -1
- maxframe/tensor/arithmetic/spacing.py +1 -1
- maxframe/tensor/arithmetic/sqrt.py +1 -1
- maxframe/tensor/arithmetic/square.py +1 -1
- maxframe/tensor/arithmetic/subtract.py +1 -1
- maxframe/tensor/arithmetic/tan.py +1 -1
- maxframe/tensor/arithmetic/tanh.py +1 -1
- maxframe/tensor/arithmetic/tests/__init__.py +1 -1
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +1 -1
- maxframe/tensor/arithmetic/truediv.py +1 -1
- maxframe/tensor/arithmetic/trunc.py +1 -1
- maxframe/tensor/arithmetic/utils.py +1 -1
- maxframe/tensor/array_utils.py +1 -1
- maxframe/tensor/core.py +1 -1
- maxframe/tensor/datasource/__init__.py +1 -1
- maxframe/tensor/datasource/arange.py +1 -1
- maxframe/tensor/datasource/array.py +1 -1
- maxframe/tensor/datasource/core.py +1 -1
- maxframe/tensor/datasource/empty.py +1 -1
- maxframe/tensor/datasource/from_dataframe.py +1 -1
- maxframe/tensor/datasource/from_dense.py +1 -1
- maxframe/tensor/datasource/from_sparse.py +1 -1
- maxframe/tensor/datasource/full.py +1 -1
- maxframe/tensor/datasource/ones.py +1 -1
- maxframe/tensor/datasource/scalar.py +1 -1
- maxframe/tensor/datasource/tests/__init__.py +1 -1
- maxframe/tensor/datasource/tests/test_datasource.py +1 -1
- maxframe/tensor/datasource/zeros.py +1 -1
- maxframe/tensor/fetch/__init__.py +1 -1
- maxframe/tensor/fetch/core.py +1 -1
- maxframe/tensor/indexing/__init__.py +1 -1
- maxframe/tensor/indexing/choose.py +1 -1
- maxframe/tensor/indexing/compress.py +1 -1
- maxframe/tensor/indexing/core.py +1 -1
- maxframe/tensor/indexing/extract.py +1 -1
- maxframe/tensor/indexing/fill_diagonal.py +1 -1
- maxframe/tensor/indexing/flatnonzero.py +1 -1
- maxframe/tensor/indexing/getitem.py +1 -1
- maxframe/tensor/indexing/nonzero.py +1 -1
- maxframe/tensor/indexing/setitem.py +1 -1
- maxframe/tensor/indexing/slice.py +1 -1
- maxframe/tensor/indexing/take.py +1 -1
- maxframe/tensor/indexing/tests/__init__.py +1 -1
- maxframe/tensor/indexing/tests/test_indexing.py +1 -1
- maxframe/tensor/indexing/unravel_index.py +1 -1
- maxframe/tensor/merge/__init__.py +1 -1
- maxframe/tensor/merge/concatenate.py +1 -1
- maxframe/tensor/merge/stack.py +1 -1
- maxframe/tensor/merge/tests/__init__.py +1 -1
- maxframe/tensor/merge/tests/test_merge.py +1 -1
- maxframe/tensor/merge/vstack.py +1 -1
- maxframe/tensor/misc/__init__.py +1 -1
- maxframe/tensor/misc/astype.py +1 -1
- maxframe/tensor/misc/atleast_1d.py +1 -1
- maxframe/tensor/misc/atleast_2d.py +1 -1
- maxframe/tensor/misc/atleast_3d.py +1 -1
- maxframe/tensor/misc/broadcast_to.py +1 -1
- maxframe/tensor/misc/ravel.py +1 -1
- maxframe/tensor/misc/tests/__init__.py +1 -1
- maxframe/tensor/misc/tests/test_misc.py +1 -1
- maxframe/tensor/misc/transpose.py +1 -1
- maxframe/tensor/misc/unique.py +1 -1
- maxframe/tensor/misc/where.py +1 -1
- maxframe/tensor/operators.py +1 -1
- maxframe/tensor/random/__init__.py +1 -1
- maxframe/tensor/random/beta.py +1 -1
- maxframe/tensor/random/binomial.py +1 -1
- maxframe/tensor/random/bytes.py +1 -1
- maxframe/tensor/random/chisquare.py +1 -1
- maxframe/tensor/random/choice.py +1 -1
- maxframe/tensor/random/core.py +1 -1
- maxframe/tensor/random/dirichlet.py +1 -1
- maxframe/tensor/random/exponential.py +1 -1
- maxframe/tensor/random/f.py +1 -1
- maxframe/tensor/random/gamma.py +1 -1
- maxframe/tensor/random/geometric.py +1 -1
- maxframe/tensor/random/gumbel.py +1 -1
- maxframe/tensor/random/hypergeometric.py +1 -1
- maxframe/tensor/random/laplace.py +1 -1
- maxframe/tensor/random/logistic.py +1 -1
- maxframe/tensor/random/lognormal.py +1 -1
- maxframe/tensor/random/logseries.py +1 -1
- maxframe/tensor/random/multinomial.py +1 -1
- maxframe/tensor/random/multivariate_normal.py +1 -1
- maxframe/tensor/random/negative_binomial.py +1 -1
- maxframe/tensor/random/noncentral_chisquare.py +1 -1
- maxframe/tensor/random/noncentral_f.py +1 -1
- maxframe/tensor/random/normal.py +1 -1
- maxframe/tensor/random/pareto.py +1 -1
- maxframe/tensor/random/permutation.py +1 -1
- maxframe/tensor/random/poisson.py +1 -1
- maxframe/tensor/random/power.py +1 -1
- maxframe/tensor/random/rand.py +1 -1
- maxframe/tensor/random/randint.py +1 -1
- maxframe/tensor/random/randn.py +1 -1
- maxframe/tensor/random/random_integers.py +1 -1
- maxframe/tensor/random/random_sample.py +1 -1
- maxframe/tensor/random/rayleigh.py +1 -1
- maxframe/tensor/random/shuffle.py +1 -1
- maxframe/tensor/random/standard_cauchy.py +1 -1
- maxframe/tensor/random/standard_exponential.py +1 -1
- maxframe/tensor/random/standard_gamma.py +1 -1
- maxframe/tensor/random/standard_normal.py +1 -1
- maxframe/tensor/random/standard_t.py +1 -1
- maxframe/tensor/random/tests/__init__.py +1 -1
- maxframe/tensor/random/tests/test_random.py +1 -1
- maxframe/tensor/random/triangular.py +1 -1
- maxframe/tensor/random/uniform.py +1 -1
- maxframe/tensor/random/vonmises.py +1 -1
- maxframe/tensor/random/wald.py +1 -1
- maxframe/tensor/random/weibull.py +1 -1
- maxframe/tensor/random/zipf.py +1 -1
- maxframe/tensor/rechunk/__init__.py +1 -1
- maxframe/tensor/rechunk/rechunk.py +1 -1
- maxframe/tensor/reduction/__init__.py +1 -1
- maxframe/tensor/reduction/all.py +1 -1
- maxframe/tensor/reduction/allclose.py +1 -1
- maxframe/tensor/reduction/any.py +1 -1
- maxframe/tensor/reduction/argmax.py +1 -1
- maxframe/tensor/reduction/argmin.py +1 -1
- maxframe/tensor/reduction/array_equal.py +1 -1
- maxframe/tensor/reduction/core.py +1 -1
- maxframe/tensor/reduction/count_nonzero.py +1 -1
- maxframe/tensor/reduction/cumprod.py +1 -1
- maxframe/tensor/reduction/cumsum.py +1 -1
- maxframe/tensor/reduction/max.py +1 -1
- maxframe/tensor/reduction/mean.py +1 -1
- maxframe/tensor/reduction/min.py +1 -1
- maxframe/tensor/reduction/nanargmax.py +1 -1
- maxframe/tensor/reduction/nanargmin.py +1 -1
- maxframe/tensor/reduction/nancumprod.py +1 -1
- maxframe/tensor/reduction/nancumsum.py +1 -1
- maxframe/tensor/reduction/nanmax.py +1 -1
- maxframe/tensor/reduction/nanmean.py +1 -1
- maxframe/tensor/reduction/nanmin.py +1 -1
- maxframe/tensor/reduction/nanprod.py +1 -1
- maxframe/tensor/reduction/nanstd.py +1 -1
- maxframe/tensor/reduction/nansum.py +1 -1
- maxframe/tensor/reduction/nanvar.py +1 -1
- maxframe/tensor/reduction/prod.py +1 -1
- maxframe/tensor/reduction/std.py +1 -1
- maxframe/tensor/reduction/sum.py +1 -1
- maxframe/tensor/reduction/tests/__init__.py +1 -1
- maxframe/tensor/reduction/tests/test_reduction.py +1 -1
- maxframe/tensor/reduction/var.py +1 -1
- maxframe/tensor/reshape/__init__.py +1 -1
- maxframe/tensor/reshape/reshape.py +1 -1
- maxframe/tensor/reshape/tests/__init__.py +1 -1
- maxframe/tensor/reshape/tests/test_reshape.py +1 -1
- maxframe/tensor/statistics/__init__.py +1 -1
- maxframe/tensor/statistics/percentile.py +1 -1
- maxframe/tensor/statistics/quantile.py +1 -1
- maxframe/tensor/ufunc/__init__.py +1 -1
- maxframe/tensor/ufunc/ufunc.py +1 -1
- maxframe/tensor/utils.py +1 -1
- maxframe/tests/__init__.py +1 -1
- maxframe/tests/test_codegen.py +1 -1
- maxframe/tests/test_protocol.py +1 -1
- maxframe/tests/test_utils.py +1 -1
- maxframe/tests/utils.py +1 -1
- maxframe/typing_.py +1 -1
- maxframe/udf.py +6 -1
- maxframe/utils.py +8 -1
- {maxframe-1.1.1.dist-info → maxframe-1.2.0.dist-info}/METADATA +3 -2
- maxframe-1.2.0.dist-info/RECORD +697 -0
- {maxframe-1.1.1.dist-info → maxframe-1.2.0.dist-info}/WHEEL +1 -1
- maxframe_client/__init__.py +1 -1
- maxframe_client/clients/__init__.py +1 -1
- maxframe_client/clients/framedriver.py +1 -1
- maxframe_client/conftest.py +1 -1
- maxframe_client/fetcher.py +1 -1
- maxframe_client/session/__init__.py +1 -1
- maxframe_client/session/consts.py +1 -1
- maxframe_client/session/graph.py +1 -1
- maxframe_client/session/odps.py +2 -1
- maxframe_client/session/task.py +1 -1
- maxframe_client/session/tests/__init__.py +1 -1
- maxframe_client/session/tests/test_task.py +1 -1
- maxframe_client/tests/__init__.py +1 -1
- maxframe_client/tests/test_fetcher.py +1 -1
- maxframe_client/tests/test_session.py +1 -1
- maxframe-1.1.1.dist-info/RECORD +0 -675
- {maxframe-1.1.1.dist-info → maxframe-1.2.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
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
|
+
import numpy as np
|
|
15
|
+
import pandas as pd
|
|
16
|
+
import pyarrow as pa
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from ..... import dataframe as md
|
|
20
|
+
from .....lib.dtypes_extension import dict_
|
|
21
|
+
from .....utils import ARROW_DTYPE_NOT_SUPPORTED
|
|
22
|
+
from ..contains import SeriesDictContainsOperator
|
|
23
|
+
from ..getitem import SeriesDictGetItemOperator
|
|
24
|
+
from ..length import SeriesDictLengthOperator
|
|
25
|
+
from ..remove import SeriesDictRemoveOperator
|
|
26
|
+
from ..setitem import SeriesDictSetItemOperator
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.fixture
|
|
30
|
+
def df():
|
|
31
|
+
return md.DataFrame(
|
|
32
|
+
{
|
|
33
|
+
"A": pd.Series(
|
|
34
|
+
[(("k1", "v1"), ("k2", "v2"))], dtype=dict_(pa.string(), pa.string())
|
|
35
|
+
),
|
|
36
|
+
"B": pd.Series([{"k1": 1, "k2": 2}], dtype=dict_(pa.string(), pa.int64())),
|
|
37
|
+
"C": pd.Series([1], dtype=np.dtype("int64")),
|
|
38
|
+
},
|
|
39
|
+
index=[1],
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@pytest.mark.skipif(ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported")
|
|
44
|
+
def test_invalid_dtype(df):
|
|
45
|
+
with pytest.raises(AttributeError):
|
|
46
|
+
df["C"].dict.contains("k1")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@pytest.mark.skipif(ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported")
|
|
50
|
+
def test_getitem(df):
|
|
51
|
+
s1 = df["A"].dict["k1"]
|
|
52
|
+
assert isinstance(s1, md.Series)
|
|
53
|
+
assert s1.name == "k1"
|
|
54
|
+
assert s1.dtype == pd.ArrowDtype(pa.string())
|
|
55
|
+
assert s1.shape == (1,)
|
|
56
|
+
assert s1.index_value == df.index_value
|
|
57
|
+
op = s1.op
|
|
58
|
+
assert isinstance(op, SeriesDictGetItemOperator)
|
|
59
|
+
assert op.query_key == "k1"
|
|
60
|
+
assert op.default_value is None
|
|
61
|
+
assert op.ignore_key_error is False
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@pytest.mark.skipif(ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported")
|
|
65
|
+
def test_getitem_with_default_value(df):
|
|
66
|
+
s1 = df["B"].dict.get("k1", 1)
|
|
67
|
+
assert isinstance(s1, md.Series)
|
|
68
|
+
assert s1.name == "k1"
|
|
69
|
+
assert s1.dtype == pd.ArrowDtype(pa.int64())
|
|
70
|
+
assert s1.shape == (1,)
|
|
71
|
+
assert s1.index_value == df.index_value
|
|
72
|
+
op = s1.op
|
|
73
|
+
assert isinstance(op, SeriesDictGetItemOperator)
|
|
74
|
+
assert op.query_key == "k1"
|
|
75
|
+
assert op.default_value == 1
|
|
76
|
+
assert op.ignore_key_error is True
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@pytest.mark.skipif(ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported")
|
|
80
|
+
def test_setitem(df):
|
|
81
|
+
s1 = df["A"]
|
|
82
|
+
s1.dict["k1"] = "v3"
|
|
83
|
+
assert isinstance(s1, md.Series)
|
|
84
|
+
assert s1.name == "A"
|
|
85
|
+
assert s1.dtype == dict_(pa.string(), pa.string())
|
|
86
|
+
assert s1.index_value == df.index_value
|
|
87
|
+
assert s1.shape == (1,)
|
|
88
|
+
op = s1.op
|
|
89
|
+
assert isinstance(op, SeriesDictSetItemOperator)
|
|
90
|
+
assert op.query_key == "k1"
|
|
91
|
+
assert op.value == "v3"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@pytest.mark.skipif(ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported")
|
|
95
|
+
def test_length(df):
|
|
96
|
+
s1 = df["A"].dict.len()
|
|
97
|
+
assert isinstance(s1, md.Series)
|
|
98
|
+
assert s1.name is None
|
|
99
|
+
assert s1.dtype == pd.ArrowDtype(pa.int64())
|
|
100
|
+
assert s1.shape == (1,)
|
|
101
|
+
assert s1.index_value == df.index_value
|
|
102
|
+
op = s1.op
|
|
103
|
+
assert isinstance(op, SeriesDictLengthOperator)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@pytest.mark.skipif(ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported")
|
|
107
|
+
def test_remove(df):
|
|
108
|
+
s1 = df["A"].dict.remove("k1", ignore_key_error=True)
|
|
109
|
+
assert isinstance(s1, md.Series)
|
|
110
|
+
assert s1.name == "A"
|
|
111
|
+
assert s1.dtype == dict_(pa.string(), pa.string())
|
|
112
|
+
assert s1.index_value == df.index_value
|
|
113
|
+
assert s1.shape == (1,)
|
|
114
|
+
op = s1.op
|
|
115
|
+
assert isinstance(op, SeriesDictRemoveOperator)
|
|
116
|
+
assert op.query_key == "k1"
|
|
117
|
+
assert op.ignore_key_error is True
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@pytest.mark.skipif(ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported")
|
|
121
|
+
def test_contains(df):
|
|
122
|
+
s1 = df["A"].dict.contains("k1")
|
|
123
|
+
assert isinstance(s1, md.Series)
|
|
124
|
+
assert s1.name is None
|
|
125
|
+
assert s1.dtype == pd.ArrowDtype(pa.bool_())
|
|
126
|
+
assert s1.index_value == df.index_value
|
|
127
|
+
assert s1.shape == (1,)
|
|
128
|
+
op = s1.op
|
|
129
|
+
assert isinstance(op, SeriesDictContainsOperator)
|
|
130
|
+
assert op.query_key == "k1"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright 1999-
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -11,14 +11,12 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
|
|
15
|
-
|
|
16
14
|
def _install():
|
|
17
15
|
import pandas as pd
|
|
18
16
|
|
|
19
|
-
from
|
|
20
|
-
from
|
|
21
|
-
from
|
|
17
|
+
from ....core import CachedAccessor
|
|
18
|
+
from ....utils import adapt_docstring
|
|
19
|
+
from ...core import DATAFRAME_TYPE, SERIES_TYPE
|
|
22
20
|
from .core import DataFramePlotAccessor, PlotAccessor, SeriesPlotAccessor
|
|
23
21
|
|
|
24
22
|
for t in DATAFRAME_TYPE:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright 1999-
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -16,8 +16,8 @@ from collections import OrderedDict
|
|
|
16
16
|
|
|
17
17
|
import pandas as pd
|
|
18
18
|
|
|
19
|
-
from
|
|
20
|
-
from
|
|
19
|
+
from ....core import ENTITY_TYPE, ExecutableTuple
|
|
20
|
+
from ....utils import adapt_docstring, get_item_if_scalar
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class PlotAccessor:
|
|
@@ -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.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright 1999-
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -25,11 +25,11 @@ try:
|
|
|
25
25
|
except ImportError: # pragma: no cover
|
|
26
26
|
matplotlib = None
|
|
27
27
|
|
|
28
|
-
from
|
|
29
|
-
from
|
|
30
|
-
from
|
|
31
|
-
from
|
|
32
|
-
from
|
|
28
|
+
from ..... import dataframe as md
|
|
29
|
+
from ..... import tensor as mt
|
|
30
|
+
from .....core import ExecutableTuple
|
|
31
|
+
from .....tensor.datasource import Scalar
|
|
32
|
+
from ....datasource import PandasDataSourceOperator
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
@pytest.fixture
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
from .core import SeriesStringMethod
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _install():
|
|
18
|
+
from ....core import CachedAccessor
|
|
19
|
+
from ...core import SERIES_TYPE
|
|
20
|
+
from .accessor import StringAccessor
|
|
21
|
+
from .core import string_method_to_handlers
|
|
22
|
+
|
|
23
|
+
for method in string_method_to_handlers:
|
|
24
|
+
if not hasattr(StringAccessor, method):
|
|
25
|
+
StringAccessor._register(method)
|
|
26
|
+
|
|
27
|
+
for series in SERIES_TYPE:
|
|
28
|
+
series.str = CachedAccessor("str", StringAccessor)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
_install()
|
|
32
|
+
del _install
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright 1999-
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -16,16 +16,9 @@ from functools import wraps
|
|
|
16
16
|
from typing import Iterable
|
|
17
17
|
|
|
18
18
|
import pandas as pd
|
|
19
|
-
from pandas.api.types import (
|
|
20
|
-
is_datetime64_dtype,
|
|
21
|
-
is_datetime64tz_dtype,
|
|
22
|
-
is_period_dtype,
|
|
23
|
-
is_timedelta64_dtype,
|
|
24
|
-
)
|
|
25
19
|
|
|
26
|
-
from
|
|
27
|
-
from .
|
|
28
|
-
from .string_ import SeriesStringMethod, _string_method_to_handlers
|
|
20
|
+
from ....utils import adapt_docstring
|
|
21
|
+
from .core import SeriesStringMethod, string_method_to_handlers
|
|
29
22
|
|
|
30
23
|
|
|
31
24
|
class StringAccessor:
|
|
@@ -69,7 +62,7 @@ class StringAccessor:
|
|
|
69
62
|
|
|
70
63
|
def __dir__(self) -> Iterable[str]:
|
|
71
64
|
s = set(super().__dir__())
|
|
72
|
-
s.update(
|
|
65
|
+
s.update(string_method_to_handlers.keys())
|
|
73
66
|
return list(s)
|
|
74
67
|
|
|
75
68
|
@classmethod
|
|
@@ -220,57 +213,3 @@ class StringAccessor:
|
|
|
220
213
|
|
|
221
214
|
rsplit.__doc__ = adapt_docstring(pd.Series.str.rsplit.__doc__)
|
|
222
215
|
cat.__doc__ = adapt_docstring(pd.Series.str.cat.__doc__)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
class DatetimeAccessor:
|
|
226
|
-
def __init__(self, series):
|
|
227
|
-
if (
|
|
228
|
-
not is_datetime64_dtype(series.dtype)
|
|
229
|
-
and not is_datetime64tz_dtype(series.dtype)
|
|
230
|
-
and not is_timedelta64_dtype(series.dtype)
|
|
231
|
-
and not is_period_dtype(series.dtype)
|
|
232
|
-
):
|
|
233
|
-
raise AttributeError("Can only use .dt accessor with datetimelike values")
|
|
234
|
-
self._series = series
|
|
235
|
-
|
|
236
|
-
@classmethod
|
|
237
|
-
def _gen_func(cls, method, is_property):
|
|
238
|
-
@wraps(getattr(pd.Series.dt, method))
|
|
239
|
-
def _inner(self, *args, **kwargs):
|
|
240
|
-
op = SeriesDatetimeMethod(
|
|
241
|
-
method=method,
|
|
242
|
-
is_property=is_property,
|
|
243
|
-
method_args=args,
|
|
244
|
-
method_kwargs=kwargs,
|
|
245
|
-
)
|
|
246
|
-
return op(self._series)
|
|
247
|
-
|
|
248
|
-
_inner.__doc__ = adapt_docstring(getattr(pd.Series.dt, method).__doc__)
|
|
249
|
-
return _inner
|
|
250
|
-
|
|
251
|
-
@classmethod
|
|
252
|
-
def _register(cls, method):
|
|
253
|
-
is_property = not callable(getattr(pd.Series.dt, method))
|
|
254
|
-
func = cls._gen_func(method, is_property)
|
|
255
|
-
if is_property:
|
|
256
|
-
func = property(func)
|
|
257
|
-
setattr(cls, method, func)
|
|
258
|
-
|
|
259
|
-
def __dir__(self) -> Iterable[str]:
|
|
260
|
-
s = set(super().__dir__())
|
|
261
|
-
s.update(_datetime_method_to_handlers.keys())
|
|
262
|
-
return list(s)
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
class CachedAccessor:
|
|
266
|
-
def __init__(self, name: str, accessor) -> None:
|
|
267
|
-
self._name = name
|
|
268
|
-
self._accessor = accessor
|
|
269
|
-
|
|
270
|
-
def __get__(self, obj, cls):
|
|
271
|
-
if obj is None:
|
|
272
|
-
# we're accessing the attribute of the class, i.e., Dataset.geo
|
|
273
|
-
return self._accessor
|
|
274
|
-
if self._name not in obj._accessors:
|
|
275
|
-
obj._accessors[self._name] = self._accessor(obj)
|
|
276
|
-
return obj._accessors[self._name]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright 1999-
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -15,15 +15,15 @@
|
|
|
15
15
|
import numpy as np
|
|
16
16
|
import pandas as pd
|
|
17
17
|
|
|
18
|
-
from
|
|
19
|
-
from
|
|
20
|
-
from
|
|
21
|
-
from
|
|
22
|
-
from
|
|
23
|
-
from
|
|
24
|
-
from
|
|
25
|
-
from
|
|
26
|
-
from
|
|
18
|
+
from .... import opcodes
|
|
19
|
+
from ....core import OutputType
|
|
20
|
+
from ....serialization.serializables import DictField, KeyField, StringField, TupleField
|
|
21
|
+
from ....tensor import tensor as astensor
|
|
22
|
+
from ....tensor.core import TENSOR_TYPE
|
|
23
|
+
from ...core import SERIES_TYPE
|
|
24
|
+
from ...initializer import Series as asseries
|
|
25
|
+
from ...operators import DataFrameOperator, DataFrameOperatorMixin
|
|
26
|
+
from ...utils import build_empty_series, infer_index_value, parse_index
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
class SeriesStringMethod(DataFrameOperator, DataFrameOperatorMixin):
|
|
@@ -51,7 +51,7 @@ class SeriesStringMethod(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
51
51
|
self.method_kwargs["others"] = self._inputs[1]
|
|
52
52
|
|
|
53
53
|
def __call__(self, inp):
|
|
54
|
-
return
|
|
54
|
+
return string_method_to_handlers[self.method].call(self, inp)
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
class SeriesStringMethodBaseHandler:
|
|
@@ -123,7 +123,7 @@ class SeriesStringCatHandler(SeriesStringMethodBaseHandler):
|
|
|
123
123
|
others = method_kwargs.get("others")
|
|
124
124
|
|
|
125
125
|
if others is None:
|
|
126
|
-
from
|
|
126
|
+
from ...reduction import build_str_concat_object
|
|
127
127
|
|
|
128
128
|
return build_str_concat_object(
|
|
129
129
|
inp,
|
|
@@ -201,21 +201,21 @@ class SeriesStringExtractHandler(SeriesStringMethodBaseHandler):
|
|
|
201
201
|
)
|
|
202
202
|
|
|
203
203
|
|
|
204
|
-
|
|
204
|
+
string_method_to_handlers = {}
|
|
205
205
|
_not_implements = ["get_dummies"]
|
|
206
206
|
# start to register handlers for string methods
|
|
207
207
|
# register special methods first
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
208
|
+
string_method_to_handlers["split"] = SeriesStringSplitHandler
|
|
209
|
+
string_method_to_handlers["rsplit"] = SeriesStringSplitHandler
|
|
210
|
+
string_method_to_handlers["cat"] = SeriesStringCatHandler
|
|
211
|
+
string_method_to_handlers["extract"] = SeriesStringExtractHandler
|
|
212
|
+
string_method_to_handlers["extractall"] = SeriesStringExtractHandler
|
|
213
213
|
# then come to the normal methods
|
|
214
214
|
for method in dir(pd.Series.str):
|
|
215
215
|
if method.startswith("_") and method != "__getitem__":
|
|
216
216
|
continue
|
|
217
217
|
if method in _not_implements:
|
|
218
218
|
continue
|
|
219
|
-
if method in
|
|
219
|
+
if method in string_method_to_handlers:
|
|
220
220
|
continue
|
|
221
|
-
|
|
221
|
+
string_method_to_handlers[method] = SeriesStringMethodBaseHandler
|
|
@@ -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,73 @@
|
|
|
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 ....core import OutputType
|
|
20
|
+
from ....datasource.series import from_pandas as from_pandas_series
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_string_method():
|
|
24
|
+
s = pd.Series(["a", "b", "c"], name="s")
|
|
25
|
+
series = from_pandas_series(s, chunk_size=2)
|
|
26
|
+
|
|
27
|
+
with pytest.raises(AttributeError):
|
|
28
|
+
_ = series.str.non_exist
|
|
29
|
+
|
|
30
|
+
r = series.str.contains("c")
|
|
31
|
+
assert r.dtype == np.bool_
|
|
32
|
+
assert r.name == s.name
|
|
33
|
+
pd.testing.assert_index_equal(r.index_value.to_pandas(), s.index)
|
|
34
|
+
assert r.shape == s.shape
|
|
35
|
+
|
|
36
|
+
r = series.str.split(",", expand=True, n=1)
|
|
37
|
+
assert r.op.output_types[0] == OutputType.dataframe
|
|
38
|
+
assert r.shape == (3, 2)
|
|
39
|
+
pd.testing.assert_index_equal(r.index_value.to_pandas(), s.index)
|
|
40
|
+
pd.testing.assert_index_equal(r.columns_value.to_pandas(), pd.RangeIndex(2))
|
|
41
|
+
|
|
42
|
+
with pytest.raises(TypeError):
|
|
43
|
+
_ = series.str.cat([["1", "2"]])
|
|
44
|
+
|
|
45
|
+
with pytest.raises(ValueError):
|
|
46
|
+
_ = series.str.cat(["1", "2"])
|
|
47
|
+
|
|
48
|
+
with pytest.raises(ValueError):
|
|
49
|
+
_ = series.str.cat(",")
|
|
50
|
+
|
|
51
|
+
with pytest.raises(TypeError):
|
|
52
|
+
_ = series.str.cat({"1", "2", "3"})
|
|
53
|
+
|
|
54
|
+
r = series.str.cat(sep=",")
|
|
55
|
+
assert r.op.output_types[0] == OutputType.scalar
|
|
56
|
+
assert r.dtype == s.dtype
|
|
57
|
+
|
|
58
|
+
r = series.str.extract(r"[ab](\d)", expand=False)
|
|
59
|
+
assert r.op.output_types[0] == OutputType.series
|
|
60
|
+
assert r.dtype == s.dtype
|
|
61
|
+
|
|
62
|
+
r = series.str.extract(r"[ab](\d)", expand=True)
|
|
63
|
+
assert r.op.output_types[0] == OutputType.dataframe
|
|
64
|
+
assert r.shape == (3, 1)
|
|
65
|
+
pd.testing.assert_index_equal(r.index_value.to_pandas(), s.index)
|
|
66
|
+
pd.testing.assert_index_equal(r.columns_value.to_pandas(), pd.RangeIndex(1))
|
|
67
|
+
|
|
68
|
+
assert "lstrip" in dir(series.str)
|
|
69
|
+
|
|
70
|
+
r = series.str[1:10:2]
|
|
71
|
+
assert r.op.method == "slice"
|
|
72
|
+
assert r.op.method_args == ()
|
|
73
|
+
assert r.op.method_kwargs == {"start": 1, "stop": 10, "step": 2}
|