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
|
@@ -0,0 +1,189 @@
|
|
|
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 ..arithmetic.utils import arithmetic_operator
|
|
16
|
+
from ..utils import implement_scipy, infer_scipy_dtype
|
|
17
|
+
from .core import TensorSpecialBinOp, TensorSpecialUnaryOp, _register_special_op
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@_register_special_op
|
|
21
|
+
@arithmetic_operator(sparse_mode="unary")
|
|
22
|
+
class TensorEntr(TensorSpecialUnaryOp):
|
|
23
|
+
_func_name = "entr"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@implement_scipy("scipy.special.entr")
|
|
27
|
+
@infer_scipy_dtype("scipy.special.entr")
|
|
28
|
+
def entr(x, out=None, where=None, **kwargs):
|
|
29
|
+
r"""
|
|
30
|
+
Elementwise function for computing entropy.
|
|
31
|
+
|
|
32
|
+
.. math:: \text{entr}(x) = \begin{cases} - x \log(x) & x > 0 \\ 0 & x = 0 \\ -\infty & \text{otherwise} \end{cases}
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
x : Tensor
|
|
37
|
+
Input tensor.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
res : Tensor
|
|
42
|
+
The value of the elementwise entropy function at the given points `x`.
|
|
43
|
+
|
|
44
|
+
See Also
|
|
45
|
+
--------
|
|
46
|
+
kl_div, rel_entr
|
|
47
|
+
|
|
48
|
+
Notes
|
|
49
|
+
-----
|
|
50
|
+
This function is concave.
|
|
51
|
+
"""
|
|
52
|
+
op = TensorEntr(**kwargs)
|
|
53
|
+
return op(x, out=out, where=where)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@_register_special_op
|
|
57
|
+
class TensorRelEntr(TensorSpecialBinOp):
|
|
58
|
+
_func_name = "rel_entr"
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def _is_sparse(cls, x1, x2):
|
|
62
|
+
if hasattr(x1, "issparse") and x1.issparse():
|
|
63
|
+
return True
|
|
64
|
+
return False
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@implement_scipy("scipy.special.rel_entr")
|
|
68
|
+
@infer_scipy_dtype("scipy.special.rel_entr")
|
|
69
|
+
def rel_entr(x, y, out=None, where=None, **kwargs):
|
|
70
|
+
r"""
|
|
71
|
+
Elementwise function for computing relative entropy.
|
|
72
|
+
|
|
73
|
+
.. math::
|
|
74
|
+
|
|
75
|
+
\mathrm{rel\_entr}(x, y) =
|
|
76
|
+
\begin{cases}
|
|
77
|
+
x \log(x / y) & x > 0, y > 0 \\
|
|
78
|
+
0 & x = 0, y \ge 0 \\
|
|
79
|
+
\infty & \text{otherwise}
|
|
80
|
+
\end{cases}
|
|
81
|
+
|
|
82
|
+
Parameters
|
|
83
|
+
----------
|
|
84
|
+
x, y : array_like
|
|
85
|
+
Input arrays
|
|
86
|
+
out : ndarray, optional
|
|
87
|
+
Optional output array for the function results
|
|
88
|
+
|
|
89
|
+
Returns
|
|
90
|
+
-------
|
|
91
|
+
scalar or ndarray
|
|
92
|
+
Relative entropy of the inputs
|
|
93
|
+
|
|
94
|
+
See Also
|
|
95
|
+
--------
|
|
96
|
+
entr, kl_div
|
|
97
|
+
|
|
98
|
+
Notes
|
|
99
|
+
-----
|
|
100
|
+
This function is jointly convex in x and y.
|
|
101
|
+
|
|
102
|
+
The origin of this function is in convex programming; see
|
|
103
|
+
[1]_. Given two discrete probability distributions :math:`p_1,
|
|
104
|
+
\ldots, p_n` and :math:`q_1, \ldots, q_n`, to get the relative
|
|
105
|
+
entropy of statistics compute the sum
|
|
106
|
+
|
|
107
|
+
.. math::
|
|
108
|
+
|
|
109
|
+
\sum_{i = 1}^n \mathrm{rel\_entr}(p_i, q_i).
|
|
110
|
+
|
|
111
|
+
See [2]_ for details.
|
|
112
|
+
|
|
113
|
+
References
|
|
114
|
+
----------
|
|
115
|
+
.. [1] Grant, Boyd, and Ye, "CVX: Matlab Software for Disciplined Convex
|
|
116
|
+
Programming", http://cvxr.com/cvx/
|
|
117
|
+
.. [2] Kullback-Leibler divergence,
|
|
118
|
+
https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence
|
|
119
|
+
"""
|
|
120
|
+
op = TensorRelEntr(**kwargs)
|
|
121
|
+
return op(x, y, out=out, where=where)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@_register_special_op
|
|
125
|
+
class TensorKlDiv(TensorSpecialBinOp):
|
|
126
|
+
_func_name = "kl_div"
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def _is_sparse(cls, x1, x2):
|
|
130
|
+
if hasattr(x1, "issparse") and x1.issparse():
|
|
131
|
+
return True
|
|
132
|
+
return False
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@implement_scipy("scipy.special.kl_div")
|
|
136
|
+
@infer_scipy_dtype("scipy.special.kl_div")
|
|
137
|
+
def kl_div(x, y, out=None, where=None, **kwargs):
|
|
138
|
+
r"""
|
|
139
|
+
Elementwise function for computing relative entropy.
|
|
140
|
+
|
|
141
|
+
.. math::
|
|
142
|
+
|
|
143
|
+
\mathrm{rel\_entr}(x, y) =
|
|
144
|
+
\begin{cases}
|
|
145
|
+
x \log(x / y) & x > 0, y > 0 \\
|
|
146
|
+
0 & x = 0, y \ge 0 \\
|
|
147
|
+
\infty & \text{otherwise}
|
|
148
|
+
\end{cases}
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
x, y : array_like
|
|
153
|
+
Input arrays
|
|
154
|
+
out : ndarray, optional
|
|
155
|
+
Optional output array for the function results
|
|
156
|
+
|
|
157
|
+
Returns
|
|
158
|
+
-------
|
|
159
|
+
scalar or ndarray
|
|
160
|
+
Relative entropy of the inputs
|
|
161
|
+
|
|
162
|
+
See Also
|
|
163
|
+
--------
|
|
164
|
+
entr, kl_div
|
|
165
|
+
|
|
166
|
+
Notes
|
|
167
|
+
-----
|
|
168
|
+
This function is jointly convex in x and y.
|
|
169
|
+
|
|
170
|
+
The origin of this function is in convex programming; see
|
|
171
|
+
[1]_. Given two discrete probability distributions :math:`p_1,
|
|
172
|
+
\ldots, p_n` and :math:`q_1, \ldots, q_n`, to get the relative
|
|
173
|
+
entropy of statistics compute the sum
|
|
174
|
+
|
|
175
|
+
.. math::
|
|
176
|
+
|
|
177
|
+
\sum_{i = 1}^n \mathrm{rel\_entr}(p_i, q_i).
|
|
178
|
+
|
|
179
|
+
See [2]_ for details.
|
|
180
|
+
|
|
181
|
+
References
|
|
182
|
+
----------
|
|
183
|
+
.. [1] Grant, Boyd, and Ye, "CVX: Matlab Software for Disciplined Convex
|
|
184
|
+
Programming", http://cvxr.com/cvx/
|
|
185
|
+
.. [2] Kullback-Leibler divergence,
|
|
186
|
+
https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence
|
|
187
|
+
"""
|
|
188
|
+
op = TensorKlDiv(**kwargs)
|
|
189
|
+
return op(x, y, out=out, where=where)
|
maxframe/tensor/special/misc.py
CHANGED
|
@@ -12,6 +12,27 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from ..utils import implement_scipy, infer_scipy_dtype
|
|
16
|
+
from .core import TensorSpecialBinOp, _register_special_op
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@_register_special_op
|
|
20
|
+
class TensorXLogY(TensorSpecialBinOp):
|
|
21
|
+
_func_name = "xlogy"
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def _is_sparse(cls, x1, x2):
|
|
25
|
+
if hasattr(x1, "issparse") and x1.issparse():
|
|
26
|
+
return True
|
|
27
|
+
return False
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@implement_scipy("scipy.special.xlogy")
|
|
31
|
+
@infer_scipy_dtype("scipy.special.xlogy")
|
|
32
|
+
def xlogy(x1, x2, out=None, where=None, **kwargs):
|
|
33
|
+
op = TensorXLogY(**kwargs)
|
|
34
|
+
return op(x1, x2, out=out, where=where)
|
|
35
|
+
|
|
15
36
|
|
|
16
37
|
def softmax(x, axis=None):
|
|
17
38
|
r"""
|
|
@@ -14,5 +14,11 @@
|
|
|
14
14
|
|
|
15
15
|
from .average import average
|
|
16
16
|
from .bincount import bincount
|
|
17
|
+
from .corrcoef import corrcoef
|
|
18
|
+
from .cov import cov
|
|
19
|
+
from .digitize import digitize
|
|
20
|
+
from .histogram import histogram, histogram_bin_edges
|
|
21
|
+
from .median import median
|
|
17
22
|
from .percentile import percentile
|
|
23
|
+
from .ptp import ptp
|
|
18
24
|
from .quantile import quantile
|
|
@@ -0,0 +1,77 @@
|
|
|
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 .cov import cov
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def corrcoef(x, y=None, rowvar=True):
|
|
19
|
+
r"""
|
|
20
|
+
Return Pearson product-moment correlation coefficients.
|
|
21
|
+
|
|
22
|
+
Please refer to the documentation for `cov` for more detail. The
|
|
23
|
+
relationship between the correlation coefficient matrix, `R`, and the
|
|
24
|
+
covariance matrix, `C`, is
|
|
25
|
+
|
|
26
|
+
.. math:: R_{ij} = \frac{ C_{ij} } { \sqrt{ C_{ii} * C_{jj} } }
|
|
27
|
+
|
|
28
|
+
The values of `R` are between -1 and 1, inclusive.
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
x : array_like
|
|
33
|
+
A 1-D or 2-D array containing multiple variables and observations.
|
|
34
|
+
Each row of `x` represents a variable, and each column a single
|
|
35
|
+
observation of all those variables. Also see `rowvar` below.
|
|
36
|
+
y : array_like, optional
|
|
37
|
+
An additional set of variables and observations. `y` has the same
|
|
38
|
+
shape as `x`.
|
|
39
|
+
rowvar : bool, optional
|
|
40
|
+
If `rowvar` is True (default), then each row represents a
|
|
41
|
+
variable, with observations in the columns. Otherwise, the relationship
|
|
42
|
+
is transposed: each column represents a variable, while the rows
|
|
43
|
+
contain observations.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
R : Tensor
|
|
48
|
+
The correlation coefficient matrix of the variables.
|
|
49
|
+
|
|
50
|
+
See Also
|
|
51
|
+
--------
|
|
52
|
+
cov : Covariance matrix
|
|
53
|
+
|
|
54
|
+
Notes
|
|
55
|
+
-----
|
|
56
|
+
Due to floating point rounding the resulting tensor may not be Hermitian,
|
|
57
|
+
the diagonal elements may not be 1, and the elements may not satisfy the
|
|
58
|
+
inequality abs(a) <= 1. The real and imaginary parts are clipped to the
|
|
59
|
+
interval [-1, 1] in an attempt to improve on that situation but is not
|
|
60
|
+
much help in the complex case.
|
|
61
|
+
|
|
62
|
+
This function accepts but discards arguments `bias` and `ddof`. This is
|
|
63
|
+
for backwards compatibility with previous versions of this function. These
|
|
64
|
+
arguments had no effect on the return values of the function and can be
|
|
65
|
+
safely ignored in this and previous versions of numpy.
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
from ..arithmetic import sqrt
|
|
69
|
+
from ..datasource import diag
|
|
70
|
+
|
|
71
|
+
c = cov(x, y, rowvar)
|
|
72
|
+
if c.ndim == 0:
|
|
73
|
+
return c / c
|
|
74
|
+
d = diag(c)
|
|
75
|
+
d = d.reshape(d.shape[0], 1)
|
|
76
|
+
sqrt_d = sqrt(d)
|
|
77
|
+
return (c / sqrt_d) / sqrt_d.T
|
|
@@ -0,0 +1,222 @@
|
|
|
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 warnings
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ..core import Tensor
|
|
20
|
+
from ..datasource import array
|
|
21
|
+
from ..datasource import tensor as astensor
|
|
22
|
+
from ..misc.squeeze import squeeze
|
|
23
|
+
from ..misc.where import where
|
|
24
|
+
from .average import average
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None):
|
|
28
|
+
"""
|
|
29
|
+
Estimate a covariance matrix, given data and weights.
|
|
30
|
+
|
|
31
|
+
Covariance indicates the level to which two variables vary together.
|
|
32
|
+
If we examine N-dimensional samples, :math:`X = [x_1, x_2, ... x_N]^T`,
|
|
33
|
+
then the covariance matrix element :math:`C_{ij}` is the covariance of
|
|
34
|
+
:math:`x_i` and :math:`x_j`. The element :math:`C_{ii}` is the variance
|
|
35
|
+
of :math:`x_i`.
|
|
36
|
+
|
|
37
|
+
See the notes for an outline of the algorithm.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
m : array_like
|
|
42
|
+
A 1-D or 2-D array containing multiple variables and observations.
|
|
43
|
+
Each row of `m` represents a variable, and each column a single
|
|
44
|
+
observation of all those variables. Also see `rowvar` below.
|
|
45
|
+
y : array_like, optional
|
|
46
|
+
An additional set of variables and observations. `y` has the same form
|
|
47
|
+
as that of `m`.
|
|
48
|
+
rowvar : bool, optional
|
|
49
|
+
If `rowvar` is True (default), then each row represents a
|
|
50
|
+
variable, with observations in the columns. Otherwise, the relationship
|
|
51
|
+
is transposed: each column represents a variable, while the rows
|
|
52
|
+
contain observations.
|
|
53
|
+
bias : bool, optional
|
|
54
|
+
Default normalization (False) is by ``(N - 1)``, where ``N`` is the
|
|
55
|
+
number of observations given (unbiased estimate). If `bias` is True,
|
|
56
|
+
then normalization is by ``N``. These values can be overridden by using
|
|
57
|
+
the keyword ``ddof`` in numpy versions >= 1.5.
|
|
58
|
+
ddof : int, optional
|
|
59
|
+
If not ``None`` the default value implied by `bias` is overridden.
|
|
60
|
+
Note that ``ddof=1`` will return the unbiased estimate, even if both
|
|
61
|
+
`fweights` and `aweights` are specified, and ``ddof=0`` will return
|
|
62
|
+
the simple average. See the notes for the details. The default value
|
|
63
|
+
is ``None``.
|
|
64
|
+
fweights : array_like, int, optional
|
|
65
|
+
1-D tensor of integer freguency weights; the number of times each
|
|
66
|
+
observation vector should be repeated.
|
|
67
|
+
aweights : array_like, optional
|
|
68
|
+
1-D tensor of observation vector weights. These relative weights are
|
|
69
|
+
typically large for observations considered "important" and smaller for
|
|
70
|
+
observations considered less "important". If ``ddof=0`` the array of
|
|
71
|
+
weights can be used to assign probabilities to observation vectors.
|
|
72
|
+
|
|
73
|
+
Returns
|
|
74
|
+
-------
|
|
75
|
+
out : Tensor
|
|
76
|
+
The covariance matrix of the variables.
|
|
77
|
+
|
|
78
|
+
See Also
|
|
79
|
+
--------
|
|
80
|
+
corrcoef : Normalized covariance matrix
|
|
81
|
+
|
|
82
|
+
Notes
|
|
83
|
+
-----
|
|
84
|
+
Assume that the observations are in the columns of the observation
|
|
85
|
+
array `m` and let ``f = fweights`` and ``a = aweights`` for brevity. The
|
|
86
|
+
steps to compute the weighted covariance are as follows::
|
|
87
|
+
|
|
88
|
+
>>> w = f * a
|
|
89
|
+
>>> v1 = mt.sum(w)
|
|
90
|
+
>>> v2 = mt.sum(w * a)
|
|
91
|
+
>>> m -= mt.sum(m * w, axis=1, keepdims=True) / v1
|
|
92
|
+
>>> cov = mt.dot(m * w, m.T) * v1 / (v1**2 - ddof * v2)
|
|
93
|
+
|
|
94
|
+
Note that when ``a == 1``, the normalization factor
|
|
95
|
+
``v1 / (v1**2 - ddof * v2)`` goes over to ``1 / (np.sum(f) - ddof)``
|
|
96
|
+
as it should.
|
|
97
|
+
|
|
98
|
+
Examples
|
|
99
|
+
--------
|
|
100
|
+
Consider two variables, :math:`x_0` and :math:`x_1`, which
|
|
101
|
+
correlate perfectly, but in opposite directions:
|
|
102
|
+
|
|
103
|
+
>>> import maxframe.tensor as mt
|
|
104
|
+
|
|
105
|
+
>>> x = mt.array([[0, 2], [1, 1], [2, 0]]).T
|
|
106
|
+
>>> x.execute()
|
|
107
|
+
array([[0, 1, 2],
|
|
108
|
+
[2, 1, 0]])
|
|
109
|
+
|
|
110
|
+
Note how :math:`x_0` increases while :math:`x_1` decreases. The covariance
|
|
111
|
+
matrix shows this clearly:
|
|
112
|
+
|
|
113
|
+
>>> mt.cov(x).execute()
|
|
114
|
+
array([[ 1., -1.],
|
|
115
|
+
[-1., 1.]])
|
|
116
|
+
|
|
117
|
+
Note that element :math:`C_{0,1}`, which shows the correlation between
|
|
118
|
+
:math:`x_0` and :math:`x_1`, is negative.
|
|
119
|
+
|
|
120
|
+
Further, note how `x` and `y` are combined:
|
|
121
|
+
|
|
122
|
+
>>> x = [-2.1, -1, 4.3]
|
|
123
|
+
>>> y = [3, 1.1, 0.12]
|
|
124
|
+
>>> X = mt.stack((x, y), axis=0)
|
|
125
|
+
>>> print(mt.cov(X).execute())
|
|
126
|
+
[[ 11.71 -4.286 ]
|
|
127
|
+
[ -4.286 2.14413333]]
|
|
128
|
+
>>> print(mt.cov(x, y).execute())
|
|
129
|
+
[[ 11.71 -4.286 ]
|
|
130
|
+
[ -4.286 2.14413333]]
|
|
131
|
+
>>> print(mt.cov(x).execute())
|
|
132
|
+
11.71
|
|
133
|
+
|
|
134
|
+
"""
|
|
135
|
+
from ..linalg import dot
|
|
136
|
+
from ..merge import vstack
|
|
137
|
+
|
|
138
|
+
if ddof is not None and ddof != int(ddof):
|
|
139
|
+
raise ValueError("ddof must be integer")
|
|
140
|
+
|
|
141
|
+
m = astensor(m)
|
|
142
|
+
if m.ndim > 2:
|
|
143
|
+
raise ValueError("m has more than 2 dimensions")
|
|
144
|
+
|
|
145
|
+
if y is None:
|
|
146
|
+
dtype = np.result_type(m.dtype, np.float64)
|
|
147
|
+
else:
|
|
148
|
+
y = astensor(y)
|
|
149
|
+
if y.ndim > 2:
|
|
150
|
+
raise ValueError("y has more than 2 dimensions")
|
|
151
|
+
dtype = np.result_type(m.dtype, y.dtype, np.float64)
|
|
152
|
+
|
|
153
|
+
X = array(m, ndmin=2, dtype=dtype)
|
|
154
|
+
if not rowvar and X.shape[0] != 1:
|
|
155
|
+
X = X.T
|
|
156
|
+
if y is not None:
|
|
157
|
+
y = array(y, copy=False, ndmin=2, dtype=dtype)
|
|
158
|
+
if not rowvar and y.shape[0] != 1:
|
|
159
|
+
y = y.T
|
|
160
|
+
X = vstack((X, y))
|
|
161
|
+
|
|
162
|
+
if ddof is None:
|
|
163
|
+
if bias == 0:
|
|
164
|
+
ddof = 1
|
|
165
|
+
else:
|
|
166
|
+
ddof = 0
|
|
167
|
+
|
|
168
|
+
# Get the product of frequencies and weights
|
|
169
|
+
w = None
|
|
170
|
+
if fweights is not None:
|
|
171
|
+
fweights = astensor(fweights, dtype=float)
|
|
172
|
+
if fweights.ndim > 1:
|
|
173
|
+
raise RuntimeError("cannot handle multidimensional fweights")
|
|
174
|
+
if fweights.shape[0] != X.shape[1]:
|
|
175
|
+
raise RuntimeError("incompatible numbers of samples and fweights")
|
|
176
|
+
if any(fweights < 0):
|
|
177
|
+
raise ValueError("fweights cannot be negative")
|
|
178
|
+
w = fweights
|
|
179
|
+
if aweights is not None:
|
|
180
|
+
aweights = astensor(aweights, dtype=float)
|
|
181
|
+
if aweights.ndim > 1:
|
|
182
|
+
raise RuntimeError("cannot handle multidimensional aweights")
|
|
183
|
+
if aweights.shape[0] != X.shape[1]:
|
|
184
|
+
raise RuntimeError("incompatible numbers of samples and aweights")
|
|
185
|
+
if any(aweights < 0):
|
|
186
|
+
raise ValueError("aweights cannot be negative")
|
|
187
|
+
if w is None:
|
|
188
|
+
w = aweights
|
|
189
|
+
else:
|
|
190
|
+
w *= aweights
|
|
191
|
+
|
|
192
|
+
avg, w_sum = average(X, axis=1, weights=w, returned=True)
|
|
193
|
+
w_sum = w_sum[0]
|
|
194
|
+
|
|
195
|
+
# Determine the normalization
|
|
196
|
+
if w is None:
|
|
197
|
+
fact = X.shape[1] - ddof
|
|
198
|
+
elif ddof == 0:
|
|
199
|
+
fact = w_sum
|
|
200
|
+
elif aweights is None:
|
|
201
|
+
fact = w_sum - ddof
|
|
202
|
+
else:
|
|
203
|
+
fact = w_sum - ddof * sum(w * aweights) / w_sum
|
|
204
|
+
|
|
205
|
+
X -= avg[:, None]
|
|
206
|
+
if w is None:
|
|
207
|
+
X_T = X.T
|
|
208
|
+
else:
|
|
209
|
+
X_T = (X * w).T
|
|
210
|
+
c = dot(X, X_T.conj())
|
|
211
|
+
if isinstance(fact, Tensor):
|
|
212
|
+
fact = where(fact <= 0, 0.0, fact)
|
|
213
|
+
fact = fact.astype(float)
|
|
214
|
+
else:
|
|
215
|
+
if fact <= 0:
|
|
216
|
+
warnings.warn(
|
|
217
|
+
"Degrees of freedom <= 0 for slice", RuntimeWarning, stacklevel=2
|
|
218
|
+
)
|
|
219
|
+
fact = 0.0
|
|
220
|
+
fact = np.float64(fact)
|
|
221
|
+
c = c * (1.0 / fact)
|
|
222
|
+
return squeeze(c)
|
|
@@ -0,0 +1,126 @@
|
|
|
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 typing import List
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ... import opcodes
|
|
20
|
+
from ...lib.sparse.core import get_array_module
|
|
21
|
+
from ...serialization.serializables import AnyField, BoolField, KeyField
|
|
22
|
+
from ...typing_ import EntityType
|
|
23
|
+
from ..core import Tensor, TensorOrder
|
|
24
|
+
from ..datasource import tensor as astensor
|
|
25
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TensorDigitize(TensorHasInput, TensorOperatorMixin):
|
|
29
|
+
_op_type_ = opcodes.DIGITIZE
|
|
30
|
+
|
|
31
|
+
input = KeyField("input")
|
|
32
|
+
bins = AnyField("bins")
|
|
33
|
+
right = BoolField("right")
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def _set_inputs(cls, op: "TensorDigitize", inputs: List[EntityType]):
|
|
37
|
+
super()._set_inputs(op, inputs)
|
|
38
|
+
if len(inputs) > 1:
|
|
39
|
+
op.bins = op._inputs[1]
|
|
40
|
+
|
|
41
|
+
def __call__(self, x, bins):
|
|
42
|
+
x = astensor(x)
|
|
43
|
+
inputs = [x]
|
|
44
|
+
if not isinstance(bins, Tensor):
|
|
45
|
+
bins = get_array_module(bins).asarray(bins)
|
|
46
|
+
self.bins = bins
|
|
47
|
+
else:
|
|
48
|
+
inputs.append(bins)
|
|
49
|
+
self.dtype = np.digitize(
|
|
50
|
+
[0], np.empty(1, dtype=bins.dtype), right=self.right
|
|
51
|
+
).dtype
|
|
52
|
+
|
|
53
|
+
return self.new_tensor(inputs, x.shape, order=TensorOrder.C_ORDER)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def digitize(x, bins, right=False):
|
|
57
|
+
"""
|
|
58
|
+
Return the indices of the bins to which each value in input tensor belongs.
|
|
59
|
+
|
|
60
|
+
Each index ``i`` returned is such that ``bins[i-1] <= x < bins[i]`` if
|
|
61
|
+
`bins` is monotonically increasing, or ``bins[i-1] > x >= bins[i]`` if
|
|
62
|
+
`bins` is monotonically decreasing. If values in `x` are beyond the
|
|
63
|
+
bounds of `bins`, 0 or ``len(bins)`` is returned as appropriate. If right
|
|
64
|
+
is True, then the right bin is closed so that the index ``i`` is such
|
|
65
|
+
that ``bins[i-1] < x <= bins[i]`` or ``bins[i-1] >= x > bins[i]`` if `bins`
|
|
66
|
+
is monotonically increasing or decreasing, respectively.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
x : array_like
|
|
71
|
+
Input tensor to be binned.
|
|
72
|
+
bins : array_like
|
|
73
|
+
Array of bins. It has to be 1-dimensional and monotonic.
|
|
74
|
+
right : bool, optional
|
|
75
|
+
Indicating whether the intervals include the right or the left bin
|
|
76
|
+
edge. Default behavior is (right==False) indicating that the interval
|
|
77
|
+
does not include the right edge. The left bin end is open in this
|
|
78
|
+
case, i.e., bins[i-1] <= x < bins[i] is the default behavior for
|
|
79
|
+
monotonically increasing bins.
|
|
80
|
+
|
|
81
|
+
Returns
|
|
82
|
+
-------
|
|
83
|
+
out : Tensor of ints
|
|
84
|
+
Output tensor of indices, of same shape as `x`.
|
|
85
|
+
|
|
86
|
+
Raises
|
|
87
|
+
------
|
|
88
|
+
ValueError
|
|
89
|
+
If `bins` is not monotonic.
|
|
90
|
+
TypeError
|
|
91
|
+
If the type of the input is complex.
|
|
92
|
+
|
|
93
|
+
See Also
|
|
94
|
+
--------
|
|
95
|
+
bincount, histogram, unique, searchsorted
|
|
96
|
+
|
|
97
|
+
Notes
|
|
98
|
+
-----
|
|
99
|
+
If values in `x` are such that they fall outside the bin range,
|
|
100
|
+
attempting to index `bins` with the indices that `digitize` returns
|
|
101
|
+
will result in an IndexError.
|
|
102
|
+
|
|
103
|
+
`mt.digitize` is implemented in terms of `mt.searchsorted`. This means
|
|
104
|
+
that a binary search is used to bin the values, which scales much better
|
|
105
|
+
for larger number of bins than the previous linear search. It also removes
|
|
106
|
+
the requirement for the input array to be 1-dimensional.
|
|
107
|
+
|
|
108
|
+
Examples
|
|
109
|
+
--------
|
|
110
|
+
>>> import maxframe.tensor as mt
|
|
111
|
+
|
|
112
|
+
>>> x = mt.array([0.2, 6.4, 3.0, 1.6])
|
|
113
|
+
>>> bins = mt.array([0.0, 1.0, 2.5, 4.0, 10.0])
|
|
114
|
+
>>> inds = mt.digitize(x, bins)
|
|
115
|
+
>>> inds.execute()
|
|
116
|
+
array([1, 4, 3, 2])
|
|
117
|
+
|
|
118
|
+
>>> x = mt.array([1.2, 10.0, 12.4, 15.5, 20.])
|
|
119
|
+
>>> bins = mt.array([0, 5, 10, 15, 20])
|
|
120
|
+
>>> mt.digitize(x,bins,right=True).execute()
|
|
121
|
+
array([1, 2, 3, 4, 4])
|
|
122
|
+
>>> mt.digitize(x,bins,right=False).execute()
|
|
123
|
+
array([1, 3, 3, 4, 5])
|
|
124
|
+
"""
|
|
125
|
+
op = TensorDigitize(right=right)
|
|
126
|
+
return op(x, bins)
|