maxframe 1.3.1__cp39-cp39-macosx_10_9_universal2.whl → 2.0.0__cp39-cp39-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-39-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-39-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-39-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-39-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.0.dist-info}/METADATA +4 -1
  632. maxframe-2.0.0.dist-info/RECORD +939 -0
  633. {maxframe-1.3.1.dist-info → maxframe-2.0.0.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.0.dist-info}/top_level.txt +0 -0
maxframe/utils.py CHANGED
@@ -15,6 +15,7 @@
15
15
  import asyncio.events
16
16
  import concurrent.futures
17
17
  import contextvars
18
+ import copy
18
19
  import dataclasses
19
20
  import datetime
20
21
  import enum
@@ -23,10 +24,12 @@ import importlib
23
24
  import inspect
24
25
  import io
25
26
  import itertools
27
+ import logging
26
28
  import numbers
27
29
  import os
28
30
  import pkgutil
29
31
  import random
32
+ import re
30
33
  import struct
31
34
  import sys
32
35
  import threading
@@ -88,6 +91,8 @@ get_user_call_point = get_user_call_point
88
91
  _is_ci = (os.environ.get("CI") or "0").lower() in ("1", "true")
89
92
  pd_release_version: Tuple[int] = parse_version(pd.__version__).release
90
93
 
94
+ logger = logging.getLogger(__name__)
95
+
91
96
  try:
92
97
  from pandas._libs import lib as _pd__libs_lib
93
98
  from pandas._libs.lib import NoDefault, no_default
@@ -162,8 +167,15 @@ class AttributeDict(dict):
162
167
 
163
168
 
164
169
  def on_serialize_shape(shape: Tuple[int]):
170
+ def _to_shape_num(x):
171
+ if np.isnan(x):
172
+ return -1
173
+ if isinstance(x, np.generic):
174
+ return x.item()
175
+ return x
176
+
165
177
  if shape:
166
- return tuple(s if not np.isnan(s) else -1 for s in shape)
178
+ return tuple(_to_shape_num(s) for s in shape)
167
179
  return shape
168
180
 
169
181
 
@@ -251,8 +263,14 @@ def copy_tileables(tileables: List[TileableType], **kwargs):
251
263
  return op.new_tileables(inputs, kws=kws, output_limit=len(kws))
252
264
 
253
265
 
254
- def get_dtype(dtype: Union[np.dtype, pd.api.extensions.ExtensionDtype]):
255
- if pd.api.types.is_extension_array_dtype(dtype):
266
+ def make_dtype(dtype: Union[np.dtype, pd.api.extensions.ExtensionDtype]):
267
+ if dtype is None:
268
+ return None
269
+ elif (
270
+ isinstance(dtype, str) and dtype == "category"
271
+ ) or pd.api.types.is_extension_array_dtype(dtype):
272
+ # return string dtype directly as legacy python version
273
+ # does not support ExtensionDtype
256
274
  return dtype
257
275
  elif dtype is pd.Timestamp or dtype is datetime.datetime:
258
276
  return np.dtype("datetime64[ns]")
@@ -262,6 +280,28 @@ def get_dtype(dtype: Union[np.dtype, pd.api.extensions.ExtensionDtype]):
262
280
  return np.dtype(dtype)
263
281
 
264
282
 
283
+ def make_dtypes(
284
+ dtypes: Union[
285
+ list, dict, str, np.dtype, pd.Series, pd.api.extensions.ExtensionDtype
286
+ ],
287
+ make_series: bool = True,
288
+ ):
289
+ if dtypes is None:
290
+ return None
291
+ elif isinstance(dtypes, np.dtype):
292
+ return dtypes
293
+ elif isinstance(dtypes, list):
294
+ val = [make_dtype(dt) for dt in dtypes]
295
+ return val if not make_series else pd.Series(val)
296
+ elif isinstance(dtypes, dict):
297
+ val = {k: make_dtype(v) for k, v in dtypes.items()}
298
+ return val if not make_series else pd.Series(val)
299
+ elif isinstance(dtypes, pd.Series):
300
+ return dtypes.map(make_dtype)
301
+ else:
302
+ return make_dtype(dtypes)
303
+
304
+
265
305
  def serialize_serializable(serializable, compress: bool = False):
266
306
  from .serialization import serialize
267
307
 
@@ -269,7 +309,14 @@ def serialize_serializable(serializable, compress: bool = False):
269
309
  header, buffers = serialize(serializable)
270
310
  buf_sizes = [getattr(buf, "nbytes", len(buf)) for buf in buffers]
271
311
  header[0]["buf_sizes"] = buf_sizes
272
- s_header = msgpack.dumps(header)
312
+
313
+ def encode_np_num(obj):
314
+ if isinstance(obj, np.generic) and obj.shape == () and not np.isnan(obj):
315
+ return obj.item()
316
+ return obj
317
+
318
+ s_header = msgpack.dumps(header, default=encode_np_num)
319
+
273
320
  bio.write(struct.pack("<Q", len(s_header)))
274
321
  bio.write(s_header)
275
322
  for buf in buffers:
@@ -377,6 +424,12 @@ def format_timeout_params(timeout: TimeoutType) -> str:
377
424
  return f"?wait=1&timeout={timeout}"
378
425
 
379
426
 
427
+ def unwrap_partial_function(func):
428
+ while isinstance(func, functools.partial):
429
+ func = func.func
430
+ return func
431
+
432
+
380
433
  _PrimitiveType = TypeVar("_PrimitiveType")
381
434
 
382
435
 
@@ -430,6 +483,7 @@ class ToThreadMixin:
430
483
  *args,
431
484
  wait_on_cancel: bool = False,
432
485
  timeout: float = None,
486
+ debug_task_name: Optional[str] = None,
433
487
  **kwargs,
434
488
  ) -> _ToThreadRetType:
435
489
  if not hasattr(self, "_pool"):
@@ -443,6 +497,31 @@ class ToThreadMixin:
443
497
  func_call = functools.partial(ctx.run, func, *args, **kwargs)
444
498
  fut = loop.run_in_executor(self._pool, func_call)
445
499
 
500
+ if loop.get_debug():
501
+ # create a task and mark its name
502
+ default_task_name = None
503
+ try:
504
+ unwrapped = unwrap_partial_function(func)
505
+ default_task_name = unwrapped.__qualname__
506
+ if getattr(unwrapped, "__module__", None):
507
+ default_task_name = unwrapped.__module__ + "#" + default_task_name
508
+ except: # noqa # pragma: no cover
509
+ try:
510
+ default_task_name = repr(func)
511
+ except: # noqa
512
+ pass
513
+ debug_task_name = debug_task_name or default_task_name
514
+
515
+ async def _wait_fut(aio_fut):
516
+ return await aio_fut
517
+
518
+ fut = asyncio.create_task(_wait_fut(fut))
519
+ if sys.version_info[:2] == (3, 7):
520
+ # In Python3.7 we should hack the task name to print it in debug logs.
521
+ setattr(fut, "fd_task_name", debug_task_name)
522
+ else:
523
+ fut.set_name(debug_task_name)
524
+
446
525
  try:
447
526
  coro = fut
448
527
  if wait_on_cancel:
@@ -547,6 +626,21 @@ def estimate_pandas_size(
547
626
  return sample_size * len(pd_obj) // max_samples
548
627
 
549
628
 
629
+ def estimate_table_size(odps_entry, full_table_name: str, partitions: List[str] = None):
630
+ try:
631
+ data_src = odps_entry.get_table(full_table_name)
632
+ if isinstance(partitions, str):
633
+ partitions = [partitions]
634
+ if not partitions:
635
+ size_mul = 1
636
+ else:
637
+ size_mul = len(partitions)
638
+ data_src = data_src.partitions[partitions[0]]
639
+ return size_mul * data_src.size
640
+ except:
641
+ return float("inf")
642
+
643
+
550
644
  class ModulePlaceholder:
551
645
  def __init__(self, mod_name: str):
552
646
  self._mod_name = mod_name
@@ -677,7 +771,7 @@ def _get_func_token_values(func):
677
771
  if hasattr(func, "__code__"):
678
772
  tokens = [func.__code__.co_code]
679
773
  if func.__closure__ is not None:
680
- cvars = tuple([x.cell_contents for x in func.__closure__])
774
+ cvars = tuple(x.cell_contents for x in func.__closure__)
681
775
  tokens.append(cvars)
682
776
  return tokens
683
777
  else:
@@ -799,7 +893,8 @@ def adapt_docstring(doc: str) -> str:
799
893
  line = line.replace("np.", "mt.").replace("pd.", "md.")
800
894
  elif prev_prompt:
801
895
  prev_prompt = False
802
- if sp:
896
+ if sp and lines[-1].strip().strip("."):
897
+ # need prev line contains chars other than dots
803
898
  lines[-1] += ".execute()"
804
899
  lines.append(line)
805
900
  return "\n".join(lines)
@@ -821,25 +916,101 @@ def stringify_path(path: Union[str, os.PathLike]) -> str:
821
916
 
822
917
  _memory_size_indices = {"": 0, "k": 1, "m": 2, "g": 3, "t": 4}
823
918
 
919
+ _size_pattern = re.compile(r"^([0-9.-]+)\s*([a-z]*)$")
920
+
824
921
 
825
922
  def parse_readable_size(value: Union[str, int, float]) -> Tuple[float, bool]:
923
+ """
924
+ Parse a human-readable size representation into a numeric value.
925
+
926
+ This function converts various size formats into their corresponding
927
+ float values. It supports:
928
+ - Raw numbers (e.g., 1024)
929
+ - Percentages (e.g., "50%")
930
+ - Size units (e.g., "10KB", "5.5GB", "2MiB")
931
+
932
+ The function recognizes standard binary prefixes (K, M, G, T, etc.) and
933
+ handles different suffix variations (B, iB, etc.).
934
+
935
+ Parameters
936
+ ----------
937
+ value : Union[str, int, float]
938
+ The size value to parse, can be a string, int, or float
939
+
940
+ Returns
941
+ -------
942
+ Tuple[float, bool]
943
+ A tuple of (parsed_value, is_percentage)
944
+ - parsed_value: The parsed numeric value
945
+ - is_percentage: True if the input was a percentage, False otherwise
946
+ """
826
947
  if isinstance(value, numbers.Number):
827
948
  return float(value), False
828
949
 
950
+ if not isinstance(value, str):
951
+ raise TypeError(f"Expected string or number, got {type(value).__name__}")
952
+
829
953
  value = value.strip().lower()
830
- num_pos = 0
831
- while num_pos < len(value) and value[num_pos] in "0123456789.-":
832
- num_pos += 1
833
954
 
834
- value, suffix = value[:num_pos], value[num_pos:]
835
- suffix = suffix.strip()
836
- if suffix.endswith("%"):
837
- return float(value) / 100, True
955
+ # Handle percentage values
956
+ if value.endswith("%"):
957
+ return float(value[:-1]) / 100, True
958
+
959
+ # Parse the value into numeric and unit parts
960
+ match = _size_pattern.match(value)
961
+ if not match:
962
+ raise ValueError(f"Cannot parse size value: {value}")
963
+
964
+ number_str, unit = match.groups()
965
+
966
+ # convert to float
967
+ number = float(number_str)
968
+
969
+ # if no unit, return the number
970
+ if not unit:
971
+ return number, False
972
+
973
+ # Validate the unit prefix
974
+ if unit[0] not in _memory_size_indices:
975
+ valid_prefixes = ", ".join(sorted(_memory_size_indices.keys()))
976
+ raise ValueError(
977
+ f"Unknown unit prefix: '{unit[0]}', valid prefixes are {valid_prefixes}"
978
+ )
838
979
 
980
+ # Check for valid unit suffix
981
+ if len(unit) > 1 and unit[1:] not in ("ib", "b", "i", ""):
982
+ raise ValueError(f"Invalid size unit suffix: {unit}")
983
+
984
+ is_binary_unit = "i" in unit.lower()
985
+ # calc the multiplier
986
+ base = 1024 if is_binary_unit else 1000
987
+ multiplier = base ** _memory_size_indices[unit[0]]
988
+
989
+ return number * multiplier, False
990
+
991
+
992
+ def parse_size_to_megabytes(
993
+ value: Union[str, int, float], default_number_unit: str = "GiB"
994
+ ) -> float:
839
995
  try:
840
- return float(value) * (1024 ** _memory_size_indices[suffix[:1]]), False
841
- except (ValueError, KeyError):
842
- raise ValueError(f"Unknown limitation value: {value}")
996
+ value = float(value)
997
+ except BaseException:
998
+ pass
999
+
1000
+ if isinstance(value, numbers.Number):
1001
+ if not default_number_unit:
1002
+ raise ValueError(
1003
+ "`default_number_unit` must be provided when give a number value"
1004
+ )
1005
+ return parse_size_to_megabytes(
1006
+ f"{value}{default_number_unit}", default_number_unit
1007
+ )
1008
+
1009
+ bytes_number, is_percentage = parse_readable_size(value)
1010
+ if is_percentage:
1011
+ raise ValueError("Percentage size is not supported to parse")
1012
+
1013
+ return bytes_number / (1024**2) # convert to megabytes
843
1014
 
844
1015
 
845
1016
  def remove_suffix(value: str, suffix: str) -> Tuple[str, bool]:
@@ -1133,7 +1304,7 @@ def sync_pyodps_options():
1133
1304
 
1134
1305
 
1135
1306
  def str_to_bool(s: Optional[str]) -> Optional[bool]:
1136
- return s.lower().strip() in ("true", "1") if s is not None else None
1307
+ return s.lower().strip() in ("true", "1") if isinstance(s, str) else s
1137
1308
 
1138
1309
 
1139
1310
  def is_empty(val):
@@ -1142,5 +1313,235 @@ def is_empty(val):
1142
1313
  return not bool(val)
1143
1314
 
1144
1315
 
1316
+ def extract_class_name(cls):
1317
+ return cls.__module__ + "#" + cls.__qualname__
1318
+
1319
+
1320
+ def flatten(nested_iterable: Union[List, Tuple]) -> List:
1321
+ """
1322
+ Flatten a nested iterable into a list.
1323
+
1324
+ Parameters
1325
+ ----------
1326
+ nested_iterable : list or tuple
1327
+ an iterable which can contain other iterables
1328
+
1329
+ Returns
1330
+ -------
1331
+ flattened : list
1332
+
1333
+ Examples
1334
+ --------
1335
+ >>> flatten([[0, 1], [2, 3]])
1336
+ [0, 1, 2, 3]
1337
+ >>> flatten([[0, 1], [[3], [4, 5]]])
1338
+ [0, 1, 3, 4, 5]
1339
+ """
1340
+
1341
+ flattened = []
1342
+ stack = list(nested_iterable)[::-1]
1343
+ while len(stack) > 0:
1344
+ inp = stack.pop()
1345
+ if isinstance(inp, (tuple, list)):
1346
+ stack.extend(inp[::-1])
1347
+ else:
1348
+ flattened.append(inp)
1349
+ return flattened
1350
+
1351
+
1352
+ def stack_back(flattened: List, raw: Union[List, Tuple]) -> Union[List, Tuple]:
1353
+ """
1354
+ Organize a new iterable from a flattened list according to raw iterable.
1355
+
1356
+ Parameters
1357
+ ----------
1358
+ flattened : list
1359
+ flattened list
1360
+ raw: list
1361
+ raw iterable
1362
+
1363
+ Returns
1364
+ -------
1365
+ ret : list
1366
+
1367
+ Examples
1368
+ --------
1369
+ >>> raw = [[0, 1], [2, [3, 4]]]
1370
+ >>> flattened = flatten(raw)
1371
+ >>> flattened
1372
+ [0, 1, 2, 3, 4]
1373
+ >>> a = [f + 1 for f in flattened]
1374
+ >>> a
1375
+ [1, 2, 3, 4, 5]
1376
+ >>> stack_back(a, raw)
1377
+ [[1, 2], [3, [4, 5]]]
1378
+ """
1379
+ flattened_iter = iter(flattened)
1380
+ result = list()
1381
+
1382
+ def _stack(container, items):
1383
+ for item in items:
1384
+ if not isinstance(item, (list, tuple)):
1385
+ container.append(next(flattened_iter))
1386
+ else:
1387
+ new_container = list()
1388
+ container.append(new_container)
1389
+ _stack(new_container, item)
1390
+
1391
+ return container
1392
+
1393
+ return _stack(result, raw)
1394
+
1395
+
1396
+ _RetryRetType = TypeVar("_RetryRetType")
1397
+
1398
+
1399
+ def call_with_retry(
1400
+ func: Callable[..., _RetryRetType],
1401
+ *args,
1402
+ retry_times: Optional[int] = None,
1403
+ retry_timeout: TimeoutType = None,
1404
+ delay: TimeoutType = None,
1405
+ reset_func: Optional[Callable] = None,
1406
+ exc_type: Union[
1407
+ Type[BaseException], Tuple[Type[BaseException], ...]
1408
+ ] = BaseException,
1409
+ allow_interrupt: bool = True,
1410
+ no_raise: bool = False,
1411
+ is_func_async: Optional[bool] = None,
1412
+ **kwargs,
1413
+ ) -> _RetryRetType:
1414
+ """
1415
+ Retry calling function given specified times or timeout.
1416
+
1417
+ Parameters
1418
+ ----------
1419
+ func: Callable
1420
+ function to be retried
1421
+ args
1422
+ arguments to be passed to the function
1423
+ retry_times: Optional[int]
1424
+ times to retry the function
1425
+ retry_timeout: TimeoutType
1426
+ timeout in seconds to retry the function
1427
+ delay: TimeoutType
1428
+ delay in seconds between every trial
1429
+ reset_func: Callable
1430
+ Function to call after every trial
1431
+ exc_type: Type[BaseException] | Tuple[Type[BaseException], ...]
1432
+ Exception type for retrial
1433
+ allow_interrupt: bool
1434
+ If True, KeyboardInterrupt will stop the retry
1435
+ no_raise: bool
1436
+ If True, no exception will be raised even if all trials failed
1437
+ is_func_async: bool
1438
+ If True, func will be treated as async
1439
+ kwargs
1440
+ keyword arguments to be passed to the function
1441
+
1442
+ Returns
1443
+ -------
1444
+ Return value of the original function
1445
+ """
1446
+ from .config import options
1447
+
1448
+ retry_num = 0
1449
+ retry_times = retry_times if retry_times is not None else options.retry_times
1450
+ delay = delay if delay is not None else options.retry_delay
1451
+ start_time = time.monotonic() if retry_timeout is not None else None
1452
+
1453
+ def raise_or_continue(exc: BaseException):
1454
+ nonlocal retry_num
1455
+ retry_num += 1
1456
+ if allow_interrupt and isinstance(exc, KeyboardInterrupt):
1457
+ raise exc from None
1458
+ if (retry_times is not None and retry_num > retry_times) or (
1459
+ retry_timeout is not None
1460
+ and start_time is not None
1461
+ and time.monotonic() - start_time > retry_timeout
1462
+ ):
1463
+ if no_raise:
1464
+ return sys.exc_info()
1465
+ raise exc from None
1466
+
1467
+ async def async_retry():
1468
+ while True:
1469
+ try:
1470
+ return await func(*args, **kwargs)
1471
+ except exc_type as ex:
1472
+ await asyncio.sleep(delay)
1473
+ res = raise_or_continue(ex)
1474
+ if res is not None:
1475
+ return res
1476
+
1477
+ if callable(reset_func):
1478
+ reset_res = reset_func()
1479
+ if asyncio.iscoroutine(reset_res):
1480
+ await reset_res
1481
+
1482
+ def sync_retry():
1483
+ while True:
1484
+ try:
1485
+ return func(*args, **kwargs)
1486
+ except exc_type as ex:
1487
+ time.sleep(delay)
1488
+ res = raise_or_continue(ex)
1489
+ if res is not None:
1490
+ return res
1491
+ if callable(reset_func):
1492
+ reset_func()
1493
+
1494
+ unwrap_func = func
1495
+ if is_func_async is None:
1496
+ # unwrap to get true result if func is async
1497
+ while isinstance(unwrap_func, functools.partial):
1498
+ unwrap_func = unwrap_func.func
1499
+
1500
+ if is_func_async or asyncio.iscoroutinefunction(unwrap_func):
1501
+ return async_retry()
1502
+ else:
1503
+ return sync_retry()
1504
+
1505
+
1506
+ def update_wlm_quota_settings(session_id: str, engine_settings: Dict[str, Any]):
1507
+ from .config import options
1508
+
1509
+ engine_quota = engine_settings.get("odps.task.wlm.quota", None)
1510
+ session_quota = options.session.quota_name or None
1511
+ if engine_quota != session_quota and engine_quota:
1512
+ logger.warning(
1513
+ "[Session=%s] Session quota (%s) is different to SubDag engine quota (%s)",
1514
+ session_id,
1515
+ session_quota,
1516
+ engine_quota,
1517
+ )
1518
+ raise ValueError(
1519
+ "Quota name cannot be changed after sessions are created, "
1520
+ f"session_quota={session_quota}, engine_quota={engine_quota}"
1521
+ )
1522
+
1523
+ if session_quota:
1524
+ engine_settings["odps.task.wlm.quota"] = session_quota
1525
+ elif "odps.task.wlm.quota" in engine_settings:
1526
+ engine_settings.pop("odps.task.wlm.quota")
1527
+
1528
+
1145
1529
  def get_default_table_properties():
1146
1530
  return {"storagestrategy": "archive"}
1531
+
1532
+
1533
+ def copy_if_possible(obj: Any, deep=False) -> Any:
1534
+ try:
1535
+ return copy.deepcopy(obj) if deep else copy.copy(obj)
1536
+ except: # pragma: no cover
1537
+ return obj
1538
+
1539
+
1540
+ def cache_tileables(*tileables):
1541
+ from .core import ENTITY_TYPE
1542
+
1543
+ if len(tileables) == 1 and isinstance(tileables[0], (tuple, list)):
1544
+ tileables = tileables[0]
1545
+ for t in tileables:
1546
+ if isinstance(t, ENTITY_TYPE):
1547
+ t.cache = True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maxframe
3
- Version: 1.3.1
3
+ Version: 2.0.0
4
4
  Summary: MaxFrame operator-based data analyze framework
5
5
  Requires-Dist: numpy<2.0.0,>=1.19.0
6
6
  Requires-Dist: pandas>=1.0.0
@@ -28,6 +28,8 @@ Requires-Dist: pytest-cov>=4.1.0; extra == "test"
28
28
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
29
29
  Requires-Dist: pytest-timeout>=2.1.0; extra == "test"
30
30
  Requires-Dist: matplotlib>=2.0.0; extra == "test"
31
+ Requires-Dist: lightgbm<4.0.0,>=3.0.0; extra == "test"
32
+ Requires-Dist: scikit-learn>=1.0; extra == "test"
31
33
  Requires-Dist: xgboost<3.0.0,>=1.4.0; extra == "test"
32
34
  Dynamic: description
33
35
 
@@ -104,3 +106,4 @@ License
104
106
 
105
107
  Licensed under the `Apache License
106
108
  2.0 <https://www.apache.org/licenses/LICENSE-2.0.html>`__.
109
+