maxframe 1.3.1__cp311-cp311-macosx_10_9_universal2.whl → 2.0.0b1__cp311-cp311-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 (639) hide show
  1. maxframe/_utils.cpython-311-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-311-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 +33 -3
  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 +33 -0
  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 +8 -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 +22 -48
  264. maxframe/learn/__init__.py +2 -2
  265. maxframe/learn/contrib/__init__.py +2 -2
  266. maxframe/learn/contrib/graph/connected_components.py +2 -1
  267. maxframe/learn/contrib/lightgbm/__init__.py +33 -0
  268. maxframe/learn/contrib/lightgbm/_predict.py +138 -0
  269. maxframe/learn/contrib/lightgbm/_train.py +163 -0
  270. maxframe/learn/contrib/lightgbm/callback.py +114 -0
  271. maxframe/learn/contrib/lightgbm/classifier.py +199 -0
  272. maxframe/learn/contrib/lightgbm/core.py +372 -0
  273. maxframe/learn/contrib/lightgbm/dataset.py +153 -0
  274. maxframe/learn/contrib/lightgbm/regressor.py +29 -0
  275. maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
  276. maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
  277. maxframe/learn/contrib/models.py +38 -9
  278. maxframe/learn/contrib/utils.py +55 -0
  279. maxframe/learn/contrib/xgboost/callback.py +86 -0
  280. maxframe/learn/contrib/xgboost/classifier.py +26 -30
  281. maxframe/learn/contrib/xgboost/core.py +53 -42
  282. maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
  283. maxframe/learn/contrib/xgboost/predict.py +16 -9
  284. maxframe/learn/contrib/xgboost/regressor.py +28 -27
  285. maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
  286. maxframe/learn/contrib/xgboost/train.py +59 -16
  287. maxframe/learn/core.py +252 -0
  288. maxframe/learn/datasets/__init__.py +20 -0
  289. maxframe/learn/datasets/samples_generator.py +628 -0
  290. maxframe/learn/linear_model/__init__.py +15 -0
  291. maxframe/learn/linear_model/_base.py +163 -0
  292. maxframe/learn/linear_model/_lin_reg.py +175 -0
  293. maxframe/learn/metrics/__init__.py +25 -0
  294. maxframe/learn/metrics/_check_targets.py +95 -0
  295. maxframe/learn/metrics/_classification.py +1121 -0
  296. maxframe/learn/metrics/_regression.py +256 -0
  297. maxframe/learn/model_selection/__init__.py +15 -0
  298. maxframe/learn/model_selection/_split.py +451 -0
  299. maxframe/learn/model_selection/tests/__init__.py +13 -0
  300. maxframe/learn/model_selection/tests/test_split.py +156 -0
  301. maxframe/learn/preprocessing/__init__.py +16 -0
  302. maxframe/learn/preprocessing/_data/__init__.py +17 -0
  303. maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
  304. maxframe/learn/preprocessing/_data/normalize.py +127 -0
  305. maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
  306. maxframe/learn/preprocessing/_data/utils.py +79 -0
  307. maxframe/learn/preprocessing/_label/__init__.py +16 -0
  308. maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
  309. maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
  310. maxframe/learn/utils/__init__.py +4 -0
  311. maxframe/learn/utils/_encode.py +314 -0
  312. maxframe/learn/utils/checks.py +161 -0
  313. maxframe/learn/utils/core.py +33 -0
  314. maxframe/learn/utils/extmath.py +176 -0
  315. maxframe/learn/utils/multiclass.py +292 -0
  316. maxframe/learn/utils/shuffle.py +114 -0
  317. maxframe/learn/utils/sparsefuncs.py +87 -0
  318. maxframe/learn/utils/validation.py +775 -0
  319. maxframe/lib/__init__.py +0 -2
  320. maxframe/lib/compat.py +145 -0
  321. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  322. maxframe/lib/mmh3.cpython-311-darwin.so +0 -0
  323. maxframe/lib/sparse/__init__.py +10 -15
  324. maxframe/lib/sparse/array.py +45 -33
  325. maxframe/lib/sparse/core.py +0 -2
  326. maxframe/lib/sparse/linalg.py +31 -0
  327. maxframe/lib/sparse/matrix.py +5 -2
  328. maxframe/lib/sparse/tests/__init__.py +0 -2
  329. maxframe/lib/sparse/tests/test_sparse.py +53 -53
  330. maxframe/lib/sparse/vector.py +0 -2
  331. maxframe/mixin.py +59 -2
  332. maxframe/opcodes.py +13 -5
  333. maxframe/protocol.py +67 -14
  334. maxframe/remote/core.py +16 -14
  335. maxframe/remote/run_script.py +6 -3
  336. maxframe/serialization/__init__.py +2 -0
  337. maxframe/serialization/core.cpython-311-darwin.so +0 -0
  338. maxframe/serialization/core.pxd +3 -0
  339. maxframe/serialization/core.pyi +3 -1
  340. maxframe/serialization/core.pyx +82 -4
  341. maxframe/serialization/pandas.py +5 -1
  342. maxframe/serialization/serializables/core.py +6 -5
  343. maxframe/serialization/serializables/field.py +2 -2
  344. maxframe/serialization/serializables/tests/test_field_type.py +3 -5
  345. maxframe/serialization/tests/test_serial.py +27 -0
  346. maxframe/session.py +4 -71
  347. maxframe/sperunner.py +165 -0
  348. maxframe/tensor/__init__.py +35 -2
  349. maxframe/tensor/arithmetic/__init__.py +2 -4
  350. maxframe/tensor/arithmetic/abs.py +0 -2
  351. maxframe/tensor/arithmetic/absolute.py +0 -2
  352. maxframe/tensor/arithmetic/add.py +34 -4
  353. maxframe/tensor/arithmetic/angle.py +0 -2
  354. maxframe/tensor/arithmetic/arccos.py +1 -4
  355. maxframe/tensor/arithmetic/arccosh.py +1 -3
  356. maxframe/tensor/arithmetic/arcsin.py +0 -2
  357. maxframe/tensor/arithmetic/arcsinh.py +0 -2
  358. maxframe/tensor/arithmetic/arctan.py +0 -2
  359. maxframe/tensor/arithmetic/arctan2.py +0 -2
  360. maxframe/tensor/arithmetic/arctanh.py +0 -2
  361. maxframe/tensor/arithmetic/around.py +0 -2
  362. maxframe/tensor/arithmetic/bitand.py +0 -2
  363. maxframe/tensor/arithmetic/bitor.py +1 -3
  364. maxframe/tensor/arithmetic/bitxor.py +1 -3
  365. maxframe/tensor/arithmetic/cbrt.py +0 -2
  366. maxframe/tensor/arithmetic/ceil.py +0 -2
  367. maxframe/tensor/arithmetic/clip.py +13 -13
  368. maxframe/tensor/arithmetic/conj.py +0 -2
  369. maxframe/tensor/arithmetic/copysign.py +0 -2
  370. maxframe/tensor/arithmetic/core.py +47 -39
  371. maxframe/tensor/arithmetic/cos.py +1 -3
  372. maxframe/tensor/arithmetic/cosh.py +0 -2
  373. maxframe/tensor/arithmetic/deg2rad.py +0 -2
  374. maxframe/tensor/arithmetic/degrees.py +0 -2
  375. maxframe/tensor/arithmetic/divide.py +0 -2
  376. maxframe/tensor/arithmetic/equal.py +0 -2
  377. maxframe/tensor/arithmetic/exp.py +1 -3
  378. maxframe/tensor/arithmetic/exp2.py +0 -2
  379. maxframe/tensor/arithmetic/expm1.py +0 -2
  380. maxframe/tensor/arithmetic/fabs.py +0 -2
  381. maxframe/tensor/arithmetic/fix.py +0 -2
  382. maxframe/tensor/arithmetic/float_power.py +0 -2
  383. maxframe/tensor/arithmetic/floor.py +0 -2
  384. maxframe/tensor/arithmetic/floordiv.py +0 -2
  385. maxframe/tensor/arithmetic/fmax.py +0 -2
  386. maxframe/tensor/arithmetic/fmin.py +0 -2
  387. maxframe/tensor/arithmetic/fmod.py +0 -2
  388. maxframe/tensor/arithmetic/frexp.py +6 -2
  389. maxframe/tensor/arithmetic/greater.py +0 -2
  390. maxframe/tensor/arithmetic/greater_equal.py +0 -2
  391. maxframe/tensor/arithmetic/hypot.py +0 -2
  392. maxframe/tensor/arithmetic/i0.py +1 -3
  393. maxframe/tensor/arithmetic/imag.py +0 -2
  394. maxframe/tensor/arithmetic/invert.py +1 -3
  395. maxframe/tensor/arithmetic/isclose.py +0 -2
  396. maxframe/tensor/arithmetic/iscomplex.py +0 -2
  397. maxframe/tensor/arithmetic/isfinite.py +1 -3
  398. maxframe/tensor/arithmetic/isinf.py +0 -2
  399. maxframe/tensor/arithmetic/isnan.py +0 -2
  400. maxframe/tensor/arithmetic/isreal.py +0 -2
  401. maxframe/tensor/arithmetic/ldexp.py +0 -2
  402. maxframe/tensor/arithmetic/less.py +0 -2
  403. maxframe/tensor/arithmetic/less_equal.py +0 -2
  404. maxframe/tensor/arithmetic/log.py +1 -3
  405. maxframe/tensor/arithmetic/log10.py +1 -3
  406. maxframe/tensor/arithmetic/log1p.py +1 -3
  407. maxframe/tensor/arithmetic/log2.py +1 -3
  408. maxframe/tensor/arithmetic/logaddexp.py +0 -2
  409. maxframe/tensor/arithmetic/logaddexp2.py +0 -2
  410. maxframe/tensor/arithmetic/logical_and.py +0 -2
  411. maxframe/tensor/arithmetic/logical_not.py +1 -3
  412. maxframe/tensor/arithmetic/logical_or.py +0 -2
  413. maxframe/tensor/arithmetic/logical_xor.py +0 -2
  414. maxframe/tensor/arithmetic/lshift.py +0 -2
  415. maxframe/tensor/arithmetic/maximum.py +0 -2
  416. maxframe/tensor/arithmetic/minimum.py +0 -2
  417. maxframe/tensor/arithmetic/mod.py +0 -2
  418. maxframe/tensor/arithmetic/modf.py +6 -2
  419. maxframe/tensor/arithmetic/multiply.py +37 -4
  420. maxframe/tensor/arithmetic/nan_to_num.py +0 -2
  421. maxframe/tensor/arithmetic/negative.py +0 -2
  422. maxframe/tensor/arithmetic/nextafter.py +0 -2
  423. maxframe/tensor/arithmetic/not_equal.py +0 -2
  424. maxframe/tensor/arithmetic/positive.py +0 -2
  425. maxframe/tensor/arithmetic/power.py +0 -2
  426. maxframe/tensor/arithmetic/rad2deg.py +0 -2
  427. maxframe/tensor/arithmetic/radians.py +0 -2
  428. maxframe/tensor/arithmetic/real.py +0 -2
  429. maxframe/tensor/arithmetic/reciprocal.py +5 -3
  430. maxframe/tensor/arithmetic/rint.py +1 -3
  431. maxframe/tensor/arithmetic/rshift.py +0 -2
  432. maxframe/tensor/arithmetic/setimag.py +0 -2
  433. maxframe/tensor/arithmetic/setreal.py +0 -2
  434. maxframe/tensor/arithmetic/sign.py +0 -2
  435. maxframe/tensor/arithmetic/signbit.py +0 -2
  436. maxframe/tensor/arithmetic/sin.py +0 -2
  437. maxframe/tensor/arithmetic/sinc.py +1 -3
  438. maxframe/tensor/arithmetic/sinh.py +0 -2
  439. maxframe/tensor/arithmetic/spacing.py +0 -2
  440. maxframe/tensor/arithmetic/sqrt.py +0 -2
  441. maxframe/tensor/arithmetic/square.py +0 -2
  442. maxframe/tensor/arithmetic/subtract.py +4 -2
  443. maxframe/tensor/arithmetic/tan.py +0 -2
  444. maxframe/tensor/arithmetic/tanh.py +0 -2
  445. maxframe/tensor/arithmetic/tests/__init__.py +0 -2
  446. maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
  447. maxframe/tensor/arithmetic/truediv.py +0 -2
  448. maxframe/tensor/arithmetic/trunc.py +0 -2
  449. maxframe/tensor/arithmetic/utils.py +32 -6
  450. maxframe/tensor/array_utils.py +3 -25
  451. maxframe/tensor/core.py +6 -6
  452. maxframe/tensor/datasource/__init__.py +10 -2
  453. maxframe/tensor/datasource/arange.py +0 -2
  454. maxframe/tensor/datasource/array.py +3 -22
  455. maxframe/tensor/datasource/core.py +15 -10
  456. maxframe/tensor/datasource/diag.py +140 -0
  457. maxframe/tensor/datasource/diagflat.py +69 -0
  458. maxframe/tensor/datasource/empty.py +0 -2
  459. maxframe/tensor/datasource/eye.py +95 -0
  460. maxframe/tensor/datasource/from_dataframe.py +0 -2
  461. maxframe/tensor/datasource/from_dense.py +0 -17
  462. maxframe/tensor/datasource/from_sparse.py +0 -2
  463. maxframe/tensor/datasource/full.py +0 -2
  464. maxframe/tensor/datasource/identity.py +54 -0
  465. maxframe/tensor/datasource/indices.py +115 -0
  466. maxframe/tensor/datasource/linspace.py +140 -0
  467. maxframe/tensor/datasource/meshgrid.py +135 -0
  468. maxframe/tensor/datasource/ones.py +8 -3
  469. maxframe/tensor/datasource/tests/test_datasource.py +32 -1
  470. maxframe/tensor/datasource/tri_array.py +107 -0
  471. maxframe/tensor/datasource/zeros.py +7 -3
  472. maxframe/tensor/extensions/__init__.py +31 -0
  473. maxframe/tensor/extensions/accessor.py +25 -0
  474. maxframe/tensor/extensions/apply_chunk.py +137 -0
  475. maxframe/tensor/indexing/__init__.py +1 -1
  476. maxframe/tensor/indexing/choose.py +8 -6
  477. maxframe/tensor/indexing/compress.py +0 -2
  478. maxframe/tensor/indexing/extract.py +0 -2
  479. maxframe/tensor/indexing/fill_diagonal.py +9 -6
  480. maxframe/tensor/indexing/flatnonzero.py +1 -3
  481. maxframe/tensor/indexing/getitem.py +10 -43
  482. maxframe/tensor/indexing/nonzero.py +2 -4
  483. maxframe/tensor/indexing/setitem.py +19 -9
  484. maxframe/tensor/indexing/slice.py +6 -3
  485. maxframe/tensor/indexing/take.py +0 -2
  486. maxframe/tensor/indexing/tests/__init__.py +0 -2
  487. maxframe/tensor/indexing/tests/test_indexing.py +0 -2
  488. maxframe/tensor/indexing/unravel_index.py +6 -6
  489. maxframe/tensor/lib/__init__.py +16 -0
  490. maxframe/tensor/lib/index_tricks.py +404 -0
  491. maxframe/tensor/linalg/__init__.py +36 -0
  492. maxframe/tensor/linalg/dot.py +145 -0
  493. maxframe/tensor/linalg/inner.py +36 -0
  494. maxframe/tensor/linalg/inv.py +83 -0
  495. maxframe/tensor/linalg/lu.py +115 -0
  496. maxframe/tensor/linalg/matmul.py +225 -0
  497. maxframe/tensor/linalg/qr.py +124 -0
  498. maxframe/tensor/linalg/solve_triangular.py +103 -0
  499. maxframe/tensor/linalg/svd.py +167 -0
  500. maxframe/tensor/linalg/tensordot.py +213 -0
  501. maxframe/tensor/linalg/vdot.py +73 -0
  502. maxframe/tensor/merge/__init__.py +4 -0
  503. maxframe/tensor/merge/append.py +74 -0
  504. maxframe/tensor/merge/column_stack.py +63 -0
  505. maxframe/tensor/merge/concatenate.py +3 -2
  506. maxframe/tensor/merge/dstack.py +71 -0
  507. maxframe/tensor/merge/hstack.py +70 -0
  508. maxframe/tensor/merge/stack.py +0 -2
  509. maxframe/tensor/merge/tests/test_merge.py +0 -2
  510. maxframe/tensor/misc/__init__.py +18 -5
  511. maxframe/tensor/misc/astype.py +10 -8
  512. maxframe/tensor/misc/broadcast_to.py +1 -1
  513. maxframe/tensor/misc/copy.py +64 -0
  514. maxframe/tensor/misc/diff.py +115 -0
  515. maxframe/tensor/misc/flatten.py +63 -0
  516. maxframe/tensor/misc/in1d.py +94 -0
  517. maxframe/tensor/misc/isin.py +130 -0
  518. maxframe/tensor/misc/ndim.py +53 -0
  519. maxframe/tensor/misc/ravel.py +0 -2
  520. maxframe/tensor/misc/repeat.py +129 -0
  521. maxframe/tensor/misc/searchsorted.py +147 -0
  522. maxframe/tensor/misc/setdiff1d.py +58 -0
  523. maxframe/tensor/misc/squeeze.py +117 -0
  524. maxframe/tensor/misc/swapaxes.py +113 -0
  525. maxframe/tensor/misc/tests/test_misc.py +0 -2
  526. maxframe/tensor/misc/transpose.py +8 -4
  527. maxframe/tensor/misc/trapezoid.py +123 -0
  528. maxframe/tensor/misc/unique.py +0 -1
  529. maxframe/tensor/misc/where.py +10 -8
  530. maxframe/tensor/operators.py +0 -34
  531. maxframe/tensor/random/__init__.py +3 -5
  532. maxframe/tensor/random/binomial.py +0 -2
  533. maxframe/tensor/random/bytes.py +0 -2
  534. maxframe/tensor/random/chisquare.py +0 -2
  535. maxframe/tensor/random/choice.py +9 -8
  536. maxframe/tensor/random/core.py +20 -5
  537. maxframe/tensor/random/dirichlet.py +0 -2
  538. maxframe/tensor/random/exponential.py +0 -2
  539. maxframe/tensor/random/f.py +2 -4
  540. maxframe/tensor/random/gamma.py +0 -2
  541. maxframe/tensor/random/geometric.py +0 -2
  542. maxframe/tensor/random/gumbel.py +0 -2
  543. maxframe/tensor/random/hypergeometric.py +0 -2
  544. maxframe/tensor/random/laplace.py +2 -4
  545. maxframe/tensor/random/logistic.py +0 -2
  546. maxframe/tensor/random/lognormal.py +0 -2
  547. maxframe/tensor/random/logseries.py +0 -2
  548. maxframe/tensor/random/multinomial.py +0 -2
  549. maxframe/tensor/random/multivariate_normal.py +0 -2
  550. maxframe/tensor/random/negative_binomial.py +0 -2
  551. maxframe/tensor/random/noncentral_chisquare.py +0 -2
  552. maxframe/tensor/random/noncentral_f.py +1 -3
  553. maxframe/tensor/random/normal.py +0 -2
  554. maxframe/tensor/random/pareto.py +0 -2
  555. maxframe/tensor/random/permutation.py +6 -3
  556. maxframe/tensor/random/poisson.py +0 -2
  557. maxframe/tensor/random/power.py +0 -2
  558. maxframe/tensor/random/rand.py +0 -2
  559. maxframe/tensor/random/randint.py +0 -2
  560. maxframe/tensor/random/randn.py +0 -2
  561. maxframe/tensor/random/random_integers.py +0 -2
  562. maxframe/tensor/random/random_sample.py +0 -2
  563. maxframe/tensor/random/rayleigh.py +0 -2
  564. maxframe/tensor/random/standard_cauchy.py +0 -2
  565. maxframe/tensor/random/standard_exponential.py +0 -2
  566. maxframe/tensor/random/standard_gamma.py +0 -2
  567. maxframe/tensor/random/standard_normal.py +0 -2
  568. maxframe/tensor/random/standard_t.py +0 -2
  569. maxframe/tensor/random/tests/__init__.py +0 -2
  570. maxframe/tensor/random/tests/test_random.py +0 -2
  571. maxframe/tensor/random/triangular.py +0 -2
  572. maxframe/tensor/random/uniform.py +0 -2
  573. maxframe/tensor/random/vonmises.py +0 -2
  574. maxframe/tensor/random/wald.py +0 -2
  575. maxframe/tensor/random/weibull.py +0 -2
  576. maxframe/tensor/random/zipf.py +0 -2
  577. maxframe/tensor/reduction/__init__.py +0 -2
  578. maxframe/tensor/reduction/all.py +0 -2
  579. maxframe/tensor/reduction/allclose.py +0 -2
  580. maxframe/tensor/reduction/any.py +0 -2
  581. maxframe/tensor/reduction/argmax.py +1 -3
  582. maxframe/tensor/reduction/argmin.py +1 -3
  583. maxframe/tensor/reduction/array_equal.py +0 -2
  584. maxframe/tensor/reduction/core.py +0 -2
  585. maxframe/tensor/reduction/count_nonzero.py +0 -2
  586. maxframe/tensor/reduction/cumprod.py +0 -2
  587. maxframe/tensor/reduction/cumsum.py +0 -2
  588. maxframe/tensor/reduction/max.py +0 -2
  589. maxframe/tensor/reduction/mean.py +0 -2
  590. maxframe/tensor/reduction/min.py +0 -2
  591. maxframe/tensor/reduction/nanargmax.py +0 -2
  592. maxframe/tensor/reduction/nanargmin.py +0 -2
  593. maxframe/tensor/reduction/nancumprod.py +0 -2
  594. maxframe/tensor/reduction/nancumsum.py +0 -2
  595. maxframe/tensor/reduction/nanmax.py +0 -2
  596. maxframe/tensor/reduction/nanmean.py +0 -2
  597. maxframe/tensor/reduction/nanmin.py +0 -2
  598. maxframe/tensor/reduction/nanprod.py +0 -2
  599. maxframe/tensor/reduction/nanstd.py +0 -2
  600. maxframe/tensor/reduction/nansum.py +0 -2
  601. maxframe/tensor/reduction/nanvar.py +0 -2
  602. maxframe/tensor/reduction/prod.py +0 -2
  603. maxframe/tensor/reduction/std.py +0 -2
  604. maxframe/tensor/reduction/sum.py +0 -2
  605. maxframe/tensor/reduction/tests/test_reduction.py +1 -4
  606. maxframe/tensor/reduction/var.py +0 -2
  607. maxframe/tensor/reshape/__init__.py +0 -2
  608. maxframe/tensor/reshape/reshape.py +6 -5
  609. maxframe/tensor/reshape/tests/__init__.py +0 -2
  610. maxframe/tensor/reshape/tests/test_reshape.py +0 -2
  611. maxframe/tensor/sort/__init__.py +16 -0
  612. maxframe/tensor/sort/argsort.py +150 -0
  613. maxframe/tensor/sort/sort.py +295 -0
  614. maxframe/tensor/special/__init__.py +37 -0
  615. maxframe/tensor/special/core.py +38 -0
  616. maxframe/tensor/special/misc.py +142 -0
  617. maxframe/tensor/special/statistical.py +56 -0
  618. maxframe/tensor/statistics/__init__.py +5 -0
  619. maxframe/tensor/statistics/average.py +143 -0
  620. maxframe/tensor/statistics/bincount.py +133 -0
  621. maxframe/tensor/statistics/quantile.py +10 -8
  622. maxframe/tensor/ufunc/__init__.py +0 -2
  623. maxframe/tensor/ufunc/ufunc.py +0 -2
  624. maxframe/tensor/utils.py +21 -3
  625. maxframe/tests/test_protocol.py +3 -3
  626. maxframe/tests/test_utils.py +210 -1
  627. maxframe/tests/utils.py +67 -1
  628. maxframe/udf.py +76 -6
  629. maxframe/utils.py +418 -17
  630. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/METADATA +4 -1
  631. maxframe-2.0.0b1.dist-info/RECORD +939 -0
  632. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/WHEEL +1 -1
  633. maxframe_client/clients/framedriver.py +19 -3
  634. maxframe_client/fetcher.py +113 -6
  635. maxframe_client/session/odps.py +173 -38
  636. maxframe_client/session/task.py +3 -1
  637. maxframe_client/tests/test_session.py +41 -5
  638. maxframe-1.3.1.dist-info/RECORD +0 -705
  639. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,238 @@
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.core import DATAFRAME_TYPE, INDEX_TYPE
18
+ from ....dataframe.indexing.align import DataFrameAlign
19
+ from ....dataframe.indexing.getitem import DataFrameIndex, SeriesIndex
20
+ from ....dataframe.indexing.iloc import DataFrameIlocGetItem, SeriesIlocGetItem
21
+ from ....dataframe.indexing.insert import DataFrameInsert
22
+ from ....dataframe.indexing.reindex import DataFrameReindex
23
+ from ....dataframe.indexing.rename import DataFrameRename
24
+ from ....dataframe.indexing.reset_index import DataFrameResetIndex
25
+ from ....dataframe.indexing.sample import DataFrameSample
26
+ from ....dataframe.indexing.set_axis import DataFrameSetAxis
27
+ from ....dataframe.indexing.set_index import DataFrameSetIndex
28
+ from ....dataframe.indexing.setitem import DataFrameSetitem
29
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
30
+ from ..utils import build_method_call_adapter
31
+
32
+
33
+ @register_op_adapter(DataFrameAlign)
34
+ class DataFrameAlignAdapter(SPEOperatorAdapter):
35
+ def generate_code(self, op: DataFrameAlign, context: SPECodeContext) -> List[str]:
36
+ input_var = context.get_input_tileable_variable(op.inputs[0])
37
+ out_lhs_var = context.get_output_tileable_variable(op.outputs[0])
38
+ out_rhs_var = context.get_output_tileable_variable(op.outputs[1])
39
+ kw_keys = [
40
+ "join",
41
+ "axis",
42
+ "level",
43
+ "fill_value",
44
+ "method",
45
+ "limit",
46
+ "fill_axis",
47
+ "broadcast_axis",
48
+ ]
49
+ args_str = self.generate_call_args_with_attributes(
50
+ op, context, "rhs", skip_none=True, kw_keys=kw_keys
51
+ )
52
+ return [f"{out_lhs_var}, {out_rhs_var} = {input_var}.align({args_str})"]
53
+
54
+
55
+ DataFrameInsertAdapter = build_method_call_adapter(
56
+ DataFrameInsert, "insert", kw_keys=["loc", "column", "value"], allow_duplicates=None
57
+ )
58
+
59
+
60
+ @register_op_adapter(SeriesIndex)
61
+ class SeriesIndexAdapter(SPEOperatorAdapter):
62
+ def generate_code(self, op: SeriesIndex, context: SPECodeContext) -> List[str]:
63
+ args = self._translate_call_args(context, op.labels)
64
+ input_var = context.get_input_tileable_variable(op.inputs[0])
65
+ output_var = context.get_output_tileable_variable(op.outputs[0])
66
+ return [f"{output_var} = {input_var}[{', '.join(args)}]"]
67
+
68
+
69
+ @register_op_adapter(DataFrameIndex)
70
+ class DataFrameIndexAdapter(SPEOperatorAdapter):
71
+ def generate_code(self, op: DataFrameIndex, context: SPECodeContext) -> List[str]:
72
+ input_var = context.get_input_tileable_variable(op.inputs[0])
73
+ if op.col_names is not None:
74
+ args = ", ".join(self._translate_call_args(context, op.col_names))
75
+ else:
76
+ args = context.get_input_tileable_variable(op.mask)
77
+ output_var = context.get_output_tileable_variable(op.outputs[0])
78
+ return [f"{output_var} = {input_var}[{args}]"]
79
+
80
+
81
+ @register_op_adapter(DataFrameRename)
82
+ class DataFrameRenameAdapter(SPEOperatorAdapter):
83
+ def generate_code(self, op: DataFrameRename, context: SPECodeContext) -> List[str]:
84
+ input_var = context.get_input_tileable_variable(op.inputs[0])
85
+ output_var = context.get_output_tileable_variable(op.outputs[0])
86
+
87
+ if isinstance(op.outputs[0], INDEX_TYPE):
88
+ func_name = "set_names"
89
+ arg_list = [self.translate_var(context, op.index_mapper)]
90
+ arg_dict = {"level": self.translate_var(context, op.level)}
91
+ else:
92
+ func_name = "rename"
93
+ new_name_var = self.translate_var(context, op.new_name)
94
+ arg_list = []
95
+ arg_dict = {
96
+ "columns": self.translate_var(context, op.columns_mapper),
97
+ "index": self.translate_var(context, op.index_mapper),
98
+ "level": self.translate_var(context, op.level),
99
+ "errors": self.translate_var(context, op.errors),
100
+ }
101
+ if (
102
+ not isinstance(op.outputs[0], DATAFRAME_TYPE)
103
+ and op.new_name is not None
104
+ ):
105
+ arg_dict["index"] = new_name_var
106
+
107
+ arg_list += [f"{k}={v}" for k, v in arg_dict.items() if v != "None"]
108
+ arg_str = ", ".join(arg_list)
109
+ return [f"{output_var} = {input_var}.{func_name}({arg_str})"]
110
+
111
+
112
+ @register_op_adapter(DataFrameSetAxis)
113
+ class DataFrameSetAxisAdapter(SPEOperatorAdapter):
114
+ def generate_code(self, op: DataFrameSetAxis, context: SPECodeContext) -> List[str]:
115
+ input_var = context.get_input_tileable_variable(op.input)
116
+ value_var = self.translate_var(context, op.value)
117
+ axis = self.translate_var(context, op.axis)
118
+ output_var = context.get_output_tileable_variable(op.outputs[0])
119
+ return [
120
+ f"{output_var} = {input_var}.set_axis({value_var}, axis={axis})",
121
+ ]
122
+
123
+
124
+ @register_op_adapter(DataFrameSetitem)
125
+ class DataFrameSetitemAdapter(SPEOperatorAdapter):
126
+ def generate_code(self, op: DataFrameSetitem, context: SPECodeContext) -> List[str]:
127
+ target_var = context.get_input_tileable_variable(op.target)
128
+ source_var = self.translate_var(context, op.value)
129
+ output_var = context.get_output_tileable_variable(op.outputs[0])
130
+ indexes = self.translate_var(context, op.indexes)
131
+ return [
132
+ f"{target_var}[{indexes}] = {source_var}",
133
+ f"{output_var} = {target_var}",
134
+ ]
135
+
136
+
137
+ @register_op_adapter([SeriesIlocGetItem, DataFrameIlocGetItem])
138
+ class DataFrameIlocGetItemAdapter(SPEOperatorAdapter):
139
+ def generate_code(
140
+ self, op: SeriesIlocGetItem, context: SPECodeContext
141
+ ) -> List[str]:
142
+ input_var = context.get_input_tileable_variable(op.inputs[0])
143
+ output_var = context.get_output_tileable_variable(op.outputs[0])
144
+ row_exp = self.translate_var(context, op.indexes[0])
145
+ col_exp = ""
146
+ if len(op.indexes) > 1:
147
+ col_exp = f", {self.translate_var(context, op.indexes[1])}"
148
+ return [f"{output_var} = {input_var}.iloc[{row_exp}{col_exp}]"]
149
+
150
+
151
+ @register_op_adapter(DataFrameSample)
152
+ class DataFrameSampleAdapter(SPEOperatorAdapter):
153
+ def generate_code(self, op: DataFrameSample, context: SPECodeContext) -> List[str]:
154
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
155
+ kwargs = {
156
+ "n": op.size,
157
+ "frac": op.frac,
158
+ "replace": op.replace,
159
+ "weights": op.weights,
160
+ "axis": op.axis,
161
+ }
162
+ codes = list()
163
+ context.register_import("numpy", "np")
164
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
165
+ args_str = ", ".join(self._translate_call_args(context, **kwargs))
166
+ if op.random_state is not None:
167
+ rs_var = f"{res_var_name}_rs"
168
+ codes.append(f"{rs_var} = np.random.RandomState()")
169
+ rs_param = self.translate_var(context, op.random_state.get_state())
170
+ codes.append(f"{rs_var}.set_state({rs_param})")
171
+ args_str += f", random_state={rs_var}"
172
+ codes.append(f"{res_var_name} = {input_var_name}.sample({args_str})")
173
+ return codes
174
+
175
+
176
+ @register_op_adapter(DataFrameResetIndex)
177
+ class DataFrameResetIndexAdapter(SPEOperatorAdapter):
178
+ def generate_code(
179
+ self, op: DataFrameResetIndex, context: SPECodeContext
180
+ ) -> List[str]:
181
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
182
+
183
+ kwargs = {"level": op.level, "drop": op.drop, "inplace": False}
184
+
185
+ if isinstance(op.inputs[0], DATAFRAME_TYPE):
186
+ kwargs.update(
187
+ {
188
+ "col_level": op.col_level,
189
+ "col_fill": op.col_fill,
190
+ }
191
+ )
192
+ else:
193
+ kwargs.update(
194
+ {
195
+ "name": op.name,
196
+ }
197
+ )
198
+
199
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
200
+ args_str = ", ".join(self._translate_call_args(context, **kwargs))
201
+
202
+ return [f"{res_var_name} = {input_var_name}.reset_index({args_str})"]
203
+
204
+
205
+ @register_op_adapter(DataFrameSetIndex)
206
+ class DataFrameSetIndexAdapter(SPEOperatorAdapter):
207
+ def generate_code(
208
+ self, op: DataFrameSetIndex, context: SPECodeContext
209
+ ) -> List[str]:
210
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
211
+
212
+ kwargs = {
213
+ "keys": op.keys,
214
+ "drop": op.drop,
215
+ "append": op.append,
216
+ "inplace": False,
217
+ "verify_integrity": op.verify_integrity,
218
+ }
219
+
220
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
221
+ args_str = ", ".join(self._translate_call_args(context, **kwargs))
222
+
223
+ return [f"{res_var_name} = {input_var_name}.set_index({args_str})"]
224
+
225
+
226
+ DataFrameReindexAdapter = build_method_call_adapter(
227
+ DataFrameReindex,
228
+ "reindex",
229
+ skip_none=True,
230
+ kw_keys=[
231
+ "index",
232
+ "columns",
233
+ "method",
234
+ "level",
235
+ "fill_value",
236
+ "limit",
237
+ ],
238
+ )
@@ -0,0 +1,73 @@
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.merge import DataFrameConcat, DataFrameMerge
18
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
19
+
20
+
21
+ @register_op_adapter(DataFrameMerge)
22
+ class DataFrameMergeAdapter(SPEOperatorAdapter):
23
+ def generate_code(self, op: DataFrameMerge, context: SPECodeContext) -> List[str]:
24
+ left_var = context.get_input_tileable_variable(op.inputs[0])
25
+ right_var = context.get_input_tileable_variable(op.inputs[1])
26
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
27
+ kwargs = {"how": op.how}
28
+ if op.how != "cross":
29
+ if op.on is not None:
30
+ kwargs["on"] = op.on
31
+ else:
32
+ if op.left_index:
33
+ kwargs["left_index"] = True
34
+ else:
35
+ kwargs["left_on"] = op.left_on
36
+
37
+ if op.right_index:
38
+ kwargs["right_index"] = True
39
+ else:
40
+ kwargs["right_on"] = op.right_on
41
+ kwargs["sort"] = op.sort
42
+ kwargs["suffixes"] = op.suffixes
43
+ kwargs["indicator"] = op.indicator
44
+ kwargs["validate"] = op.validate
45
+ kwargs["copy"] = op.copy_
46
+ args = ", ".join(self._translate_call_args(context, **kwargs))
47
+ context.register_import("pandas", "pd")
48
+ return [f"{res_var_name} = pd.merge({left_var}, {right_var}, {args})"]
49
+
50
+
51
+ @register_op_adapter(DataFrameConcat)
52
+ class DataFrameConcatAdapter(SPEOperatorAdapter):
53
+ def generate_code(self, op: DataFrameConcat, context: SPECodeContext) -> List[str]:
54
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
55
+ kw_keys = [
56
+ "axis",
57
+ "join",
58
+ "ignore_index",
59
+ "keys",
60
+ "levels",
61
+ "names",
62
+ "verify_integrity",
63
+ "sort",
64
+ ]
65
+ args = self.generate_call_args_with_attributes(
66
+ op,
67
+ context,
68
+ kw_keys=kw_keys,
69
+ inputs="objs",
70
+ copy_="copy",
71
+ )
72
+ context.register_import("pandas", "pd")
73
+ return [f"{res_var_name} = pd.concat({args})"]
@@ -0,0 +1,286 @@
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, List
16
+
17
+ from ....dataframe.core import DATAFRAME_TYPE, SERIES_TYPE, TILEABLE_TYPE
18
+ from ....dataframe.misc.apply import DataFrameApply
19
+ from ....dataframe.misc.astype import DataFrameAstype
20
+ from ....dataframe.misc.case_when import DataFrameCaseWhen
21
+ from ....dataframe.misc.check_monotonic import DataFrameCheckMonotonic
22
+ from ....dataframe.misc.cut import DataFrameCut
23
+ from ....dataframe.misc.describe import DataFrameDescribe
24
+ from ....dataframe.misc.diff import DataFrameDiff
25
+ from ....dataframe.misc.drop import DataFrameDrop
26
+ from ....dataframe.misc.drop_duplicates import DataFrameDropDuplicates
27
+ from ....dataframe.misc.duplicated import DataFrameDuplicated
28
+ from ....dataframe.misc.eval import DataFrameEval
29
+ from ....dataframe.misc.explode import DataFrameExplode
30
+ from ....dataframe.misc.get_dummies import DataFrameGetDummies
31
+ from ....dataframe.misc.isin import DataFrameIsin
32
+ from ....dataframe.misc.map import DataFrameMap
33
+ from ....dataframe.misc.melt import DataFrameMelt
34
+ from ....dataframe.misc.memory_usage import DataFrameMemoryUsage
35
+ from ....dataframe.misc.pivot import DataFramePivot
36
+ from ....dataframe.misc.pivot_table import DataFramePivotTable
37
+ from ....dataframe.misc.shift import DataFrameShift
38
+ from ....dataframe.misc.stack import DataFrameStack
39
+ from ....dataframe.misc.to_numeric import DataFrameToNumeric
40
+ from ....dataframe.misc.transform import TransformOperator
41
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
42
+ from ..utils import build_method_call_adapter
43
+
44
+ DataFrameAstypeAdapter = build_method_call_adapter(
45
+ DataFrameAstype, "astype", "dtype_values"
46
+ )
47
+
48
+
49
+ @register_op_adapter(DataFrameCheckMonotonic)
50
+ class DataFrameCheckMonotonicAdapter(SPEOperatorAdapter):
51
+ def generate_code(
52
+ self, op: DataFrameCheckMonotonic, context: SPECodeContext
53
+ ) -> List[str]:
54
+ inst_var_name = context.get_input_tileable_variable(op.inputs[0])
55
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
56
+ if op.decreasing:
57
+ prop = "is_monotonic_decreasing"
58
+ else:
59
+ prop = "is_monotonic_increasing"
60
+ return [f"{res_var_name} = {inst_var_name}.{prop}"]
61
+
62
+
63
+ @register_op_adapter(DataFrameCut)
64
+ class DataFrameCutAdapter(SPEOperatorAdapter):
65
+ def generate_code(self, op: DataFrameCut, context: SPECodeContext) -> List[str]:
66
+ """ """
67
+ context.register_import("pandas", "pd")
68
+
69
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
70
+ kw_keys = [
71
+ "skip_none",
72
+ "right",
73
+ "labels",
74
+ "retbins",
75
+ "precision",
76
+ "include_lowest",
77
+ "duplicates",
78
+ "ordered",
79
+ ]
80
+ args = self.generate_call_args_with_attributes(
81
+ op, context, "_input", "bins", kw_keys=kw_keys
82
+ )
83
+ return [f"{res_var_name} = pd.cut({args})"]
84
+
85
+
86
+ DataFrameDescribeAdapter = build_method_call_adapter(
87
+ DataFrameDescribe, "describe", kw_keys=["percentiles", "include", "exclude"]
88
+ )
89
+ DataFrameDiffAdapter = build_method_call_adapter(
90
+ DataFrameDiff, "diff", kw_keys=["periods", "axis"]
91
+ )
92
+ DataFrameDuplicatedAdapter = build_method_call_adapter(
93
+ DataFrameDuplicated, "duplicated", kw_keys=["subset", "keep"]
94
+ )
95
+
96
+
97
+ @register_op_adapter(DataFrameEval)
98
+ class DataFrameEvalAdapter(SPEOperatorAdapter):
99
+ def generate_code(self, op: DataFrameEval, context: SPECodeContext) -> List[str]:
100
+ func_name = "query" if op.is_query else "eval"
101
+ inst_var_name = context.get_input_tileable_variable(op.inputs[0])
102
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
103
+ args_list = self._translate_call_args(context, op.expr)
104
+ args = ", ".join(args_list)
105
+ return [f"{res_var_name} = {inst_var_name}.{func_name}({args})"]
106
+
107
+
108
+ DataFrameExplodeAdapter = build_method_call_adapter(
109
+ DataFrameExplode, "explode", "column", ignore_index=None
110
+ )
111
+ DataFrameMeltAdapter = build_method_call_adapter(
112
+ DataFrameMelt,
113
+ "melt",
114
+ kw_keys=["id_vars", "value_vars", "var_name", "value_name", "col_level"],
115
+ )
116
+ DataFrameMemoryUsageAdapter = build_method_call_adapter(
117
+ DataFrameMemoryUsage, "memory_usage", kw_keys=["index", "deep"]
118
+ )
119
+
120
+
121
+ @register_op_adapter(DataFrameIsin)
122
+ class DataFrameIsinAdapter(SPEOperatorAdapter):
123
+ def generate_code(self, op: DataFrameIsin, context: SPECodeContext) -> List[str]:
124
+ input_var = context.get_input_tileable_variable(op.input)
125
+ filter_var = self.translate_var(context, op.values)
126
+ output_var = context.get_output_tileable_variable(op.outputs[0])
127
+ return [f"{output_var} = {input_var}.isin({filter_var})"]
128
+
129
+
130
+ DataFrameMapAdapter = build_method_call_adapter(
131
+ DataFrameMap, "map", "arg", na_action=None
132
+ )
133
+ DataFrameShiftAdapter = build_method_call_adapter(
134
+ DataFrameShift, "shift", kw_keys=["periods", "freq", "axis", "fill_value"]
135
+ )
136
+ DataFrameStackAdapter = build_method_call_adapter(
137
+ DataFrameStack, "stack", kw_keys=["level", "dropna"]
138
+ )
139
+ DataFramePivotAdapter = build_method_call_adapter(
140
+ DataFramePivot, "pivot", kw_keys=["columns", "index", "values"]
141
+ )
142
+ DataFramePivotTableAdapter = build_method_call_adapter(
143
+ DataFramePivotTable,
144
+ "pivot_table",
145
+ kw_keys=[
146
+ "values",
147
+ "index",
148
+ "columns",
149
+ "aggfunc",
150
+ "fill_value",
151
+ "margins",
152
+ "dropna",
153
+ "margins_name",
154
+ "sort",
155
+ ],
156
+ )
157
+
158
+
159
+ @register_op_adapter(DataFrameToNumeric)
160
+ class DataFrameToNumericAdapter(SPEOperatorAdapter):
161
+ def generate_code(
162
+ self, op: DataFrameToNumeric, context: SPECodeContext
163
+ ) -> List[str]:
164
+ context.register_import("pandas", "pd")
165
+
166
+ kw_keys = ["errors", "downcast"]
167
+ args = self.generate_call_args_with_attributes(
168
+ op, context, "input", kw_keys=kw_keys
169
+ )
170
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
171
+ return [f"{res_var_name} = pd.to_numeric({args})"]
172
+
173
+
174
+ @register_op_adapter(TransformOperator)
175
+ class TransformOperatorAdapter(SPEOperatorAdapter):
176
+ def generate_code(
177
+ self, op: TransformOperator, context: SPECodeContext
178
+ ) -> List[str]:
179
+ input_var = context.get_input_tileable_variable(op.inputs[0])
180
+ output_var = context.get_output_tileable_variable(op.outputs[0])
181
+ funcs_var = self.translate_var(context, op.func)
182
+ return [f"{output_var} = {input_var}.transform({funcs_var}, axis={op.axis})"]
183
+
184
+
185
+ @register_op_adapter(DataFrameDrop)
186
+ class DataFrameDropAdapter(SPEOperatorAdapter):
187
+ def generate_code(self, op: DataFrameDrop, context: SPECodeContext) -> List[str]:
188
+ input_var = context.get_input_tileable_variable(op.inputs[0])
189
+ output_var = context.get_output_tileable_variable(op.outputs[0])
190
+ args_str = self.generate_call_args_with_attributes(
191
+ op, context, kw_keys=["index", "columns", "level", "errors"]
192
+ )
193
+ return [f"{output_var} = {input_var}.drop({args_str})"]
194
+
195
+
196
+ @register_op_adapter(DataFrameApply)
197
+ class DataFrameApplyAdapter(SPEOperatorAdapter):
198
+ def generate_code(self, op: DataFrameApply, context: SPECodeContext) -> List[str]:
199
+ input_var = context.get_input_tileable_variable(op.inputs[0])
200
+ output_var = context.get_output_tileable_variable(op.outputs[0])
201
+ applied_var = f"{output_var}_applied"
202
+ renamed_var = f"{output_var}_renamed"
203
+ if isinstance(op.inputs[0], DATAFRAME_TYPE):
204
+ apply_arg_list = ("func", "axis", "raw", "result_type")
205
+ else:
206
+ apply_arg_list = ("func", "convert_dtype")
207
+ apply_args = self.generate_call_args_with_attributes(
208
+ op, context, kw_keys=apply_arg_list
209
+ )
210
+
211
+ apply_code = f"{applied_var} = {input_var}.apply({apply_args})"
212
+
213
+ if isinstance(op.outputs[0], SERIES_TYPE):
214
+ rename_arg = self.translate_var(context, op.outputs[0].name)
215
+ rename_code = f"{renamed_var} = {applied_var}.rename({rename_arg})"
216
+ astype_arg = self.translate_var(context, op.outputs[0].dtype)
217
+ astype_node = f"{output_var} = {renamed_var}.astype({astype_arg})"
218
+ else:
219
+ rename_arg = self.translate_var(context, list(op.outputs[0].dtypes.index))
220
+ rename_code = f"{applied_var}.columns = {rename_arg}"
221
+ astype_arg = self.translate_var(context, dict(op.outputs[0].dtypes))
222
+ astype_node = f"{output_var} = {applied_var}.astype({astype_arg})"
223
+
224
+ return [apply_code, rename_code, astype_node]
225
+
226
+
227
+ @register_op_adapter(DataFrameDropDuplicates)
228
+ class DropDuplicatesOperatorAdapter(SPEOperatorAdapter):
229
+ def generate_code(
230
+ self, op: DataFrameDropDuplicates, context: SPECodeContext
231
+ ) -> List[str]:
232
+ input_var = context.get_input_tileable_variable(op.inputs[0])
233
+ output_var = context.get_output_tileable_variable(op.outputs[0])
234
+ if isinstance(op.inputs[0], DATAFRAME_TYPE):
235
+ arg_list = ("subset", "keep", "ignore_index")
236
+ elif isinstance(op.inputs[0], SERIES_TYPE):
237
+ arg_list = ("keep", "ignore_index")
238
+ else:
239
+ arg_list = ("keep",)
240
+ args = self.generate_call_args_with_attributes(op, context, kw_keys=arg_list)
241
+ return [f"{output_var} = {input_var}.drop_duplicates({args})"]
242
+
243
+
244
+ @register_op_adapter(DataFrameCaseWhen)
245
+ class CaseWhenOperatorAdapter(SPEOperatorAdapter):
246
+ @classmethod
247
+ def _get_case_expression(cls, expr: Any, context: SPECodeContext) -> str:
248
+ if isinstance(expr, TILEABLE_TYPE):
249
+ return context.get_input_tileable_variable(expr)
250
+ return cls.translate_var(context, expr)
251
+
252
+ def generate_code(
253
+ self, op: DataFrameCaseWhen, context: SPECodeContext
254
+ ) -> List[str]:
255
+ input_var = context.get_input_tileable_variable(op.inputs[0])
256
+ output_var = context.get_output_tileable_variable(op.outputs[0])
257
+
258
+ cond_exprs = [
259
+ self._get_case_expression(cond, context) for cond in op.conditions
260
+ ]
261
+ repl_exprs = [
262
+ self._get_case_expression(repl, context) for repl in op.replacements
263
+ ]
264
+ case_list_items = [
265
+ f"({cond_expr}, {repr_expr})"
266
+ for cond_expr, repr_expr in zip(cond_exprs, repl_exprs)
267
+ ]
268
+ case_list = ", ".join(case_list_items)
269
+ return [f"{output_var} = {input_var}.case_when(caselist=[{case_list}])"]
270
+
271
+
272
+ DataFrameGetDummiesAdapter = build_method_call_adapter(
273
+ DataFrameGetDummies,
274
+ "get_dummies",
275
+ "data",
276
+ kw_keys=[
277
+ "prefix",
278
+ "prefix_sep",
279
+ "dummy_na",
280
+ "columns",
281
+ "sparse",
282
+ "drop_first",
283
+ "dtype",
284
+ ],
285
+ source_module="pd",
286
+ )
@@ -0,0 +1,64 @@
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.missing.checkna import DataFrameCheckNA
18
+ from ....dataframe.missing.dropna import DataFrameDropNA
19
+ from ....dataframe.missing.fillna import DataFrameFillNA
20
+ from ....dataframe.missing.replace import DataFrameReplace
21
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
22
+ from ..utils import build_method_call_adapter
23
+
24
+
25
+ @register_op_adapter(DataFrameDropNA)
26
+ class DataFrameDropNAAdapter(SPEOperatorAdapter):
27
+ def generate_code(self, op: DataFrameDropNA, context: SPECodeContext) -> List[str]:
28
+ input_var = context.get_input_tileable_variable(op.inputs[0])
29
+ output_var = context.get_output_tileable_variable(op.outputs[0])
30
+ args_str = self.generate_call_args_with_attributes(
31
+ op, context, kw_keys=["axis", "how", "thresh", "subset"], skip_none=True
32
+ )
33
+ drop_idx_code = "" if not op.ignore_index else ".reset_index(drop=True)"
34
+ return [f"{output_var} = {input_var}.dropna({args_str}){drop_idx_code}"]
35
+
36
+
37
+ DataFrameFillNAAdapter = build_method_call_adapter(
38
+ DataFrameFillNA,
39
+ "fillna",
40
+ skip_none=False,
41
+ kw_keys=["value", "method", "axis", "limit", "downcast"],
42
+ )
43
+
44
+
45
+ @register_op_adapter(DataFrameCheckNA)
46
+ class DataFrameCheckNAAdapter(SPEOperatorAdapter):
47
+ def generate_code(self, op: DataFrameCheckNA, context: SPECodeContext) -> List[str]:
48
+ input_var = context.get_input_tileable_variable(op.inputs[0])
49
+ output_var = context.get_output_tileable_variable(op.outputs[0])
50
+ if op.positive:
51
+ return [f"{output_var} = {input_var}.isna()"]
52
+ else:
53
+ return [f"{output_var} = {input_var}.notna()"]
54
+
55
+
56
+ @register_op_adapter(DataFrameReplace)
57
+ class DataFrameReplaceAdapter(SPEOperatorAdapter):
58
+ def generate_code(self, op: DataFrameReplace, context: SPECodeContext) -> List[str]:
59
+ input_var = context.get_input_tileable_variable(op.inputs[0])
60
+ output_var = context.get_output_tileable_variable(op.outputs[0])
61
+ args_str = self.generate_call_args_with_attributes(
62
+ op, context, kw_keys=["to_replace", "value", "limit", "regex", "method"]
63
+ )
64
+ return [f"{output_var} = {input_var}.replace({args_str})"]