maxframe 1.3.1__cp310-cp310-win32.whl → 2.0.0__cp310-cp310-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of maxframe might be problematic. Click here for more details.

Files changed (640) hide show
  1. maxframe/_utils.cp310-win32.pyd +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.cp310-win32.pyd +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.cp310-win32.pyd +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.cp310-win32.pyd +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
@@ -0,0 +1,204 @@
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 Dict, List, Optional
16
+
17
+ import pyarrow as pa
18
+ from odps import ODPS
19
+ from odps.types import Column, OdpsSchema, PartitionSpec
20
+
21
+ from ....config import options
22
+ from ....dataframe.datastore.to_odps import DataFrameToODPSTable
23
+ from ....io.odpsio import ODPSTableIO, pandas_to_arrow, pandas_to_odps_schema
24
+ from ....protocol import DataFrameTableMeta, ResultInfo
25
+ from ....typing_ import PandasObjectTypes
26
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
27
+
28
+
29
+ @register_op_adapter(DataFrameToODPSTable)
30
+ class DataFrameToODPSTableAdapter(SPEOperatorAdapter):
31
+ @classmethod
32
+ def _get_index_mapping(
33
+ cls,
34
+ index: bool,
35
+ index_label: Optional[List[str]],
36
+ input_meta: DataFrameTableMeta,
37
+ ) -> Dict[str, str]:
38
+ if not index:
39
+ return {}
40
+ labels = DataFrameToODPSTable.get_index_mapping(
41
+ index_label, input_meta.pd_index_level_names
42
+ )
43
+ return {
44
+ src_col: idx_col
45
+ for src_col, idx_col in zip(input_meta.table_index_column_names, labels)
46
+ }
47
+
48
+ @classmethod
49
+ def _get_result_schema(
50
+ cls,
51
+ partition_spec: Optional[str],
52
+ partition_columns: Optional[List[str]],
53
+ src_schema: OdpsSchema,
54
+ exclude_cols: List[str],
55
+ index_mappings: Dict[str, str],
56
+ ) -> OdpsSchema:
57
+ part_spec = (
58
+ PartitionSpec(partition_spec) if partition_spec is not None else None
59
+ )
60
+ exclude_col_set = set(exclude_cols or ())
61
+
62
+ parts = []
63
+ if part_spec is not None:
64
+ parts.extend(Column(k, "string") for k in part_spec.keys())
65
+ if partition_columns is not None:
66
+ part_column_set = set(partition_columns)
67
+ cols = [
68
+ col
69
+ for col in src_schema.columns
70
+ if col.name not in part_column_set and col.name not in exclude_col_set
71
+ ]
72
+ parts.extend(
73
+ col for col in src_schema.columns if col.name in part_column_set
74
+ )
75
+ else:
76
+ cols = [
77
+ col for col in src_schema.columns if col.name not in exclude_col_set
78
+ ]
79
+ odps_schema = OdpsSchema(cols, parts)
80
+
81
+ for col in odps_schema.columns:
82
+ col.name = index_mappings.get(col.name, col.name)
83
+ return odps_schema
84
+
85
+ @classmethod
86
+ def _check_table_schema(cls, table_schema: OdpsSchema, data_schema: OdpsSchema):
87
+ table_cols = [col.name for col in table_schema.simple_columns]
88
+ data_cols = [col.name for col in data_schema.simple_columns]
89
+ if set(table_cols) != set(data_cols):
90
+ raise ValueError(
91
+ f"Source and dest columns does not match: "
92
+ f"{sorted(data_cols)} does not equal to {sorted(table_cols)}"
93
+ )
94
+ table_part_cols = [col.name for col in table_schema.partitions]
95
+ data_part_cols = [col.name for col in data_schema.partitions]
96
+ if set(table_part_cols) != set(data_part_cols):
97
+ raise ValueError(
98
+ f"Source and dest partitions does not match: "
99
+ f"{sorted(data_part_cols)} does not equal to {sorted(table_part_cols)}"
100
+ )
101
+
102
+ @classmethod
103
+ def _write_as_table(
104
+ cls,
105
+ df_obj: PandasObjectTypes,
106
+ table_name: str,
107
+ partition_spec: Optional[str] = None,
108
+ partition_columns: Optional[List[str]] = None,
109
+ index: bool = True,
110
+ index_label: Optional[List[str]] = None,
111
+ overwrite: bool = True,
112
+ lifecycle: Optional[int] = None,
113
+ table_properties: Optional[Dict] = None,
114
+ ):
115
+ partition_spec = (
116
+ PartitionSpec(partition_spec) if partition_spec is not None else None
117
+ )
118
+ odps_schema, odps_meta = pandas_to_odps_schema(df_obj, unknown_as_string=True)
119
+ index_mapping = cls._get_index_mapping(index, index_label, odps_meta)
120
+ exclude_cols = [] if index else odps_meta.table_index_column_names
121
+ result_schema = cls._get_result_schema(
122
+ partition_spec, partition_columns, odps_schema, exclude_cols, index_mapping
123
+ )
124
+
125
+ odps_entry = ODPS.from_environments() or ODPS.from_global()
126
+ if not odps_entry.exist_table(table_name):
127
+ odps_entry.create_table(
128
+ table_name,
129
+ result_schema,
130
+ lifecycle=lifecycle,
131
+ table_properties=table_properties,
132
+ )
133
+ part_cols = [col.name for col in result_schema.partitions]
134
+ else:
135
+ table = odps_entry.get_table(table_name)
136
+ cls._check_table_schema(table.table_schema, result_schema)
137
+ result_schema = table.table_schema
138
+ part_cols = [col.name for col in table.table_schema.partitions]
139
+
140
+ part_and_group = []
141
+ if partition_columns is not None:
142
+ groupby_obj = df_obj.groupby(partition_columns)
143
+ for group in groupby_obj.groups:
144
+ group_data = groupby_obj.get_group(group)
145
+ group_data = group_data.loc[
146
+ :, ~group_data.columns.isin(partition_columns)
147
+ ]
148
+
149
+ group = (group,) if len(partition_columns) == 1 else group
150
+ part_dict = dict(zip(partition_columns, group))
151
+
152
+ part_dict.update(dict(partition_spec.items() if partition_spec else {}))
153
+ part_spec = ",".join(f"{col}={part_dict[col]}" for col in part_cols)
154
+ part_and_group.append((part_spec, group_data))
155
+ else:
156
+ part_and_group.append((partition_spec, df_obj))
157
+
158
+ for part, data in part_and_group:
159
+ if part is not None:
160
+ odps_entry.get_table(table_name).create_partition(
161
+ part, if_not_exists=True
162
+ )
163
+
164
+ with ODPSTableIO(odps_entry).open_writer(
165
+ table_name, part, overwrite=overwrite
166
+ ) as writer:
167
+ arrow_val, _ = pandas_to_arrow(data)
168
+ data_array_dict = dict(zip(arrow_val.column_names, arrow_val.columns))
169
+ cols, arrays = [], []
170
+ col_name_to_src_name = {v: k for k, v in index_mapping.items()}
171
+ for col in result_schema.simple_columns:
172
+ cols.append(col.name)
173
+ arrays.append(
174
+ data_array_dict[col_name_to_src_name.get(col.name, col.name)]
175
+ )
176
+ writer.write(pa.Table.from_arrays(arrays, cols))
177
+
178
+ def generate_code(
179
+ self, op: DataFrameToODPSTable, context: SPECodeContext
180
+ ) -> List[str]:
181
+ # to_odps_table should return None
182
+ context.put_tileable_result_info(op.outputs[0], ResultInfo())
183
+
184
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
185
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
186
+
187
+ context.register_import(__name__, from_item=type(self).__name__)
188
+
189
+ args = self._translate_call_args(
190
+ context,
191
+ op.table_name,
192
+ op.partition_spec,
193
+ op.partition_columns,
194
+ op.index,
195
+ op.index_label,
196
+ overwrite=op.overwrite,
197
+ lifecycle=op.lifecycle or options.session.table_lifecycle,
198
+ table_properties=op.table_properties,
199
+ )
200
+ return [
201
+ f"{type(self).__name__}._write_as_table("
202
+ f"{input_var_name}, {', '.join(args)})",
203
+ f"{res_var_name} = None",
204
+ ]
@@ -0,0 +1,63 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import List
16
+
17
+ from ....dataframe.extensions import DataFrameApplyChunk, DataFrameReshuffle
18
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
19
+
20
+
21
+ @register_op_adapter(DataFrameReshuffle)
22
+ class DataFrameReshuffleAdapter(SPEOperatorAdapter):
23
+ def generate_code(
24
+ self, op: DataFrameReshuffle, context: SPECodeContext
25
+ ) -> List[str]:
26
+ input_var = context.get_input_tileable_variable(op.inputs[0])
27
+ if not op.group_by:
28
+ kwargs = {}
29
+ if op.ignore_index:
30
+ kwargs["ignore_index"] = op.ignore_index
31
+ args = self._translate_call_args(context, frac=1, **kwargs)
32
+ shuffled = f"{input_var}.sample({', '.join(args)})"
33
+ else:
34
+ sort_keys = list(op.group_by) + list(op.sort_by or [])
35
+ kwargs = {"ascending": op.ascending}
36
+ if op.ignore_index:
37
+ kwargs["ignore_index"] = op.ignore_index
38
+ args = self._translate_call_args(context, sort_keys, **kwargs)
39
+ shuffled = f"{input_var}.sort_values({', '.join(args)})"
40
+ output_var = context.get_output_tileable_variable(op.outputs[0])
41
+ return [f"{output_var} = {shuffled}"]
42
+
43
+
44
+ @register_op_adapter(DataFrameApplyChunk)
45
+ class DataFrameApplyChunkAdapter(SPEOperatorAdapter):
46
+ def generate_code(
47
+ self, op: DataFrameApplyChunk, context: SPECodeContext
48
+ ) -> List[str]:
49
+ context.register_import("pandas", "pd")
50
+ input_var = context.get_input_tileable_variable(op.inputs[0])
51
+ output_var = context.get_output_tileable_variable(op.outputs[0])
52
+ func_var = self.translate_var(context, op.func)
53
+ if not op.batch_rows:
54
+ return [f"{output_var} = {func_var}({input_var})"]
55
+ else:
56
+ return [
57
+ f"{input_var}_batches = [{func_var}({input_var}.iloc[i : i + {op.batch_rows}]) "
58
+ f"for i in range(0, len({input_var}), {op.batch_rows})]",
59
+ f"if len({input_var}_batches) > 1:",
60
+ f" {output_var} = pd.concat({input_var}_batches)",
61
+ f"else:",
62
+ f" {output_var} = {input_var}_batches[0]",
63
+ ]
@@ -0,0 +1,26 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import List
16
+
17
+ from ....dataframe.fetch import DataFrameFetch
18
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
19
+
20
+
21
+ @register_op_adapter(DataFrameFetch)
22
+ class DataFrameFetchAdapter(SPEOperatorAdapter):
23
+ def generate_code(self, op: DataFrameFetch, context: SPECodeContext) -> List[str]:
24
+ # Simply register Fetch as SPE-executable.
25
+ # Actual codegen is done inside code generator itself.
26
+ return []
@@ -0,0 +1,224 @@
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 Any, Dict, List
16
+
17
+ import pandas as pd
18
+
19
+ from ....dataframe.groupby.aggregation import DataFrameGroupByAgg
20
+ from ....dataframe.groupby.apply import GroupByApply
21
+ from ....dataframe.groupby.apply_chunk import GroupByApplyChunk
22
+ from ....dataframe.groupby.core import DataFrameGroupByOp
23
+ from ....dataframe.groupby.cum import GroupByCumcount, GroupByCumReductionOperator
24
+ from ....dataframe.groupby.fill import GroupByFill
25
+ from ....dataframe.groupby.getitem import GroupByIndex
26
+ from ....dataframe.groupby.head import GroupByHead
27
+ from ....dataframe.groupby.sample import GroupBySample
28
+ from ....dataframe.groupby.transform import GroupByTransform
29
+ from ....dataframe.utils import make_column_list
30
+ from ....lib.version import parse as parse_version
31
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
32
+ from ..utils import build_method_call_adapter
33
+
34
+ _need_enforce_group_keys = parse_version(pd.__version__) < parse_version("1.5.0")
35
+
36
+
37
+ class SPEGroupByOperatorAdapter(SPEOperatorAdapter):
38
+ def build_groupby_call(
39
+ self, context: SPECodeContext, groupby_params: Dict[str, Any]
40
+ ) -> str:
41
+ groupby_params = {k: v for k, v in groupby_params.items() if v is not None}
42
+ selection = groupby_params.pop("selection", None)
43
+ by_args_list = self._translate_call_args(context, **groupby_params)
44
+ groupby_args = ", ".join(by_args_list)
45
+ groupby_call = f"groupby({groupby_args})"
46
+ if selection is not None:
47
+ sel_str = ", ".join(repr(s) for s in selection)
48
+ groupby_call += f"[[{sel_str}]]"
49
+ return groupby_call
50
+
51
+
52
+ @register_op_adapter(DataFrameGroupByAgg)
53
+ class DataFrameGroupByAggAdapter(SPEGroupByOperatorAdapter):
54
+ def generate_code(
55
+ self, op: DataFrameGroupByAgg, context: SPECodeContext
56
+ ) -> List[str]:
57
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
58
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
59
+
60
+ groupby_call = self.build_groupby_call(context, op.groupby_params)
61
+ agg_func_str = self.translate_var(context, op.raw_func)
62
+
63
+ return [f"{res_var_name} = {input_var_name}.{groupby_call}.agg({agg_func_str})"]
64
+
65
+
66
+ DataFrameGroupByOpAdapter = build_method_call_adapter(
67
+ DataFrameGroupByOp,
68
+ "groupby",
69
+ kw_keys=["by", "level", "as_index", "sort", "group_keys"],
70
+ )
71
+
72
+
73
+ @register_op_adapter(GroupByApply)
74
+ class GroupByApplyAdapter(SPEOperatorAdapter):
75
+ def generate_code(self, op: GroupByApply, context: SPECodeContext) -> List[str]:
76
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
77
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
78
+
79
+ args_list = self._translate_call_args(context, op.func, *op.args, **op.kwds)
80
+ args = ", ".join(args_list)
81
+ return [f"{res_var_name} = {input_var_name}.apply({args})"]
82
+
83
+
84
+ @register_op_adapter(GroupByApplyChunk)
85
+ class GroupByApplyChunkAdapter(SPEGroupByOperatorAdapter):
86
+ def generate_code(
87
+ self, op: GroupByApplyChunk, context: SPECodeContext
88
+ ) -> List[str]:
89
+ input_var = context.get_input_tileable_variable(op.inputs[0])
90
+ output_var = context.get_output_tileable_variable(op.outputs[0])
91
+ func_var = self.translate_var(context, op.func)
92
+
93
+ by_cols = make_column_list(op.groupby_params.get("by", []), op.inputs[0].dtypes)
94
+
95
+ need_group_keys = False
96
+ if isinstance(op.inputs[0].op, (GroupByIndex, DataFrameGroupByOp)):
97
+ input_obj_code = input_var
98
+ else:
99
+ assert op.groupby_params
100
+ groupby_params = (op.groupby_params or {}).copy()
101
+ if op.groupby_params.get("selection") is None:
102
+ by_col_set = set(by_cols)
103
+ sel = [
104
+ col for col in op.inputs[0].dtypes.index if col not in by_col_set
105
+ ]
106
+
107
+ if _need_enforce_group_keys and groupby_params.get("group_keys"):
108
+ need_group_keys = True
109
+ sel.extend(by_cols)
110
+
111
+ groupby_params["selection"] = sel
112
+ groupby_call = self.build_groupby_call(context, groupby_params)
113
+ input_obj_code = f"{input_var}.{groupby_call}"
114
+
115
+ args_list = self._translate_call_args(context, *op.args, **op.kwargs)
116
+ args = ", ".join(args_list)
117
+ if args:
118
+ args = f", {args}"
119
+
120
+ if not op.batch_rows:
121
+ lines = [f"{output_var} = {input_obj_code}.apply({func_var}{args})"]
122
+ else:
123
+ lines = [
124
+ f"def batch_apply_{input_var}(frame, *args, **kw):",
125
+ f" batches = [{func_var}(frame.iloc[i : i + {op.batch_rows}], *args, **kw) "
126
+ f" for i in range(0, len(frame), {op.batch_rows})]",
127
+ f" if len(batches) > 1:",
128
+ f" return pd.concat(batches)",
129
+ f" else:",
130
+ f" return batches[0]",
131
+ f"{output_var} = {input_obj_code}.apply(batch_apply_{input_var}{args})",
132
+ ]
133
+ if need_group_keys:
134
+ by_cols_str = ", ".join(repr(col) for col in by_cols)
135
+ lines.append(
136
+ f"{output_var} = {output_var}.set_index("
137
+ f"[{by_cols_str}, {output_var}.index])",
138
+ )
139
+ return lines
140
+
141
+
142
+ @register_op_adapter(GroupByCumReductionOperator)
143
+ class GroupByCumReductionAdapter(SPEOperatorAdapter):
144
+ def generate_code(
145
+ self, op: GroupByCumReductionOperator, context: SPECodeContext
146
+ ) -> List[str]:
147
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
148
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
149
+
150
+ if isinstance(op, GroupByCumcount):
151
+ kw_keys = ["ascending"]
152
+ else:
153
+ kw_keys = ["axis"]
154
+
155
+ args = self.generate_call_args_with_attributes(
156
+ op, context, kw_keys=kw_keys, skip_none=True
157
+ )
158
+ return [f"{res_var_name} = {input_var_name}.{op._func_name}({args})"]
159
+
160
+
161
+ @register_op_adapter(GroupByFill)
162
+ class GroupByFillOperatorAdapter(SPEOperatorAdapter):
163
+ def generate_code(self, op: GroupByFill, context: SPECodeContext) -> List[str]:
164
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
165
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
166
+
167
+ kw_keys = ["method", "axis", "limit", "downcast"]
168
+ if op._func_name == "fillna":
169
+ kw_args = ["value"]
170
+ else:
171
+ kw_args = []
172
+ args = self.generate_call_args_with_attributes(
173
+ op, context, *kw_args, kw_keys=kw_keys, skip_none=True
174
+ )
175
+ return [f"{res_var_name} = {input_var_name}.{op._func_name}({args})"]
176
+
177
+
178
+ @register_op_adapter(GroupByIndex)
179
+ class GroupByIndexAdapter(SPEOperatorAdapter):
180
+ def generate_code(self, op: GroupByIndex, context: SPECodeContext) -> List[str]:
181
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
182
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
183
+
184
+ selection = self.translate_var(context, op.selection)
185
+ return [f"{res_var_name} = {input_var_name}[{selection}]"]
186
+
187
+
188
+ @register_op_adapter(GroupByHead)
189
+ class GroupByHeadAdapter(SPEGroupByOperatorAdapter):
190
+ def generate_code(self, op: GroupByHead, context: SPECodeContext) -> List[str]:
191
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
192
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
193
+
194
+ groupby_call = self.build_groupby_call(context, op.groupby_params)
195
+ args = self.generate_call_args_with_attributes(op, context, "row_count")
196
+ return [f"{res_var_name} = {input_var_name}.{groupby_call}.head({args})"]
197
+
198
+
199
+ @register_op_adapter(GroupBySample)
200
+ class GroupBySampleAdapter(SPEGroupByOperatorAdapter):
201
+ def generate_code(self, op: GroupBySample, context: SPECodeContext) -> List[str]:
202
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
203
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
204
+
205
+ groupby_call = self.build_groupby_call(context, op.groupby_params)
206
+ args = self.generate_call_args_with_attributes(
207
+ op,
208
+ context,
209
+ size="n",
210
+ kw_keys=["frac", "replace", "weights"],
211
+ skip_none=True,
212
+ )
213
+ return [f"{res_var_name} = {input_var_name}.{groupby_call}.agg({args})"]
214
+
215
+
216
+ @register_op_adapter(GroupByTransform)
217
+ class GroupByTransformAdapter(SPEOperatorAdapter):
218
+ def generate_code(self, op: GroupByTransform, context: SPECodeContext) -> List[str]:
219
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
220
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
221
+
222
+ args_list = self._translate_call_args(context, op.func, *op.args, **op.kwds)
223
+ args = ", ".join(args_list)
224
+ return [f"{res_var_name} = {input_var_name}.transform({args})"]