maxframe 2.0.0b2__cp39-cp39-win32.whl → 2.3.0rc1__cp39-cp39-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 (443) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp39-win32.pyd +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +9 -8
  5. maxframe/codegen/spe/core.py +1 -1
  6. maxframe/codegen/spe/dataframe/__init__.py +1 -0
  7. maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
  8. maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
  9. maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
  10. maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
  11. maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
  12. maxframe/codegen/spe/dataframe/groupby.py +88 -0
  13. maxframe/codegen/spe/dataframe/indexing.py +99 -4
  14. maxframe/codegen/spe/dataframe/merge.py +38 -1
  15. maxframe/codegen/spe/dataframe/misc.py +11 -33
  16. maxframe/codegen/spe/dataframe/reduction.py +32 -9
  17. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  18. maxframe/codegen/spe/dataframe/sort.py +39 -18
  19. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
  20. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
  21. maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
  22. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
  23. maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
  24. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
  25. maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
  26. maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
  27. maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
  28. maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
  29. maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
  30. maxframe/codegen/spe/dataframe/tseries.py +9 -0
  31. maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
  32. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
  33. maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
  34. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  35. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  36. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  37. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  38. maxframe/codegen/spe/tensor/__init__.py +3 -0
  39. maxframe/codegen/spe/tensor/datasource.py +1 -0
  40. maxframe/codegen/spe/tensor/fft.py +74 -0
  41. maxframe/codegen/spe/tensor/linalg.py +29 -2
  42. maxframe/codegen/spe/tensor/misc.py +79 -25
  43. maxframe/codegen/spe/tensor/spatial.py +45 -0
  44. maxframe/codegen/spe/tensor/statistics.py +44 -0
  45. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  46. maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
  47. maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
  48. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  49. maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
  50. maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
  51. maxframe/codegen/spe/utils.py +2 -0
  52. maxframe/config/config.py +73 -9
  53. maxframe/config/tests/test_validators.py +13 -1
  54. maxframe/config/validators.py +49 -0
  55. maxframe/conftest.py +54 -17
  56. maxframe/core/accessor.py +2 -2
  57. maxframe/core/base.py +2 -1
  58. maxframe/core/entity/core.py +5 -0
  59. maxframe/core/entity/tileables.py +3 -1
  60. maxframe/core/graph/core.cp39-win32.pyd +0 -0
  61. maxframe/core/graph/entity.py +8 -3
  62. maxframe/core/mode.py +6 -1
  63. maxframe/core/operator/base.py +9 -2
  64. maxframe/core/operator/core.py +10 -2
  65. maxframe/core/operator/utils.py +13 -0
  66. maxframe/dataframe/__init__.py +12 -5
  67. maxframe/dataframe/accessors/__init__.py +1 -1
  68. maxframe/dataframe/accessors/compat.py +45 -0
  69. maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
  70. maxframe/dataframe/accessors/dict_/contains.py +7 -16
  71. maxframe/dataframe/accessors/dict_/core.py +48 -0
  72. maxframe/dataframe/accessors/dict_/getitem.py +17 -21
  73. maxframe/dataframe/accessors/dict_/length.py +7 -16
  74. maxframe/dataframe/accessors/dict_/remove.py +6 -18
  75. maxframe/dataframe/accessors/dict_/setitem.py +8 -18
  76. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
  77. maxframe/dataframe/accessors/list_/__init__.py +2 -2
  78. maxframe/dataframe/accessors/list_/core.py +48 -0
  79. maxframe/dataframe/accessors/list_/getitem.py +12 -19
  80. maxframe/dataframe/accessors/list_/length.py +7 -16
  81. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
  82. maxframe/dataframe/accessors/string_/__init__.py +4 -1
  83. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  84. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  85. maxframe/dataframe/accessors/struct_/core.py +43 -0
  86. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  87. maxframe/dataframe/accessors/struct_/field.py +123 -0
  88. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  89. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  90. maxframe/dataframe/arithmetic/__init__.py +18 -4
  91. maxframe/dataframe/arithmetic/between.py +106 -0
  92. maxframe/dataframe/arithmetic/dot.py +237 -0
  93. maxframe/dataframe/arithmetic/maximum.py +33 -0
  94. maxframe/dataframe/arithmetic/minimum.py +33 -0
  95. maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
  96. maxframe/dataframe/core.py +161 -224
  97. maxframe/dataframe/datasource/__init__.py +18 -0
  98. maxframe/dataframe/datasource/core.py +6 -0
  99. maxframe/dataframe/datasource/direct.py +57 -0
  100. maxframe/dataframe/datasource/from_dict.py +124 -0
  101. maxframe/dataframe/datasource/from_index.py +1 -1
  102. maxframe/dataframe/datasource/from_records.py +77 -0
  103. maxframe/dataframe/datasource/from_tensor.py +109 -41
  104. maxframe/dataframe/datasource/read_csv.py +21 -14
  105. maxframe/dataframe/datasource/read_odps_query.py +29 -6
  106. maxframe/dataframe/datasource/read_odps_table.py +32 -10
  107. maxframe/dataframe/datasource/read_parquet.py +38 -39
  108. maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
  109. maxframe/dataframe/datastore/__init__.py +11 -1
  110. maxframe/dataframe/datastore/direct.py +268 -0
  111. maxframe/dataframe/datastore/to_csv.py +29 -41
  112. maxframe/dataframe/datastore/to_odps.py +36 -4
  113. maxframe/dataframe/extensions/__init__.py +20 -4
  114. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  115. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  116. maxframe/dataframe/extensions/collect_kv.py +126 -0
  117. maxframe/dataframe/extensions/extract_kv.py +177 -0
  118. maxframe/dataframe/extensions/flatjson.py +2 -1
  119. maxframe/dataframe/extensions/map_reduce.py +263 -0
  120. maxframe/dataframe/extensions/rebalance.py +62 -0
  121. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  122. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  123. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  124. maxframe/dataframe/groupby/__init__.py +17 -2
  125. maxframe/dataframe/groupby/aggregation.py +86 -49
  126. maxframe/dataframe/groupby/apply.py +1 -1
  127. maxframe/dataframe/groupby/apply_chunk.py +19 -5
  128. maxframe/dataframe/groupby/core.py +116 -16
  129. maxframe/dataframe/groupby/cum.py +4 -25
  130. maxframe/dataframe/groupby/expanding.py +264 -0
  131. maxframe/dataframe/groupby/fill.py +1 -1
  132. maxframe/dataframe/groupby/getitem.py +12 -5
  133. maxframe/dataframe/groupby/head.py +11 -1
  134. maxframe/dataframe/groupby/rank.py +136 -0
  135. maxframe/dataframe/groupby/rolling.py +206 -0
  136. maxframe/dataframe/groupby/shift.py +114 -0
  137. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  138. maxframe/dataframe/indexing/__init__.py +22 -2
  139. maxframe/dataframe/indexing/droplevel.py +195 -0
  140. maxframe/dataframe/indexing/filter.py +169 -0
  141. maxframe/dataframe/indexing/get_level_values.py +76 -0
  142. maxframe/dataframe/indexing/iat.py +45 -0
  143. maxframe/dataframe/indexing/iloc.py +152 -12
  144. maxframe/dataframe/indexing/insert.py +46 -18
  145. maxframe/dataframe/indexing/loc.py +287 -7
  146. maxframe/dataframe/indexing/reindex.py +14 -5
  147. maxframe/dataframe/indexing/rename.py +6 -0
  148. maxframe/dataframe/indexing/rename_axis.py +2 -2
  149. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  150. maxframe/dataframe/indexing/reset_index.py +33 -6
  151. maxframe/dataframe/indexing/sample.py +8 -0
  152. maxframe/dataframe/indexing/setitem.py +3 -3
  153. maxframe/dataframe/indexing/swaplevel.py +185 -0
  154. maxframe/dataframe/indexing/take.py +99 -0
  155. maxframe/dataframe/indexing/truncate.py +140 -0
  156. maxframe/dataframe/indexing/where.py +0 -11
  157. maxframe/dataframe/indexing/xs.py +148 -0
  158. maxframe/dataframe/merge/__init__.py +15 -1
  159. maxframe/dataframe/merge/append.py +97 -98
  160. maxframe/dataframe/merge/combine.py +244 -0
  161. maxframe/dataframe/merge/combine_first.py +120 -0
  162. maxframe/dataframe/merge/compare.py +387 -0
  163. maxframe/dataframe/merge/concat.py +183 -0
  164. maxframe/dataframe/merge/update.py +271 -0
  165. maxframe/dataframe/misc/__init__.py +28 -11
  166. maxframe/dataframe/misc/_duplicate.py +10 -4
  167. maxframe/dataframe/misc/apply.py +1 -1
  168. maxframe/dataframe/misc/check_unique.py +82 -0
  169. maxframe/dataframe/misc/clip.py +145 -0
  170. maxframe/dataframe/misc/describe.py +175 -9
  171. maxframe/dataframe/misc/drop.py +31 -0
  172. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  173. maxframe/dataframe/misc/duplicated.py +2 -2
  174. maxframe/dataframe/misc/get_dummies.py +5 -1
  175. maxframe/dataframe/misc/infer_dtypes.py +251 -0
  176. maxframe/dataframe/misc/isin.py +2 -2
  177. maxframe/dataframe/misc/map.py +125 -18
  178. maxframe/dataframe/misc/repeat.py +159 -0
  179. maxframe/dataframe/misc/tests/test_misc.py +48 -3
  180. maxframe/dataframe/misc/to_numeric.py +3 -0
  181. maxframe/dataframe/misc/transform.py +12 -5
  182. maxframe/dataframe/misc/transpose.py +13 -1
  183. maxframe/dataframe/misc/valid_index.py +115 -0
  184. maxframe/dataframe/misc/value_counts.py +38 -4
  185. maxframe/dataframe/missing/checkna.py +14 -6
  186. maxframe/dataframe/missing/dropna.py +5 -0
  187. maxframe/dataframe/missing/fillna.py +1 -1
  188. maxframe/dataframe/missing/replace.py +7 -4
  189. maxframe/dataframe/reduction/__init__.py +35 -16
  190. maxframe/dataframe/reduction/aggregation.py +43 -14
  191. maxframe/dataframe/reduction/all.py +2 -2
  192. maxframe/dataframe/reduction/any.py +2 -2
  193. maxframe/dataframe/reduction/argmax.py +103 -0
  194. maxframe/dataframe/reduction/argmin.py +103 -0
  195. maxframe/dataframe/reduction/core.py +80 -24
  196. maxframe/dataframe/reduction/count.py +13 -9
  197. maxframe/dataframe/reduction/cov.py +166 -0
  198. maxframe/dataframe/reduction/cummax.py +2 -2
  199. maxframe/dataframe/reduction/cummin.py +2 -2
  200. maxframe/dataframe/reduction/cumprod.py +2 -2
  201. maxframe/dataframe/reduction/cumsum.py +2 -2
  202. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  203. maxframe/dataframe/reduction/idxmax.py +185 -0
  204. maxframe/dataframe/reduction/idxmin.py +185 -0
  205. maxframe/dataframe/reduction/kurtosis.py +37 -30
  206. maxframe/dataframe/reduction/max.py +2 -2
  207. maxframe/dataframe/reduction/mean.py +9 -7
  208. maxframe/dataframe/reduction/median.py +2 -2
  209. maxframe/dataframe/reduction/min.py +2 -2
  210. maxframe/dataframe/reduction/mode.py +144 -0
  211. maxframe/dataframe/reduction/nunique.py +19 -11
  212. maxframe/dataframe/reduction/prod.py +18 -13
  213. maxframe/dataframe/reduction/reduction_size.py +2 -2
  214. maxframe/dataframe/reduction/sem.py +13 -9
  215. maxframe/dataframe/reduction/skew.py +31 -27
  216. maxframe/dataframe/reduction/str_concat.py +10 -7
  217. maxframe/dataframe/reduction/sum.py +18 -14
  218. maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
  219. maxframe/dataframe/reduction/unique.py +20 -3
  220. maxframe/dataframe/reduction/var.py +16 -12
  221. maxframe/dataframe/reshape/__init__.py +38 -0
  222. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  223. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  224. maxframe/dataframe/reshape/unstack.py +114 -0
  225. maxframe/dataframe/sort/__init__.py +16 -1
  226. maxframe/dataframe/sort/argsort.py +68 -0
  227. maxframe/dataframe/sort/core.py +2 -1
  228. maxframe/dataframe/sort/nlargest.py +238 -0
  229. maxframe/dataframe/sort/nsmallest.py +228 -0
  230. maxframe/dataframe/sort/rank.py +147 -0
  231. maxframe/dataframe/statistics/__init__.py +3 -3
  232. maxframe/dataframe/statistics/corr.py +1 -0
  233. maxframe/dataframe/statistics/quantile.py +2 -2
  234. maxframe/dataframe/tests/test_typing.py +104 -0
  235. maxframe/dataframe/tests/test_utils.py +66 -2
  236. maxframe/dataframe/tseries/__init__.py +19 -0
  237. maxframe/dataframe/tseries/at_time.py +61 -0
  238. maxframe/dataframe/tseries/between_time.py +122 -0
  239. maxframe/dataframe/typing_.py +185 -0
  240. maxframe/dataframe/utils.py +125 -52
  241. maxframe/dataframe/window/aggregation.py +8 -4
  242. maxframe/dataframe/window/core.py +14 -1
  243. maxframe/dataframe/window/ewm.py +1 -3
  244. maxframe/dataframe/window/expanding.py +37 -35
  245. maxframe/dataframe/window/rolling.py +49 -39
  246. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  247. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  248. maxframe/env.py +7 -4
  249. maxframe/errors.py +2 -2
  250. maxframe/io/odpsio/schema.py +9 -3
  251. maxframe/io/odpsio/tableio.py +7 -2
  252. maxframe/io/odpsio/tests/test_schema.py +198 -83
  253. maxframe/learn/__init__.py +10 -2
  254. maxframe/learn/cluster/__init__.py +15 -0
  255. maxframe/learn/cluster/_kmeans.py +782 -0
  256. maxframe/learn/contrib/llm/core.py +18 -7
  257. maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
  258. maxframe/learn/contrib/llm/deploy/config.py +221 -0
  259. maxframe/learn/contrib/llm/deploy/core.py +247 -0
  260. maxframe/learn/contrib/llm/deploy/framework.py +35 -0
  261. maxframe/learn/contrib/llm/deploy/loader.py +360 -0
  262. maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
  263. maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
  264. maxframe/learn/contrib/llm/models/__init__.py +1 -0
  265. maxframe/learn/contrib/llm/models/dashscope.py +12 -6
  266. maxframe/learn/contrib/llm/models/managed.py +76 -11
  267. maxframe/learn/contrib/llm/models/openai.py +72 -0
  268. maxframe/learn/contrib/llm/tests/__init__.py +13 -0
  269. maxframe/learn/contrib/llm/tests/test_core.py +34 -0
  270. maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
  271. maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
  272. maxframe/learn/contrib/llm/text.py +348 -42
  273. maxframe/learn/contrib/models.py +4 -1
  274. maxframe/learn/contrib/xgboost/classifier.py +2 -0
  275. maxframe/learn/contrib/xgboost/core.py +113 -4
  276. maxframe/learn/contrib/xgboost/predict.py +4 -2
  277. maxframe/learn/contrib/xgboost/regressor.py +5 -0
  278. maxframe/learn/contrib/xgboost/train.py +7 -2
  279. maxframe/learn/core.py +66 -0
  280. maxframe/learn/linear_model/_base.py +58 -1
  281. maxframe/learn/linear_model/_lin_reg.py +1 -1
  282. maxframe/learn/metrics/__init__.py +6 -0
  283. maxframe/learn/metrics/_classification.py +145 -0
  284. maxframe/learn/metrics/_ranking.py +477 -0
  285. maxframe/learn/metrics/_scorer.py +60 -0
  286. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  287. maxframe/learn/metrics/pairwise/core.py +77 -0
  288. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  289. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  290. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  291. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  292. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  293. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  294. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  295. maxframe/learn/metrics/tests/__init__.py +13 -0
  296. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  297. maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
  298. maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
  299. maxframe/learn/utils/__init__.py +2 -1
  300. maxframe/learn/utils/checks.py +1 -2
  301. maxframe/learn/utils/core.py +59 -0
  302. maxframe/learn/utils/extmath.py +79 -9
  303. maxframe/learn/utils/odpsio.py +262 -0
  304. maxframe/learn/utils/validation.py +2 -2
  305. maxframe/lib/compat.py +40 -0
  306. maxframe/lib/dtypes_extension/__init__.py +16 -1
  307. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  308. maxframe/lib/dtypes_extension/blob.py +304 -0
  309. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  310. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  311. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  312. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  313. maxframe/lib/filesystem/_oss_lib/common.py +124 -50
  314. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  315. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  316. maxframe/lib/filesystem/base.py +1 -1
  317. maxframe/lib/filesystem/core.py +1 -1
  318. maxframe/lib/filesystem/oss.py +115 -46
  319. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  320. maxframe/lib/mmh3.cp39-win32.pyd +0 -0
  321. maxframe/lib/wrapped_pickle.py +10 -0
  322. maxframe/opcodes.py +41 -15
  323. maxframe/protocol.py +12 -0
  324. maxframe/remote/core.py +4 -0
  325. maxframe/serialization/__init__.py +11 -2
  326. maxframe/serialization/arrow.py +38 -13
  327. maxframe/serialization/blob.py +32 -0
  328. maxframe/serialization/core.cp39-win32.pyd +0 -0
  329. maxframe/serialization/core.pyx +39 -1
  330. maxframe/serialization/exception.py +2 -4
  331. maxframe/serialization/numpy.py +11 -0
  332. maxframe/serialization/pandas.py +46 -9
  333. maxframe/serialization/serializables/core.py +2 -2
  334. maxframe/serialization/tests/test_serial.py +31 -4
  335. maxframe/tensor/__init__.py +38 -8
  336. maxframe/tensor/arithmetic/__init__.py +19 -10
  337. maxframe/tensor/arithmetic/core.py +2 -2
  338. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  339. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
  340. maxframe/tensor/core.py +6 -2
  341. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  342. maxframe/tensor/extensions/__init__.py +2 -0
  343. maxframe/tensor/extensions/apply_chunk.py +3 -3
  344. maxframe/tensor/extensions/rebalance.py +65 -0
  345. maxframe/tensor/fft/__init__.py +32 -0
  346. maxframe/tensor/fft/core.py +168 -0
  347. maxframe/tensor/fft/fft.py +112 -0
  348. maxframe/tensor/fft/fft2.py +118 -0
  349. maxframe/tensor/fft/fftfreq.py +80 -0
  350. maxframe/tensor/fft/fftn.py +123 -0
  351. maxframe/tensor/fft/fftshift.py +79 -0
  352. maxframe/tensor/fft/hfft.py +112 -0
  353. maxframe/tensor/fft/ifft.py +114 -0
  354. maxframe/tensor/fft/ifft2.py +115 -0
  355. maxframe/tensor/fft/ifftn.py +123 -0
  356. maxframe/tensor/fft/ifftshift.py +73 -0
  357. maxframe/tensor/fft/ihfft.py +93 -0
  358. maxframe/tensor/fft/irfft.py +118 -0
  359. maxframe/tensor/fft/irfft2.py +62 -0
  360. maxframe/tensor/fft/irfftn.py +114 -0
  361. maxframe/tensor/fft/rfft.py +116 -0
  362. maxframe/tensor/fft/rfft2.py +63 -0
  363. maxframe/tensor/fft/rfftfreq.py +87 -0
  364. maxframe/tensor/fft/rfftn.py +113 -0
  365. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  366. maxframe/tensor/linalg/__init__.py +7 -0
  367. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  368. maxframe/tensor/linalg/cholesky.py +117 -0
  369. maxframe/tensor/linalg/einsum.py +339 -0
  370. maxframe/tensor/linalg/lstsq.py +100 -0
  371. maxframe/tensor/linalg/matrix_norm.py +75 -0
  372. maxframe/tensor/linalg/norm.py +249 -0
  373. maxframe/tensor/linalg/solve.py +72 -0
  374. maxframe/tensor/linalg/solve_triangular.py +2 -2
  375. maxframe/tensor/linalg/vector_norm.py +113 -0
  376. maxframe/tensor/misc/__init__.py +24 -1
  377. maxframe/tensor/misc/argwhere.py +72 -0
  378. maxframe/tensor/misc/array_split.py +46 -0
  379. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  380. maxframe/tensor/misc/copyto.py +130 -0
  381. maxframe/tensor/misc/delete.py +104 -0
  382. maxframe/tensor/misc/dsplit.py +68 -0
  383. maxframe/tensor/misc/ediff1d.py +74 -0
  384. maxframe/tensor/misc/expand_dims.py +85 -0
  385. maxframe/tensor/misc/flip.py +90 -0
  386. maxframe/tensor/misc/fliplr.py +64 -0
  387. maxframe/tensor/misc/flipud.py +68 -0
  388. maxframe/tensor/misc/hsplit.py +85 -0
  389. maxframe/tensor/misc/insert.py +139 -0
  390. maxframe/tensor/misc/moveaxis.py +83 -0
  391. maxframe/tensor/misc/result_type.py +88 -0
  392. maxframe/tensor/misc/roll.py +124 -0
  393. maxframe/tensor/misc/rollaxis.py +77 -0
  394. maxframe/tensor/misc/shape.py +89 -0
  395. maxframe/tensor/misc/split.py +190 -0
  396. maxframe/tensor/misc/tile.py +109 -0
  397. maxframe/tensor/misc/vsplit.py +74 -0
  398. maxframe/tensor/reduction/array_equal.py +2 -1
  399. maxframe/tensor/sort/__init__.py +2 -0
  400. maxframe/tensor/sort/argpartition.py +98 -0
  401. maxframe/tensor/sort/partition.py +228 -0
  402. maxframe/tensor/spatial/__init__.py +15 -0
  403. maxframe/tensor/spatial/distance/__init__.py +17 -0
  404. maxframe/tensor/spatial/distance/cdist.py +421 -0
  405. maxframe/tensor/spatial/distance/pdist.py +398 -0
  406. maxframe/tensor/spatial/distance/squareform.py +153 -0
  407. maxframe/tensor/special/__init__.py +159 -21
  408. maxframe/tensor/special/airy.py +55 -0
  409. maxframe/tensor/special/bessel.py +199 -0
  410. maxframe/tensor/special/core.py +65 -4
  411. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  412. maxframe/tensor/special/ellip_harm.py +55 -0
  413. maxframe/tensor/special/err_fresnel.py +223 -0
  414. maxframe/tensor/special/gamma_funcs.py +303 -0
  415. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  416. maxframe/tensor/special/info_theory.py +189 -0
  417. maxframe/tensor/special/misc.py +21 -0
  418. maxframe/tensor/statistics/__init__.py +6 -0
  419. maxframe/tensor/statistics/corrcoef.py +77 -0
  420. maxframe/tensor/statistics/cov.py +222 -0
  421. maxframe/tensor/statistics/digitize.py +126 -0
  422. maxframe/tensor/statistics/histogram.py +520 -0
  423. maxframe/tensor/statistics/median.py +85 -0
  424. maxframe/tensor/statistics/ptp.py +89 -0
  425. maxframe/tensor/utils.py +3 -3
  426. maxframe/tests/test_udf.py +61 -0
  427. maxframe/tests/test_utils.py +51 -6
  428. maxframe/tests/utils.py +0 -2
  429. maxframe/typing_.py +2 -0
  430. maxframe/udf.py +130 -9
  431. maxframe/utils.py +254 -27
  432. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
  433. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
  434. maxframe_client/fetcher.py +35 -4
  435. maxframe_client/session/odps.py +7 -2
  436. maxframe_client/session/task.py +8 -1
  437. maxframe_client/tests/test_fetcher.py +76 -3
  438. maxframe_client/tests/test_session.py +28 -1
  439. maxframe/dataframe/arrays.py +0 -864
  440. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  441. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  442. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
  443. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -12,15 +12,27 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import List
15
+ from typing import List, Union
16
16
 
17
17
  from ....dataframe.core import DATAFRAME_TYPE, INDEX_TYPE
18
18
  from ....dataframe.indexing.align import DataFrameAlign
19
+ from ....dataframe.indexing.droplevel import DataFrameDropLevel
20
+ from ....dataframe.indexing.filter import DataFrameFilter
21
+ from ....dataframe.indexing.get_level_values import IndexGetLevelValues
19
22
  from ....dataframe.indexing.getitem import DataFrameIndex, SeriesIndex
20
- from ....dataframe.indexing.iloc import DataFrameIlocGetItem, SeriesIlocGetItem
23
+ from ....dataframe.indexing.iloc import (
24
+ DataFrameIlocGetItem,
25
+ DataFrameIlocSetItem,
26
+ IndexIlocGetItem,
27
+ SeriesIlocGetItem,
28
+ SeriesIlocSetItem,
29
+ )
21
30
  from ....dataframe.indexing.insert import DataFrameInsert
31
+ from ....dataframe.indexing.loc import DataFrameLocGetItem, DataFrameLocSetItem
22
32
  from ....dataframe.indexing.reindex import DataFrameReindex
23
33
  from ....dataframe.indexing.rename import DataFrameRename
34
+ from ....dataframe.indexing.rename_axis import DataFrameRenameAxis
35
+ from ....dataframe.indexing.reorder_levels import DataFrameReorderLevels
24
36
  from ....dataframe.indexing.reset_index import DataFrameResetIndex
25
37
  from ....dataframe.indexing.sample import DataFrameSample
26
38
  from ....dataframe.indexing.set_axis import DataFrameSetAxis
@@ -52,6 +64,12 @@ class DataFrameAlignAdapter(SPEOperatorAdapter):
52
64
  return [f"{out_lhs_var}, {out_rhs_var} = {input_var}.align({args_str})"]
53
65
 
54
66
 
67
+ DataFrameDropLevelAdapter = build_method_call_adapter(
68
+ DataFrameDropLevel, "droplevel", skip_none=True, kw_keys=["level", "axis"]
69
+ )
70
+ IndexGetLevelValuesAdapter = build_method_call_adapter(
71
+ IndexGetLevelValues, "get_level_values", "level"
72
+ )
55
73
  DataFrameInsertAdapter = build_method_call_adapter(
56
74
  DataFrameInsert, "insert", kw_keys=["loc", "column", "value"], allow_duplicates=None
57
75
  )
@@ -134,10 +152,12 @@ class DataFrameSetitemAdapter(SPEOperatorAdapter):
134
152
  ]
135
153
 
136
154
 
137
- @register_op_adapter([SeriesIlocGetItem, DataFrameIlocGetItem])
155
+ @register_op_adapter([DataFrameIlocGetItem, SeriesIlocGetItem, IndexIlocGetItem])
138
156
  class DataFrameIlocGetItemAdapter(SPEOperatorAdapter):
139
157
  def generate_code(
140
- self, op: SeriesIlocGetItem, context: SPECodeContext
158
+ self,
159
+ op: Union[DataFrameIlocGetItem, SeriesIlocGetItem, IndexIlocGetItem],
160
+ context: SPECodeContext,
141
161
  ) -> List[str]:
142
162
  input_var = context.get_input_tileable_variable(op.inputs[0])
143
163
  output_var = context.get_output_tileable_variable(op.outputs[0])
@@ -148,6 +168,62 @@ class DataFrameIlocGetItemAdapter(SPEOperatorAdapter):
148
168
  return [f"{output_var} = {input_var}.iloc[{row_exp}{col_exp}]"]
149
169
 
150
170
 
171
+ @register_op_adapter([DataFrameIlocSetItem, SeriesIlocSetItem])
172
+ class DataFrameIlocSetItemAdapter(SPEOperatorAdapter):
173
+ def generate_code(
174
+ self,
175
+ op: Union[DataFrameIlocSetItem, SeriesIlocSetItem],
176
+ context: SPECodeContext,
177
+ ) -> List[str]:
178
+ input_var = context.get_input_tileable_variable(op.inputs[0])
179
+ output_var = context.get_output_tileable_variable(op.outputs[0])
180
+ value_exp = self.translate_var(context, op.value)
181
+ row_exp = self.translate_var(context, op.indexes[0])
182
+ col_exp = ""
183
+ if len(op.indexes) > 1:
184
+ col_exp = f", {self.translate_var(context, op.indexes[1])}"
185
+ return [
186
+ f"{output_var} = {input_var}.copy()",
187
+ f"{output_var}.iloc[{row_exp}{col_exp}] = {value_exp}",
188
+ ]
189
+
190
+
191
+ @register_op_adapter(DataFrameLocGetItem)
192
+ class DataFrameLocGetItemAdapter(SPEOperatorAdapter):
193
+ def generate_code(
194
+ self,
195
+ op: DataFrameLocGetItem,
196
+ context: SPECodeContext,
197
+ ) -> List[str]:
198
+ input_var = context.get_input_tileable_variable(op.inputs[0])
199
+ output_var = context.get_output_tileable_variable(op.outputs[0])
200
+ row_exp = self.translate_var(context, op.indexes[0])
201
+ col_exp = ""
202
+ if len(op.indexes) > 1:
203
+ col_exp = f", {self.translate_var(context, op.indexes[1])}"
204
+ return [f"{output_var} = {input_var}.loc[{row_exp}{col_exp}]"]
205
+
206
+
207
+ @register_op_adapter(DataFrameLocSetItem)
208
+ class DataFrameLocSetItemAdapter(SPEOperatorAdapter):
209
+ def generate_code(
210
+ self,
211
+ op: DataFrameLocSetItem,
212
+ context: SPECodeContext,
213
+ ) -> List[str]:
214
+ input_var = context.get_input_tileable_variable(op.inputs[0])
215
+ output_var = context.get_output_tileable_variable(op.outputs[0])
216
+ value_exp = self.translate_var(context, op.value)
217
+ row_exp = self.translate_var(context, op.indexes[0])
218
+ col_exp = ""
219
+ if len(op.indexes) > 1:
220
+ col_exp = f", {self.translate_var(context, op.indexes[1])}"
221
+ return [
222
+ f"{output_var} = {input_var}.copy()",
223
+ f"{output_var}.loc[{row_exp}{col_exp}] = {value_exp}",
224
+ ]
225
+
226
+
151
227
  @register_op_adapter(DataFrameSample)
152
228
  class DataFrameSampleAdapter(SPEOperatorAdapter):
153
229
  def generate_code(self, op: DataFrameSample, context: SPECodeContext) -> List[str]:
@@ -236,3 +312,22 @@ DataFrameReindexAdapter = build_method_call_adapter(
236
312
  "limit",
237
313
  ],
238
314
  )
315
+
316
+ DataFrameFilterAdapter = build_method_call_adapter(
317
+ DataFrameFilter,
318
+ "filter",
319
+ skip_none=True,
320
+ kw_keys=["items", "like", "regex", "axis"],
321
+ )
322
+
323
+
324
+ DataFrameReorderLevelsAdapter = build_method_call_adapter(
325
+ DataFrameReorderLevels, "reorder_levels", kw_keys=["order", "axis"]
326
+ )
327
+
328
+ DataFrameRenameAxisAdapter = build_method_call_adapter(
329
+ DataFrameRenameAxis,
330
+ "rename_axis",
331
+ skip_none=True,
332
+ kw_keys=["mapper", "index", "columns", "axis", "copy", "level", "inplace"],
333
+ )
@@ -14,8 +14,24 @@
14
14
 
15
15
  from typing import List
16
16
 
17
- from ....dataframe.merge import DataFrameConcat, DataFrameMerge
17
+ from ....dataframe.merge import (
18
+ DataFrameCombine,
19
+ DataFrameCompare,
20
+ DataFrameConcat,
21
+ DataFrameMerge,
22
+ DataFrameUpdate,
23
+ )
18
24
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
25
+ from ..utils import build_method_call_adapter
26
+
27
+ DataFrameCombineAdapter = build_method_call_adapter(
28
+ DataFrameCombine, "combine", 1, "func", kw_keys=["fill_value"]
29
+ )
30
+ DataFrameCompareAdapter = build_method_call_adapter(
31
+ DataFrameCompare,
32
+ "compare",
33
+ kw_keys=["align_axis", "keep_shape", "keep_equal", "result_names"],
34
+ )
19
35
 
20
36
 
21
37
  @register_op_adapter(DataFrameMerge)
@@ -71,3 +87,24 @@ class DataFrameConcatAdapter(SPEOperatorAdapter):
71
87
  )
72
88
  context.register_import("pandas", "pd")
73
89
  return [f"{res_var_name} = pd.concat({args})"]
90
+
91
+
92
+ @register_op_adapter(DataFrameUpdate)
93
+ class DataFrameUpdateAdapter(SPEOperatorAdapter):
94
+ def generate_code(self, op: DataFrameUpdate, context: SPECodeContext) -> List[str]:
95
+ input_var = context.get_input_tileable_variable(op.inputs[0])
96
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
97
+ context.register_import("pandas", "pd")
98
+ if op.join == "outer":
99
+ method = "combine_first"
100
+ args = self.generate_call_args_with_attributes(op, context, 1)
101
+ return [f"{res_var_name} = {input_var}.{method}({args})"]
102
+ else:
103
+ method = "update"
104
+ args = self.generate_call_args_with_attributes(
105
+ op, context, 1, kw_keys=["join", "overwrite", "filter_func", "errors"]
106
+ )
107
+ return [
108
+ f"{res_var_name} = {input_var}.copy()",
109
+ f"{res_var_name}.{method}({args})",
110
+ ]
@@ -19,6 +19,7 @@ from ....dataframe.misc.apply import DataFrameApply
19
19
  from ....dataframe.misc.astype import DataFrameAstype
20
20
  from ....dataframe.misc.case_when import DataFrameCaseWhen
21
21
  from ....dataframe.misc.check_monotonic import DataFrameCheckMonotonic
22
+ from ....dataframe.misc.clip import DataFrameClip
22
23
  from ....dataframe.misc.cut import DataFrameCut
23
24
  from ....dataframe.misc.describe import DataFrameDescribe
24
25
  from ....dataframe.misc.diff import DataFrameDiff
@@ -30,14 +31,11 @@ from ....dataframe.misc.explode import DataFrameExplode
30
31
  from ....dataframe.misc.get_dummies import DataFrameGetDummies
31
32
  from ....dataframe.misc.isin import DataFrameIsin
32
33
  from ....dataframe.misc.map import DataFrameMap
33
- from ....dataframe.misc.melt import DataFrameMelt
34
34
  from ....dataframe.misc.memory_usage import DataFrameMemoryUsage
35
- from ....dataframe.misc.pivot import DataFramePivot
36
- from ....dataframe.misc.pivot_table import DataFramePivotTable
35
+ from ....dataframe.misc.repeat import DataFrameRepeat
37
36
  from ....dataframe.misc.shift import DataFrameShift
38
- from ....dataframe.misc.stack import DataFrameStack
39
37
  from ....dataframe.misc.to_numeric import DataFrameToNumeric
40
- from ....dataframe.misc.transform import TransformOperator
38
+ from ....dataframe.misc.transform import DataFrameTransform
41
39
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
42
40
  from ..utils import build_method_call_adapter
43
41
 
@@ -60,6 +58,11 @@ class DataFrameCheckMonotonicAdapter(SPEOperatorAdapter):
60
58
  return [f"{res_var_name} = {inst_var_name}.{prop}"]
61
59
 
62
60
 
61
+ DataFrameClipAdapter = build_method_call_adapter(
62
+ DataFrameClip, "clip", skip_none=True, kw_keys=["lower", "upper", "axis"]
63
+ )
64
+
65
+
63
66
  @register_op_adapter(DataFrameCut)
64
67
  class DataFrameCutAdapter(SPEOperatorAdapter):
65
68
  def generate_code(self, op: DataFrameCut, context: SPECodeContext) -> List[str]:
@@ -108,11 +111,6 @@ class DataFrameEvalAdapter(SPEOperatorAdapter):
108
111
  DataFrameExplodeAdapter = build_method_call_adapter(
109
112
  DataFrameExplode, "explode", "column", ignore_index=None
110
113
  )
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
114
  DataFrameMemoryUsageAdapter = build_method_call_adapter(
117
115
  DataFrameMemoryUsage, "memory_usage", kw_keys=["index", "deep"]
118
116
  )
@@ -130,30 +128,10 @@ class DataFrameIsinAdapter(SPEOperatorAdapter):
130
128
  DataFrameMapAdapter = build_method_call_adapter(
131
129
  DataFrameMap, "map", "arg", na_action=None
132
130
  )
131
+ DataFrameRepeatAdapter = build_method_call_adapter(DataFrameRepeat, "repeat", "repeats")
133
132
  DataFrameShiftAdapter = build_method_call_adapter(
134
133
  DataFrameShift, "shift", kw_keys=["periods", "freq", "axis", "fill_value"]
135
134
  )
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
135
 
158
136
 
159
137
  @register_op_adapter(DataFrameToNumeric)
@@ -171,10 +149,10 @@ class DataFrameToNumericAdapter(SPEOperatorAdapter):
171
149
  return [f"{res_var_name} = pd.to_numeric({args})"]
172
150
 
173
151
 
174
- @register_op_adapter(TransformOperator)
152
+ @register_op_adapter(DataFrameTransform)
175
153
  class TransformOperatorAdapter(SPEOperatorAdapter):
176
154
  def generate_code(
177
- self, op: TransformOperator, context: SPECodeContext
155
+ self, op: DataFrameTransform, context: SPECodeContext
178
156
  ) -> List[str]:
179
157
  input_var = context.get_input_tileable_variable(op.inputs[0])
180
158
  output_var = context.get_output_tileable_variable(op.outputs[0])
@@ -18,12 +18,17 @@ from ....dataframe.reduction import (
18
18
  DataFrameAggregate,
19
19
  DataFrameAll,
20
20
  DataFrameAny,
21
+ DataFrameArgMax,
22
+ DataFrameArgMin,
21
23
  DataFrameCount,
24
+ DataFrameIdxMax,
25
+ DataFrameIdxMin,
22
26
  DataFrameKurtosis,
23
27
  DataFrameMax,
24
28
  DataFrameMean,
25
29
  DataFrameMedian,
26
30
  DataFrameMin,
31
+ DataFrameMode,
27
32
  DataFrameNunique,
28
33
  DataFrameProd,
29
34
  DataFrameSem,
@@ -32,21 +37,18 @@ from ....dataframe.reduction import (
32
37
  DataFrameUnique,
33
38
  DataFrameVar,
34
39
  )
35
- from ....dataframe.reduction.core import (
36
- DataFrameCumReductionOperator,
37
- DataFrameReductionOperator,
38
- )
40
+ from ....dataframe.reduction.core import DataFrameCumReduction, DataFrameReduction
39
41
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
40
42
 
41
43
 
42
- @register_op_adapter(DataFrameCumReductionOperator)
44
+ @register_op_adapter(DataFrameCumReduction)
43
45
  class DataFrameCumsumAdapter(SPEOperatorAdapter):
44
46
  """
45
47
  TODO: Refine this in window functions
46
48
  """
47
49
 
48
50
  def generate_code(
49
- self, op: DataFrameCumReductionOperator, context: SPECodeContext
51
+ self, op: DataFrameCumReduction, context: SPECodeContext
50
52
  ) -> List[str]:
51
53
  input_var_name = context.get_input_tileable_variable(op.inputs[0])
52
54
  args = []
@@ -78,7 +80,11 @@ class DataFrameAggregateAdapter(SPEOperatorAdapter):
78
80
  [
79
81
  DataFrameAll,
80
82
  DataFrameAny,
83
+ DataFrameArgMax,
84
+ DataFrameArgMin,
81
85
  DataFrameCount,
86
+ DataFrameIdxMax,
87
+ DataFrameIdxMin,
82
88
  DataFrameMax,
83
89
  DataFrameMean,
84
90
  DataFrameMedian,
@@ -90,13 +96,13 @@ class DataFrameAggregateAdapter(SPEOperatorAdapter):
90
96
  class DataFrameReductionAdapter(SPEOperatorAdapter):
91
97
  _common_args = ["axis", "skipna", "numeric_only", "bool_only", "level", "min_count"]
92
98
 
93
- def extra_args(self, op: DataFrameReductionOperator) -> Dict[str, Any]:
99
+ def extra_args(self, op: DataFrameReduction) -> Dict[str, Any]:
94
100
  """
95
101
  Get the extra arguments of the API call.
96
102
 
97
103
  Parameters
98
104
  ----------
99
- op : DataFrameReductionOperator
105
+ op : DataFrameReduction
100
106
  The DataFrameReductionOperator instance.
101
107
 
102
108
  Returns
@@ -107,7 +113,7 @@ class DataFrameReductionAdapter(SPEOperatorAdapter):
107
113
  return dict()
108
114
 
109
115
  def generate_code(
110
- self, op: DataFrameReductionOperator, context: SPECodeContext
116
+ self, op: DataFrameReduction, context: SPECodeContext
111
117
  ) -> List[str]:
112
118
  input_var_name = context.get_input_tileable_variable(op.inputs[0])
113
119
  kwargs = dict()
@@ -158,3 +164,20 @@ class DataFrameUniqueAdapter(SPEOperatorAdapter):
158
164
  input_var_name = context.get_input_tileable_variable(op.inputs[0])
159
165
  res_var_name = context.get_output_tileable_variable(op.outputs[0])
160
166
  return [f"{res_var_name} = pd.unique({input_var_name})"]
167
+
168
+
169
+ @register_op_adapter(DataFrameMode)
170
+ class DataFrameModeAdapter(SPEOperatorAdapter):
171
+ def generate_code(self, op: DataFrameMode, context: SPECodeContext) -> List[str]:
172
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
173
+ args = []
174
+ if op.inputs[0].ndim == 2:
175
+ if op.axis is not None:
176
+ args.append(f"axis={op.axis!r}")
177
+ if op.numeric_only is not None:
178
+ args.append(f"numeric_only={op.numeric_only!r}")
179
+ if op.dropna is not None:
180
+ args.append(f"dropna={op.dropna!r}")
181
+ args_str = ", ".join(args)
182
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
183
+ return [f"{res_var_name} = {input_var_name}.mode({args_str})"]
@@ -0,0 +1,46 @@
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 ....dataframe.reshape.melt import DataFrameMelt
16
+ from ....dataframe.reshape.pivot import DataFramePivot
17
+ from ....dataframe.reshape.pivot_table import DataFramePivotTable
18
+ from ....dataframe.reshape.stack import DataFrameStack
19
+ from ..utils import build_method_call_adapter
20
+
21
+ DataFrameMeltAdapter = build_method_call_adapter(
22
+ DataFrameMelt,
23
+ "melt",
24
+ kw_keys=["id_vars", "value_vars", "var_name", "value_name", "col_level"],
25
+ )
26
+ DataFrameStackAdapter = build_method_call_adapter(
27
+ DataFrameStack, "stack", kw_keys=["level", "dropna"]
28
+ )
29
+ DataFramePivotAdapter = build_method_call_adapter(
30
+ DataFramePivot, "pivot", kw_keys=["columns", "index", "values"]
31
+ )
32
+ DataFramePivotTableAdapter = build_method_call_adapter(
33
+ DataFramePivotTable,
34
+ "pivot_table",
35
+ kw_keys=[
36
+ "values",
37
+ "index",
38
+ "columns",
39
+ "aggfunc",
40
+ "fill_value",
41
+ "margins",
42
+ "dropna",
43
+ "margins_name",
44
+ "sort",
45
+ ],
46
+ )
@@ -16,9 +16,17 @@ from abc import abstractmethod
16
16
  from typing import Any, Dict, List
17
17
 
18
18
  from ....dataframe.core import DATAFRAME_TYPE
19
- from ....dataframe.sort import DataFrameSortIndex, DataFrameSortValues
19
+ from ....dataframe.sort import DataFrameRank, DataFrameSortIndex, DataFrameSortValues
20
20
  from ....dataframe.sort.core import DataFrameSortOperator
21
21
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
22
+ from ..utils import build_method_call_adapter
23
+
24
+ DataFrameRankAdapter = build_method_call_adapter(
25
+ DataFrameRank,
26
+ "rank",
27
+ kw_keys=["axis", "method", "numeric_only", "na_option", "ascending", "pct"],
28
+ skip_none=True,
29
+ )
22
30
 
23
31
 
24
32
  class _DataFrameSortAdapter(SPEOperatorAdapter):
@@ -26,17 +34,27 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
26
34
  self, op: DataFrameSortOperator, context: SPECodeContext
27
35
  ) -> List[str]:
28
36
  input_var_name = context.get_input_tileable_variable(op.inputs[0])
29
- kwargs = {
30
- "axis": op.axis,
31
- "ascending": op.ascending,
32
- "inplace": op.inplace,
33
- "na_position": op.na_position,
34
- "ignore_index": op.ignore_index,
35
- }
37
+ if op.keep_kind == "head" or not op.nrows:
38
+ args = []
39
+ kwargs = {
40
+ "axis": op.axis,
41
+ "ascending": op.ascending,
42
+ "inplace": op.inplace,
43
+ "na_position": op.na_position,
44
+ "ignore_index": op.ignore_index,
45
+ }
46
+ else:
47
+ args = [op.nrows]
48
+ kwargs = {"keep": op.keep_kind}
36
49
  kwargs.update(self.extra_args(op, context))
37
- args_str = ", ".join(self._translate_call_args(context, **kwargs))
50
+ args_str = ", ".join(self._translate_call_args(context, *args, **kwargs))
38
51
  res_var_name = context.get_output_tileable_variable(op.outputs[0])
39
- return [f"{res_var_name} = {input_var_name}.{self.method_name}({args_str})"]
52
+ ret = [
53
+ f"{res_var_name} = {input_var_name}.{self.get_method_name(op)}({args_str})"
54
+ ]
55
+ if op.keep_kind == "head" and op.nrows:
56
+ ret.append(f"{res_var_name} = {res_var_name}.head({op.nrows})")
57
+ return ret
40
58
 
41
59
  @abstractmethod
42
60
  def extra_args(
@@ -44,9 +62,8 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
44
62
  ) -> Dict[str, Any]:
45
63
  raise NotImplementedError
46
64
 
47
- @property
48
65
  @abstractmethod
49
- def method_name(self) -> str:
66
+ def get_method_name(self, op: DataFrameSortOperator) -> str:
50
67
  raise NotImplementedError
51
68
 
52
69
 
@@ -54,8 +71,7 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
54
71
  class DataFrameSortIndexAdapter(_DataFrameSortAdapter):
55
72
  _method_name = "sort_index"
56
73
 
57
- @property
58
- def method_name(self) -> str:
74
+ def get_method_name(self, op: DataFrameSortIndex) -> str:
59
75
  return self._method_name
60
76
 
61
77
  def extra_args(
@@ -71,13 +87,18 @@ class DataFrameSortIndexAdapter(_DataFrameSortAdapter):
71
87
  class DataFrameSortValuesAdapter(_DataFrameSortAdapter):
72
88
  _method_name = "sort_values"
73
89
 
74
- @property
75
- def method_name(self) -> str:
76
- return self._method_name
90
+ def get_method_name(self, op: DataFrameSortValues) -> str:
91
+ if op.keep_kind == "head" or not op.nrows:
92
+ return self._method_name
93
+ else:
94
+ return "nsmallest" if op.ascending else "nlargest"
77
95
 
78
96
  def extra_args(
79
97
  self, op: DataFrameSortValues, context: SPECodeContext
80
98
  ) -> Dict[str, Any]:
81
99
  if isinstance(op.outputs[0], DATAFRAME_TYPE):
82
- return {"by": op.by}
100
+ if op.keep_kind == "head" or not op.nrows:
101
+ return {"by": op.by}
102
+ else:
103
+ return {"columns": op.by}
83
104
  return {}
@@ -21,13 +21,7 @@ from ...... import dataframe as md
21
21
  from ......lib.dtypes_extension import dict_
22
22
  from ......utils import ARROW_DTYPE_NOT_SUPPORTED
23
23
  from ....core import SPECodeContext
24
- from ...accessors.dict_ import (
25
- SeriesDictContainsOperatorAdapter,
26
- SeriesDictGetItemOperatorAdapter,
27
- SeriesDictLengthOperatorAdapter,
28
- SeriesDictRemoveOperatorAdapter,
29
- SeriesDictSetItemOperatorAdapter,
30
- )
24
+ from ...accessors.dict_ import SeriesDictMethodAdapter
31
25
 
32
26
  pytestmark = pytest.mark.skipif(
33
27
  ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
@@ -66,7 +60,7 @@ def md_df_1(pd_df_1):
66
60
  def test_getitem(md_df_1, pd_df_1):
67
61
  s1 = md_df_1["A"].dict["k1"]
68
62
  context = SPECodeContext()
69
- adapter = SeriesDictGetItemOperatorAdapter()
63
+ adapter = SeriesDictMethodAdapter()
70
64
  results = adapter.generate_code(s1.op, context)
71
65
 
72
66
  expected_results = [
@@ -102,7 +96,7 @@ var_1.name = 'k1'
102
96
  def test_getitem_with_default_value(md_df_1, pd_df_1):
103
97
  s1 = md_df_1["A"].dict.get("k2", 9)
104
98
  context = SPECodeContext()
105
- adapter = SeriesDictGetItemOperatorAdapter()
99
+ adapter = SeriesDictMethodAdapter()
106
100
  results = adapter.generate_code(s1.op, context)
107
101
 
108
102
  expected_results = [
@@ -137,7 +131,7 @@ var_1.name = 'k2'
137
131
  def test_getitem_with_key_error(md_df_1, pd_df_1):
138
132
  s1 = md_df_1["A"].dict["k2"]
139
133
  context = SPECodeContext()
140
- adapter = SeriesDictGetItemOperatorAdapter()
134
+ adapter = SeriesDictMethodAdapter()
141
135
  results = adapter.generate_code(s1.op, context)
142
136
 
143
137
  expected_results = [
@@ -167,7 +161,7 @@ def test_setitem(md_df_1, pd_df_1):
167
161
  s1 = md_df_1["A"]
168
162
  s1.dict["k2"] = 9
169
163
  context = SPECodeContext()
170
- adapter = SeriesDictSetItemOperatorAdapter()
164
+ adapter = SeriesDictMethodAdapter()
171
165
  results = adapter.generate_code(s1.op, context)
172
166
 
173
167
  expected_results = [
@@ -207,7 +201,7 @@ var_1 = var_0.map(_inner_set, na_action="ignore").astype(const_0)
207
201
  def test_length(md_df_1, pd_df_1):
208
202
  s1 = md_df_1["A"].dict.len()
209
203
  context = SPECodeContext()
210
- adapter = SeriesDictLengthOperatorAdapter()
204
+ adapter = SeriesDictMethodAdapter()
211
205
  results = adapter.generate_code(s1.op, context)
212
206
 
213
207
  expected_results = [
@@ -227,7 +221,7 @@ var_1.name = None
227
221
  def test_remove_with_ignore_key_error(md_df_1, pd_df_1):
228
222
  s1 = md_df_1["A"].dict.remove("k2", ignore_key_error=True)
229
223
  context = SPECodeContext()
230
- adapter = SeriesDictRemoveOperatorAdapter()
224
+ adapter = SeriesDictMethodAdapter()
231
225
  results = adapter.generate_code(s1.op, context)
232
226
 
233
227
  expected_results = [
@@ -262,7 +256,7 @@ var_1 = var_0.map(_inner_remove, na_action="ignore").astype(const_0)
262
256
  def test_remove_with_key_error(md_df_1, pd_df_1):
263
257
  s1 = md_df_1["A"].dict.remove("k2", ignore_key_error=False)
264
258
  context = SPECodeContext()
265
- adapter = SeriesDictRemoveOperatorAdapter()
259
+ adapter = SeriesDictMethodAdapter()
266
260
  results = adapter.generate_code(s1.op, context)
267
261
 
268
262
  expected_results = [
@@ -290,7 +284,7 @@ var_1 = var_0.map(_inner_remove, na_action="ignore").astype(const_0)
290
284
  def test_contains(md_df_1, pd_df_1):
291
285
  s1 = md_df_1["A"].dict.contains("k2")
292
286
  context = SPECodeContext()
293
- adapter = SeriesDictContainsOperatorAdapter()
287
+ adapter = SeriesDictMethodAdapter()
294
288
  results = adapter.generate_code(s1.op, context)
295
289
 
296
290
  expected_results = [
@@ -21,10 +21,7 @@ from ...... import dataframe as md
21
21
  from ......lib.dtypes_extension import list_
22
22
  from ......utils import ARROW_DTYPE_NOT_SUPPORTED
23
23
  from ....core import SPECodeContext
24
- from ...accessors.list_ import (
25
- SeriesListGetItemOperatorAdapter,
26
- SeriesListLengthOperatorAdapter,
27
- )
24
+ from ...accessors.list_ import SeriesListMethodAdapter
28
25
 
29
26
  pytestmark = pytest.mark.skipif(
30
27
  ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
@@ -63,7 +60,7 @@ def md_df_1(pd_df_1):
63
60
  def test_getitem(md_df_1, pd_df_1):
64
61
  s1 = md_df_1["A"].list.get(0)
65
62
  context = SPECodeContext()
66
- adapter = SeriesListGetItemOperatorAdapter()
63
+ adapter = SeriesListMethodAdapter()
67
64
  results = adapter.generate_code(s1.op, context)
68
65
 
69
66
  expected_results = [
@@ -94,7 +91,7 @@ var_1.name = None
94
91
  def test_getitem_with_index_error(md_df_1, pd_df_1):
95
92
  s1 = md_df_1["A"].list[3]
96
93
  context = SPECodeContext()
97
- adapter = SeriesListGetItemOperatorAdapter()
94
+ adapter = SeriesListMethodAdapter()
98
95
  results = adapter.generate_code(s1.op, context)
99
96
 
100
97
  expected_results = [
@@ -120,7 +117,7 @@ var_1.name = None
120
117
  def test_length(md_df_1, pd_df_1):
121
118
  s1 = md_df_1["A"].list.len()
122
119
  context = SPECodeContext()
123
- adapter = SeriesListLengthOperatorAdapter()
120
+ adapter = SeriesListMethodAdapter()
124
121
  results = adapter.generate_code(s1.op, context)
125
122
 
126
123
  expected_results = [