maxframe 1.3.1__cp310-cp310-macosx_10_9_universal2.whl → 2.0.0b2__cp310-cp310-macosx_10_9_universal2.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.

Files changed (640) hide show
  1. maxframe/_utils.cpython-310-darwin.so +0 -0
  2. maxframe/_utils.pyi +21 -0
  3. maxframe/_utils.pyx +4 -3
  4. maxframe/codegen/__init__.py +27 -0
  5. maxframe/{codegen.py → codegen/core.py} +49 -43
  6. maxframe/codegen/spe/__init__.py +16 -0
  7. maxframe/codegen/spe/core.py +307 -0
  8. maxframe/codegen/spe/dataframe/__init__.py +37 -0
  9. maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
  10. maxframe/codegen/spe/dataframe/accessors/base.py +53 -0
  11. maxframe/codegen/spe/dataframe/accessors/dict_.py +194 -0
  12. maxframe/codegen/spe/dataframe/accessors/list_.py +80 -0
  13. maxframe/codegen/spe/dataframe/arithmetic.py +84 -0
  14. maxframe/codegen/spe/dataframe/datasource.py +181 -0
  15. maxframe/codegen/spe/dataframe/datastore.py +204 -0
  16. maxframe/codegen/spe/dataframe/extensions.py +63 -0
  17. maxframe/codegen/spe/dataframe/fetch.py +26 -0
  18. maxframe/codegen/spe/dataframe/groupby.py +224 -0
  19. maxframe/codegen/spe/dataframe/indexing.py +238 -0
  20. maxframe/codegen/spe/dataframe/merge.py +73 -0
  21. maxframe/codegen/spe/dataframe/misc.py +286 -0
  22. maxframe/codegen/spe/dataframe/missing.py +64 -0
  23. maxframe/codegen/spe/dataframe/reduction.py +160 -0
  24. maxframe/codegen/spe/dataframe/sort.py +83 -0
  25. maxframe/codegen/spe/dataframe/statistics.py +46 -0
  26. maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
  27. maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
  28. maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
  29. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +310 -0
  30. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +137 -0
  31. maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
  32. maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
  33. maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
  34. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +76 -0
  35. maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
  36. maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
  37. maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
  38. maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
  39. maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
  40. maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
  41. maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
  42. maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
  43. maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
  44. maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
  45. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +234 -0
  46. maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
  47. maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
  48. maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
  49. maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
  50. maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
  51. maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
  52. maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
  53. maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
  54. maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
  55. maxframe/codegen/spe/dataframe/tests/test_groupby.py +225 -0
  56. maxframe/codegen/spe/dataframe/tests/test_merge.py +400 -0
  57. maxframe/codegen/spe/dataframe/tests/test_reduction.py +104 -0
  58. maxframe/codegen/spe/dataframe/tests/test_sort.py +159 -0
  59. maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
  60. maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
  61. maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
  62. maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
  63. maxframe/codegen/spe/dataframe/tseries.py +46 -0
  64. maxframe/codegen/spe/dataframe/udf.py +62 -0
  65. maxframe/codegen/spe/dataframe/value_counts.py +31 -0
  66. maxframe/codegen/spe/dataframe/window.py +65 -0
  67. maxframe/codegen/spe/learn/__init__.py +15 -0
  68. maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
  69. maxframe/codegen/spe/learn/contrib/lightgbm.py +160 -0
  70. maxframe/codegen/spe/learn/contrib/models.py +41 -0
  71. maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
  72. maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
  73. maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
  74. maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
  75. maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
  76. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +98 -0
  77. maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
  78. maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
  79. maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
  80. maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
  81. maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
  82. maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
  83. maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
  84. maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
  85. maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
  86. maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
  87. maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
  88. maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
  89. maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
  90. maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
  91. maxframe/codegen/spe/learn/utils/__init__.py +15 -0
  92. maxframe/codegen/spe/learn/utils/checks.py +55 -0
  93. maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
  94. maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
  95. maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
  96. maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
  97. maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
  98. maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
  99. maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
  100. maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
  101. maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
  102. maxframe/codegen/spe/learn/utils/validation.py +35 -0
  103. maxframe/codegen/spe/objects.py +26 -0
  104. maxframe/codegen/spe/remote.py +29 -0
  105. maxframe/codegen/spe/tensor/__init__.py +28 -0
  106. maxframe/codegen/spe/tensor/arithmetic.py +95 -0
  107. maxframe/codegen/spe/tensor/core.py +41 -0
  108. maxframe/codegen/spe/tensor/datasource.py +165 -0
  109. maxframe/codegen/spe/tensor/extensions.py +35 -0
  110. maxframe/codegen/spe/tensor/fetch.py +26 -0
  111. maxframe/codegen/spe/tensor/indexing.py +63 -0
  112. maxframe/codegen/spe/tensor/linalg.py +63 -0
  113. maxframe/codegen/spe/tensor/merge.py +31 -0
  114. maxframe/codegen/spe/tensor/misc.py +121 -0
  115. maxframe/codegen/spe/tensor/random.py +29 -0
  116. maxframe/codegen/spe/tensor/reduction.py +39 -0
  117. maxframe/codegen/spe/tensor/reshape.py +26 -0
  118. maxframe/codegen/spe/tensor/sort.py +42 -0
  119. maxframe/codegen/spe/tensor/special.py +35 -0
  120. maxframe/codegen/spe/tensor/statistics.py +24 -0
  121. maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
  122. maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
  123. maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
  124. maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
  125. maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
  126. maxframe/codegen/spe/tensor/tests/test_linalg.py +38 -0
  127. maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
  128. maxframe/codegen/spe/tensor/tests/test_misc.py +94 -0
  129. maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
  130. maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
  131. maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
  132. maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
  133. maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
  134. maxframe/codegen/spe/tensor/tests/test_statistics.py +29 -0
  135. maxframe/codegen/spe/tests/__init__.py +13 -0
  136. maxframe/codegen/spe/tests/test_remote.py +29 -0
  137. maxframe/codegen/spe/tests/test_spe_codegen.py +141 -0
  138. maxframe/codegen/spe/utils.py +54 -0
  139. maxframe/codegen/tests/__init__.py +13 -0
  140. maxframe/{tests → codegen/tests}/test_codegen.py +3 -5
  141. maxframe/config/__init__.py +1 -1
  142. maxframe/config/config.py +50 -23
  143. maxframe/config/tests/test_config.py +4 -12
  144. maxframe/config/validators.py +5 -0
  145. maxframe/conftest.py +38 -10
  146. maxframe/core/__init__.py +1 -0
  147. maxframe/core/context.py +110 -0
  148. maxframe/core/entity/__init__.py +1 -0
  149. maxframe/core/entity/core.py +0 -7
  150. maxframe/core/entity/objects.py +19 -5
  151. maxframe/core/entity/output_types.py +11 -0
  152. maxframe/core/entity/tests/test_objects.py +11 -12
  153. maxframe/core/entity/tileables.py +3 -1
  154. maxframe/core/entity/utils.py +15 -0
  155. maxframe/core/graph/__init__.py +6 -1
  156. maxframe/core/graph/builder/base.py +5 -1
  157. maxframe/core/graph/core.cpython-310-darwin.so +0 -0
  158. maxframe/core/graph/core.pyx +17 -6
  159. maxframe/core/graph/entity.py +18 -6
  160. maxframe/core/operator/__init__.py +8 -3
  161. maxframe/core/operator/base.py +35 -12
  162. maxframe/core/operator/core.py +37 -14
  163. maxframe/core/operator/fetch.py +5 -18
  164. maxframe/core/operator/objects.py +0 -20
  165. maxframe/core/operator/shuffle.py +6 -72
  166. maxframe/dataframe/__init__.py +1 -0
  167. maxframe/dataframe/accessors/datetime_/core.py +7 -4
  168. maxframe/dataframe/accessors/string_/core.py +9 -6
  169. maxframe/dataframe/arithmetic/core.py +31 -20
  170. maxframe/dataframe/arithmetic/tests/test_arithmetic.py +6 -0
  171. maxframe/dataframe/core.py +98 -91
  172. maxframe/dataframe/datasource/core.py +8 -1
  173. maxframe/dataframe/datasource/date_range.py +8 -0
  174. maxframe/dataframe/datasource/from_index.py +9 -5
  175. maxframe/dataframe/datasource/from_records.py +9 -2
  176. maxframe/dataframe/datasource/from_tensor.py +32 -21
  177. maxframe/dataframe/datasource/read_csv.py +8 -2
  178. maxframe/dataframe/datasource/read_odps_query.py +109 -19
  179. maxframe/dataframe/datasource/read_odps_table.py +20 -5
  180. maxframe/dataframe/datasource/read_parquet.py +8 -3
  181. maxframe/dataframe/datasource/tests/test_datasource.py +80 -1
  182. maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
  183. maxframe/dataframe/datastore/to_csv.py +7 -3
  184. maxframe/dataframe/datastore/to_odps.py +42 -6
  185. maxframe/dataframe/extensions/__init__.py +6 -1
  186. maxframe/dataframe/extensions/apply_chunk.py +96 -136
  187. maxframe/dataframe/extensions/flatjson.py +3 -2
  188. maxframe/dataframe/extensions/flatmap.py +15 -7
  189. maxframe/dataframe/fetch/core.py +12 -1
  190. maxframe/dataframe/groupby/__init__.py +7 -0
  191. maxframe/dataframe/groupby/aggregation.py +9 -8
  192. maxframe/dataframe/groupby/apply.py +50 -74
  193. maxframe/dataframe/groupby/apply_chunk.py +393 -0
  194. maxframe/dataframe/groupby/core.py +80 -17
  195. maxframe/dataframe/groupby/extensions.py +26 -0
  196. maxframe/dataframe/groupby/fill.py +9 -4
  197. maxframe/dataframe/groupby/sample.py +7 -7
  198. maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
  199. maxframe/dataframe/groupby/transform.py +57 -54
  200. maxframe/dataframe/indexing/align.py +7 -6
  201. maxframe/dataframe/indexing/getitem.py +9 -8
  202. maxframe/dataframe/indexing/iloc.py +28 -23
  203. maxframe/dataframe/indexing/insert.py +7 -3
  204. maxframe/dataframe/indexing/loc.py +9 -8
  205. maxframe/dataframe/indexing/reindex.py +36 -30
  206. maxframe/dataframe/indexing/rename_axis.py +18 -10
  207. maxframe/dataframe/indexing/reset_index.py +0 -2
  208. maxframe/dataframe/indexing/sample.py +13 -9
  209. maxframe/dataframe/indexing/set_axis.py +9 -6
  210. maxframe/dataframe/indexing/setitem.py +8 -5
  211. maxframe/dataframe/indexing/where.py +12 -9
  212. maxframe/dataframe/merge/__init__.py +0 -1
  213. maxframe/dataframe/merge/concat.py +10 -31
  214. maxframe/dataframe/merge/merge.py +2 -24
  215. maxframe/dataframe/misc/__init__.py +6 -0
  216. maxframe/dataframe/misc/_duplicate.py +7 -3
  217. maxframe/dataframe/misc/apply.py +106 -139
  218. maxframe/dataframe/misc/astype.py +3 -2
  219. maxframe/dataframe/misc/case_when.py +11 -7
  220. maxframe/dataframe/misc/cut.py +11 -10
  221. maxframe/dataframe/misc/describe.py +7 -3
  222. maxframe/dataframe/misc/drop.py +13 -11
  223. maxframe/dataframe/misc/eval.py +0 -2
  224. maxframe/dataframe/misc/get_dummies.py +78 -49
  225. maxframe/dataframe/misc/isin.py +13 -10
  226. maxframe/dataframe/misc/map.py +21 -6
  227. maxframe/dataframe/misc/melt.py +8 -1
  228. maxframe/dataframe/misc/pivot.py +232 -0
  229. maxframe/dataframe/misc/pivot_table.py +52 -40
  230. maxframe/dataframe/misc/rechunk.py +59 -0
  231. maxframe/dataframe/misc/shift.py +7 -4
  232. maxframe/dataframe/misc/stack.py +5 -3
  233. maxframe/dataframe/misc/tests/test_misc.py +167 -1
  234. maxframe/dataframe/misc/transform.py +63 -65
  235. maxframe/dataframe/misc/value_counts.py +7 -4
  236. maxframe/dataframe/missing/dropna.py +16 -7
  237. maxframe/dataframe/missing/fillna.py +18 -10
  238. maxframe/dataframe/missing/replace.py +10 -6
  239. maxframe/dataframe/missing/tests/test_missing.py +2 -2
  240. maxframe/dataframe/operators.py +1 -27
  241. maxframe/dataframe/reduction/aggregation.py +65 -3
  242. maxframe/dataframe/reduction/core.py +3 -1
  243. maxframe/dataframe/reduction/median.py +1 -1
  244. maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
  245. maxframe/dataframe/reduction/unique.py +53 -7
  246. maxframe/dataframe/statistics/corr.py +9 -6
  247. maxframe/dataframe/statistics/quantile.py +9 -6
  248. maxframe/dataframe/tseries/to_datetime.py +6 -4
  249. maxframe/dataframe/utils.py +219 -31
  250. maxframe/dataframe/window/rolling.py +7 -4
  251. maxframe/env.py +1 -0
  252. maxframe/errors.py +9 -0
  253. maxframe/extension.py +13 -2
  254. maxframe/io/objects/core.py +67 -51
  255. maxframe/io/objects/tensor.py +73 -17
  256. maxframe/io/objects/tests/test_object_io.py +10 -55
  257. maxframe/io/odpsio/arrow.py +15 -2
  258. maxframe/io/odpsio/schema.py +43 -13
  259. maxframe/io/odpsio/tableio.py +63 -11
  260. maxframe/io/odpsio/tests/test_arrow.py +1 -2
  261. maxframe/io/odpsio/tests/test_schema.py +114 -1
  262. maxframe/io/odpsio/tests/test_tableio.py +42 -0
  263. maxframe/io/odpsio/tests/test_volumeio.py +21 -58
  264. maxframe/io/odpsio/volumeio.py +23 -8
  265. maxframe/learn/__init__.py +2 -2
  266. maxframe/learn/contrib/__init__.py +2 -2
  267. maxframe/learn/contrib/graph/connected_components.py +2 -1
  268. maxframe/learn/contrib/lightgbm/__init__.py +33 -0
  269. maxframe/learn/contrib/lightgbm/_predict.py +138 -0
  270. maxframe/learn/contrib/lightgbm/_train.py +163 -0
  271. maxframe/learn/contrib/lightgbm/callback.py +114 -0
  272. maxframe/learn/contrib/lightgbm/classifier.py +199 -0
  273. maxframe/learn/contrib/lightgbm/core.py +372 -0
  274. maxframe/learn/contrib/lightgbm/dataset.py +153 -0
  275. maxframe/learn/contrib/lightgbm/regressor.py +29 -0
  276. maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
  277. maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
  278. maxframe/learn/contrib/models.py +38 -9
  279. maxframe/learn/contrib/utils.py +55 -0
  280. maxframe/learn/contrib/xgboost/callback.py +86 -0
  281. maxframe/learn/contrib/xgboost/classifier.py +26 -30
  282. maxframe/learn/contrib/xgboost/core.py +54 -42
  283. maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
  284. maxframe/learn/contrib/xgboost/predict.py +16 -9
  285. maxframe/learn/contrib/xgboost/regressor.py +28 -27
  286. maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
  287. maxframe/learn/contrib/xgboost/train.py +59 -16
  288. maxframe/learn/core.py +252 -0
  289. maxframe/learn/datasets/__init__.py +20 -0
  290. maxframe/learn/datasets/samples_generator.py +628 -0
  291. maxframe/learn/linear_model/__init__.py +15 -0
  292. maxframe/learn/linear_model/_base.py +163 -0
  293. maxframe/learn/linear_model/_lin_reg.py +175 -0
  294. maxframe/learn/metrics/__init__.py +25 -0
  295. maxframe/learn/metrics/_check_targets.py +95 -0
  296. maxframe/learn/metrics/_classification.py +1121 -0
  297. maxframe/learn/metrics/_regression.py +256 -0
  298. maxframe/learn/model_selection/__init__.py +15 -0
  299. maxframe/learn/model_selection/_split.py +451 -0
  300. maxframe/learn/model_selection/tests/__init__.py +13 -0
  301. maxframe/learn/model_selection/tests/test_split.py +156 -0
  302. maxframe/learn/preprocessing/__init__.py +16 -0
  303. maxframe/learn/preprocessing/_data/__init__.py +17 -0
  304. maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
  305. maxframe/learn/preprocessing/_data/normalize.py +127 -0
  306. maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
  307. maxframe/learn/preprocessing/_data/utils.py +79 -0
  308. maxframe/learn/preprocessing/_label/__init__.py +16 -0
  309. maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
  310. maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
  311. maxframe/learn/utils/__init__.py +4 -0
  312. maxframe/learn/utils/_encode.py +314 -0
  313. maxframe/learn/utils/checks.py +161 -0
  314. maxframe/learn/utils/core.py +33 -0
  315. maxframe/learn/utils/extmath.py +176 -0
  316. maxframe/learn/utils/multiclass.py +292 -0
  317. maxframe/learn/utils/shuffle.py +114 -0
  318. maxframe/learn/utils/sparsefuncs.py +87 -0
  319. maxframe/learn/utils/validation.py +775 -0
  320. maxframe/lib/__init__.py +0 -2
  321. maxframe/lib/compat.py +145 -0
  322. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  323. maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
  324. maxframe/lib/sparse/__init__.py +10 -15
  325. maxframe/lib/sparse/array.py +45 -33
  326. maxframe/lib/sparse/core.py +0 -2
  327. maxframe/lib/sparse/linalg.py +31 -0
  328. maxframe/lib/sparse/matrix.py +5 -2
  329. maxframe/lib/sparse/tests/__init__.py +0 -2
  330. maxframe/lib/sparse/tests/test_sparse.py +53 -53
  331. maxframe/lib/sparse/vector.py +0 -2
  332. maxframe/mixin.py +59 -2
  333. maxframe/opcodes.py +13 -5
  334. maxframe/protocol.py +67 -14
  335. maxframe/remote/core.py +16 -14
  336. maxframe/remote/run_script.py +6 -3
  337. maxframe/serialization/__init__.py +2 -0
  338. maxframe/serialization/core.cpython-310-darwin.so +0 -0
  339. maxframe/serialization/core.pxd +3 -0
  340. maxframe/serialization/core.pyi +3 -1
  341. maxframe/serialization/core.pyx +82 -4
  342. maxframe/serialization/pandas.py +5 -1
  343. maxframe/serialization/serializables/core.py +6 -5
  344. maxframe/serialization/serializables/field.py +2 -2
  345. maxframe/serialization/serializables/tests/test_field_type.py +3 -5
  346. maxframe/serialization/tests/test_serial.py +27 -0
  347. maxframe/session.py +4 -71
  348. maxframe/sperunner.py +165 -0
  349. maxframe/tensor/__init__.py +35 -2
  350. maxframe/tensor/arithmetic/__init__.py +2 -4
  351. maxframe/tensor/arithmetic/abs.py +0 -2
  352. maxframe/tensor/arithmetic/absolute.py +0 -2
  353. maxframe/tensor/arithmetic/add.py +34 -4
  354. maxframe/tensor/arithmetic/angle.py +0 -2
  355. maxframe/tensor/arithmetic/arccos.py +1 -4
  356. maxframe/tensor/arithmetic/arccosh.py +1 -3
  357. maxframe/tensor/arithmetic/arcsin.py +0 -2
  358. maxframe/tensor/arithmetic/arcsinh.py +0 -2
  359. maxframe/tensor/arithmetic/arctan.py +0 -2
  360. maxframe/tensor/arithmetic/arctan2.py +0 -2
  361. maxframe/tensor/arithmetic/arctanh.py +0 -2
  362. maxframe/tensor/arithmetic/around.py +0 -2
  363. maxframe/tensor/arithmetic/bitand.py +0 -2
  364. maxframe/tensor/arithmetic/bitor.py +1 -3
  365. maxframe/tensor/arithmetic/bitxor.py +1 -3
  366. maxframe/tensor/arithmetic/cbrt.py +0 -2
  367. maxframe/tensor/arithmetic/ceil.py +0 -2
  368. maxframe/tensor/arithmetic/clip.py +13 -13
  369. maxframe/tensor/arithmetic/conj.py +0 -2
  370. maxframe/tensor/arithmetic/copysign.py +0 -2
  371. maxframe/tensor/arithmetic/core.py +47 -39
  372. maxframe/tensor/arithmetic/cos.py +1 -3
  373. maxframe/tensor/arithmetic/cosh.py +0 -2
  374. maxframe/tensor/arithmetic/deg2rad.py +0 -2
  375. maxframe/tensor/arithmetic/degrees.py +0 -2
  376. maxframe/tensor/arithmetic/divide.py +0 -2
  377. maxframe/tensor/arithmetic/equal.py +0 -2
  378. maxframe/tensor/arithmetic/exp.py +1 -3
  379. maxframe/tensor/arithmetic/exp2.py +0 -2
  380. maxframe/tensor/arithmetic/expm1.py +0 -2
  381. maxframe/tensor/arithmetic/fabs.py +0 -2
  382. maxframe/tensor/arithmetic/fix.py +0 -2
  383. maxframe/tensor/arithmetic/float_power.py +0 -2
  384. maxframe/tensor/arithmetic/floor.py +0 -2
  385. maxframe/tensor/arithmetic/floordiv.py +0 -2
  386. maxframe/tensor/arithmetic/fmax.py +0 -2
  387. maxframe/tensor/arithmetic/fmin.py +0 -2
  388. maxframe/tensor/arithmetic/fmod.py +0 -2
  389. maxframe/tensor/arithmetic/frexp.py +6 -2
  390. maxframe/tensor/arithmetic/greater.py +0 -2
  391. maxframe/tensor/arithmetic/greater_equal.py +0 -2
  392. maxframe/tensor/arithmetic/hypot.py +0 -2
  393. maxframe/tensor/arithmetic/i0.py +1 -3
  394. maxframe/tensor/arithmetic/imag.py +0 -2
  395. maxframe/tensor/arithmetic/invert.py +1 -3
  396. maxframe/tensor/arithmetic/isclose.py +0 -2
  397. maxframe/tensor/arithmetic/iscomplex.py +0 -2
  398. maxframe/tensor/arithmetic/isfinite.py +1 -3
  399. maxframe/tensor/arithmetic/isinf.py +0 -2
  400. maxframe/tensor/arithmetic/isnan.py +0 -2
  401. maxframe/tensor/arithmetic/isreal.py +0 -2
  402. maxframe/tensor/arithmetic/ldexp.py +0 -2
  403. maxframe/tensor/arithmetic/less.py +0 -2
  404. maxframe/tensor/arithmetic/less_equal.py +0 -2
  405. maxframe/tensor/arithmetic/log.py +1 -3
  406. maxframe/tensor/arithmetic/log10.py +1 -3
  407. maxframe/tensor/arithmetic/log1p.py +1 -3
  408. maxframe/tensor/arithmetic/log2.py +1 -3
  409. maxframe/tensor/arithmetic/logaddexp.py +0 -2
  410. maxframe/tensor/arithmetic/logaddexp2.py +0 -2
  411. maxframe/tensor/arithmetic/logical_and.py +0 -2
  412. maxframe/tensor/arithmetic/logical_not.py +1 -3
  413. maxframe/tensor/arithmetic/logical_or.py +0 -2
  414. maxframe/tensor/arithmetic/logical_xor.py +0 -2
  415. maxframe/tensor/arithmetic/lshift.py +0 -2
  416. maxframe/tensor/arithmetic/maximum.py +0 -2
  417. maxframe/tensor/arithmetic/minimum.py +0 -2
  418. maxframe/tensor/arithmetic/mod.py +0 -2
  419. maxframe/tensor/arithmetic/modf.py +6 -2
  420. maxframe/tensor/arithmetic/multiply.py +37 -4
  421. maxframe/tensor/arithmetic/nan_to_num.py +0 -2
  422. maxframe/tensor/arithmetic/negative.py +0 -2
  423. maxframe/tensor/arithmetic/nextafter.py +0 -2
  424. maxframe/tensor/arithmetic/not_equal.py +0 -2
  425. maxframe/tensor/arithmetic/positive.py +0 -2
  426. maxframe/tensor/arithmetic/power.py +0 -2
  427. maxframe/tensor/arithmetic/rad2deg.py +0 -2
  428. maxframe/tensor/arithmetic/radians.py +0 -2
  429. maxframe/tensor/arithmetic/real.py +0 -2
  430. maxframe/tensor/arithmetic/reciprocal.py +5 -3
  431. maxframe/tensor/arithmetic/rint.py +1 -3
  432. maxframe/tensor/arithmetic/rshift.py +0 -2
  433. maxframe/tensor/arithmetic/setimag.py +0 -2
  434. maxframe/tensor/arithmetic/setreal.py +0 -2
  435. maxframe/tensor/arithmetic/sign.py +0 -2
  436. maxframe/tensor/arithmetic/signbit.py +0 -2
  437. maxframe/tensor/arithmetic/sin.py +0 -2
  438. maxframe/tensor/arithmetic/sinc.py +1 -3
  439. maxframe/tensor/arithmetic/sinh.py +0 -2
  440. maxframe/tensor/arithmetic/spacing.py +0 -2
  441. maxframe/tensor/arithmetic/sqrt.py +0 -2
  442. maxframe/tensor/arithmetic/square.py +0 -2
  443. maxframe/tensor/arithmetic/subtract.py +4 -2
  444. maxframe/tensor/arithmetic/tan.py +0 -2
  445. maxframe/tensor/arithmetic/tanh.py +0 -2
  446. maxframe/tensor/arithmetic/tests/__init__.py +0 -2
  447. maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
  448. maxframe/tensor/arithmetic/truediv.py +0 -2
  449. maxframe/tensor/arithmetic/trunc.py +0 -2
  450. maxframe/tensor/arithmetic/utils.py +32 -6
  451. maxframe/tensor/array_utils.py +3 -25
  452. maxframe/tensor/core.py +6 -6
  453. maxframe/tensor/datasource/__init__.py +10 -2
  454. maxframe/tensor/datasource/arange.py +0 -2
  455. maxframe/tensor/datasource/array.py +3 -22
  456. maxframe/tensor/datasource/core.py +15 -10
  457. maxframe/tensor/datasource/diag.py +140 -0
  458. maxframe/tensor/datasource/diagflat.py +69 -0
  459. maxframe/tensor/datasource/empty.py +0 -2
  460. maxframe/tensor/datasource/eye.py +95 -0
  461. maxframe/tensor/datasource/from_dataframe.py +0 -2
  462. maxframe/tensor/datasource/from_dense.py +0 -17
  463. maxframe/tensor/datasource/from_sparse.py +0 -2
  464. maxframe/tensor/datasource/full.py +0 -2
  465. maxframe/tensor/datasource/identity.py +54 -0
  466. maxframe/tensor/datasource/indices.py +115 -0
  467. maxframe/tensor/datasource/linspace.py +140 -0
  468. maxframe/tensor/datasource/meshgrid.py +135 -0
  469. maxframe/tensor/datasource/ones.py +8 -3
  470. maxframe/tensor/datasource/tests/test_datasource.py +32 -1
  471. maxframe/tensor/datasource/tri_array.py +107 -0
  472. maxframe/tensor/datasource/zeros.py +7 -3
  473. maxframe/tensor/extensions/__init__.py +31 -0
  474. maxframe/tensor/extensions/accessor.py +25 -0
  475. maxframe/tensor/extensions/apply_chunk.py +137 -0
  476. maxframe/tensor/indexing/__init__.py +1 -1
  477. maxframe/tensor/indexing/choose.py +8 -6
  478. maxframe/tensor/indexing/compress.py +0 -2
  479. maxframe/tensor/indexing/extract.py +0 -2
  480. maxframe/tensor/indexing/fill_diagonal.py +9 -6
  481. maxframe/tensor/indexing/flatnonzero.py +1 -3
  482. maxframe/tensor/indexing/getitem.py +10 -43
  483. maxframe/tensor/indexing/nonzero.py +2 -4
  484. maxframe/tensor/indexing/setitem.py +19 -9
  485. maxframe/tensor/indexing/slice.py +6 -3
  486. maxframe/tensor/indexing/take.py +0 -2
  487. maxframe/tensor/indexing/tests/__init__.py +0 -2
  488. maxframe/tensor/indexing/tests/test_indexing.py +0 -2
  489. maxframe/tensor/indexing/unravel_index.py +6 -6
  490. maxframe/tensor/lib/__init__.py +16 -0
  491. maxframe/tensor/lib/index_tricks.py +404 -0
  492. maxframe/tensor/linalg/__init__.py +36 -0
  493. maxframe/tensor/linalg/dot.py +145 -0
  494. maxframe/tensor/linalg/inner.py +36 -0
  495. maxframe/tensor/linalg/inv.py +83 -0
  496. maxframe/tensor/linalg/lu.py +115 -0
  497. maxframe/tensor/linalg/matmul.py +225 -0
  498. maxframe/tensor/linalg/qr.py +124 -0
  499. maxframe/tensor/linalg/solve_triangular.py +103 -0
  500. maxframe/tensor/linalg/svd.py +167 -0
  501. maxframe/tensor/linalg/tensordot.py +213 -0
  502. maxframe/tensor/linalg/vdot.py +73 -0
  503. maxframe/tensor/merge/__init__.py +4 -0
  504. maxframe/tensor/merge/append.py +74 -0
  505. maxframe/tensor/merge/column_stack.py +63 -0
  506. maxframe/tensor/merge/concatenate.py +3 -2
  507. maxframe/tensor/merge/dstack.py +71 -0
  508. maxframe/tensor/merge/hstack.py +70 -0
  509. maxframe/tensor/merge/stack.py +0 -2
  510. maxframe/tensor/merge/tests/test_merge.py +0 -2
  511. maxframe/tensor/misc/__init__.py +18 -5
  512. maxframe/tensor/misc/astype.py +10 -8
  513. maxframe/tensor/misc/broadcast_to.py +1 -1
  514. maxframe/tensor/misc/copy.py +64 -0
  515. maxframe/tensor/misc/diff.py +115 -0
  516. maxframe/tensor/misc/flatten.py +63 -0
  517. maxframe/tensor/misc/in1d.py +94 -0
  518. maxframe/tensor/misc/isin.py +130 -0
  519. maxframe/tensor/misc/ndim.py +53 -0
  520. maxframe/tensor/misc/ravel.py +0 -2
  521. maxframe/tensor/misc/repeat.py +129 -0
  522. maxframe/tensor/misc/searchsorted.py +147 -0
  523. maxframe/tensor/misc/setdiff1d.py +58 -0
  524. maxframe/tensor/misc/squeeze.py +117 -0
  525. maxframe/tensor/misc/swapaxes.py +113 -0
  526. maxframe/tensor/misc/tests/test_misc.py +0 -2
  527. maxframe/tensor/misc/transpose.py +8 -4
  528. maxframe/tensor/misc/trapezoid.py +123 -0
  529. maxframe/tensor/misc/unique.py +0 -1
  530. maxframe/tensor/misc/where.py +10 -8
  531. maxframe/tensor/operators.py +0 -34
  532. maxframe/tensor/random/__init__.py +3 -5
  533. maxframe/tensor/random/binomial.py +0 -2
  534. maxframe/tensor/random/bytes.py +0 -2
  535. maxframe/tensor/random/chisquare.py +0 -2
  536. maxframe/tensor/random/choice.py +9 -8
  537. maxframe/tensor/random/core.py +20 -5
  538. maxframe/tensor/random/dirichlet.py +0 -2
  539. maxframe/tensor/random/exponential.py +0 -2
  540. maxframe/tensor/random/f.py +2 -4
  541. maxframe/tensor/random/gamma.py +0 -2
  542. maxframe/tensor/random/geometric.py +0 -2
  543. maxframe/tensor/random/gumbel.py +0 -2
  544. maxframe/tensor/random/hypergeometric.py +0 -2
  545. maxframe/tensor/random/laplace.py +2 -4
  546. maxframe/tensor/random/logistic.py +0 -2
  547. maxframe/tensor/random/lognormal.py +0 -2
  548. maxframe/tensor/random/logseries.py +0 -2
  549. maxframe/tensor/random/multinomial.py +0 -2
  550. maxframe/tensor/random/multivariate_normal.py +0 -2
  551. maxframe/tensor/random/negative_binomial.py +0 -2
  552. maxframe/tensor/random/noncentral_chisquare.py +0 -2
  553. maxframe/tensor/random/noncentral_f.py +1 -3
  554. maxframe/tensor/random/normal.py +0 -2
  555. maxframe/tensor/random/pareto.py +0 -2
  556. maxframe/tensor/random/permutation.py +6 -3
  557. maxframe/tensor/random/poisson.py +0 -2
  558. maxframe/tensor/random/power.py +0 -2
  559. maxframe/tensor/random/rand.py +0 -2
  560. maxframe/tensor/random/randint.py +0 -2
  561. maxframe/tensor/random/randn.py +0 -2
  562. maxframe/tensor/random/random_integers.py +0 -2
  563. maxframe/tensor/random/random_sample.py +0 -2
  564. maxframe/tensor/random/rayleigh.py +0 -2
  565. maxframe/tensor/random/standard_cauchy.py +0 -2
  566. maxframe/tensor/random/standard_exponential.py +0 -2
  567. maxframe/tensor/random/standard_gamma.py +0 -2
  568. maxframe/tensor/random/standard_normal.py +0 -2
  569. maxframe/tensor/random/standard_t.py +0 -2
  570. maxframe/tensor/random/tests/__init__.py +0 -2
  571. maxframe/tensor/random/tests/test_random.py +0 -2
  572. maxframe/tensor/random/triangular.py +0 -2
  573. maxframe/tensor/random/uniform.py +0 -2
  574. maxframe/tensor/random/vonmises.py +0 -2
  575. maxframe/tensor/random/wald.py +0 -2
  576. maxframe/tensor/random/weibull.py +0 -2
  577. maxframe/tensor/random/zipf.py +0 -2
  578. maxframe/tensor/reduction/__init__.py +0 -2
  579. maxframe/tensor/reduction/all.py +0 -2
  580. maxframe/tensor/reduction/allclose.py +0 -2
  581. maxframe/tensor/reduction/any.py +0 -2
  582. maxframe/tensor/reduction/argmax.py +1 -3
  583. maxframe/tensor/reduction/argmin.py +1 -3
  584. maxframe/tensor/reduction/array_equal.py +0 -2
  585. maxframe/tensor/reduction/core.py +0 -2
  586. maxframe/tensor/reduction/count_nonzero.py +0 -2
  587. maxframe/tensor/reduction/cumprod.py +0 -2
  588. maxframe/tensor/reduction/cumsum.py +0 -2
  589. maxframe/tensor/reduction/max.py +0 -2
  590. maxframe/tensor/reduction/mean.py +0 -2
  591. maxframe/tensor/reduction/min.py +0 -2
  592. maxframe/tensor/reduction/nanargmax.py +0 -2
  593. maxframe/tensor/reduction/nanargmin.py +0 -2
  594. maxframe/tensor/reduction/nancumprod.py +0 -2
  595. maxframe/tensor/reduction/nancumsum.py +0 -2
  596. maxframe/tensor/reduction/nanmax.py +0 -2
  597. maxframe/tensor/reduction/nanmean.py +0 -2
  598. maxframe/tensor/reduction/nanmin.py +0 -2
  599. maxframe/tensor/reduction/nanprod.py +0 -2
  600. maxframe/tensor/reduction/nanstd.py +0 -2
  601. maxframe/tensor/reduction/nansum.py +0 -2
  602. maxframe/tensor/reduction/nanvar.py +0 -2
  603. maxframe/tensor/reduction/prod.py +0 -2
  604. maxframe/tensor/reduction/std.py +0 -2
  605. maxframe/tensor/reduction/sum.py +0 -2
  606. maxframe/tensor/reduction/tests/test_reduction.py +1 -4
  607. maxframe/tensor/reduction/var.py +0 -2
  608. maxframe/tensor/reshape/__init__.py +0 -2
  609. maxframe/tensor/reshape/reshape.py +6 -5
  610. maxframe/tensor/reshape/tests/__init__.py +0 -2
  611. maxframe/tensor/reshape/tests/test_reshape.py +0 -2
  612. maxframe/tensor/sort/__init__.py +16 -0
  613. maxframe/tensor/sort/argsort.py +150 -0
  614. maxframe/tensor/sort/sort.py +295 -0
  615. maxframe/tensor/special/__init__.py +37 -0
  616. maxframe/tensor/special/core.py +38 -0
  617. maxframe/tensor/special/misc.py +142 -0
  618. maxframe/tensor/special/statistical.py +56 -0
  619. maxframe/tensor/statistics/__init__.py +5 -0
  620. maxframe/tensor/statistics/average.py +143 -0
  621. maxframe/tensor/statistics/bincount.py +133 -0
  622. maxframe/tensor/statistics/quantile.py +10 -8
  623. maxframe/tensor/ufunc/__init__.py +0 -2
  624. maxframe/tensor/ufunc/ufunc.py +0 -2
  625. maxframe/tensor/utils.py +21 -3
  626. maxframe/tests/test_protocol.py +3 -3
  627. maxframe/tests/test_utils.py +210 -1
  628. maxframe/tests/utils.py +59 -1
  629. maxframe/udf.py +76 -6
  630. maxframe/utils.py +418 -17
  631. {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/METADATA +4 -1
  632. maxframe-2.0.0b2.dist-info/RECORD +939 -0
  633. {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/WHEEL +1 -1
  634. maxframe_client/clients/framedriver.py +19 -3
  635. maxframe_client/fetcher.py +113 -6
  636. maxframe_client/session/odps.py +173 -38
  637. maxframe_client/session/task.py +3 -1
  638. maxframe_client/tests/test_session.py +41 -5
  639. maxframe-1.3.1.dist-info/RECORD +0 -705
  640. {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,141 @@
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 base64
16
+ import hashlib
17
+ import textwrap
18
+
19
+ import pytest
20
+
21
+ from .... import dataframe as md
22
+ from .... import tensor as mt
23
+ from ....dataframe.utils import bind_func_args_from_pos
24
+ from ....lib import wrapped_pickle as pickle
25
+ from ..core import SPECodeGenerator
26
+
27
+
28
+ @pytest.fixture
29
+ def codegen():
30
+ return SPECodeGenerator("session_1")
31
+
32
+
33
+ def test_simple_codegen(codegen):
34
+ df = md.DataFrame(mt.random.rand(1000, 5), columns=list("ABCDE"))
35
+ df["F"] = df["A"] + df["B"]
36
+ df["G"] = df["C"] * 2 + df["D"]
37
+ result = df.cumsum()
38
+ dag = result.build_graph()
39
+ generated = codegen.generate(dag)
40
+
41
+ local_vars = generated.constants.copy()
42
+ exec(generated.code, {}, local_vars)
43
+ df_result = local_vars[generated.output_key_to_variables[result.key]]
44
+ assert len(df_result.columns) == 7
45
+
46
+
47
+ def test_codegen_with_udf(codegen):
48
+ df = md.DataFrame(mt.random.rand(1, 3), columns=list("ABC"))
49
+
50
+ def f1(x) -> int:
51
+ return x + 1
52
+
53
+ def f2(x) -> int:
54
+ return x - 1
55
+
56
+ result = df.transform({"A": f1, "B": [f1, f2]})
57
+ dag = result.build_graph()
58
+ generated = codegen.generate(dag)
59
+
60
+ udf_1_body = base64.b64encode(pickle.dumps(f1, protocol=pickle.DEFAULT_PROTOCOL))
61
+ udf_2_body = base64.b64encode(pickle.dumps(f2, protocol=pickle.DEFAULT_PROTOCOL))
62
+ udf_1_value = (
63
+ f"pickled_data = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
64
+ )
65
+ udf_2_value = (
66
+ f"pickled_data = cloudpickle.loads(base64.b64decode({udf_2_body}), buffers=[])"
67
+ )
68
+ udf_1 = f"user_udf_f1_{hashlib.md5(udf_1_value.encode('utf-8')).hexdigest()}"
69
+ udf_2 = f"user_udf_f2_{hashlib.md5(udf_2_value.encode('utf-8')).hexdigest()}"
70
+
71
+ expected_contents = f"""
72
+ import numpy as np
73
+ import pandas as pd
74
+ import base64
75
+ import cloudpickle
76
+ {udf_1_value}
77
+ {udf_1} = pickled_data
78
+ {udf_2_value}
79
+ {udf_2} = pickled_data
80
+ if not running:
81
+ raise RuntimeError('CANCELLED')
82
+ var_0 = np.random.rand(1, 3)
83
+
84
+ if not running:
85
+ raise RuntimeError('CANCELLED')
86
+ var_1 = pd.DataFrame(var_0, index=const_0, columns=['A', 'B', 'C'])
87
+
88
+ del var_0
89
+ if not running:
90
+ raise RuntimeError('CANCELLED')
91
+ var_2 = var_1.transform({{'A': {udf_1}, 'B': [{udf_1}, {udf_2}]}}, axis=0)
92
+
93
+ del var_1
94
+ """
95
+ assert generated.code == textwrap.dedent(expected_contents).strip()
96
+
97
+
98
+ def test_codegen_with_udf_and_args(codegen):
99
+ df = md.DataFrame(mt.random.rand(1, 3), columns=list("ABC"))
100
+
101
+ def f1(x, y, a, b) -> int:
102
+ return x + y + a + b
103
+
104
+ result = df.transform({"A": f1}, 0, 2, a=3, b=4)
105
+ dag = result.build_graph()
106
+ generated = codegen.generate(dag)
107
+
108
+ udf_1_body = base64.b64encode(
109
+ pickle.dumps(
110
+ bind_func_args_from_pos(f1, 1, 2, a=3, b=4),
111
+ protocol=pickle.DEFAULT_PROTOCOL,
112
+ )
113
+ )
114
+ udf_1_value = (
115
+ f"pickled_data = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
116
+ )
117
+ udf_1 = f"user_udf_f1_{hashlib.md5(udf_1_value.encode('utf-8')).hexdigest()}"
118
+
119
+ expected_contents = f"""
120
+ import numpy as np
121
+ import pandas as pd
122
+ import base64
123
+ import cloudpickle
124
+ {udf_1_value}
125
+ {udf_1} = pickled_data
126
+ if not running:
127
+ raise RuntimeError('CANCELLED')
128
+ var_0 = np.random.rand(1, 3)
129
+
130
+ if not running:
131
+ raise RuntimeError('CANCELLED')
132
+ var_1 = pd.DataFrame(var_0, index=const_0, columns=['A', 'B', 'C'])
133
+
134
+ del var_0
135
+ if not running:
136
+ raise RuntimeError('CANCELLED')
137
+ var_2 = var_1.transform({{'A': {udf_1}}}, axis=0)
138
+
139
+ del var_1
140
+ """
141
+ assert generated.code == textwrap.dedent(expected_contents).strip()
@@ -0,0 +1,54 @@
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, Type
16
+
17
+ from ...typing_ import OperatorType
18
+ from .core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
19
+
20
+ _import_aliases = {
21
+ "np": "numpy",
22
+ "npl": "numpy.linalg",
23
+ "pd": "pandas",
24
+ "spl": "scipy.linalg",
25
+ }
26
+
27
+
28
+ def build_method_call_adapter(
29
+ op_cls: Type[OperatorType],
30
+ method_name: str,
31
+ *call_args,
32
+ skip_none: bool = True,
33
+ source_module: str = None,
34
+ **call_kwargs,
35
+ ) -> Type[SPEOperatorAdapter]:
36
+ class MethodCallAdapter(SPEOperatorAdapter):
37
+ def generate_code(self, op: OperatorType, context: SPECodeContext) -> List[str]:
38
+ if source_module in _import_aliases:
39
+ context.register_import(_import_aliases[source_module], source_module)
40
+
41
+ input_var_name = source_module or context.get_input_tileable_variable(
42
+ op.inputs[0]
43
+ )
44
+ res_var_names = [
45
+ context.get_output_tileable_variable(out) for out in op.outputs
46
+ ]
47
+ args_str = self.generate_call_args_with_attributes(
48
+ op, context, *call_args, skip_none=skip_none, **call_kwargs
49
+ )
50
+ res_var_names_str = ", ".join(res_var_names)
51
+ return [f"{res_var_names_str} = {input_var_name}.{method_name}({args_str})"]
52
+
53
+ MethodCallAdapter.__name__ = op_cls.__name__ + "Adapter"
54
+ return register_op_adapter(op_cls)(MethodCallAdapter)
@@ -0,0 +1,13 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright 1999-2025 Alibaba Group Holding Ltd.
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,12 +15,11 @@
16
15
  import base64
17
16
  from typing import List, Tuple
18
17
 
19
- # 使用pytest生成单元测试
20
18
  import pytest
21
19
 
22
- from maxframe.codegen import UserCodeMixin
23
- from maxframe.lib import wrapped_pickle
24
- from maxframe.serialization.core import PickleContainer
20
+ from ...lib import wrapped_pickle
21
+ from ...serialization.core import PickleContainer
22
+ from ..core import UserCodeMixin
25
23
 
26
24
 
27
25
  @pytest.mark.parametrize(
@@ -12,4 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from .config import AttributeDict, option_context, options, update_wlm_quota_settings
15
+ from .config import AttributeDict, option_context, options
maxframe/config/config.py CHANGED
@@ -14,6 +14,7 @@
14
14
 
15
15
  import contextlib
16
16
  import contextvars
17
+ import os
17
18
  import traceback
18
19
  import warnings
19
20
  from copy import deepcopy
@@ -28,14 +29,14 @@ except ImportError:
28
29
 
29
30
  available_timezones = lambda: all_timezones
30
31
 
31
- import logging
32
-
33
32
  from ..utils import get_python_tag
34
33
  from .validators import (
35
34
  ValidatorType,
36
35
  all_validator,
36
+ is_all_dict_keys_in,
37
37
  is_bool,
38
38
  is_dict,
39
+ is_float,
39
40
  is_in,
40
41
  is_integer,
41
42
  is_non_negative_integer,
@@ -45,11 +46,11 @@ from .validators import (
45
46
  is_valid_cache_path,
46
47
  )
47
48
 
48
- logger = logging.getLogger(__name__)
49
-
50
49
  _DEFAULT_REDIRECT_WARN = "Option {source} has been replaced by {target} and might be removed in a future release."
51
50
  _DEFAULT_MAX_ALIVE_SECONDS = 3 * 24 * 3600
52
51
  _DEFAULT_MAX_IDLE_SECONDS = 3600
52
+ _DEFAULT_RETRY_DELAY = 0.1
53
+ _DEFAULT_RETRY_TIMES = 4
53
54
  _DEFAULT_SPE_OPERATION_TIMEOUT_SECONDS = 120
54
55
  _DEFAULT_SPE_FAILURE_RETRY_TIMES = 5
55
56
  _DEFAULT_UPLOAD_BATCH_SIZE = 4096
@@ -57,6 +58,7 @@ _DEFAULT_TEMP_LIFECYCLE = 1
57
58
  _DEFAULT_TASK_START_TIMEOUT = 60
58
59
  _DEFAULT_TASK_RESTART_TIMEOUT = 300
59
60
  _DEFAULT_LOGVIEW_HOURS = 24 * 30
61
+ _DEFAULT_FUNCTION_RUNNING_OPTIONS = {"cpu": 1, "memory": "4GiB", "gpu": 0}
60
62
 
61
63
 
62
64
  class OptionError(Exception):
@@ -321,6 +323,12 @@ def _get_legal_local_tz_name() -> Optional[str]:
321
323
 
322
324
 
323
325
  default_options = Config()
326
+ default_options.register_option(
327
+ "retry_times", _DEFAULT_RETRY_TIMES, validator=is_integer
328
+ )
329
+ default_options.register_option(
330
+ "retry_delay", _DEFAULT_RETRY_DELAY, validator=is_integer | is_float
331
+ )
324
332
  default_options.register_option(
325
333
  "execution_mode", "trigger", validator=is_in(["trigger", "eager"])
326
334
  )
@@ -368,6 +376,14 @@ default_options.register_option(
368
376
  default_options.register_option(
369
377
  "chunk_size", None, validator=is_null | is_integer, remote=True
370
378
  )
379
+ default_options.register_option(
380
+ "chunk_store_limit", 128 * 1024**2, validator=is_numeric
381
+ )
382
+
383
+ default_options.register_option("local_execution.enabled", False, validator=is_bool)
384
+ default_options.register_option(
385
+ "local_execution.size_limit", 5 * 1024**2, validator=is_integer
386
+ )
371
387
 
372
388
  default_options.register_option(
373
389
  "session.max_alive_seconds",
@@ -425,6 +441,9 @@ default_options.register_option(
425
441
  validator=is_null | is_integer,
426
442
  remote=True,
427
443
  )
444
+ default_options.register_option(
445
+ "session.client_version", None, validator=is_null | is_string, remote=True
446
+ )
428
447
 
429
448
  default_options.register_option("warn_duplicated_execution", False, validator=is_bool)
430
449
  default_options.register_option("dataframe.use_arrow_dtype", True, validator=is_bool)
@@ -439,6 +458,23 @@ default_options.register_option(
439
458
  "dag.settings", value=dict(), validator=is_dict, remote=True
440
459
  )
441
460
 
461
+ default_options.register_option(
462
+ "function.default_running_options",
463
+ _DEFAULT_FUNCTION_RUNNING_OPTIONS,
464
+ validator=is_dict | is_all_dict_keys_in("cpu", "memory", "gpu"),
465
+ )
466
+
467
+ ################
468
+ # DPE Settings #
469
+ ################
470
+ default_options.register_option("dpe.settings", dict(), validator=is_dict, remote=True)
471
+ default_options.register_option(
472
+ "dpe.task.settings", dict(), validator=is_dict, remote=True
473
+ )
474
+ default_options.register_option(
475
+ "dpe.reduction.combine_size", 4, validator=is_integer, remote=True
476
+ )
477
+
442
478
  ################
443
479
  # SPE Settings #
444
480
  ################
@@ -463,6 +499,16 @@ default_options.register_option(
463
499
  "pythonpack.task.settings", {}, validator=is_dict, remote=True
464
500
  )
465
501
 
502
+ ##################
503
+ # Learn settings #
504
+ ##################
505
+ assume_finite = os.environ.get("SKLEARN_ASSUME_FINITE")
506
+ if assume_finite is not None:
507
+ assume_finite = bool(assume_finite)
508
+ default_options.register_option(
509
+ "learn.assume_finite", assume_finite, validator=is_null | is_bool
510
+ )
511
+
466
512
  _options_ctx_var = contextvars.ContextVar("_options_ctx_var")
467
513
 
468
514
 
@@ -518,22 +564,3 @@ class OptionsProxy:
518
564
 
519
565
 
520
566
  options = OptionsProxy()
521
-
522
-
523
- def update_wlm_quota_settings(session_id: str, engine_settings: Dict[str, Any]):
524
- engine_quota = engine_settings.get("odps.task.wlm.quota", None)
525
- session_quota = options.session.quota_name or None
526
- if engine_quota != session_quota and engine_quota:
527
- logger.warning(
528
- "[Session=%s] Session quota (%s) is different to SubDag engine quota (%s)",
529
- session_id,
530
- session_quota,
531
- engine_quota,
532
- )
533
- # TODO(renxiang): overwrite or not overwrite
534
- return
535
-
536
- if session_quota:
537
- engine_settings["odps.task.wlm.quota"] = session_quota
538
- elif "odps.task.wlm.quota" in engine_settings:
539
- engine_settings.pop("odps.task.wlm.quota")
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
1
  # Copyright 1999-2025 Alibaba Group Holding Ltd.
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,14 +16,8 @@ import threading
18
16
 
19
17
  import pytest
20
18
 
21
- from ..config import (
22
- Config,
23
- is_integer,
24
- is_string,
25
- option_context,
26
- options,
27
- update_wlm_quota_settings,
28
- )
19
+ from ...utils import update_wlm_quota_settings
20
+ from ..config import Config, is_integer, is_string, option_context, options
29
21
 
30
22
 
31
23
  def test_config_context():
@@ -117,6 +109,6 @@ def test_update_wlm_quota_settings():
117
109
  update_wlm_quota_settings("session_id", engine_settings)
118
110
  assert engine_settings["odps.task.wlm.quota"] == "quota1"
119
111
  options.session.quota_name = None
120
- update_wlm_quota_settings("session_id", engine_settings)
121
- # TODO(renxiang): overwrite or not overwrite
112
+ with pytest.raises(ValueError):
113
+ update_wlm_quota_settings("session_id", engine_settings)
122
114
  assert "odps.task.wlm.quota" in engine_settings
@@ -64,6 +64,11 @@ def is_in(vals):
64
64
  return Validator(vals.__contains__)
65
65
 
66
66
 
67
+ def is_all_dict_keys_in(*keys):
68
+ keys_set = set(keys)
69
+ return Validator(lambda x: x in keys_set)
70
+
71
+
67
72
  def _is_valid_cache_path(path: str) -> bool:
68
73
  """
69
74
  path should look like oss://oss_endpoint/oss_bucket/path
maxframe/conftest.py CHANGED
@@ -35,7 +35,7 @@ def test_config():
35
35
  return config
36
36
 
37
37
 
38
- def _get_odps_env(test_config: ConfigParser, section_name: str) -> ODPS:
38
+ def _get_account_env(test_config: ConfigParser, section_name: str) -> ODPS:
39
39
  try:
40
40
  access_id = test_config.get(section_name, "access_id")
41
41
  except NoOptionError:
@@ -60,10 +60,18 @@ def _get_odps_env(test_config: ConfigParser, section_name: str) -> ODPS:
60
60
  tunnel_endpoint = test_config.get("odps", "tunnel_endpoint")
61
61
  except NoOptionError:
62
62
  tunnel_endpoint = None
63
-
64
- entry = ODPS(
65
- access_id, secret_access_key, project, endpoint, overwrite_global=False
63
+ return ODPS(
64
+ access_id,
65
+ secret_access_key,
66
+ project,
67
+ endpoint,
68
+ tunnel_endpoint=tunnel_endpoint,
69
+ overwrite_global=False,
66
70
  )
71
+
72
+
73
+ def _get_bearer_token_env(test_config: ConfigParser, section_name: str) -> ODPS:
74
+ entry = _get_account_env(test_config, section_name)
67
75
  policy = {
68
76
  "Version": "1",
69
77
  "Statement": [
@@ -73,27 +81,28 @@ def _get_odps_env(test_config: ConfigParser, section_name: str) -> ODPS:
73
81
  token = entry.get_project().generate_auth_token(policy, "bearer", 5)
74
82
  return ODPS(
75
83
  account=BearerTokenAccount(token, 5),
76
- project=project,
77
- endpoint=endpoint,
78
- tunnel_endpoint=tunnel_endpoint,
84
+ project=entry.project,
85
+ endpoint=entry.endpoint,
86
+ tunnel_endpoint=entry.tunnel_endpoint,
79
87
  )
80
88
 
81
89
 
82
90
  @pytest.fixture(scope="session")
83
91
  def odps_with_schema(test_config):
84
92
  try:
85
- return _get_odps_env(test_config, "odps_with_schema")
93
+ return _get_bearer_token_env(test_config, "odps_with_schema")
86
94
  except NoSectionError:
87
95
  pytest.skip("Need to specify odps_with_schema section in test.conf")
88
96
 
89
97
 
90
98
  @pytest.fixture(scope="session", autouse=True)
91
99
  def odps_envs(test_config):
92
- entry = _get_odps_env(test_config, "odps")
100
+ entry = _get_bearer_token_env(test_config, "odps")
93
101
 
94
102
  os.environ["ODPS_BEARER_TOKEN"] = entry.account.token
95
103
  os.environ["ODPS_PROJECT_NAME"] = entry.project
96
104
  os.environ["ODPS_ENDPOINT"] = entry.endpoint
105
+ os.environ["RAY_ISOLATION_UT_ENV"] = "UT"
97
106
  if entry.tunnel_endpoint:
98
107
  os.environ["ODPS_TUNNEL_ENDPOINT"] = entry.tunnel_endpoint
99
108
 
@@ -104,6 +113,7 @@ def odps_envs(test_config):
104
113
  os.environ.pop("ODPS_PROJECT_NAME", None)
105
114
  os.environ.pop("ODPS_ENDPOINT", None)
106
115
  os.environ.pop("ODPS_TUNNEL_ENDPOINT", None)
116
+ os.environ.pop("RAY_ISOLATION_UT_ENV", None)
107
117
 
108
118
  from .tests.utils import _test_tables_to_drop
109
119
 
@@ -114,6 +124,11 @@ def odps_envs(test_config):
114
124
  pass
115
125
 
116
126
 
127
+ @pytest.fixture(scope="session")
128
+ def odps_account(test_config):
129
+ return _get_account_env(test_config, "odps")
130
+
131
+
117
132
  @pytest.fixture(scope="session")
118
133
  def oss_config():
119
134
  config = ConfigParser()
@@ -155,7 +170,7 @@ def oss_config():
155
170
  config.oss_rolearn = oss_rolearn
156
171
  yield config
157
172
  except (NoSectionError, NoOptionError, ImportError):
158
- return None
173
+ yield None
159
174
  finally:
160
175
  options.service_role_arn = old_role_arn
161
176
  options.object_cache_url = old_cache_url
@@ -194,3 +209,16 @@ def local_test_envs():
194
209
  os.environ[spe_launcher_env] = old_value
195
210
  else:
196
211
  del os.environ[spe_launcher_env]
212
+
213
+
214
+ @pytest.fixture
215
+ def enable_local_execution(request):
216
+ old_enabled = options.local_execution.enabled
217
+ old_limit = options.local_execution.size_limit
218
+ try:
219
+ options.local_execution.enabled = True
220
+ options.local_execution.size_limit = getattr(request, "param", 0)
221
+ yield
222
+ finally:
223
+ options.local_execution.enabled = old_enabled
224
+ options.local_execution.size_limit = old_limit
maxframe/core/__init__.py CHANGED
@@ -32,6 +32,7 @@ from .entity import (
32
32
  Tileable,
33
33
  TileableData,
34
34
  _ExecuteAndFetchMixin,
35
+ df_output_types,
35
36
  get_fetch_class,
36
37
  get_output_types,
37
38
  get_tileable_types,
@@ -0,0 +1,110 @@
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 abc import ABC, abstractmethod
16
+ from typing import Any, List
17
+
18
+ from ..utils import classproperty
19
+
20
+
21
+ class Context(ABC):
22
+ """
23
+ Context that providing API that can be
24
+ used inside `tile` and `execute`.
25
+ """
26
+
27
+ all_contexts = []
28
+
29
+ @abstractmethod
30
+ def get_session_id(self) -> str:
31
+ raise NotImplementedError
32
+
33
+ @abstractmethod
34
+ def get_subdag_id(self) -> str:
35
+ raise NotImplementedError
36
+
37
+ @abstractmethod
38
+ def get_local_host_ip(self) -> str:
39
+ raise NotImplementedError
40
+
41
+ @abstractmethod
42
+ def get_worker_cores(self) -> int:
43
+ raise NotImplementedError
44
+
45
+ @abstractmethod
46
+ def get_chunks_result(self, data_keys: List[str], copy: bool = True) -> List[Any]:
47
+ raise NotImplementedError
48
+
49
+ @abstractmethod
50
+ def create_operator_controller(self, name: str, object_cls, *args, **kwargs):
51
+ """
52
+ Create operator controller.
53
+
54
+ Parameters
55
+ ----------
56
+ name : str
57
+ Object name.
58
+ object_cls
59
+ Object class.
60
+ args
61
+ kwargs
62
+
63
+ Returns
64
+ -------
65
+ ref
66
+ """
67
+
68
+ @abstractmethod
69
+ def get_operator_controller(self, name: str):
70
+ """
71
+ Get remote object
72
+
73
+ Parameters
74
+ ----------
75
+ name : str
76
+ Object name.
77
+
78
+ Returns
79
+ -------
80
+ ref
81
+ """
82
+
83
+ @abstractmethod
84
+ def destroy_operator_controller(self, name: str):
85
+ """
86
+ Destroy remote object.
87
+
88
+ Parameters
89
+ ----------
90
+ name : str
91
+ Object name.
92
+ """
93
+
94
+ def __enter__(self):
95
+ Context.all_contexts.append(self)
96
+
97
+ def __exit__(self, *_):
98
+ Context.all_contexts.pop()
99
+
100
+ @classproperty
101
+ def current(cls):
102
+ return cls.all_contexts[-1] if cls.all_contexts else None
103
+
104
+
105
+ def set_context(context: Context):
106
+ Context.all_contexts.append(context)
107
+
108
+
109
+ def get_context() -> Context:
110
+ return Context.current
@@ -17,6 +17,7 @@ from .executable import ExecutableTuple, _ExecuteAndFetchMixin
17
17
  from .objects import OBJECT_TYPE, Object, ObjectData
18
18
  from .output_types import (
19
19
  OutputType,
20
+ df_output_types,
20
21
  get_fetch_class,
21
22
  get_output_types,
22
23
  get_tileable_types,
@@ -129,13 +129,6 @@ class Entity(Serializable):
129
129
  def copy_from(self, obj):
130
130
  self.data = obj.data
131
131
 
132
- def tiles(self):
133
- from .tileables import handler
134
-
135
- new_entity = self.copy()
136
- new_entity.data = handler.tiles(self.data)
137
- return new_entity
138
-
139
132
  def __getattr__(self, attr):
140
133
  return getattr(self._data, attr)
141
134