maxframe 2.0.0b1__cp37-cp37m-win_amd64.whl → 2.2.0__cp37-cp37m-win_amd64.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 (395) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp37-win_amd64.pyd +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +6 -6
  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 +34 -1
  15. maxframe/codegen/spe/dataframe/misc.py +9 -33
  16. maxframe/codegen/spe/dataframe/reduction.py +14 -9
  17. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  18. maxframe/codegen/spe/dataframe/sort.py +30 -17
  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_reshape.py +79 -0
  28. maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
  29. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
  30. maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
  31. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  32. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  33. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  34. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  35. maxframe/codegen/spe/tensor/__init__.py +3 -0
  36. maxframe/codegen/spe/tensor/fft.py +74 -0
  37. maxframe/codegen/spe/tensor/linalg.py +29 -2
  38. maxframe/codegen/spe/tensor/misc.py +79 -25
  39. maxframe/codegen/spe/tensor/spatial.py +45 -0
  40. maxframe/codegen/spe/tensor/statistics.py +44 -0
  41. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  42. maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
  43. maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
  44. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  45. maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
  46. maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
  47. maxframe/codegen/spe/utils.py +2 -0
  48. maxframe/config/config.py +70 -9
  49. maxframe/config/tests/test_validators.py +13 -1
  50. maxframe/config/validators.py +49 -0
  51. maxframe/conftest.py +44 -17
  52. maxframe/core/accessor.py +2 -2
  53. maxframe/core/entity/core.py +5 -0
  54. maxframe/core/entity/tileables.py +1 -1
  55. maxframe/core/graph/core.cp37-win_amd64.pyd +0 -0
  56. maxframe/core/graph/entity.py +1 -2
  57. maxframe/core/operator/base.py +9 -2
  58. maxframe/core/operator/core.py +10 -2
  59. maxframe/core/operator/utils.py +13 -0
  60. maxframe/dataframe/__init__.py +10 -3
  61. maxframe/dataframe/accessors/__init__.py +1 -1
  62. maxframe/dataframe/accessors/compat.py +45 -0
  63. maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
  64. maxframe/dataframe/accessors/dict_/contains.py +7 -16
  65. maxframe/dataframe/accessors/dict_/core.py +48 -0
  66. maxframe/dataframe/accessors/dict_/getitem.py +17 -21
  67. maxframe/dataframe/accessors/dict_/length.py +7 -16
  68. maxframe/dataframe/accessors/dict_/remove.py +6 -18
  69. maxframe/dataframe/accessors/dict_/setitem.py +8 -18
  70. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
  71. maxframe/dataframe/accessors/list_/__init__.py +2 -2
  72. maxframe/dataframe/accessors/list_/core.py +48 -0
  73. maxframe/dataframe/accessors/list_/getitem.py +12 -19
  74. maxframe/dataframe/accessors/list_/length.py +7 -16
  75. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
  76. maxframe/dataframe/accessors/string_/__init__.py +4 -1
  77. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  78. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  79. maxframe/dataframe/accessors/struct_/core.py +43 -0
  80. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  81. maxframe/dataframe/accessors/struct_/field.py +123 -0
  82. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  83. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  84. maxframe/dataframe/arithmetic/__init__.py +14 -4
  85. maxframe/dataframe/arithmetic/between.py +106 -0
  86. maxframe/dataframe/arithmetic/dot.py +237 -0
  87. maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
  88. maxframe/dataframe/core.py +63 -118
  89. maxframe/dataframe/datasource/__init__.py +18 -0
  90. maxframe/dataframe/datasource/from_dict.py +124 -0
  91. maxframe/dataframe/datasource/from_index.py +1 -1
  92. maxframe/dataframe/datasource/from_records.py +77 -0
  93. maxframe/dataframe/datasource/from_tensor.py +109 -41
  94. maxframe/dataframe/datasource/read_csv.py +2 -3
  95. maxframe/dataframe/datasource/read_odps_query.py +76 -16
  96. maxframe/dataframe/datasource/tests/test_datasource.py +84 -1
  97. maxframe/dataframe/datastore/__init__.py +5 -1
  98. maxframe/dataframe/datastore/to_csv.py +29 -41
  99. maxframe/dataframe/datastore/to_odps.py +30 -4
  100. maxframe/dataframe/extensions/__init__.py +20 -4
  101. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  102. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  103. maxframe/dataframe/extensions/collect_kv.py +126 -0
  104. maxframe/dataframe/extensions/extract_kv.py +177 -0
  105. maxframe/dataframe/extensions/map_reduce.py +263 -0
  106. maxframe/dataframe/extensions/rebalance.py +62 -0
  107. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  108. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  109. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  110. maxframe/dataframe/groupby/__init__.py +12 -1
  111. maxframe/dataframe/groupby/aggregation.py +78 -45
  112. maxframe/dataframe/groupby/apply.py +1 -1
  113. maxframe/dataframe/groupby/apply_chunk.py +18 -2
  114. maxframe/dataframe/groupby/core.py +96 -12
  115. maxframe/dataframe/groupby/cum.py +4 -25
  116. maxframe/dataframe/groupby/expanding.py +264 -0
  117. maxframe/dataframe/groupby/fill.py +1 -1
  118. maxframe/dataframe/groupby/getitem.py +12 -5
  119. maxframe/dataframe/groupby/head.py +11 -1
  120. maxframe/dataframe/groupby/rank.py +136 -0
  121. maxframe/dataframe/groupby/rolling.py +206 -0
  122. maxframe/dataframe/groupby/shift.py +114 -0
  123. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  124. maxframe/dataframe/indexing/__init__.py +20 -1
  125. maxframe/dataframe/indexing/droplevel.py +195 -0
  126. maxframe/dataframe/indexing/filter.py +169 -0
  127. maxframe/dataframe/indexing/get_level_values.py +76 -0
  128. maxframe/dataframe/indexing/iat.py +45 -0
  129. maxframe/dataframe/indexing/iloc.py +152 -12
  130. maxframe/dataframe/indexing/insert.py +1 -1
  131. maxframe/dataframe/indexing/loc.py +287 -7
  132. maxframe/dataframe/indexing/reindex.py +14 -5
  133. maxframe/dataframe/indexing/rename.py +6 -0
  134. maxframe/dataframe/indexing/rename_axis.py +2 -2
  135. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  136. maxframe/dataframe/indexing/reset_index.py +33 -6
  137. maxframe/dataframe/indexing/sample.py +8 -0
  138. maxframe/dataframe/indexing/setitem.py +3 -3
  139. maxframe/dataframe/indexing/swaplevel.py +185 -0
  140. maxframe/dataframe/indexing/take.py +99 -0
  141. maxframe/dataframe/indexing/truncate.py +140 -0
  142. maxframe/dataframe/indexing/where.py +0 -11
  143. maxframe/dataframe/indexing/xs.py +148 -0
  144. maxframe/dataframe/merge/__init__.py +12 -1
  145. maxframe/dataframe/merge/append.py +97 -98
  146. maxframe/dataframe/merge/combine_first.py +120 -0
  147. maxframe/dataframe/merge/compare.py +387 -0
  148. maxframe/dataframe/merge/concat.py +183 -0
  149. maxframe/dataframe/merge/update.py +271 -0
  150. maxframe/dataframe/misc/__init__.py +16 -10
  151. maxframe/dataframe/misc/_duplicate.py +10 -4
  152. maxframe/dataframe/misc/apply.py +1 -1
  153. maxframe/dataframe/misc/check_unique.py +51 -0
  154. maxframe/dataframe/misc/clip.py +145 -0
  155. maxframe/dataframe/misc/describe.py +175 -9
  156. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  157. maxframe/dataframe/misc/duplicated.py +2 -2
  158. maxframe/dataframe/misc/get_dummies.py +5 -1
  159. maxframe/dataframe/misc/isin.py +2 -2
  160. maxframe/dataframe/misc/map.py +94 -0
  161. maxframe/dataframe/misc/tests/test_misc.py +13 -2
  162. maxframe/dataframe/misc/to_numeric.py +3 -0
  163. maxframe/dataframe/misc/transform.py +12 -5
  164. maxframe/dataframe/misc/transpose.py +13 -1
  165. maxframe/dataframe/misc/valid_index.py +115 -0
  166. maxframe/dataframe/misc/value_counts.py +38 -4
  167. maxframe/dataframe/missing/checkna.py +13 -6
  168. maxframe/dataframe/missing/dropna.py +5 -0
  169. maxframe/dataframe/missing/fillna.py +1 -1
  170. maxframe/dataframe/missing/replace.py +7 -4
  171. maxframe/dataframe/reduction/__init__.py +29 -15
  172. maxframe/dataframe/reduction/aggregation.py +38 -9
  173. maxframe/dataframe/reduction/all.py +2 -2
  174. maxframe/dataframe/reduction/any.py +2 -2
  175. maxframe/dataframe/reduction/argmax.py +100 -0
  176. maxframe/dataframe/reduction/argmin.py +100 -0
  177. maxframe/dataframe/reduction/core.py +65 -18
  178. maxframe/dataframe/reduction/count.py +13 -9
  179. maxframe/dataframe/reduction/cov.py +166 -0
  180. maxframe/dataframe/reduction/cummax.py +2 -2
  181. maxframe/dataframe/reduction/cummin.py +2 -2
  182. maxframe/dataframe/reduction/cumprod.py +2 -2
  183. maxframe/dataframe/reduction/cumsum.py +2 -2
  184. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  185. maxframe/dataframe/reduction/idxmax.py +185 -0
  186. maxframe/dataframe/reduction/idxmin.py +185 -0
  187. maxframe/dataframe/reduction/kurtosis.py +37 -30
  188. maxframe/dataframe/reduction/max.py +2 -2
  189. maxframe/dataframe/reduction/mean.py +9 -7
  190. maxframe/dataframe/reduction/median.py +2 -2
  191. maxframe/dataframe/reduction/min.py +2 -2
  192. maxframe/dataframe/reduction/nunique.py +9 -8
  193. maxframe/dataframe/reduction/prod.py +18 -13
  194. maxframe/dataframe/reduction/reduction_size.py +2 -2
  195. maxframe/dataframe/reduction/sem.py +13 -9
  196. maxframe/dataframe/reduction/skew.py +31 -27
  197. maxframe/dataframe/reduction/str_concat.py +10 -7
  198. maxframe/dataframe/reduction/sum.py +18 -14
  199. maxframe/dataframe/reduction/unique.py +20 -3
  200. maxframe/dataframe/reduction/var.py +16 -12
  201. maxframe/dataframe/reshape/__init__.py +38 -0
  202. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  203. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  204. maxframe/dataframe/reshape/unstack.py +114 -0
  205. maxframe/dataframe/sort/__init__.py +8 -0
  206. maxframe/dataframe/sort/argsort.py +62 -0
  207. maxframe/dataframe/sort/core.py +1 -0
  208. maxframe/dataframe/sort/nlargest.py +238 -0
  209. maxframe/dataframe/sort/nsmallest.py +228 -0
  210. maxframe/dataframe/statistics/__init__.py +3 -3
  211. maxframe/dataframe/statistics/corr.py +1 -0
  212. maxframe/dataframe/statistics/quantile.py +2 -2
  213. maxframe/dataframe/tests/test_typing.py +104 -0
  214. maxframe/dataframe/tests/test_utils.py +66 -2
  215. maxframe/dataframe/typing_.py +185 -0
  216. maxframe/dataframe/utils.py +95 -26
  217. maxframe/dataframe/window/aggregation.py +8 -4
  218. maxframe/dataframe/window/core.py +14 -1
  219. maxframe/dataframe/window/ewm.py +1 -3
  220. maxframe/dataframe/window/expanding.py +37 -35
  221. maxframe/dataframe/window/rolling.py +49 -39
  222. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  223. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  224. maxframe/env.py +7 -4
  225. maxframe/errors.py +2 -2
  226. maxframe/io/objects/tests/test_object_io.py +4 -2
  227. maxframe/io/odpsio/schema.py +9 -3
  228. maxframe/io/odpsio/tableio.py +7 -2
  229. maxframe/io/odpsio/tests/test_schema.py +198 -83
  230. maxframe/io/odpsio/tests/test_volumeio.py +4 -15
  231. maxframe/io/odpsio/volumeio.py +23 -8
  232. maxframe/learn/__init__.py +10 -2
  233. maxframe/learn/cluster/__init__.py +15 -0
  234. maxframe/learn/cluster/_kmeans.py +782 -0
  235. maxframe/learn/contrib/llm/core.py +2 -0
  236. maxframe/learn/contrib/xgboost/core.py +87 -1
  237. maxframe/learn/contrib/xgboost/train.py +5 -2
  238. maxframe/learn/core.py +66 -0
  239. maxframe/learn/linear_model/_base.py +58 -1
  240. maxframe/learn/linear_model/_lin_reg.py +1 -1
  241. maxframe/learn/metrics/__init__.py +6 -0
  242. maxframe/learn/metrics/_classification.py +145 -0
  243. maxframe/learn/metrics/_ranking.py +477 -0
  244. maxframe/learn/metrics/_scorer.py +60 -0
  245. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  246. maxframe/learn/metrics/pairwise/core.py +77 -0
  247. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  248. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  249. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  250. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  251. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  252. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  253. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  254. maxframe/learn/metrics/tests/__init__.py +13 -0
  255. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  256. maxframe/learn/utils/__init__.py +1 -1
  257. maxframe/learn/utils/checks.py +1 -2
  258. maxframe/learn/utils/core.py +59 -0
  259. maxframe/learn/utils/extmath.py +37 -0
  260. maxframe/learn/utils/odpsio.py +193 -0
  261. maxframe/learn/utils/validation.py +2 -2
  262. maxframe/lib/compat.py +40 -0
  263. maxframe/lib/dtypes_extension/__init__.py +16 -1
  264. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  265. maxframe/lib/dtypes_extension/blob.py +304 -0
  266. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  267. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  268. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  269. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  270. maxframe/lib/filesystem/_oss_lib/common.py +122 -50
  271. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  272. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  273. maxframe/lib/filesystem/base.py +1 -1
  274. maxframe/lib/filesystem/core.py +1 -1
  275. maxframe/lib/filesystem/oss.py +115 -46
  276. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  277. maxframe/lib/mmh3.cp37-win_amd64.pyd +0 -0
  278. maxframe/lib/wrapped_pickle.py +10 -0
  279. maxframe/opcodes.py +33 -15
  280. maxframe/protocol.py +12 -0
  281. maxframe/serialization/__init__.py +11 -2
  282. maxframe/serialization/arrow.py +38 -13
  283. maxframe/serialization/blob.py +32 -0
  284. maxframe/serialization/core.cp37-win_amd64.pyd +0 -0
  285. maxframe/serialization/core.pyx +39 -1
  286. maxframe/serialization/exception.py +2 -4
  287. maxframe/serialization/numpy.py +11 -0
  288. maxframe/serialization/pandas.py +46 -9
  289. maxframe/serialization/serializables/core.py +2 -2
  290. maxframe/serialization/tests/test_serial.py +29 -2
  291. maxframe/tensor/__init__.py +38 -8
  292. maxframe/tensor/arithmetic/__init__.py +19 -10
  293. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  294. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -0
  295. maxframe/tensor/core.py +3 -2
  296. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  297. maxframe/tensor/extensions/__init__.py +2 -0
  298. maxframe/tensor/extensions/apply_chunk.py +3 -3
  299. maxframe/tensor/extensions/rebalance.py +65 -0
  300. maxframe/tensor/fft/__init__.py +32 -0
  301. maxframe/tensor/fft/core.py +168 -0
  302. maxframe/tensor/fft/fft.py +112 -0
  303. maxframe/tensor/fft/fft2.py +118 -0
  304. maxframe/tensor/fft/fftfreq.py +80 -0
  305. maxframe/tensor/fft/fftn.py +123 -0
  306. maxframe/tensor/fft/fftshift.py +79 -0
  307. maxframe/tensor/fft/hfft.py +112 -0
  308. maxframe/tensor/fft/ifft.py +114 -0
  309. maxframe/tensor/fft/ifft2.py +115 -0
  310. maxframe/tensor/fft/ifftn.py +123 -0
  311. maxframe/tensor/fft/ifftshift.py +73 -0
  312. maxframe/tensor/fft/ihfft.py +93 -0
  313. maxframe/tensor/fft/irfft.py +118 -0
  314. maxframe/tensor/fft/irfft2.py +62 -0
  315. maxframe/tensor/fft/irfftn.py +114 -0
  316. maxframe/tensor/fft/rfft.py +116 -0
  317. maxframe/tensor/fft/rfft2.py +63 -0
  318. maxframe/tensor/fft/rfftfreq.py +87 -0
  319. maxframe/tensor/fft/rfftn.py +113 -0
  320. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  321. maxframe/tensor/linalg/__init__.py +7 -0
  322. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  323. maxframe/tensor/linalg/cholesky.py +117 -0
  324. maxframe/tensor/linalg/einsum.py +339 -0
  325. maxframe/tensor/linalg/lstsq.py +100 -0
  326. maxframe/tensor/linalg/matrix_norm.py +75 -0
  327. maxframe/tensor/linalg/norm.py +249 -0
  328. maxframe/tensor/linalg/solve.py +72 -0
  329. maxframe/tensor/linalg/solve_triangular.py +2 -2
  330. maxframe/tensor/linalg/vector_norm.py +113 -0
  331. maxframe/tensor/misc/__init__.py +24 -1
  332. maxframe/tensor/misc/argwhere.py +72 -0
  333. maxframe/tensor/misc/array_split.py +46 -0
  334. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  335. maxframe/tensor/misc/copyto.py +130 -0
  336. maxframe/tensor/misc/delete.py +104 -0
  337. maxframe/tensor/misc/dsplit.py +68 -0
  338. maxframe/tensor/misc/ediff1d.py +74 -0
  339. maxframe/tensor/misc/expand_dims.py +85 -0
  340. maxframe/tensor/misc/flip.py +90 -0
  341. maxframe/tensor/misc/fliplr.py +64 -0
  342. maxframe/tensor/misc/flipud.py +68 -0
  343. maxframe/tensor/misc/hsplit.py +85 -0
  344. maxframe/tensor/misc/insert.py +139 -0
  345. maxframe/tensor/misc/moveaxis.py +83 -0
  346. maxframe/tensor/misc/result_type.py +88 -0
  347. maxframe/tensor/misc/roll.py +124 -0
  348. maxframe/tensor/misc/rollaxis.py +77 -0
  349. maxframe/tensor/misc/shape.py +89 -0
  350. maxframe/tensor/misc/split.py +190 -0
  351. maxframe/tensor/misc/tile.py +109 -0
  352. maxframe/tensor/misc/vsplit.py +74 -0
  353. maxframe/tensor/reduction/array_equal.py +2 -1
  354. maxframe/tensor/sort/__init__.py +2 -0
  355. maxframe/tensor/sort/argpartition.py +98 -0
  356. maxframe/tensor/sort/partition.py +228 -0
  357. maxframe/tensor/spatial/__init__.py +15 -0
  358. maxframe/tensor/spatial/distance/__init__.py +17 -0
  359. maxframe/tensor/spatial/distance/cdist.py +421 -0
  360. maxframe/tensor/spatial/distance/pdist.py +398 -0
  361. maxframe/tensor/spatial/distance/squareform.py +153 -0
  362. maxframe/tensor/special/__init__.py +159 -21
  363. maxframe/tensor/special/airy.py +55 -0
  364. maxframe/tensor/special/bessel.py +199 -0
  365. maxframe/tensor/special/core.py +65 -4
  366. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  367. maxframe/tensor/special/ellip_harm.py +55 -0
  368. maxframe/tensor/special/err_fresnel.py +223 -0
  369. maxframe/tensor/special/gamma_funcs.py +303 -0
  370. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  371. maxframe/tensor/special/info_theory.py +189 -0
  372. maxframe/tensor/special/misc.py +21 -0
  373. maxframe/tensor/statistics/__init__.py +6 -0
  374. maxframe/tensor/statistics/corrcoef.py +77 -0
  375. maxframe/tensor/statistics/cov.py +222 -0
  376. maxframe/tensor/statistics/digitize.py +126 -0
  377. maxframe/tensor/statistics/histogram.py +520 -0
  378. maxframe/tensor/statistics/median.py +85 -0
  379. maxframe/tensor/statistics/ptp.py +89 -0
  380. maxframe/tensor/utils.py +3 -3
  381. maxframe/tests/test_utils.py +43 -1
  382. maxframe/tests/utils.py +3 -13
  383. maxframe/typing_.py +2 -0
  384. maxframe/udf.py +27 -2
  385. maxframe/utils.py +193 -19
  386. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/METADATA +3 -2
  387. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/RECORD +395 -240
  388. maxframe_client/fetcher.py +35 -4
  389. maxframe_client/session/odps.py +7 -2
  390. maxframe_client/tests/test_fetcher.py +76 -3
  391. maxframe_client/tests/test_session.py +4 -1
  392. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  393. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  394. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/WHEEL +0 -0
  395. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.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,20 @@
14
14
 
15
15
  from typing import List
16
16
 
17
- from ....dataframe.merge import DataFrameConcat, DataFrameMerge
17
+ from ....dataframe.merge import (
18
+ DataFrameCompare,
19
+ DataFrameConcat,
20
+ DataFrameMerge,
21
+ DataFrameUpdate,
22
+ )
18
23
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
24
+ from ..utils import build_method_call_adapter
25
+
26
+ DataFrameCompareAdapter = build_method_call_adapter(
27
+ DataFrameCompare,
28
+ "compare",
29
+ kw_keys=["align_axis", "keep_shape", "keep_equal", "result_names"],
30
+ )
19
31
 
20
32
 
21
33
  @register_op_adapter(DataFrameMerge)
@@ -71,3 +83,24 @@ class DataFrameConcatAdapter(SPEOperatorAdapter):
71
83
  )
72
84
  context.register_import("pandas", "pd")
73
85
  return [f"{res_var_name} = pd.concat({args})"]
86
+
87
+
88
+ @register_op_adapter(DataFrameUpdate)
89
+ class DataFrameUpdateAdapter(SPEOperatorAdapter):
90
+ def generate_code(self, op: DataFrameUpdate, context: SPECodeContext) -> List[str]:
91
+ input_var = context.get_input_tileable_variable(op.inputs[0])
92
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
93
+ context.register_import("pandas", "pd")
94
+ if op.join == "outer":
95
+ method = "combine_first"
96
+ args = self.generate_call_args_with_attributes(op, context, 1)
97
+ return [f"{res_var_name} = {input_var}.{method}({args})"]
98
+ else:
99
+ method = "update"
100
+ args = self.generate_call_args_with_attributes(
101
+ op, context, 1, kw_keys=["join", "overwrite", "filter_func", "errors"]
102
+ )
103
+ return [
104
+ f"{res_var_name} = {input_var}.copy()",
105
+ f"{res_var_name}.{method}({args})",
106
+ ]
@@ -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,10 @@ 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
37
35
  from ....dataframe.misc.shift import DataFrameShift
38
- from ....dataframe.misc.stack import DataFrameStack
39
36
  from ....dataframe.misc.to_numeric import DataFrameToNumeric
40
- from ....dataframe.misc.transform import TransformOperator
37
+ from ....dataframe.misc.transform import DataFrameTransform
41
38
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
42
39
  from ..utils import build_method_call_adapter
43
40
 
@@ -60,6 +57,11 @@ class DataFrameCheckMonotonicAdapter(SPEOperatorAdapter):
60
57
  return [f"{res_var_name} = {inst_var_name}.{prop}"]
61
58
 
62
59
 
60
+ DataFrameClipAdapter = build_method_call_adapter(
61
+ DataFrameClip, "clip", skip_none=True, kw_keys=["lower", "upper", "axis"]
62
+ )
63
+
64
+
63
65
  @register_op_adapter(DataFrameCut)
64
66
  class DataFrameCutAdapter(SPEOperatorAdapter):
65
67
  def generate_code(self, op: DataFrameCut, context: SPECodeContext) -> List[str]:
@@ -108,11 +110,6 @@ class DataFrameEvalAdapter(SPEOperatorAdapter):
108
110
  DataFrameExplodeAdapter = build_method_call_adapter(
109
111
  DataFrameExplode, "explode", "column", ignore_index=None
110
112
  )
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
113
  DataFrameMemoryUsageAdapter = build_method_call_adapter(
117
114
  DataFrameMemoryUsage, "memory_usage", kw_keys=["index", "deep"]
118
115
  )
@@ -133,27 +130,6 @@ DataFrameMapAdapter = build_method_call_adapter(
133
130
  DataFrameShiftAdapter = build_method_call_adapter(
134
131
  DataFrameShift, "shift", kw_keys=["periods", "freq", "axis", "fill_value"]
135
132
  )
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
133
 
158
134
 
159
135
  @register_op_adapter(DataFrameToNumeric)
@@ -171,10 +147,10 @@ class DataFrameToNumericAdapter(SPEOperatorAdapter):
171
147
  return [f"{res_var_name} = pd.to_numeric({args})"]
172
148
 
173
149
 
174
- @register_op_adapter(TransformOperator)
150
+ @register_op_adapter(DataFrameTransform)
175
151
  class TransformOperatorAdapter(SPEOperatorAdapter):
176
152
  def generate_code(
177
- self, op: TransformOperator, context: SPECodeContext
153
+ self, op: DataFrameTransform, context: SPECodeContext
178
154
  ) -> List[str]:
179
155
  input_var = context.get_input_tileable_variable(op.inputs[0])
180
156
  output_var = context.get_output_tileable_variable(op.outputs[0])
@@ -18,7 +18,11 @@ 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,
@@ -32,21 +36,18 @@ from ....dataframe.reduction import (
32
36
  DataFrameUnique,
33
37
  DataFrameVar,
34
38
  )
35
- from ....dataframe.reduction.core import (
36
- DataFrameCumReductionOperator,
37
- DataFrameReductionOperator,
38
- )
39
+ from ....dataframe.reduction.core import DataFrameCumReduction, DataFrameReduction
39
40
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
40
41
 
41
42
 
42
- @register_op_adapter(DataFrameCumReductionOperator)
43
+ @register_op_adapter(DataFrameCumReduction)
43
44
  class DataFrameCumsumAdapter(SPEOperatorAdapter):
44
45
  """
45
46
  TODO: Refine this in window functions
46
47
  """
47
48
 
48
49
  def generate_code(
49
- self, op: DataFrameCumReductionOperator, context: SPECodeContext
50
+ self, op: DataFrameCumReduction, context: SPECodeContext
50
51
  ) -> List[str]:
51
52
  input_var_name = context.get_input_tileable_variable(op.inputs[0])
52
53
  args = []
@@ -78,7 +79,11 @@ class DataFrameAggregateAdapter(SPEOperatorAdapter):
78
79
  [
79
80
  DataFrameAll,
80
81
  DataFrameAny,
82
+ DataFrameArgMax,
83
+ DataFrameArgMin,
81
84
  DataFrameCount,
85
+ DataFrameIdxMax,
86
+ DataFrameIdxMin,
82
87
  DataFrameMax,
83
88
  DataFrameMean,
84
89
  DataFrameMedian,
@@ -90,13 +95,13 @@ class DataFrameAggregateAdapter(SPEOperatorAdapter):
90
95
  class DataFrameReductionAdapter(SPEOperatorAdapter):
91
96
  _common_args = ["axis", "skipna", "numeric_only", "bool_only", "level", "min_count"]
92
97
 
93
- def extra_args(self, op: DataFrameReductionOperator) -> Dict[str, Any]:
98
+ def extra_args(self, op: DataFrameReduction) -> Dict[str, Any]:
94
99
  """
95
100
  Get the extra arguments of the API call.
96
101
 
97
102
  Parameters
98
103
  ----------
99
- op : DataFrameReductionOperator
104
+ op : DataFrameReduction
100
105
  The DataFrameReductionOperator instance.
101
106
 
102
107
  Returns
@@ -107,7 +112,7 @@ class DataFrameReductionAdapter(SPEOperatorAdapter):
107
112
  return dict()
108
113
 
109
114
  def generate_code(
110
- self, op: DataFrameReductionOperator, context: SPECodeContext
115
+ self, op: DataFrameReduction, context: SPECodeContext
111
116
  ) -> List[str]:
112
117
  input_var_name = context.get_input_tileable_variable(op.inputs[0])
113
118
  kwargs = dict()
@@ -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
+ )
@@ -26,17 +26,27 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
26
26
  self, op: DataFrameSortOperator, context: SPECodeContext
27
27
  ) -> List[str]:
28
28
  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
- }
29
+ if op.keep_kind == "head" or not op.nrows:
30
+ args = []
31
+ kwargs = {
32
+ "axis": op.axis,
33
+ "ascending": op.ascending,
34
+ "inplace": op.inplace,
35
+ "na_position": op.na_position,
36
+ "ignore_index": op.ignore_index,
37
+ }
38
+ else:
39
+ args = [op.nrows]
40
+ kwargs = {"keep": op.keep_kind}
36
41
  kwargs.update(self.extra_args(op, context))
37
- args_str = ", ".join(self._translate_call_args(context, **kwargs))
42
+ args_str = ", ".join(self._translate_call_args(context, *args, **kwargs))
38
43
  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})"]
44
+ ret = [
45
+ f"{res_var_name} = {input_var_name}.{self.get_method_name(op)}({args_str})"
46
+ ]
47
+ if op.keep_kind == "head" and op.nrows:
48
+ ret.append(f"{res_var_name} = {res_var_name}.head({op.nrows})")
49
+ return ret
40
50
 
41
51
  @abstractmethod
42
52
  def extra_args(
@@ -44,9 +54,8 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
44
54
  ) -> Dict[str, Any]:
45
55
  raise NotImplementedError
46
56
 
47
- @property
48
57
  @abstractmethod
49
- def method_name(self) -> str:
58
+ def get_method_name(self, op: DataFrameSortOperator) -> str:
50
59
  raise NotImplementedError
51
60
 
52
61
 
@@ -54,8 +63,7 @@ class _DataFrameSortAdapter(SPEOperatorAdapter):
54
63
  class DataFrameSortIndexAdapter(_DataFrameSortAdapter):
55
64
  _method_name = "sort_index"
56
65
 
57
- @property
58
- def method_name(self) -> str:
66
+ def get_method_name(self, op: DataFrameSortIndex) -> str:
59
67
  return self._method_name
60
68
 
61
69
  def extra_args(
@@ -71,13 +79,18 @@ class DataFrameSortIndexAdapter(_DataFrameSortAdapter):
71
79
  class DataFrameSortValuesAdapter(_DataFrameSortAdapter):
72
80
  _method_name = "sort_values"
73
81
 
74
- @property
75
- def method_name(self) -> str:
76
- return self._method_name
82
+ def get_method_name(self, op: DataFrameSortValues) -> str:
83
+ if op.keep_kind == "head" or not op.nrows:
84
+ return self._method_name
85
+ else:
86
+ return "nsmallest" if op.ascending else "nlargest"
77
87
 
78
88
  def extra_args(
79
89
  self, op: DataFrameSortValues, context: SPECodeContext
80
90
  ) -> Dict[str, Any]:
81
91
  if isinstance(op.outputs[0], DATAFRAME_TYPE):
82
- return {"by": op.by}
92
+ if op.keep_kind == "head" or not op.nrows:
93
+ return {"by": op.by}
94
+ else:
95
+ return {"columns": op.by}
83
96
  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 = [
@@ -0,0 +1,75 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import pandas as pd
16
+ import pyarrow as pa
17
+ import pytest
18
+
19
+ from ...... import dataframe as md
20
+ from ......utils import ARROW_DTYPE_NOT_SUPPORTED
21
+ from ....core import SPECodeContext
22
+ from ...accessors.struct_ import SeriesStructMethodAdapter
23
+
24
+ pytestmark = pytest.mark.skipif(
25
+ ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
26
+ )
27
+
28
+
29
+ def _run_generated_code(
30
+ code: str, ctx: SPECodeContext, input_val: pd.DataFrame
31
+ ) -> dict:
32
+ local_vars = ctx.constants.copy()
33
+ local_vars["var_0"] = input_val
34
+ import_code = "import pandas as pd\nimport numpy as np\n"
35
+ exec(import_code + code, local_vars, local_vars)
36
+ return local_vars
37
+
38
+
39
+ @pytest.fixture
40
+ def series():
41
+ version_type = pa.struct(
42
+ [
43
+ ("major", pa.int64()),
44
+ ("minor", pa.int64()),
45
+ ]
46
+ )
47
+ return md.Series(
48
+ [
49
+ {"version": {"major": 1, "minor": 5}, "project": "pandas"},
50
+ {"version": {"major": 2, "minor": 1}, "project": "pandas"},
51
+ {"version": {"major": 1, "minor": 26}, "project": "numpy"},
52
+ ],
53
+ dtype=pd.ArrowDtype(
54
+ pa.struct([("version", version_type), ("project", pa.string())])
55
+ ),
56
+ )
57
+
58
+
59
+ def test_field(series):
60
+ s1 = series.struct.field(["version", "minor"])
61
+ context = SPECodeContext()
62
+ adapter = SeriesStructMethodAdapter()
63
+ results = adapter.generate_code(s1.op, context)
64
+
65
+ expected_results = [
66
+ """
67
+ var_1 = var_0.struct.field(['version', 'minor'])
68
+ """
69
+ ]
70
+ assert results == expected_results
71
+ local_vars = _run_generated_code(results[0], context, series.op.data)
72
+ expected_series = pd.Series(
73
+ [5, 1, 26], dtype=pd.ArrowDtype(pa.int64()), name="minor"
74
+ )
75
+ pd.testing.assert_series_equal(expected_series, local_vars["var_1"])