maxframe 2.0.0b2__cp311-cp311-win_amd64.whl → 2.2.0__cp311-cp311-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 (391) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp311-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.cp311-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/tests/test_datasource.py +37 -0
  96. maxframe/dataframe/datastore/__init__.py +5 -1
  97. maxframe/dataframe/datastore/to_csv.py +29 -41
  98. maxframe/dataframe/datastore/to_odps.py +30 -4
  99. maxframe/dataframe/extensions/__init__.py +20 -4
  100. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  101. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  102. maxframe/dataframe/extensions/collect_kv.py +126 -0
  103. maxframe/dataframe/extensions/extract_kv.py +177 -0
  104. maxframe/dataframe/extensions/map_reduce.py +263 -0
  105. maxframe/dataframe/extensions/rebalance.py +62 -0
  106. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  107. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  108. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  109. maxframe/dataframe/groupby/__init__.py +12 -1
  110. maxframe/dataframe/groupby/aggregation.py +78 -45
  111. maxframe/dataframe/groupby/apply.py +1 -1
  112. maxframe/dataframe/groupby/apply_chunk.py +18 -2
  113. maxframe/dataframe/groupby/core.py +96 -12
  114. maxframe/dataframe/groupby/cum.py +4 -25
  115. maxframe/dataframe/groupby/expanding.py +264 -0
  116. maxframe/dataframe/groupby/fill.py +1 -1
  117. maxframe/dataframe/groupby/getitem.py +12 -5
  118. maxframe/dataframe/groupby/head.py +11 -1
  119. maxframe/dataframe/groupby/rank.py +136 -0
  120. maxframe/dataframe/groupby/rolling.py +206 -0
  121. maxframe/dataframe/groupby/shift.py +114 -0
  122. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  123. maxframe/dataframe/indexing/__init__.py +20 -1
  124. maxframe/dataframe/indexing/droplevel.py +195 -0
  125. maxframe/dataframe/indexing/filter.py +169 -0
  126. maxframe/dataframe/indexing/get_level_values.py +76 -0
  127. maxframe/dataframe/indexing/iat.py +45 -0
  128. maxframe/dataframe/indexing/iloc.py +152 -12
  129. maxframe/dataframe/indexing/insert.py +1 -1
  130. maxframe/dataframe/indexing/loc.py +287 -7
  131. maxframe/dataframe/indexing/reindex.py +14 -5
  132. maxframe/dataframe/indexing/rename.py +6 -0
  133. maxframe/dataframe/indexing/rename_axis.py +2 -2
  134. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  135. maxframe/dataframe/indexing/reset_index.py +33 -6
  136. maxframe/dataframe/indexing/sample.py +8 -0
  137. maxframe/dataframe/indexing/setitem.py +3 -3
  138. maxframe/dataframe/indexing/swaplevel.py +185 -0
  139. maxframe/dataframe/indexing/take.py +99 -0
  140. maxframe/dataframe/indexing/truncate.py +140 -0
  141. maxframe/dataframe/indexing/where.py +0 -11
  142. maxframe/dataframe/indexing/xs.py +148 -0
  143. maxframe/dataframe/merge/__init__.py +12 -1
  144. maxframe/dataframe/merge/append.py +97 -98
  145. maxframe/dataframe/merge/combine_first.py +120 -0
  146. maxframe/dataframe/merge/compare.py +387 -0
  147. maxframe/dataframe/merge/concat.py +183 -0
  148. maxframe/dataframe/merge/update.py +271 -0
  149. maxframe/dataframe/misc/__init__.py +16 -10
  150. maxframe/dataframe/misc/_duplicate.py +10 -4
  151. maxframe/dataframe/misc/apply.py +1 -1
  152. maxframe/dataframe/misc/check_unique.py +51 -0
  153. maxframe/dataframe/misc/clip.py +145 -0
  154. maxframe/dataframe/misc/describe.py +175 -9
  155. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  156. maxframe/dataframe/misc/duplicated.py +2 -2
  157. maxframe/dataframe/misc/get_dummies.py +5 -1
  158. maxframe/dataframe/misc/isin.py +2 -2
  159. maxframe/dataframe/misc/map.py +94 -0
  160. maxframe/dataframe/misc/tests/test_misc.py +13 -2
  161. maxframe/dataframe/misc/to_numeric.py +3 -0
  162. maxframe/dataframe/misc/transform.py +12 -5
  163. maxframe/dataframe/misc/transpose.py +13 -1
  164. maxframe/dataframe/misc/valid_index.py +115 -0
  165. maxframe/dataframe/misc/value_counts.py +38 -4
  166. maxframe/dataframe/missing/checkna.py +13 -6
  167. maxframe/dataframe/missing/dropna.py +5 -0
  168. maxframe/dataframe/missing/fillna.py +1 -1
  169. maxframe/dataframe/missing/replace.py +7 -4
  170. maxframe/dataframe/reduction/__init__.py +29 -15
  171. maxframe/dataframe/reduction/aggregation.py +38 -9
  172. maxframe/dataframe/reduction/all.py +2 -2
  173. maxframe/dataframe/reduction/any.py +2 -2
  174. maxframe/dataframe/reduction/argmax.py +100 -0
  175. maxframe/dataframe/reduction/argmin.py +100 -0
  176. maxframe/dataframe/reduction/core.py +65 -18
  177. maxframe/dataframe/reduction/count.py +13 -9
  178. maxframe/dataframe/reduction/cov.py +166 -0
  179. maxframe/dataframe/reduction/cummax.py +2 -2
  180. maxframe/dataframe/reduction/cummin.py +2 -2
  181. maxframe/dataframe/reduction/cumprod.py +2 -2
  182. maxframe/dataframe/reduction/cumsum.py +2 -2
  183. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  184. maxframe/dataframe/reduction/idxmax.py +185 -0
  185. maxframe/dataframe/reduction/idxmin.py +185 -0
  186. maxframe/dataframe/reduction/kurtosis.py +37 -30
  187. maxframe/dataframe/reduction/max.py +2 -2
  188. maxframe/dataframe/reduction/mean.py +9 -7
  189. maxframe/dataframe/reduction/median.py +2 -2
  190. maxframe/dataframe/reduction/min.py +2 -2
  191. maxframe/dataframe/reduction/nunique.py +9 -8
  192. maxframe/dataframe/reduction/prod.py +18 -13
  193. maxframe/dataframe/reduction/reduction_size.py +2 -2
  194. maxframe/dataframe/reduction/sem.py +13 -9
  195. maxframe/dataframe/reduction/skew.py +31 -27
  196. maxframe/dataframe/reduction/str_concat.py +10 -7
  197. maxframe/dataframe/reduction/sum.py +18 -14
  198. maxframe/dataframe/reduction/unique.py +20 -3
  199. maxframe/dataframe/reduction/var.py +16 -12
  200. maxframe/dataframe/reshape/__init__.py +38 -0
  201. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  202. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  203. maxframe/dataframe/reshape/unstack.py +114 -0
  204. maxframe/dataframe/sort/__init__.py +8 -0
  205. maxframe/dataframe/sort/argsort.py +62 -0
  206. maxframe/dataframe/sort/core.py +1 -0
  207. maxframe/dataframe/sort/nlargest.py +238 -0
  208. maxframe/dataframe/sort/nsmallest.py +228 -0
  209. maxframe/dataframe/statistics/__init__.py +3 -3
  210. maxframe/dataframe/statistics/corr.py +1 -0
  211. maxframe/dataframe/statistics/quantile.py +2 -2
  212. maxframe/dataframe/tests/test_typing.py +104 -0
  213. maxframe/dataframe/tests/test_utils.py +66 -2
  214. maxframe/dataframe/typing_.py +185 -0
  215. maxframe/dataframe/utils.py +95 -26
  216. maxframe/dataframe/window/aggregation.py +8 -4
  217. maxframe/dataframe/window/core.py +14 -1
  218. maxframe/dataframe/window/ewm.py +1 -3
  219. maxframe/dataframe/window/expanding.py +37 -35
  220. maxframe/dataframe/window/rolling.py +49 -39
  221. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  222. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  223. maxframe/env.py +7 -4
  224. maxframe/errors.py +2 -2
  225. maxframe/io/odpsio/schema.py +9 -3
  226. maxframe/io/odpsio/tableio.py +7 -2
  227. maxframe/io/odpsio/tests/test_schema.py +198 -83
  228. maxframe/learn/__init__.py +10 -2
  229. maxframe/learn/cluster/__init__.py +15 -0
  230. maxframe/learn/cluster/_kmeans.py +782 -0
  231. maxframe/learn/contrib/llm/core.py +2 -0
  232. maxframe/learn/contrib/xgboost/core.py +86 -1
  233. maxframe/learn/contrib/xgboost/train.py +5 -2
  234. maxframe/learn/core.py +66 -0
  235. maxframe/learn/linear_model/_base.py +58 -1
  236. maxframe/learn/linear_model/_lin_reg.py +1 -1
  237. maxframe/learn/metrics/__init__.py +6 -0
  238. maxframe/learn/metrics/_classification.py +145 -0
  239. maxframe/learn/metrics/_ranking.py +477 -0
  240. maxframe/learn/metrics/_scorer.py +60 -0
  241. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  242. maxframe/learn/metrics/pairwise/core.py +77 -0
  243. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  244. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  245. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  246. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  247. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  248. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  249. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  250. maxframe/learn/metrics/tests/__init__.py +13 -0
  251. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  252. maxframe/learn/utils/__init__.py +1 -1
  253. maxframe/learn/utils/checks.py +1 -2
  254. maxframe/learn/utils/core.py +59 -0
  255. maxframe/learn/utils/extmath.py +37 -0
  256. maxframe/learn/utils/odpsio.py +193 -0
  257. maxframe/learn/utils/validation.py +2 -2
  258. maxframe/lib/compat.py +40 -0
  259. maxframe/lib/dtypes_extension/__init__.py +16 -1
  260. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  261. maxframe/lib/dtypes_extension/blob.py +304 -0
  262. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  263. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  264. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  265. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  266. maxframe/lib/filesystem/_oss_lib/common.py +122 -50
  267. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  268. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  269. maxframe/lib/filesystem/base.py +1 -1
  270. maxframe/lib/filesystem/core.py +1 -1
  271. maxframe/lib/filesystem/oss.py +115 -46
  272. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  273. maxframe/lib/mmh3.cp311-win_amd64.pyd +0 -0
  274. maxframe/lib/wrapped_pickle.py +10 -0
  275. maxframe/opcodes.py +33 -15
  276. maxframe/protocol.py +12 -0
  277. maxframe/serialization/__init__.py +11 -2
  278. maxframe/serialization/arrow.py +38 -13
  279. maxframe/serialization/blob.py +32 -0
  280. maxframe/serialization/core.cp311-win_amd64.pyd +0 -0
  281. maxframe/serialization/core.pyx +39 -1
  282. maxframe/serialization/exception.py +2 -4
  283. maxframe/serialization/numpy.py +11 -0
  284. maxframe/serialization/pandas.py +46 -9
  285. maxframe/serialization/serializables/core.py +2 -2
  286. maxframe/serialization/tests/test_serial.py +29 -2
  287. maxframe/tensor/__init__.py +38 -8
  288. maxframe/tensor/arithmetic/__init__.py +19 -10
  289. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  290. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -0
  291. maxframe/tensor/core.py +3 -2
  292. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  293. maxframe/tensor/extensions/__init__.py +2 -0
  294. maxframe/tensor/extensions/apply_chunk.py +3 -3
  295. maxframe/tensor/extensions/rebalance.py +65 -0
  296. maxframe/tensor/fft/__init__.py +32 -0
  297. maxframe/tensor/fft/core.py +168 -0
  298. maxframe/tensor/fft/fft.py +112 -0
  299. maxframe/tensor/fft/fft2.py +118 -0
  300. maxframe/tensor/fft/fftfreq.py +80 -0
  301. maxframe/tensor/fft/fftn.py +123 -0
  302. maxframe/tensor/fft/fftshift.py +79 -0
  303. maxframe/tensor/fft/hfft.py +112 -0
  304. maxframe/tensor/fft/ifft.py +114 -0
  305. maxframe/tensor/fft/ifft2.py +115 -0
  306. maxframe/tensor/fft/ifftn.py +123 -0
  307. maxframe/tensor/fft/ifftshift.py +73 -0
  308. maxframe/tensor/fft/ihfft.py +93 -0
  309. maxframe/tensor/fft/irfft.py +118 -0
  310. maxframe/tensor/fft/irfft2.py +62 -0
  311. maxframe/tensor/fft/irfftn.py +114 -0
  312. maxframe/tensor/fft/rfft.py +116 -0
  313. maxframe/tensor/fft/rfft2.py +63 -0
  314. maxframe/tensor/fft/rfftfreq.py +87 -0
  315. maxframe/tensor/fft/rfftn.py +113 -0
  316. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  317. maxframe/tensor/linalg/__init__.py +7 -0
  318. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  319. maxframe/tensor/linalg/cholesky.py +117 -0
  320. maxframe/tensor/linalg/einsum.py +339 -0
  321. maxframe/tensor/linalg/lstsq.py +100 -0
  322. maxframe/tensor/linalg/matrix_norm.py +75 -0
  323. maxframe/tensor/linalg/norm.py +249 -0
  324. maxframe/tensor/linalg/solve.py +72 -0
  325. maxframe/tensor/linalg/solve_triangular.py +2 -2
  326. maxframe/tensor/linalg/vector_norm.py +113 -0
  327. maxframe/tensor/misc/__init__.py +24 -1
  328. maxframe/tensor/misc/argwhere.py +72 -0
  329. maxframe/tensor/misc/array_split.py +46 -0
  330. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  331. maxframe/tensor/misc/copyto.py +130 -0
  332. maxframe/tensor/misc/delete.py +104 -0
  333. maxframe/tensor/misc/dsplit.py +68 -0
  334. maxframe/tensor/misc/ediff1d.py +74 -0
  335. maxframe/tensor/misc/expand_dims.py +85 -0
  336. maxframe/tensor/misc/flip.py +90 -0
  337. maxframe/tensor/misc/fliplr.py +64 -0
  338. maxframe/tensor/misc/flipud.py +68 -0
  339. maxframe/tensor/misc/hsplit.py +85 -0
  340. maxframe/tensor/misc/insert.py +139 -0
  341. maxframe/tensor/misc/moveaxis.py +83 -0
  342. maxframe/tensor/misc/result_type.py +88 -0
  343. maxframe/tensor/misc/roll.py +124 -0
  344. maxframe/tensor/misc/rollaxis.py +77 -0
  345. maxframe/tensor/misc/shape.py +89 -0
  346. maxframe/tensor/misc/split.py +190 -0
  347. maxframe/tensor/misc/tile.py +109 -0
  348. maxframe/tensor/misc/vsplit.py +74 -0
  349. maxframe/tensor/reduction/array_equal.py +2 -1
  350. maxframe/tensor/sort/__init__.py +2 -0
  351. maxframe/tensor/sort/argpartition.py +98 -0
  352. maxframe/tensor/sort/partition.py +228 -0
  353. maxframe/tensor/spatial/__init__.py +15 -0
  354. maxframe/tensor/spatial/distance/__init__.py +17 -0
  355. maxframe/tensor/spatial/distance/cdist.py +421 -0
  356. maxframe/tensor/spatial/distance/pdist.py +398 -0
  357. maxframe/tensor/spatial/distance/squareform.py +153 -0
  358. maxframe/tensor/special/__init__.py +159 -21
  359. maxframe/tensor/special/airy.py +55 -0
  360. maxframe/tensor/special/bessel.py +199 -0
  361. maxframe/tensor/special/core.py +65 -4
  362. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  363. maxframe/tensor/special/ellip_harm.py +55 -0
  364. maxframe/tensor/special/err_fresnel.py +223 -0
  365. maxframe/tensor/special/gamma_funcs.py +303 -0
  366. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  367. maxframe/tensor/special/info_theory.py +189 -0
  368. maxframe/tensor/special/misc.py +21 -0
  369. maxframe/tensor/statistics/__init__.py +6 -0
  370. maxframe/tensor/statistics/corrcoef.py +77 -0
  371. maxframe/tensor/statistics/cov.py +222 -0
  372. maxframe/tensor/statistics/digitize.py +126 -0
  373. maxframe/tensor/statistics/histogram.py +520 -0
  374. maxframe/tensor/statistics/median.py +85 -0
  375. maxframe/tensor/statistics/ptp.py +89 -0
  376. maxframe/tensor/utils.py +3 -3
  377. maxframe/tests/test_utils.py +43 -1
  378. maxframe/tests/utils.py +0 -2
  379. maxframe/typing_.py +2 -0
  380. maxframe/udf.py +27 -2
  381. maxframe/utils.py +193 -19
  382. {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/METADATA +3 -2
  383. {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/RECORD +391 -236
  384. maxframe_client/fetcher.py +35 -4
  385. maxframe_client/session/odps.py +7 -2
  386. maxframe_client/tests/test_fetcher.py +76 -3
  387. maxframe_client/tests/test_session.py +4 -1
  388. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  389. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  390. {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/WHEEL +0 -0
  391. {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/top_level.txt +0 -0
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  from ....core import SPECodeContext
16
- from ...indexing import DataFrameIlocGetItemAdapter
16
+ from ...indexing import DataFrameIlocGetItemAdapter, DataFrameIlocSetItemAdapter
17
17
 
18
18
 
19
19
  def test_series_iloc_single_row(s1):
@@ -24,6 +24,14 @@ def test_series_iloc_single_row(s1):
24
24
  assert results == expected_results
25
25
 
26
26
 
27
+ def test_series_iloc_set_single_row(s1):
28
+ s1.iloc[2] = 2
29
+ context = SPECodeContext()
30
+ results = DataFrameIlocSetItemAdapter().generate_code(s1.op, context)
31
+ expected_results = ["var_1 = var_0.copy()", "var_1.iloc[2] = 2"]
32
+ assert results == expected_results
33
+
34
+
27
35
  def test_series_iloc_multi_rows(s1):
28
36
  df = s1.iloc[:2]
29
37
  context = SPECodeContext()
@@ -48,6 +56,17 @@ def test_dataframe_iloc_only_columns(df1):
48
56
  assert results == expected_results
49
57
 
50
58
 
59
+ def test_dataframe_iloc_set_only_column(df1):
60
+ df1.iloc[:, 0] = 5
61
+ context = SPECodeContext()
62
+ results = DataFrameIlocSetItemAdapter().generate_code(df1.op, context)
63
+ expected_results = [
64
+ "var_1 = var_0.copy()",
65
+ "var_1.iloc[slice(None, None, None), 0] = 5",
66
+ ]
67
+ assert results == expected_results
68
+
69
+
51
70
  def test_dataframe_iloc_only_rows(df1):
52
71
  df = df1.iloc[1]
53
72
  context = SPECodeContext()
@@ -0,0 +1,35 @@
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 ....core import SPECodeContext
16
+ from ...indexing import DataFrameLocGetItemAdapter, DataFrameLocSetItemAdapter
17
+
18
+
19
+ def test_dataframe_iloc_only_columns(df1):
20
+ df = df1.iloc[:, [0, 1]]
21
+ context = SPECodeContext()
22
+ results = DataFrameLocGetItemAdapter().generate_code(df.op, context)
23
+ expected_results = ["var_1 = var_0.loc[slice(None, None, None), [0, 1]]"]
24
+ assert results == expected_results
25
+
26
+
27
+ def test_dataframe_iloc_set_only_column(df1):
28
+ df1.iloc[:, 0] = 5
29
+ context = SPECodeContext()
30
+ results = DataFrameLocSetItemAdapter().generate_code(df1.op, context)
31
+ expected_results = [
32
+ "var_1 = var_0.copy()",
33
+ "var_1.loc[slice(None, None, None), 0] = 5",
34
+ ]
35
+ assert results == expected_results
@@ -30,11 +30,8 @@ from ...misc import (
30
30
  DataFrameExplodeAdapter,
31
31
  DataFrameIsinAdapter,
32
32
  DataFrameMapAdapter,
33
- DataFrameMeltAdapter,
34
33
  DataFrameMemoryUsageAdapter,
35
- DataFramePivotTableAdapter,
36
34
  DataFrameShiftAdapter,
37
- DataFrameStackAdapter,
38
35
  DataFrameToNumericAdapter,
39
36
  )
40
37
 
@@ -181,17 +178,6 @@ def test_map(df1):
181
178
  assert results == expected_results
182
179
 
183
180
 
184
- def test_melt(df1):
185
- context = SPECodeContext()
186
-
187
- v1 = df1.melt(id_vars=["A"], value_vars=["B"])
188
- results = DataFrameMeltAdapter().generate_code(v1.op, context)
189
- assert (
190
- results[0]
191
- == "var_1 = var_0.melt(id_vars=['A'], value_vars=['B'], value_name='value')"
192
- )
193
-
194
-
195
181
  def test_memory_usage(df1):
196
182
  context = SPECodeContext()
197
183
  v1 = df1.memory_usage(index=False)
@@ -199,17 +185,6 @@ def test_memory_usage(df1):
199
185
  assert results[0] == "var_1 = var_0.memory_usage(index=False, deep=False)"
200
186
 
201
187
 
202
- def test_pivot_table(midx_df1):
203
- df = midx_df1.pivot_table(columns="B", values="C")
204
- context = SPECodeContext()
205
- results = DataFramePivotTableAdapter().generate_code(df.op, context)
206
- assert results[0] == (
207
- "var_1 = var_0.pivot_table(values='C', columns='B', "
208
- "aggfunc='mean', margins=False, dropna=True, margins_name='All', "
209
- "sort=True)"
210
- )
211
-
212
-
213
188
  def test_shift(df1):
214
189
  df = df1.shift(periods=1)
215
190
  context = SPECodeContext()
@@ -217,13 +192,6 @@ def test_shift(df1):
217
192
  assert results[0] == "var_1 = var_0.shift(periods=1, axis=0)"
218
193
 
219
194
 
220
- def test_stack(midx_df1):
221
- df = midx_df1.stack([0])
222
- context = SPECodeContext()
223
- results = DataFrameStackAdapter().generate_code(df.op, context)
224
- assert results[0] == "var_1 = var_0.stack(level=[0], dropna=True)"
225
-
226
-
227
195
  def test_to_numeric():
228
196
  v0 = md.Series([1, 2, 3, 4, 5, 6])
229
197
  v1 = md.to_numeric(v0, downcast="float")
@@ -21,10 +21,11 @@ from ..groupby import (
21
21
  DataFrameGroupByOpAdapter,
22
22
  GroupByApplyAdapter,
23
23
  GroupByApplyChunkAdapter,
24
- GroupByCumReductionAdapter,
24
+ GroupByExpandingAggAdapter,
25
25
  GroupByFillOperatorAdapter,
26
26
  GroupByHeadAdapter,
27
27
  GroupByIndexAdapter,
28
+ GroupByRollingAggAdapter,
28
29
  GroupBySampleAdapter,
29
30
  GroupByTransformAdapter,
30
31
  _need_enforce_group_keys,
@@ -73,30 +74,92 @@ def test_dataframe_groupby_agg(df1):
73
74
  @pytest.mark.parametrize(
74
75
  "func, func_kwargs, expected_results",
75
76
  [
76
- ("cumcount", {}, ["var_1 = var_0.cumcount(ascending=True)"]),
77
- ("cumcount", {"ascending": True}, ["var_1 = var_0.cumcount(ascending=True)"]),
78
- ("cumcount", {"ascending": False}, ["var_1 = var_0.cumcount(ascending=False)"]),
79
- ("cumsum", {}, ["var_1 = var_0.cumsum(axis=0)"]),
80
- ("cumsum", {"axis": 0}, ["var_1 = var_0.cumsum(axis=0)"]),
81
- ("cumsum", {"axis": 1}, ["var_1 = var_0.cumsum(axis=1)"]),
82
- ("cumprod", {}, ["var_1 = var_0.cumprod(axis=0)"]),
83
- ("cumprod", {"axis": 0}, ["var_1 = var_0.cumprod(axis=0)"]),
84
- ("cumprod", {"axis": 1}, ["var_1 = var_0.cumprod(axis=1)"]),
85
- ("cummax", {}, ["var_1 = var_0.cummax(axis=0)"]),
86
- ("cummax", {"axis": 0}, ["var_1 = var_0.cummax(axis=0)"]),
87
- ("cummax", {"axis": 1}, ["var_1 = var_0.cummax(axis=1)"]),
88
- ("cummin", {}, ["var_1 = var_0.cummin(axis=0)"]),
89
- ("cummin", {"axis": 0}, ["var_1 = var_0.cummin(axis=0)"]),
90
- ("cummin", {"axis": 1}, ["var_1 = var_0.cummin(axis=1)"]),
77
+ ("cumcount", {}, ["var_1 = {G}.cumcount(ascending=True)"]),
78
+ ("cumcount", {"ascending": True}, ["var_1 = {G}.cumcount(ascending=True)"]),
79
+ ("cumcount", {"ascending": False}, ["var_1 = {G}.cumcount(ascending=False)"]),
80
+ ("cumsum", {}, ["var_1 = {G}.cumsum()"]),
81
+ ("cumprod", {}, ["var_1 = {G}.cumprod()"]),
82
+ ("cummax", {}, ["var_1 = {G}.cummax()"]),
83
+ ("cummin", {}, ["var_1 = {G}.cummin()"]),
91
84
  ],
92
85
  )
93
86
  def test_dataframe_groupby_cum(df1, func, func_kwargs, expected_results):
94
87
  context = SPECodeContext()
95
- adapter = GroupByCumReductionAdapter()
88
+ adapter = GroupByExpandingAggAdapter()
96
89
 
90
+ groupby_code = "var_0.groupby(by=['A'], as_index=True, sort=True, group_keys=True)"
97
91
  res = getattr(df1.groupby("A"), func)(**func_kwargs)
98
92
  results = adapter.generate_code(res.op, context)
99
- assert results == expected_results
93
+ assert results == [s.replace("{G}", groupby_code) for s in expected_results]
94
+
95
+
96
+ def test_dataframe_groupby_expanding(df1):
97
+ context = SPECodeContext()
98
+ adapter = GroupByExpandingAggAdapter()
99
+ res = df1.groupby("A").expanding(2).sum()
100
+ results = adapter.generate_code(res.op, context)
101
+ assert results == [
102
+ "def _exp_fun_var_1(frame, **_):",
103
+ " func = 'sum' if func != \"prod\" else lambda x: x.prod()",
104
+ " out_frame = frame.expanding(min_periods=2).agg(func)",
105
+ " return out_frame",
106
+ "var_1 = var_0.groupby(by=['A'], as_index=True, sort=True, group_keys=True"
107
+ ").apply(_exp_fun_var_1, include_groups=False)",
108
+ ]
109
+
110
+ res = df1.groupby("A").expanding(2, shift=1).sum()
111
+ results = adapter.generate_code(res.op, context)
112
+ assert results == [
113
+ "def _exp_fun_var_2(frame, **_):",
114
+ " func = 'sum' if func != \"prod\" else lambda x: x.prod()",
115
+ " frame = frame.shift(-1)",
116
+ " out_frame = frame.expanding(min_periods=2).agg(func)",
117
+ " return out_frame",
118
+ "var_2 = var_0.groupby(by=['A'], as_index=True, sort=True, "
119
+ "group_keys=True).apply(_exp_fun_var_2, include_groups=False)",
120
+ ]
121
+
122
+ res = df1.groupby("A").expanding(2, shift=1, reverse_range=True).sum()
123
+ results = adapter.generate_code(res.op, context)
124
+ assert results == [
125
+ "def _exp_fun_var_3(frame, **_):",
126
+ " func = 'sum' if func != \"prod\" else lambda x: x.prod()",
127
+ " frame = frame.shift(-1)",
128
+ " frame = frame.iloc[::-1]",
129
+ " out_frame = frame.expanding(min_periods=2).agg(func)",
130
+ " out_frame = out_frame.iloc[::-1]",
131
+ " return out_frame",
132
+ "var_3 = var_0.groupby(by=['A'], as_index=True, sort=True, "
133
+ "group_keys=True).apply(_exp_fun_var_3, include_groups=False)",
134
+ ]
135
+
136
+
137
+ def test_dataframe_groupby_rolling(df1):
138
+ context = SPECodeContext()
139
+ adapter = GroupByRollingAggAdapter()
140
+ res = df1.groupby("A").rolling(3).sum()
141
+ results = adapter.generate_code(res.op, context)
142
+ assert results == [
143
+ "def _roll_fun_var_1(frame, **_):",
144
+ " func = 'sum' if func != \"prod\" else lambda x: x.prod()",
145
+ " frame = frame.shift(0)",
146
+ " return frame.rolling(window=3, min_periods=None, center=False, "
147
+ "win_type=None, axis=0, on=None, closed=None).agg(func)",
148
+ "var_1 = var_0.groupby(by=['A'], as_index=True, sort=True, "
149
+ "group_keys=True).apply(_roll_fun_var_1, include_groups=False)",
150
+ ]
151
+
152
+ res = df1.groupby("A").rolling(3, shift=1).sum()
153
+ results = adapter.generate_code(res.op, context)
154
+ assert results == [
155
+ "def _roll_fun_var_2(frame, **_):",
156
+ " func = 'sum' if func != \"prod\" else lambda x: x.prod()",
157
+ " frame = frame.shift(-1)",
158
+ " return frame.rolling(window=3, min_periods=None, center=False, "
159
+ "win_type=None, axis=0, on=None, closed=None).agg(func)",
160
+ "var_2 = var_0.groupby(by=['A'], as_index=True, sort=True, "
161
+ "group_keys=True).apply(_roll_fun_var_2, include_groups=False)",
162
+ ]
100
163
 
101
164
 
102
165
  def test_dataframe_groupby_fill(df1):
@@ -17,7 +17,11 @@ import pytest
17
17
 
18
18
  from ..... import dataframe as md
19
19
  from ...core import SPECodeContext
20
- from ..merge import DataFrameConcatAdapter, DataFrameMergeAdapter
20
+ from ..merge import (
21
+ DataFrameConcatAdapter,
22
+ DataFrameMergeAdapter,
23
+ DataFrameUpdateAdapter,
24
+ )
21
25
 
22
26
 
23
27
  @pytest.fixture
@@ -398,3 +402,25 @@ def test_concat_columns_from_dataframes(df2, df6):
398
402
  " objs=[var_1, var_2], copy=True)"
399
403
  ]
400
404
  assert results == expected_results
405
+
406
+
407
+ def test_update_dataframe(df5, df6):
408
+ adapter = DataFrameUpdateAdapter()
409
+ df5.update(df6)
410
+ context = SPECodeContext()
411
+ results = adapter.generate_code(df5.op, context)
412
+ expected_results = [
413
+ "var_1 = var_0.copy()",
414
+ "var_1.update(var_2, join='left', overwrite=True, filter_func=None,"
415
+ " errors='ignore')",
416
+ ]
417
+ assert results == expected_results
418
+
419
+
420
+ def test_combine_first_dataframe(df5, df6):
421
+ adapter = DataFrameUpdateAdapter()
422
+ df = df5.combine_first(df6)
423
+ context = SPECodeContext()
424
+ results = adapter.generate_code(df.op, context)
425
+ expected_results = ["var_1 = var_0.combine_first(var_2)"]
426
+ assert results == expected_results
@@ -0,0 +1,79 @@
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 numpy as np
16
+ import pandas as pd
17
+ import pytest
18
+
19
+ from ..... import dataframe as md
20
+ from ...core import SPECodeContext
21
+ from ..reshape import (
22
+ DataFrameMeltAdapter,
23
+ DataFramePivotTableAdapter,
24
+ DataFrameStackAdapter,
25
+ )
26
+
27
+
28
+ @pytest.fixture
29
+ def df1():
30
+ return md.DataFrame(
31
+ np.random.randn(6, 4),
32
+ index=md.Index(["1", "2", "3", "4", "5", "6"], name="test_idx"),
33
+ columns=list("ABCD"),
34
+ )
35
+
36
+
37
+ @pytest.fixture
38
+ def midx_df1():
39
+ return md.DataFrame(
40
+ [
41
+ [1, 10, 101],
42
+ [9, 90, 909],
43
+ [2, 20, 202],
44
+ ],
45
+ index=pd.MultiIndex.from_arrays(
46
+ [[1, 9, 2], [11, 99, 22], [111, 999, 222]],
47
+ names=("idx_0", "idx_1", "idx_2"),
48
+ ),
49
+ columns=list("ABC"),
50
+ )
51
+
52
+
53
+ def test_melt(df1):
54
+ context = SPECodeContext()
55
+
56
+ v1 = df1.melt(id_vars=["A"], value_vars=["B"])
57
+ results = DataFrameMeltAdapter().generate_code(v1.op, context)
58
+ assert (
59
+ results[0]
60
+ == "var_1 = var_0.melt(id_vars=['A'], value_vars=['B'], value_name='value')"
61
+ )
62
+
63
+
64
+ def test_pivot_table(midx_df1):
65
+ df = midx_df1.pivot_table(columns="B", values="C")
66
+ context = SPECodeContext()
67
+ results = DataFramePivotTableAdapter().generate_code(df.op, context)
68
+ assert results[0] == (
69
+ "var_1 = var_0.pivot_table(values='C', columns='B', "
70
+ "aggfunc='mean', margins=False, dropna=True, margins_name='All', "
71
+ "sort=True)"
72
+ )
73
+
74
+
75
+ def test_stack(midx_df1):
76
+ df = midx_df1.stack([0])
77
+ context = SPECodeContext()
78
+ results = DataFrameStackAdapter().generate_code(df.op, context)
79
+ assert results[0] == "var_1 = var_0.stack(level=[0], dropna=True)"
@@ -157,3 +157,23 @@ def test_dataframe_sort_index_by_all(df2):
157
157
  " na_position='last', ignore_index=False, level=None, sort_remaining=True)"
158
158
  ]
159
159
  assert results == expected_results
160
+
161
+
162
+ def test_dataframe_nlargest(df1):
163
+ df = df1.nlargest(10, "A", keep="last")
164
+ adapter = DataFrameSortValuesAdapter()
165
+ context = SPECodeContext()
166
+ assert adapter.accepts(df.op) == EngineAcceptance.ACCEPT
167
+ results = adapter.generate_code(df.op, context)
168
+ expected_results = ["var_1 = var_0.nlargest(10, keep='last', columns='A')"]
169
+ assert results == expected_results
170
+
171
+
172
+ def test_series_nsmallest(s2):
173
+ s = s2.nsmallest(10, keep="last")
174
+ adapter = DataFrameSortValuesAdapter()
175
+ context = SPECodeContext()
176
+ assert adapter.accepts(s.op) == EngineAcceptance.ACCEPT
177
+ results = adapter.generate_code(s.op, context)
178
+ expected_results = ["var_1 = var_0.nsmallest(10, keep='last')"]
179
+ assert results == expected_results
@@ -50,8 +50,9 @@ def test_spe_xgb_train_script():
50
50
  results = adapter.generate_code(model.op, context)
51
51
  assert results == [
52
52
  "start_time = time.time()",
53
+ "var_2 = dict()",
53
54
  "logger.info('Trained data size: (%s, %s)', var_1.num_row(), var_1.num_col())",
54
- "var_0 = xgboost.train(params={}, dtrain=var_1, evals=[], num_boost_round=10)",
55
+ "var_0 = xgboost.train(params={}, dtrain=var_1, evals=[], num_boost_round=10, evals_result=var_2)",
55
56
  "logger.info('Train cost: %.2f s', time.time() - start_time)",
56
57
  ]
57
58
 
@@ -12,4 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from . import _classification
15
+ from . import _classification, _ranking, pairwise
@@ -0,0 +1,76 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import List
16
+
17
+ from .....learn.metrics._ranking import AucOp, RocAucScore, RocCurve
18
+ from ...core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
19
+
20
+
21
+ @register_op_adapter(AucOp)
22
+ class AucOpAdapter(SPEOperatorAdapter):
23
+ def generate_code(self, op: AucOp, context: SPECodeContext) -> List[str]:
24
+ context.register_import(
25
+ "sklearn.metrics",
26
+ from_item="auc",
27
+ alias="sk_auc",
28
+ )
29
+ call_args = self.generate_call_args_with_attributes(
30
+ op, context, "x", "y", skip_none=True
31
+ )
32
+ out_vars = [context.get_output_tileable_variable(out) for out in op.outputs]
33
+ out_vars_str = ", ".join(out_vars)
34
+ return [f"{out_vars_str} = sk_auc({call_args})"]
35
+
36
+
37
+ @register_op_adapter(RocAucScore)
38
+ class RocAucScoreAdapter(SPEOperatorAdapter):
39
+ def generate_code(self, op: RocAucScore, context: SPECodeContext) -> List[str]:
40
+ context.register_import(
41
+ "sklearn.metrics",
42
+ from_item="roc_auc_score",
43
+ alias="sk_roc_auc_score",
44
+ )
45
+ call_args = self.generate_call_args_with_attributes(
46
+ op,
47
+ context,
48
+ "y_true",
49
+ "y_score",
50
+ skip_none=True,
51
+ kw_keys=["average", "sample_weight", "max_fpr", "multi_class", "labels"],
52
+ )
53
+ out_vars = [context.get_output_tileable_variable(out) for out in op.outputs]
54
+ out_vars_str = ", ".join(out_vars)
55
+ return [f"{out_vars_str} = sk_roc_auc_score({call_args})"]
56
+
57
+
58
+ @register_op_adapter(RocCurve)
59
+ class RocCurveAdapter(SPEOperatorAdapter):
60
+ def generate_code(self, op: RocCurve, context: SPECodeContext) -> List[str]:
61
+ context.register_import(
62
+ "sklearn.metrics",
63
+ from_item="roc_curve",
64
+ alias="sk_roc_curve",
65
+ )
66
+ call_args = self.generate_call_args_with_attributes(
67
+ op,
68
+ context,
69
+ "y_true",
70
+ "y_score",
71
+ skip_none=True,
72
+ kw_keys=["sample_weight", "drop_intermediate", "pos_label"],
73
+ )
74
+ out_vars = [context.get_output_tileable_variable(out) for out in op.outputs]
75
+ out_vars_str = ", ".join(out_vars)
76
+ return [f"{out_vars_str} = sk_roc_curve({call_args})"]
@@ -0,0 +1,51 @@
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 .....learn.metrics.pairwise.cosine import CosineDistances
16
+ from .....learn.metrics.pairwise.euclidean import EuclideanDistances
17
+ from .....learn.metrics.pairwise.haversine import HaversineDistances
18
+ from .....learn.metrics.pairwise.manhattan import ManhattanDistances
19
+ from ...utils import build_method_call_adapter
20
+
21
+ CosineDistancesAdapter = build_method_call_adapter(
22
+ CosineDistances,
23
+ "cosine_distances",
24
+ "x",
25
+ "y",
26
+ source_module="sklearn.metrics.pairwise",
27
+ )
28
+ EuclideanDistancesAdapter = build_method_call_adapter(
29
+ EuclideanDistances,
30
+ "euclidean_distances",
31
+ "x",
32
+ "y",
33
+ y_norm_squared="Y_norm_squared",
34
+ squared="squared",
35
+ x_norm_squared="X_norm_squared",
36
+ source_module="sklearn.metrics.pairwise",
37
+ )
38
+ HaversineDistancesAdapter = build_method_call_adapter(
39
+ HaversineDistances,
40
+ "haversine_distances",
41
+ "x",
42
+ "y",
43
+ source_module="sklearn.metrics.pairwise",
44
+ )
45
+ ManhattanDistancesAdapter = build_method_call_adapter(
46
+ ManhattanDistances,
47
+ "manhattan_distances",
48
+ "x",
49
+ "y",
50
+ source_module="sklearn.metrics.pairwise",
51
+ )
@@ -0,0 +1,36 @@
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 ...... import tensor as mt
16
+ from ......learn.metrics.pairwise import euclidean_distances
17
+ from ....core import SPECodeContext
18
+ from ..pairwise import EuclideanDistancesAdapter
19
+
20
+
21
+ def test_euclidean_distances():
22
+ x = mt.random.rand(10, 3)
23
+
24
+ d = euclidean_distances(
25
+ x,
26
+ X_norm_squared=mt.random.rand(10, 1),
27
+ )
28
+
29
+ adapter = EuclideanDistancesAdapter()
30
+ context = SPECodeContext()
31
+ results = adapter.generate_code(d.op, context)
32
+ expected_results = [
33
+ "var_0 = sklearn.metrics.pairwise.euclidean_distances("
34
+ "var_1, var_1, squared=False, X_norm_squared=var_2)"
35
+ ]
36
+ assert results == expected_results
@@ -0,0 +1,59 @@
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 ...... import tensor as mt
16
+ from ......learn.metrics import auc, roc_auc_score, roc_curve
17
+ from ....core import SPECodeContext
18
+ from .._ranking import AucOpAdapter, RocAucScoreAdapter, RocCurveAdapter
19
+
20
+
21
+ def test_auc():
22
+ t1 = mt.array([1, 1, 2, 2])
23
+ t2 = mt.array([0.1, 0.4, 0.35, 0.8])
24
+ result = auc(t1, t2)
25
+
26
+ adapter = AucOpAdapter()
27
+ context = SPECodeContext()
28
+ results = adapter.generate_code(result.op, context)
29
+ expected_results = ["var_2 = sk_auc(var_0, var_1)"]
30
+ assert results == expected_results
31
+
32
+
33
+ def test_roc_auc_score():
34
+ t1 = mt.array([0, 0, 1, 1])
35
+ t2 = mt.array([0.1, 0.4, 0.35, 0.8])
36
+ result = roc_auc_score(t1, t2)
37
+
38
+ adapter = RocAucScoreAdapter()
39
+ context = SPECodeContext()
40
+ results = adapter.generate_code(result.op, context)
41
+ expected_results = [
42
+ "var_2 = sk_roc_auc_score("
43
+ "var_0, var_1, average='macro', multi_class='raise')"
44
+ ]
45
+ assert results == expected_results
46
+
47
+
48
+ def test_roc_curve():
49
+ t1 = mt.array([0, 0, 1, 1])
50
+ t2 = mt.array([0.1, 0.4, 0.35, 0.8])
51
+ result = roc_curve(t1, t2)
52
+
53
+ adapter = RocCurveAdapter()
54
+ context = SPECodeContext()
55
+ results = adapter.generate_code(result[0].op, context)
56
+ expected_results = [
57
+ "var_2, var_3, var_4 = sk_roc_curve(" "var_0, var_1, drop_intermediate=True)"
58
+ ]
59
+ assert results == expected_results
@@ -17,6 +17,7 @@ from . import (
17
17
  datasource,
18
18
  extensions,
19
19
  fetch,
20
+ fft,
20
21
  indexing,
21
22
  linalg,
22
23
  merge,
@@ -24,5 +25,7 @@ from . import (
24
25
  random,
25
26
  reduction,
26
27
  reshape,
28
+ spatial,
27
29
  special,
30
+ statistics,
28
31
  )