maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +1 -0
- maxframe/_utils.cp37-win32.pyd +0 -0
- maxframe/_utils.pyx +14 -1
- maxframe/codegen/core.py +9 -8
- maxframe/codegen/spe/core.py +1 -1
- maxframe/codegen/spe/dataframe/__init__.py +1 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
- maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
- maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
- maxframe/codegen/spe/dataframe/groupby.py +88 -0
- maxframe/codegen/spe/dataframe/indexing.py +99 -4
- maxframe/codegen/spe/dataframe/merge.py +38 -1
- maxframe/codegen/spe/dataframe/misc.py +11 -33
- maxframe/codegen/spe/dataframe/reduction.py +32 -9
- maxframe/codegen/spe/dataframe/reshape.py +46 -0
- maxframe/codegen/spe/dataframe/sort.py +39 -18
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
- maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
- maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
- maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
- maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
- maxframe/codegen/spe/dataframe/tseries.py +9 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
- maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
- maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
- maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
- maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
- maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
- maxframe/codegen/spe/tensor/__init__.py +3 -0
- maxframe/codegen/spe/tensor/datasource.py +1 -0
- maxframe/codegen/spe/tensor/fft.py +74 -0
- maxframe/codegen/spe/tensor/linalg.py +29 -2
- maxframe/codegen/spe/tensor/misc.py +79 -25
- maxframe/codegen/spe/tensor/spatial.py +45 -0
- maxframe/codegen/spe/tensor/statistics.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
- maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
- maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
- maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
- maxframe/codegen/spe/utils.py +2 -0
- maxframe/config/config.py +73 -9
- maxframe/config/tests/test_validators.py +13 -1
- maxframe/config/validators.py +49 -0
- maxframe/conftest.py +54 -17
- maxframe/core/accessor.py +2 -2
- maxframe/core/base.py +2 -1
- maxframe/core/entity/core.py +5 -0
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/graph/core.cp37-win32.pyd +0 -0
- maxframe/core/graph/entity.py +8 -3
- maxframe/core/mode.py +6 -1
- maxframe/core/operator/base.py +9 -2
- maxframe/core/operator/core.py +10 -2
- maxframe/core/operator/utils.py +13 -0
- maxframe/dataframe/__init__.py +12 -5
- maxframe/dataframe/accessors/__init__.py +1 -1
- maxframe/dataframe/accessors/compat.py +45 -0
- maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
- maxframe/dataframe/accessors/dict_/contains.py +7 -16
- maxframe/dataframe/accessors/dict_/core.py +48 -0
- maxframe/dataframe/accessors/dict_/getitem.py +17 -21
- maxframe/dataframe/accessors/dict_/length.py +7 -16
- maxframe/dataframe/accessors/dict_/remove.py +6 -18
- maxframe/dataframe/accessors/dict_/setitem.py +8 -18
- maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
- maxframe/dataframe/accessors/list_/__init__.py +2 -2
- maxframe/dataframe/accessors/list_/core.py +48 -0
- maxframe/dataframe/accessors/list_/getitem.py +12 -19
- maxframe/dataframe/accessors/list_/length.py +7 -16
- maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
- maxframe/dataframe/accessors/string_/__init__.py +4 -1
- maxframe/dataframe/accessors/struct_/__init__.py +37 -0
- maxframe/dataframe/accessors/struct_/accessor.py +39 -0
- maxframe/dataframe/accessors/struct_/core.py +43 -0
- maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
- maxframe/dataframe/accessors/struct_/field.py +123 -0
- maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
- maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
- maxframe/dataframe/arithmetic/__init__.py +18 -4
- maxframe/dataframe/arithmetic/between.py +106 -0
- maxframe/dataframe/arithmetic/dot.py +237 -0
- maxframe/dataframe/arithmetic/maximum.py +33 -0
- maxframe/dataframe/arithmetic/minimum.py +33 -0
- maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
- maxframe/dataframe/core.py +161 -224
- maxframe/dataframe/datasource/__init__.py +18 -0
- maxframe/dataframe/datasource/core.py +6 -0
- maxframe/dataframe/datasource/direct.py +57 -0
- maxframe/dataframe/datasource/from_dict.py +124 -0
- maxframe/dataframe/datasource/from_index.py +1 -1
- maxframe/dataframe/datasource/from_records.py +77 -0
- maxframe/dataframe/datasource/from_tensor.py +109 -41
- maxframe/dataframe/datasource/read_csv.py +21 -14
- maxframe/dataframe/datasource/read_odps_query.py +29 -6
- maxframe/dataframe/datasource/read_odps_table.py +32 -10
- maxframe/dataframe/datasource/read_parquet.py +38 -39
- maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
- maxframe/dataframe/datastore/__init__.py +11 -1
- maxframe/dataframe/datastore/direct.py +268 -0
- maxframe/dataframe/datastore/to_csv.py +29 -41
- maxframe/dataframe/datastore/to_odps.py +36 -4
- maxframe/dataframe/extensions/__init__.py +20 -4
- maxframe/dataframe/extensions/apply_chunk.py +32 -6
- maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
- maxframe/dataframe/extensions/collect_kv.py +126 -0
- maxframe/dataframe/extensions/extract_kv.py +177 -0
- maxframe/dataframe/extensions/flatjson.py +2 -1
- maxframe/dataframe/extensions/map_reduce.py +263 -0
- maxframe/dataframe/extensions/rebalance.py +62 -0
- maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
- maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
- maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
- maxframe/dataframe/groupby/__init__.py +17 -2
- maxframe/dataframe/groupby/aggregation.py +86 -49
- maxframe/dataframe/groupby/apply.py +1 -1
- maxframe/dataframe/groupby/apply_chunk.py +19 -5
- maxframe/dataframe/groupby/core.py +116 -16
- maxframe/dataframe/groupby/cum.py +4 -25
- maxframe/dataframe/groupby/expanding.py +264 -0
- maxframe/dataframe/groupby/fill.py +1 -1
- maxframe/dataframe/groupby/getitem.py +12 -5
- maxframe/dataframe/groupby/head.py +11 -1
- maxframe/dataframe/groupby/rank.py +136 -0
- maxframe/dataframe/groupby/rolling.py +206 -0
- maxframe/dataframe/groupby/shift.py +114 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
- maxframe/dataframe/indexing/__init__.py +22 -2
- maxframe/dataframe/indexing/droplevel.py +195 -0
- maxframe/dataframe/indexing/filter.py +169 -0
- maxframe/dataframe/indexing/get_level_values.py +76 -0
- maxframe/dataframe/indexing/iat.py +45 -0
- maxframe/dataframe/indexing/iloc.py +152 -12
- maxframe/dataframe/indexing/insert.py +46 -18
- maxframe/dataframe/indexing/loc.py +287 -7
- maxframe/dataframe/indexing/reindex.py +14 -5
- maxframe/dataframe/indexing/rename.py +6 -0
- maxframe/dataframe/indexing/rename_axis.py +2 -2
- maxframe/dataframe/indexing/reorder_levels.py +143 -0
- maxframe/dataframe/indexing/reset_index.py +33 -6
- maxframe/dataframe/indexing/sample.py +8 -0
- maxframe/dataframe/indexing/setitem.py +3 -3
- maxframe/dataframe/indexing/swaplevel.py +185 -0
- maxframe/dataframe/indexing/take.py +99 -0
- maxframe/dataframe/indexing/truncate.py +140 -0
- maxframe/dataframe/indexing/where.py +0 -11
- maxframe/dataframe/indexing/xs.py +148 -0
- maxframe/dataframe/merge/__init__.py +15 -1
- maxframe/dataframe/merge/append.py +97 -98
- maxframe/dataframe/merge/combine.py +244 -0
- maxframe/dataframe/merge/combine_first.py +120 -0
- maxframe/dataframe/merge/compare.py +387 -0
- maxframe/dataframe/merge/concat.py +183 -0
- maxframe/dataframe/merge/update.py +271 -0
- maxframe/dataframe/misc/__init__.py +28 -11
- maxframe/dataframe/misc/_duplicate.py +10 -4
- maxframe/dataframe/misc/apply.py +1 -1
- maxframe/dataframe/misc/check_unique.py +82 -0
- maxframe/dataframe/misc/clip.py +145 -0
- maxframe/dataframe/misc/describe.py +175 -9
- maxframe/dataframe/misc/drop.py +31 -0
- maxframe/dataframe/misc/drop_duplicates.py +2 -2
- maxframe/dataframe/misc/duplicated.py +2 -2
- maxframe/dataframe/misc/get_dummies.py +5 -1
- maxframe/dataframe/misc/infer_dtypes.py +251 -0
- maxframe/dataframe/misc/isin.py +2 -2
- maxframe/dataframe/misc/map.py +125 -18
- maxframe/dataframe/misc/repeat.py +159 -0
- maxframe/dataframe/misc/tests/test_misc.py +48 -3
- maxframe/dataframe/misc/to_numeric.py +3 -0
- maxframe/dataframe/misc/transform.py +12 -5
- maxframe/dataframe/misc/transpose.py +13 -1
- maxframe/dataframe/misc/valid_index.py +115 -0
- maxframe/dataframe/misc/value_counts.py +38 -4
- maxframe/dataframe/missing/checkna.py +14 -6
- maxframe/dataframe/missing/dropna.py +5 -0
- maxframe/dataframe/missing/fillna.py +1 -1
- maxframe/dataframe/missing/replace.py +7 -4
- maxframe/dataframe/reduction/__init__.py +35 -16
- maxframe/dataframe/reduction/aggregation.py +43 -14
- maxframe/dataframe/reduction/all.py +2 -2
- maxframe/dataframe/reduction/any.py +2 -2
- maxframe/dataframe/reduction/argmax.py +103 -0
- maxframe/dataframe/reduction/argmin.py +103 -0
- maxframe/dataframe/reduction/core.py +80 -24
- maxframe/dataframe/reduction/count.py +13 -9
- maxframe/dataframe/reduction/cov.py +166 -0
- maxframe/dataframe/reduction/cummax.py +2 -2
- maxframe/dataframe/reduction/cummin.py +2 -2
- maxframe/dataframe/reduction/cumprod.py +2 -2
- maxframe/dataframe/reduction/cumsum.py +2 -2
- maxframe/dataframe/reduction/custom_reduction.py +2 -2
- maxframe/dataframe/reduction/idxmax.py +185 -0
- maxframe/dataframe/reduction/idxmin.py +185 -0
- maxframe/dataframe/reduction/kurtosis.py +37 -30
- maxframe/dataframe/reduction/max.py +2 -2
- maxframe/dataframe/reduction/mean.py +9 -7
- maxframe/dataframe/reduction/median.py +2 -2
- maxframe/dataframe/reduction/min.py +2 -2
- maxframe/dataframe/reduction/mode.py +144 -0
- maxframe/dataframe/reduction/nunique.py +19 -11
- maxframe/dataframe/reduction/prod.py +18 -13
- maxframe/dataframe/reduction/reduction_size.py +2 -2
- maxframe/dataframe/reduction/sem.py +13 -9
- maxframe/dataframe/reduction/skew.py +31 -27
- maxframe/dataframe/reduction/str_concat.py +10 -7
- maxframe/dataframe/reduction/sum.py +18 -14
- maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
- maxframe/dataframe/reduction/unique.py +20 -3
- maxframe/dataframe/reduction/var.py +16 -12
- maxframe/dataframe/reshape/__init__.py +38 -0
- maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
- maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
- maxframe/dataframe/reshape/unstack.py +114 -0
- maxframe/dataframe/sort/__init__.py +16 -1
- maxframe/dataframe/sort/argsort.py +68 -0
- maxframe/dataframe/sort/core.py +2 -1
- maxframe/dataframe/sort/nlargest.py +238 -0
- maxframe/dataframe/sort/nsmallest.py +228 -0
- maxframe/dataframe/sort/rank.py +147 -0
- maxframe/dataframe/statistics/__init__.py +3 -3
- maxframe/dataframe/statistics/corr.py +1 -0
- maxframe/dataframe/statistics/quantile.py +2 -2
- maxframe/dataframe/tests/test_typing.py +104 -0
- maxframe/dataframe/tests/test_utils.py +66 -2
- maxframe/dataframe/tseries/__init__.py +19 -0
- maxframe/dataframe/tseries/at_time.py +61 -0
- maxframe/dataframe/tseries/between_time.py +122 -0
- maxframe/dataframe/typing_.py +185 -0
- maxframe/dataframe/utils.py +125 -52
- maxframe/dataframe/window/aggregation.py +8 -4
- maxframe/dataframe/window/core.py +14 -1
- maxframe/dataframe/window/ewm.py +1 -3
- maxframe/dataframe/window/expanding.py +37 -35
- maxframe/dataframe/window/rolling.py +49 -39
- maxframe/dataframe/window/tests/test_expanding.py +1 -7
- maxframe/dataframe/window/tests/test_rolling.py +1 -1
- maxframe/env.py +7 -4
- maxframe/errors.py +2 -2
- maxframe/io/odpsio/schema.py +9 -3
- maxframe/io/odpsio/tableio.py +7 -2
- maxframe/io/odpsio/tests/test_schema.py +198 -83
- maxframe/learn/__init__.py +10 -2
- maxframe/learn/cluster/__init__.py +15 -0
- maxframe/learn/cluster/_kmeans.py +782 -0
- maxframe/learn/contrib/llm/core.py +18 -7
- maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/config.py +221 -0
- maxframe/learn/contrib/llm/deploy/core.py +247 -0
- maxframe/learn/contrib/llm/deploy/framework.py +35 -0
- maxframe/learn/contrib/llm/deploy/loader.py +360 -0
- maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
- maxframe/learn/contrib/llm/models/__init__.py +1 -0
- maxframe/learn/contrib/llm/models/dashscope.py +12 -6
- maxframe/learn/contrib/llm/models/managed.py +76 -11
- maxframe/learn/contrib/llm/models/openai.py +72 -0
- maxframe/learn/contrib/llm/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/tests/test_core.py +34 -0
- maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
- maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
- maxframe/learn/contrib/llm/text.py +348 -42
- maxframe/learn/contrib/models.py +4 -1
- maxframe/learn/contrib/xgboost/classifier.py +2 -0
- maxframe/learn/contrib/xgboost/core.py +113 -4
- maxframe/learn/contrib/xgboost/predict.py +4 -2
- maxframe/learn/contrib/xgboost/regressor.py +5 -0
- maxframe/learn/contrib/xgboost/train.py +7 -2
- maxframe/learn/core.py +66 -0
- maxframe/learn/linear_model/_base.py +58 -1
- maxframe/learn/linear_model/_lin_reg.py +1 -1
- maxframe/learn/metrics/__init__.py +6 -0
- maxframe/learn/metrics/_classification.py +145 -0
- maxframe/learn/metrics/_ranking.py +477 -0
- maxframe/learn/metrics/_scorer.py +60 -0
- maxframe/learn/metrics/pairwise/__init__.py +21 -0
- maxframe/learn/metrics/pairwise/core.py +77 -0
- maxframe/learn/metrics/pairwise/cosine.py +115 -0
- maxframe/learn/metrics/pairwise/euclidean.py +176 -0
- maxframe/learn/metrics/pairwise/haversine.py +96 -0
- maxframe/learn/metrics/pairwise/manhattan.py +80 -0
- maxframe/learn/metrics/pairwise/pairwise.py +127 -0
- maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
- maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
- maxframe/learn/metrics/tests/__init__.py +13 -0
- maxframe/learn/metrics/tests/test_scorer.py +26 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
- maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
- maxframe/learn/utils/__init__.py +2 -1
- maxframe/learn/utils/checks.py +1 -2
- maxframe/learn/utils/core.py +59 -0
- maxframe/learn/utils/extmath.py +79 -9
- maxframe/learn/utils/odpsio.py +262 -0
- maxframe/learn/utils/validation.py +2 -2
- maxframe/lib/compat.py +40 -0
- maxframe/lib/dtypes_extension/__init__.py +16 -1
- maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
- maxframe/lib/dtypes_extension/blob.py +304 -0
- maxframe/lib/dtypes_extension/dtypes.py +40 -0
- maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
- maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
- maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
- maxframe/lib/filesystem/_oss_lib/common.py +124 -50
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
- maxframe/lib/filesystem/base.py +1 -1
- maxframe/lib/filesystem/core.py +1 -1
- maxframe/lib/filesystem/oss.py +115 -46
- maxframe/lib/filesystem/tests/test_oss.py +74 -36
- maxframe/lib/mmh3.cp37-win32.pyd +0 -0
- maxframe/lib/wrapped_pickle.py +10 -0
- maxframe/opcodes.py +41 -15
- maxframe/protocol.py +12 -0
- maxframe/remote/core.py +4 -0
- maxframe/serialization/__init__.py +11 -2
- maxframe/serialization/arrow.py +38 -13
- maxframe/serialization/blob.py +32 -0
- maxframe/serialization/core.cp37-win32.pyd +0 -0
- maxframe/serialization/core.pyx +39 -1
- maxframe/serialization/exception.py +2 -4
- maxframe/serialization/numpy.py +11 -0
- maxframe/serialization/pandas.py +46 -9
- maxframe/serialization/serializables/core.py +2 -2
- maxframe/serialization/tests/test_serial.py +31 -4
- maxframe/tensor/__init__.py +38 -8
- maxframe/tensor/arithmetic/__init__.py +19 -10
- maxframe/tensor/arithmetic/core.py +2 -2
- maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
- maxframe/tensor/core.py +6 -2
- maxframe/tensor/datasource/tests/test_datasource.py +2 -1
- maxframe/tensor/extensions/__init__.py +2 -0
- maxframe/tensor/extensions/apply_chunk.py +3 -3
- maxframe/tensor/extensions/rebalance.py +65 -0
- maxframe/tensor/fft/__init__.py +32 -0
- maxframe/tensor/fft/core.py +168 -0
- maxframe/tensor/fft/fft.py +112 -0
- maxframe/tensor/fft/fft2.py +118 -0
- maxframe/tensor/fft/fftfreq.py +80 -0
- maxframe/tensor/fft/fftn.py +123 -0
- maxframe/tensor/fft/fftshift.py +79 -0
- maxframe/tensor/fft/hfft.py +112 -0
- maxframe/tensor/fft/ifft.py +114 -0
- maxframe/tensor/fft/ifft2.py +115 -0
- maxframe/tensor/fft/ifftn.py +123 -0
- maxframe/tensor/fft/ifftshift.py +73 -0
- maxframe/tensor/fft/ihfft.py +93 -0
- maxframe/tensor/fft/irfft.py +118 -0
- maxframe/tensor/fft/irfft2.py +62 -0
- maxframe/tensor/fft/irfftn.py +114 -0
- maxframe/tensor/fft/rfft.py +116 -0
- maxframe/tensor/fft/rfft2.py +63 -0
- maxframe/tensor/fft/rfftfreq.py +87 -0
- maxframe/tensor/fft/rfftn.py +113 -0
- maxframe/tensor/indexing/fill_diagonal.py +1 -7
- maxframe/tensor/linalg/__init__.py +7 -0
- maxframe/tensor/linalg/_einsumfunc.py +1025 -0
- maxframe/tensor/linalg/cholesky.py +117 -0
- maxframe/tensor/linalg/einsum.py +339 -0
- maxframe/tensor/linalg/lstsq.py +100 -0
- maxframe/tensor/linalg/matrix_norm.py +75 -0
- maxframe/tensor/linalg/norm.py +249 -0
- maxframe/tensor/linalg/solve.py +72 -0
- maxframe/tensor/linalg/solve_triangular.py +2 -2
- maxframe/tensor/linalg/vector_norm.py +113 -0
- maxframe/tensor/misc/__init__.py +24 -1
- maxframe/tensor/misc/argwhere.py +72 -0
- maxframe/tensor/misc/array_split.py +46 -0
- maxframe/tensor/misc/broadcast_arrays.py +57 -0
- maxframe/tensor/misc/copyto.py +130 -0
- maxframe/tensor/misc/delete.py +104 -0
- maxframe/tensor/misc/dsplit.py +68 -0
- maxframe/tensor/misc/ediff1d.py +74 -0
- maxframe/tensor/misc/expand_dims.py +85 -0
- maxframe/tensor/misc/flip.py +90 -0
- maxframe/tensor/misc/fliplr.py +64 -0
- maxframe/tensor/misc/flipud.py +68 -0
- maxframe/tensor/misc/hsplit.py +85 -0
- maxframe/tensor/misc/insert.py +139 -0
- maxframe/tensor/misc/moveaxis.py +83 -0
- maxframe/tensor/misc/result_type.py +88 -0
- maxframe/tensor/misc/roll.py +124 -0
- maxframe/tensor/misc/rollaxis.py +77 -0
- maxframe/tensor/misc/shape.py +89 -0
- maxframe/tensor/misc/split.py +190 -0
- maxframe/tensor/misc/tile.py +109 -0
- maxframe/tensor/misc/vsplit.py +74 -0
- maxframe/tensor/reduction/array_equal.py +2 -1
- maxframe/tensor/sort/__init__.py +2 -0
- maxframe/tensor/sort/argpartition.py +98 -0
- maxframe/tensor/sort/partition.py +228 -0
- maxframe/tensor/spatial/__init__.py +15 -0
- maxframe/tensor/spatial/distance/__init__.py +17 -0
- maxframe/tensor/spatial/distance/cdist.py +421 -0
- maxframe/tensor/spatial/distance/pdist.py +398 -0
- maxframe/tensor/spatial/distance/squareform.py +153 -0
- maxframe/tensor/special/__init__.py +159 -21
- maxframe/tensor/special/airy.py +55 -0
- maxframe/tensor/special/bessel.py +199 -0
- maxframe/tensor/special/core.py +65 -4
- maxframe/tensor/special/ellip_func_integrals.py +155 -0
- maxframe/tensor/special/ellip_harm.py +55 -0
- maxframe/tensor/special/err_fresnel.py +223 -0
- maxframe/tensor/special/gamma_funcs.py +303 -0
- maxframe/tensor/special/hypergeometric_funcs.py +69 -0
- maxframe/tensor/special/info_theory.py +189 -0
- maxframe/tensor/special/misc.py +21 -0
- maxframe/tensor/statistics/__init__.py +6 -0
- maxframe/tensor/statistics/corrcoef.py +77 -0
- maxframe/tensor/statistics/cov.py +222 -0
- maxframe/tensor/statistics/digitize.py +126 -0
- maxframe/tensor/statistics/histogram.py +520 -0
- maxframe/tensor/statistics/median.py +85 -0
- maxframe/tensor/statistics/ptp.py +89 -0
- maxframe/tensor/utils.py +3 -3
- maxframe/tests/test_udf.py +61 -0
- maxframe/tests/test_utils.py +51 -6
- maxframe/tests/utils.py +0 -2
- maxframe/typing_.py +2 -0
- maxframe/udf.py +130 -9
- maxframe/utils.py +254 -27
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
- maxframe_client/fetcher.py +35 -4
- maxframe_client/session/odps.py +7 -2
- maxframe_client/session/task.py +8 -1
- maxframe_client/tests/test_fetcher.py +76 -3
- maxframe_client/tests/test_session.py +28 -1
- maxframe/dataframe/arrays.py +0 -864
- /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
- /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -23,7 +23,7 @@ from ...core import EntityData, OutputType
|
|
|
23
23
|
from ...serialization.serializables import AnyField, KeyField
|
|
24
24
|
from ...tensor.core import TENSOR_TYPE
|
|
25
25
|
from ...utils import pd_release_version
|
|
26
|
-
from ..core import DATAFRAME_TYPE, SERIES_TYPE, DataFrame
|
|
26
|
+
from ..core import DATAFRAME_TYPE, ENTITY_TYPE, SERIES_TYPE, DataFrame
|
|
27
27
|
from ..initializer import DataFrame as asframe
|
|
28
28
|
from ..initializer import Series as asseries
|
|
29
29
|
from ..operators import DataFrameOperator, DataFrameOperatorMixin
|
|
@@ -77,7 +77,7 @@ class DataFrameSetitem(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
77
77
|
value_dtype = pd.Series(list(value.dtypes), index=self.indexes)
|
|
78
78
|
elif is_list_like(value) or isinstance(value, TENSOR_TYPE):
|
|
79
79
|
# convert to numpy to get actual dim and shape
|
|
80
|
-
if is_list_like(value):
|
|
80
|
+
if is_list_like(value) and not isinstance(value, ENTITY_TYPE):
|
|
81
81
|
value = np.array(value)
|
|
82
82
|
|
|
83
83
|
if value.ndim == 1:
|
|
@@ -108,7 +108,7 @@ class DataFrameSetitem(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
108
108
|
|
|
109
109
|
try:
|
|
110
110
|
dtypes.loc[self.indexes] = value_dtype
|
|
111
|
-
except KeyError:
|
|
111
|
+
except (AttributeError, KeyError):
|
|
112
112
|
# when some index not exist, try update one by one
|
|
113
113
|
if isinstance(value_dtype, pd.Series):
|
|
114
114
|
for idx in self.indexes:
|
|
@@ -0,0 +1,185 @@
|
|
|
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
|
+
|
|
17
|
+
from ..utils import validate_axis
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _swaplevel(df_or_series, i=-2, j=-1, axis=0):
|
|
21
|
+
axis = validate_axis(axis, df_or_series)
|
|
22
|
+
|
|
23
|
+
if axis == 0:
|
|
24
|
+
src_idx_value = df_or_series.index_value
|
|
25
|
+
else:
|
|
26
|
+
src_idx_value = df_or_series.columns_value
|
|
27
|
+
|
|
28
|
+
pd_index = src_idx_value.to_pandas()
|
|
29
|
+
if not isinstance(pd_index, pd.MultiIndex):
|
|
30
|
+
raise ValueError("swaplevel can only be used with MultiIndex")
|
|
31
|
+
|
|
32
|
+
name_to_idx = {name: idx for idx, name in enumerate(pd_index.names)}
|
|
33
|
+
src_idx, dest_idx = name_to_idx.get(i, i), name_to_idx.get(j, j)
|
|
34
|
+
|
|
35
|
+
new_idxes = list(range(len(pd_index.names)))
|
|
36
|
+
new_idxes[src_idx], new_idxes[dest_idx] = new_idxes[dest_idx], new_idxes[src_idx]
|
|
37
|
+
if df_or_series.ndim == 2:
|
|
38
|
+
return df_or_series.reorder_levels(new_idxes, axis=axis)
|
|
39
|
+
else:
|
|
40
|
+
return df_or_series.reorder_levels(new_idxes)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def df_swaplevel(df, i=-2, j=-1, axis=0):
|
|
44
|
+
"""
|
|
45
|
+
Swap levels i and j in a :class:`MultiIndex`.
|
|
46
|
+
|
|
47
|
+
Default is to swap the two innermost levels of the index.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
i, j : int or str
|
|
52
|
+
Levels of the indices to be swapped. Can pass level name as string.
|
|
53
|
+
axis : {0 or 'index', 1 or 'columns'}, default 0
|
|
54
|
+
The axis to swap levels on. 0 or 'index' for row-wise, 1 or
|
|
55
|
+
'columns' for column-wise.
|
|
56
|
+
|
|
57
|
+
Returns
|
|
58
|
+
-------
|
|
59
|
+
DataFrame
|
|
60
|
+
DataFrame with levels swapped in MultiIndex.
|
|
61
|
+
|
|
62
|
+
Examples
|
|
63
|
+
--------
|
|
64
|
+
>>> import maxframe.dataframe as md
|
|
65
|
+
>>> df = md.DataFrame(
|
|
66
|
+
... {"Grade": ["A", "B", "A", "C"]},
|
|
67
|
+
... index=[
|
|
68
|
+
... ["Final exam", "Final exam", "Coursework", "Coursework"],
|
|
69
|
+
... ["History", "Geography", "History", "Geography"],
|
|
70
|
+
... ["January", "February", "March", "April"],
|
|
71
|
+
... ],
|
|
72
|
+
... )
|
|
73
|
+
>>> df.execute()
|
|
74
|
+
Grade
|
|
75
|
+
Final exam History January A
|
|
76
|
+
Geography February B
|
|
77
|
+
Coursework History March A
|
|
78
|
+
Geography April C
|
|
79
|
+
|
|
80
|
+
In the following example, we will swap the levels of the indices.
|
|
81
|
+
Here, we will swap the levels column-wise, but levels can be swapped row-wise
|
|
82
|
+
in a similar manner. Note that column-wise is the default behaviour.
|
|
83
|
+
By not supplying any arguments for i and j, we swap the last and second to
|
|
84
|
+
last indices.
|
|
85
|
+
|
|
86
|
+
>>> df.swaplevel().execute()
|
|
87
|
+
Grade
|
|
88
|
+
Final exam January History A
|
|
89
|
+
February Geography B
|
|
90
|
+
Coursework March History A
|
|
91
|
+
April Geography C
|
|
92
|
+
|
|
93
|
+
By supplying one argument, we can choose which index to swap the last
|
|
94
|
+
index with. We can for example swap the first index with the last one as
|
|
95
|
+
follows.
|
|
96
|
+
|
|
97
|
+
>>> df.swaplevel(0).execute()
|
|
98
|
+
Grade
|
|
99
|
+
January History Final exam A
|
|
100
|
+
February Geography Final exam B
|
|
101
|
+
March History Coursework A
|
|
102
|
+
April Geography Coursework C
|
|
103
|
+
|
|
104
|
+
We can also define explicitly which indices we want to swap by supplying values
|
|
105
|
+
for both i and j. Here, we for example swap the first and second indices.
|
|
106
|
+
|
|
107
|
+
>>> df.swaplevel(0, 1).execute()
|
|
108
|
+
Grade
|
|
109
|
+
History Final exam January A
|
|
110
|
+
Geography Final exam February B
|
|
111
|
+
History Coursework March A
|
|
112
|
+
Geography Coursework April C
|
|
113
|
+
"""
|
|
114
|
+
return _swaplevel(df, i, j, axis=axis)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def series_swaplevel(series, i=-2, j=-1):
|
|
118
|
+
"""
|
|
119
|
+
Swap levels i and j in a :class:`MultiIndex`.
|
|
120
|
+
|
|
121
|
+
Default is to swap the two innermost levels of the index.
|
|
122
|
+
|
|
123
|
+
Parameters
|
|
124
|
+
----------
|
|
125
|
+
i, j : int or str
|
|
126
|
+
Levels of the indices to be swapped. Can pass level name as string.
|
|
127
|
+
|
|
128
|
+
Returns
|
|
129
|
+
-------
|
|
130
|
+
Series
|
|
131
|
+
Series with levels swapped in MultiIndex.
|
|
132
|
+
|
|
133
|
+
Examples
|
|
134
|
+
--------
|
|
135
|
+
>>> import maxframe.dataframe as md
|
|
136
|
+
>>> s = md.Series(
|
|
137
|
+
... ["A", "B", "A", "C"],
|
|
138
|
+
... index=[
|
|
139
|
+
... ["Final exam", "Final exam", "Coursework", "Coursework"],
|
|
140
|
+
... ["History", "Geography", "History", "Geography"],
|
|
141
|
+
... ["January", "February", "March", "April"],
|
|
142
|
+
... ],
|
|
143
|
+
... )
|
|
144
|
+
>>> s.execute()
|
|
145
|
+
Final exam History January A
|
|
146
|
+
Geography February B
|
|
147
|
+
Coursework History March A
|
|
148
|
+
Geography April C
|
|
149
|
+
dtype: object
|
|
150
|
+
|
|
151
|
+
In the following example, we will swap the levels of the indices.
|
|
152
|
+
Here, we will swap the levels column-wise, but levels can be swapped row-wise
|
|
153
|
+
in a similar manner. Note that column-wise is the default behaviour.
|
|
154
|
+
By not supplying any arguments for i and j, we swap the last and second to
|
|
155
|
+
last indices.
|
|
156
|
+
|
|
157
|
+
>>> s.swaplevel().execute()
|
|
158
|
+
Final exam January History A
|
|
159
|
+
February Geography B
|
|
160
|
+
Coursework March History A
|
|
161
|
+
April Geography C
|
|
162
|
+
dtype: object
|
|
163
|
+
|
|
164
|
+
By supplying one argument, we can choose which index to swap the last
|
|
165
|
+
index with. We can for example swap the first index with the last one as
|
|
166
|
+
follows.
|
|
167
|
+
|
|
168
|
+
>>> s.swaplevel(0).execute()
|
|
169
|
+
January History Final exam A
|
|
170
|
+
February Geography Final exam B
|
|
171
|
+
March History Coursework A
|
|
172
|
+
April Geography Coursework C
|
|
173
|
+
dtype: object
|
|
174
|
+
|
|
175
|
+
We can also define explicitly which indices we want to swap by supplying values
|
|
176
|
+
for both i and j. Here, we for example swap the first and second indices.
|
|
177
|
+
|
|
178
|
+
>>> s.swaplevel(0, 1).execute()
|
|
179
|
+
History Final exam January A
|
|
180
|
+
Geography Final exam February B
|
|
181
|
+
History Coursework March A
|
|
182
|
+
Geography Coursework April C
|
|
183
|
+
dtype: object
|
|
184
|
+
"""
|
|
185
|
+
return _swaplevel(series, i, j)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ..utils import validate_axis
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def take(df_or_series, indices, axis=0, **kwargs):
|
|
19
|
+
"""
|
|
20
|
+
Return the elements in the given *positional* indices along an axis.
|
|
21
|
+
|
|
22
|
+
This means that we are not indexing according to actual values in
|
|
23
|
+
the index attribute of the object. We are indexing according to the
|
|
24
|
+
actual position of the element in the object.
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
indices : array-like
|
|
29
|
+
An array of ints indicating which positions to take.
|
|
30
|
+
axis : {0 or 'index', 1 or 'columns', None}, default 0
|
|
31
|
+
The axis on which to select elements. ``0`` means that we are
|
|
32
|
+
selecting rows, ``1`` means that we are selecting columns.
|
|
33
|
+
For `Series` this parameter is unused and defaults to 0.
|
|
34
|
+
**kwargs
|
|
35
|
+
For compatibility with :meth:`numpy.take`. Has no effect on the
|
|
36
|
+
output.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
same type as caller
|
|
41
|
+
An array-like containing the elements taken from the object.
|
|
42
|
+
|
|
43
|
+
See Also
|
|
44
|
+
--------
|
|
45
|
+
DataFrame.loc : Select a subset of a DataFrame by labels.
|
|
46
|
+
DataFrame.iloc : Select a subset of a DataFrame by positions.
|
|
47
|
+
numpy.take : Take elements from an array along an axis.
|
|
48
|
+
|
|
49
|
+
Examples
|
|
50
|
+
--------
|
|
51
|
+
>>> import maxframe.tensor as mt
|
|
52
|
+
>>> import maxframe.dataframe as md
|
|
53
|
+
>>> df = md.DataFrame([('falcon', 'bird', 389.0),
|
|
54
|
+
... ('parrot', 'bird', 24.0),
|
|
55
|
+
... ('lion', 'mammal', 80.5),
|
|
56
|
+
... ('monkey', 'mammal', mt.nan)],
|
|
57
|
+
... columns=['name', 'class', 'max_speed'],
|
|
58
|
+
... index=[0, 2, 3, 1])
|
|
59
|
+
>>> df.execute()
|
|
60
|
+
name class max_speed
|
|
61
|
+
0 falcon bird 389.0
|
|
62
|
+
2 parrot bird 24.0
|
|
63
|
+
3 lion mammal 80.5
|
|
64
|
+
1 monkey mammal NaN
|
|
65
|
+
|
|
66
|
+
Take elements at positions 0 and 3 along the axis 0 (default).
|
|
67
|
+
|
|
68
|
+
Note how the actual indices selected (0 and 1) do not correspond to
|
|
69
|
+
our selected indices 0 and 3. That's because we are selecting the 0th
|
|
70
|
+
and 3rd rows, not rows whose indices equal 0 and 3.
|
|
71
|
+
|
|
72
|
+
>>> df.take([0, 3]).execute()
|
|
73
|
+
name class max_speed
|
|
74
|
+
0 falcon bird 389.0
|
|
75
|
+
1 monkey mammal NaN
|
|
76
|
+
|
|
77
|
+
Take elements at indices 1 and 2 along the axis 1 (column selection).
|
|
78
|
+
|
|
79
|
+
>>> df.take([1, 2], axis=1).execute()
|
|
80
|
+
class max_speed
|
|
81
|
+
0 bird 389.0
|
|
82
|
+
2 bird 24.0
|
|
83
|
+
3 mammal 80.5
|
|
84
|
+
1 mammal NaN
|
|
85
|
+
|
|
86
|
+
We may take elements using negative integers for positive indices,
|
|
87
|
+
starting from the end of the object, just like with Python lists.
|
|
88
|
+
|
|
89
|
+
>>> df.take([-1, -2]).execute()
|
|
90
|
+
name class max_speed
|
|
91
|
+
1 monkey mammal NaN
|
|
92
|
+
3 lion mammal 80.5
|
|
93
|
+
"""
|
|
94
|
+
kwargs.clear()
|
|
95
|
+
|
|
96
|
+
axis = validate_axis(axis, df_or_series)
|
|
97
|
+
slc = [slice(None), slice(None)][: df_or_series.ndim]
|
|
98
|
+
slc[axis] = indices
|
|
99
|
+
return df_or_series.iloc[tuple(slc)]
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ..utils import validate_axis
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def truncate(df, before=None, after=None, axis=0, copy=None):
|
|
19
|
+
"""
|
|
20
|
+
Truncate a Series or DataFrame before and after some index value.
|
|
21
|
+
|
|
22
|
+
This is a useful shorthand for boolean indexing based on index
|
|
23
|
+
values above or below certain thresholds.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
before : date, str, int
|
|
28
|
+
Truncate all rows before this index value.
|
|
29
|
+
after : date, str, int
|
|
30
|
+
Truncate all rows after this index value.
|
|
31
|
+
axis : {0 or 'index', 1 or 'columns'}, optional
|
|
32
|
+
Axis to truncate. Truncates the index (rows) by default.
|
|
33
|
+
For `Series` this parameter is unused and defaults to 0.
|
|
34
|
+
copy : bool, default is True,
|
|
35
|
+
This parameter is only kept for compatibility with pandas.
|
|
36
|
+
|
|
37
|
+
Returns
|
|
38
|
+
-------
|
|
39
|
+
type of caller
|
|
40
|
+
The truncated Series or DataFrame.
|
|
41
|
+
|
|
42
|
+
See Also
|
|
43
|
+
--------
|
|
44
|
+
DataFrame.loc : Select a subset of a DataFrame by label.
|
|
45
|
+
DataFrame.iloc : Select a subset of a DataFrame by position.
|
|
46
|
+
|
|
47
|
+
Notes
|
|
48
|
+
-----
|
|
49
|
+
If the index being truncated contains only datetime values,
|
|
50
|
+
`before` and `after` may be specified as strings instead of
|
|
51
|
+
Timestamps.
|
|
52
|
+
|
|
53
|
+
Examples
|
|
54
|
+
--------
|
|
55
|
+
>>> import maxframe.dataframe as md
|
|
56
|
+
>>> df = md.DataFrame({'A': ['a', 'b', 'c', 'd', 'e'],
|
|
57
|
+
... 'B': ['f', 'g', 'h', 'i', 'j'],
|
|
58
|
+
... 'C': ['k', 'l', 'm', 'n', 'o']},
|
|
59
|
+
... index=[1, 2, 3, 4, 5])
|
|
60
|
+
>>> df.execute()
|
|
61
|
+
A B C
|
|
62
|
+
1 a f k
|
|
63
|
+
2 b g l
|
|
64
|
+
3 c h m
|
|
65
|
+
4 d i n
|
|
66
|
+
5 e j o
|
|
67
|
+
|
|
68
|
+
>>> df.truncate(before=2, after=4).execute()
|
|
69
|
+
A B C
|
|
70
|
+
2 b g l
|
|
71
|
+
3 c h m
|
|
72
|
+
4 d i n
|
|
73
|
+
|
|
74
|
+
The columns of a DataFrame can be truncated.
|
|
75
|
+
|
|
76
|
+
>>> df.truncate(before="A", after="B", axis="columns").execute()
|
|
77
|
+
A B
|
|
78
|
+
1 a f
|
|
79
|
+
2 b g
|
|
80
|
+
3 c h
|
|
81
|
+
4 d i
|
|
82
|
+
5 e j
|
|
83
|
+
|
|
84
|
+
For Series, only rows can be truncated.
|
|
85
|
+
|
|
86
|
+
>>> df['A'].truncate(before=2, after=4).execute()
|
|
87
|
+
2 b
|
|
88
|
+
3 c
|
|
89
|
+
4 d
|
|
90
|
+
Name: A, dtype: object
|
|
91
|
+
|
|
92
|
+
The index values in ``truncate`` can be datetimes or string
|
|
93
|
+
dates.
|
|
94
|
+
|
|
95
|
+
>>> dates = md.date_range('2016-01-01', '2016-02-01', freq='s')
|
|
96
|
+
>>> df = md.DataFrame(index=dates, data={'A': 1})
|
|
97
|
+
>>> df.tail().execute()
|
|
98
|
+
A
|
|
99
|
+
2016-01-31 23:59:56 1
|
|
100
|
+
2016-01-31 23:59:57 1
|
|
101
|
+
2016-01-31 23:59:58 1
|
|
102
|
+
2016-01-31 23:59:59 1
|
|
103
|
+
2016-02-01 00:00:00 1
|
|
104
|
+
|
|
105
|
+
>>> df.truncate(before=md.Timestamp('2016-01-05'),
|
|
106
|
+
... after=md.Timestamp('2016-01-10')).tail().execute()
|
|
107
|
+
A
|
|
108
|
+
2016-01-09 23:59:56 1
|
|
109
|
+
2016-01-09 23:59:57 1
|
|
110
|
+
2016-01-09 23:59:58 1
|
|
111
|
+
2016-01-09 23:59:59 1
|
|
112
|
+
2016-01-10 00:00:00 1
|
|
113
|
+
|
|
114
|
+
Because the index is a DatetimeIndex containing only dates, we can
|
|
115
|
+
specify `before` and `after` as strings. They will be coerced to
|
|
116
|
+
Timestamps before truncation.
|
|
117
|
+
|
|
118
|
+
>>> df.truncate('2016-01-05', '2016-01-10').tail().execute()
|
|
119
|
+
A
|
|
120
|
+
2016-01-09 23:59:56 1
|
|
121
|
+
2016-01-09 23:59:57 1
|
|
122
|
+
2016-01-09 23:59:58 1
|
|
123
|
+
2016-01-09 23:59:59 1
|
|
124
|
+
2016-01-10 00:00:00 1
|
|
125
|
+
|
|
126
|
+
Note that ``truncate`` assumes a 0 value for any unspecified time
|
|
127
|
+
component (midnight). This differs from partial string slicing, which
|
|
128
|
+
returns any partially matching dates.
|
|
129
|
+
|
|
130
|
+
>>> df.loc['2016-01-05':'2016-01-10', :].tail().execute()
|
|
131
|
+
A
|
|
132
|
+
2016-01-10 23:59:55 1
|
|
133
|
+
2016-01-10 23:59:56 1
|
|
134
|
+
2016-01-10 23:59:57 1
|
|
135
|
+
2016-01-10 23:59:58 1
|
|
136
|
+
2016-01-10 23:59:59 1
|
|
137
|
+
"""
|
|
138
|
+
_ = copy
|
|
139
|
+
axis = validate_axis(axis, df)
|
|
140
|
+
return df.loc[before:after, :] if axis == 0 else df.loc[:, before:after]
|
|
@@ -79,8 +79,6 @@ class DataFrameWhere(DataFrameOperator, DataFrameOperatorMixin):
|
|
|
79
79
|
other=mock_other,
|
|
80
80
|
axis=self.axis,
|
|
81
81
|
level=self.level,
|
|
82
|
-
errors=self.errors,
|
|
83
|
-
try_cast=self.try_cast,
|
|
84
82
|
)
|
|
85
83
|
|
|
86
84
|
inputs = filter_inputs([df_or_series, self.cond, self.other])
|
|
@@ -135,15 +133,6 @@ axis : int, default None
|
|
|
135
133
|
Alignment axis if needed.
|
|
136
134
|
level : int, default None
|
|
137
135
|
Alignment level if needed.
|
|
138
|
-
errors : str, {{'raise', 'ignore'}}, default 'raise'
|
|
139
|
-
Note that currently this parameter won't affect
|
|
140
|
-
the results and will always coerce to a suitable dtype.
|
|
141
|
-
|
|
142
|
-
- 'raise' : allow exceptions to be raised.
|
|
143
|
-
- 'ignore' : suppress exceptions. On error return original object.
|
|
144
|
-
|
|
145
|
-
try_cast : bool, default False
|
|
146
|
-
Try to cast the result back to the input type (if possible).
|
|
147
136
|
|
|
148
137
|
Returns
|
|
149
138
|
-------
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from pandas.api.types import is_list_like
|
|
16
|
+
|
|
17
|
+
from ..utils import validate_axis
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def xs(df_or_series, key, axis=0, level=None, drop_level=True):
|
|
21
|
+
"""
|
|
22
|
+
Return cross-section from the Series/DataFrame.
|
|
23
|
+
|
|
24
|
+
This method takes a `key` argument to select data at a particular
|
|
25
|
+
level of a MultiIndex.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
key : label or tuple of label
|
|
30
|
+
Label contained in the index, or partially in a MultiIndex.
|
|
31
|
+
axis : {0 or 'index', 1 or 'columns'}, default 0
|
|
32
|
+
Axis to retrieve cross-section on.
|
|
33
|
+
level : object, defaults to first n levels (n=1 or len(key))
|
|
34
|
+
In case of a key partially contained in a MultiIndex, indicate
|
|
35
|
+
which levels are used. Levels can be referred by label or position.
|
|
36
|
+
drop_level : bool, default True
|
|
37
|
+
If False, returns object with same levels as self.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
Series or DataFrame
|
|
42
|
+
Cross-section from the original Series or DataFrame
|
|
43
|
+
corresponding to the selected index levels.
|
|
44
|
+
|
|
45
|
+
See Also
|
|
46
|
+
--------
|
|
47
|
+
DataFrame.loc : Access a group of rows and columns
|
|
48
|
+
by label(s) or a boolean array.
|
|
49
|
+
DataFrame.iloc : Purely integer-location based indexing
|
|
50
|
+
for selection by position.
|
|
51
|
+
|
|
52
|
+
Notes
|
|
53
|
+
-----
|
|
54
|
+
`xs` can not be used to set values.
|
|
55
|
+
|
|
56
|
+
MultiIndex Slicers is a generic way to get/set values on
|
|
57
|
+
any level or levels.
|
|
58
|
+
It is a superset of `xs` functionality, see
|
|
59
|
+
:ref:`MultiIndex Slicers <advanced.mi_slicers>`.
|
|
60
|
+
|
|
61
|
+
Examples
|
|
62
|
+
--------
|
|
63
|
+
>>> import maxframe.dataframe as md
|
|
64
|
+
>>> d = {'num_legs': [4, 4, 2, 2],
|
|
65
|
+
... 'num_wings': [0, 0, 2, 2],
|
|
66
|
+
... 'class': ['mammal', 'mammal', 'mammal', 'bird'],
|
|
67
|
+
... 'animal': ['cat', 'dog', 'bat', 'penguin'],
|
|
68
|
+
... 'locomotion': ['walks', 'walks', 'flies', 'walks']}
|
|
69
|
+
>>> df = md.DataFrame(data=d)
|
|
70
|
+
>>> df = df.set_index(['class', 'animal', 'locomotion'])
|
|
71
|
+
>>> df.execute()
|
|
72
|
+
num_legs num_wings
|
|
73
|
+
class animal locomotion
|
|
74
|
+
mammal cat walks 4 0
|
|
75
|
+
dog walks 4 0
|
|
76
|
+
bat flies 2 2
|
|
77
|
+
bird penguin walks 2 2
|
|
78
|
+
|
|
79
|
+
Get values at specified index
|
|
80
|
+
|
|
81
|
+
>>> df.xs('mammal').execute()
|
|
82
|
+
num_legs num_wings
|
|
83
|
+
animal locomotion
|
|
84
|
+
cat walks 4 0
|
|
85
|
+
dog walks 4 0
|
|
86
|
+
bat flies 2 2
|
|
87
|
+
|
|
88
|
+
Get values at several indexes
|
|
89
|
+
|
|
90
|
+
>>> df.xs(('mammal', 'dog')).execute()
|
|
91
|
+
num_legs num_wings
|
|
92
|
+
locomotion
|
|
93
|
+
walks 4 0
|
|
94
|
+
|
|
95
|
+
Get values at specified index and level
|
|
96
|
+
|
|
97
|
+
>>> df.xs('cat', level=1).execute()
|
|
98
|
+
num_legs num_wings
|
|
99
|
+
class locomotion
|
|
100
|
+
mammal walks 4 0
|
|
101
|
+
|
|
102
|
+
Get values at several indexes and levels
|
|
103
|
+
|
|
104
|
+
>>> df.xs(('bird', 'walks'),
|
|
105
|
+
... level=[0, 'locomotion']).execute()
|
|
106
|
+
num_legs num_wings
|
|
107
|
+
animal
|
|
108
|
+
penguin 2 2
|
|
109
|
+
|
|
110
|
+
Get values at specified column and axis
|
|
111
|
+
|
|
112
|
+
>>> df.xs('num_wings', axis=1).execute()
|
|
113
|
+
class animal locomotion
|
|
114
|
+
mammal cat walks 0
|
|
115
|
+
dog walks 0
|
|
116
|
+
bat flies 2
|
|
117
|
+
bird penguin walks 2
|
|
118
|
+
Name: num_wings, dtype: int64
|
|
119
|
+
"""
|
|
120
|
+
axis = validate_axis(axis, df_or_series)
|
|
121
|
+
if level is None:
|
|
122
|
+
level = range(df_or_series.axes[axis].nlevels)
|
|
123
|
+
elif not is_list_like(level):
|
|
124
|
+
level = [level]
|
|
125
|
+
|
|
126
|
+
slc = [slice(None)] * df_or_series.axes[axis].nlevels
|
|
127
|
+
if not is_list_like(key):
|
|
128
|
+
key = (key,)
|
|
129
|
+
|
|
130
|
+
level_set = set()
|
|
131
|
+
for k, level_ in zip(key, level):
|
|
132
|
+
slc[level_] = k
|
|
133
|
+
level_set.add(level_)
|
|
134
|
+
left_levels = set(range(df_or_series.axes[axis].nlevels)) - level_set
|
|
135
|
+
|
|
136
|
+
if len(slc) > 1:
|
|
137
|
+
slc = tuple(slc)
|
|
138
|
+
|
|
139
|
+
res = df_or_series.loc(axis=axis)[slc]
|
|
140
|
+
if drop_level:
|
|
141
|
+
if len(left_levels) == 0:
|
|
142
|
+
if res.ndim > 1:
|
|
143
|
+
res = res.iloc[0, :] if axis == 0 else res.iloc[:, 0]
|
|
144
|
+
else:
|
|
145
|
+
res = res.iloc[0]
|
|
146
|
+
else:
|
|
147
|
+
res = res.droplevel(list(level_set), axis=axis)
|
|
148
|
+
return res
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from .append import
|
|
15
|
+
from .append import append
|
|
16
|
+
from .combine import DataFrameCombine, df_combine, series_combine
|
|
17
|
+
from .combine_first import df_combine_first, series_combine_first
|
|
18
|
+
from .compare import DataFrameCompare, df_compare, series_compare
|
|
16
19
|
from .concat import DataFrameConcat, concat
|
|
17
20
|
from .merge import (
|
|
18
21
|
DataFrameMerge,
|
|
@@ -22,14 +25,25 @@ from .merge import (
|
|
|
22
25
|
join,
|
|
23
26
|
merge,
|
|
24
27
|
)
|
|
28
|
+
from .update import DataFrameUpdate, df_update, series_update
|
|
25
29
|
|
|
26
30
|
|
|
27
31
|
def _install():
|
|
28
32
|
from ..core import DATAFRAME_TYPE, SERIES_TYPE
|
|
29
33
|
|
|
30
34
|
for cls in DATAFRAME_TYPE:
|
|
35
|
+
setattr(cls, "combine_first", df_combine_first)
|
|
36
|
+
setattr(cls, "compare", df_compare)
|
|
31
37
|
setattr(cls, "join", join)
|
|
32
38
|
setattr(cls, "merge", merge)
|
|
39
|
+
setattr(cls, "update", df_update)
|
|
40
|
+
setattr(cls, "combine", df_combine)
|
|
41
|
+
|
|
42
|
+
for cls in SERIES_TYPE:
|
|
43
|
+
setattr(cls, "combine_first", series_combine_first)
|
|
44
|
+
setattr(cls, "compare", series_compare)
|
|
45
|
+
setattr(cls, "update", series_update)
|
|
46
|
+
setattr(cls, "combine", series_combine)
|
|
33
47
|
|
|
34
48
|
for cls in DATAFRAME_TYPE + SERIES_TYPE:
|
|
35
49
|
setattr(cls, "append", append)
|