maxframe 2.0.0b2__cp310-cp310-macosx_10_9_universal2.whl → 2.2.0__cp310-cp310-macosx_10_9_universal2.whl

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

Potentially problematic release.


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

Files changed (391) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cpython-310-darwin.so +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.cpython-310-darwin.so +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.cpython-310-darwin.so +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.cpython-310-darwin.so +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
@@ -22,9 +22,10 @@ from ...core import EntityData, OutputType
22
22
  from ...serialization.serializables import BoolField, Int64Field, KeyField, StringField
23
23
  from ...utils import pd_release_version
24
24
  from ..operators import DataFrameOperator, DataFrameOperatorMixin
25
- from ..utils import build_series, parse_index
25
+ from ..utils import build_df, build_series, parse_index
26
26
 
27
27
  _keep_original_order = pd_release_version >= (1, 3, 0)
28
+ _name_count_or_proportion = pd_release_version >= (2, 0, 0)
28
29
 
29
30
 
30
31
  class DataFrameValueCounts(DataFrameOperator, DataFrameOperatorMixin):
@@ -50,7 +51,16 @@ class DataFrameValueCounts(DataFrameOperator, DataFrameOperatorMixin):
50
51
  op.input = op._inputs[0]
51
52
 
52
53
  def __call__(self, inp):
53
- test_series = build_series(inp).value_counts(normalize=self.normalize)
54
+ if inp.ndim == 2:
55
+ idx = pd.MultiIndex.from_frame(build_df(inp))
56
+ test_series = build_series(index=idx, dtype=int)
57
+ if _name_count_or_proportion:
58
+ out_name = "proportion" if self.normalize else "count"
59
+ else:
60
+ out_name = None
61
+ else:
62
+ test_series = build_series(inp).value_counts(normalize=self.normalize)
63
+ out_name = test_series.name
54
64
  if self.bins is not None:
55
65
  from .cut import cut
56
66
 
@@ -66,7 +76,7 @@ class DataFrameValueCounts(DataFrameOperator, DataFrameOperatorMixin):
66
76
  [inp],
67
77
  shape=(np.nan,),
68
78
  index_value=parse_index(pd.CategoricalIndex([]), inp, store_data=False),
69
- name=inp.name,
79
+ name=out_name,
70
80
  dtype=test_series.dtype,
71
81
  )
72
82
  else:
@@ -74,7 +84,7 @@ class DataFrameValueCounts(DataFrameOperator, DataFrameOperatorMixin):
74
84
  [inp],
75
85
  shape=(np.nan,),
76
86
  index_value=parse_index(test_series.index, store_data=False),
77
- name=inp.name,
87
+ name=out_name,
78
88
  dtype=test_series.dtype,
79
89
  )
80
90
 
@@ -170,3 +180,27 @@ def value_counts(
170
180
  method=method,
171
181
  )
172
182
  return op(series)
183
+
184
+
185
+ def df_value_counts(
186
+ df,
187
+ subset=None,
188
+ normalize=False,
189
+ sort=True,
190
+ ascending=False,
191
+ dropna=True,
192
+ method="auto",
193
+ ):
194
+ if not subset:
195
+ df_to_count = df
196
+ else:
197
+ df_to_count = df[subset]
198
+
199
+ op = DataFrameValueCounts(
200
+ normalize=normalize,
201
+ sort=sort,
202
+ ascending=ascending,
203
+ dropna=dropna,
204
+ method=method,
205
+ )
206
+ return op(df_to_count)
@@ -30,6 +30,7 @@ class DataFrameCheckNA(DataFrameOperator, DataFrameOperatorMixin):
30
30
  _op_type_ = opcodes.CHECK_NA
31
31
 
32
32
  positive = BoolField("positive", default=None)
33
+ use_inf_as_na = BoolField("use_inf_as_na", default=None)
33
34
 
34
35
  def __call__(self, df):
35
36
  if isinstance(df, DATAFRAME_TYPE):
@@ -45,11 +46,15 @@ class DataFrameCheckNA(DataFrameOperator, DataFrameOperatorMixin):
45
46
  f"Expecting maxframe dataframe, series, index, or tensor, got {type(df)}"
46
47
  )
47
48
 
48
- params = df.params.copy()
49
+ params = df.params
49
50
  if self.output_types[0] == OutputType.dataframe:
50
- params["dtypes"] = pd.Series(
51
- [np.dtype("bool")] * len(df.dtypes), index=df.columns_value.to_pandas()
52
- )
51
+ if df.dtypes is None:
52
+ params["dtypes"] = None
53
+ else:
54
+ params["dtypes"] = pd.Series(
55
+ [np.dtype("bool")] * len(df.dtypes),
56
+ index=df.columns_value.to_pandas(),
57
+ )
53
58
  else:
54
59
  params["dtype"] = np.dtype("bool")
55
60
  return self.new_tileable([df], **params)
@@ -133,13 +138,14 @@ def isna(obj):
133
138
  2 True
134
139
  dtype: bool
135
140
  """
141
+ use_inf_as_na = pd.get_option("mode.use_inf_as_na")
136
142
  if isinstance(obj, MultiIndex):
137
143
  raise NotImplementedError("isna is not defined for MultiIndex")
138
144
  elif isinstance(obj, ENTITY_TYPE):
139
145
  if isinstance(obj, TENSOR_TYPE):
140
146
  return mt.isnan(obj)
141
147
  else:
142
- op = DataFrameCheckNA(positive=True)
148
+ op = DataFrameCheckNA(positive=True, use_inf_as_na=use_inf_as_na)
143
149
  return op(obj)
144
150
  else:
145
151
  return _from_pandas(pd.isna(obj))
@@ -207,13 +213,14 @@ def notna(obj):
207
213
  2 False
208
214
  dtype: bool
209
215
  """
216
+ use_inf_as_na = pd.get_option("mode.use_inf_as_na")
210
217
  if isinstance(obj, MultiIndex):
211
218
  raise NotImplementedError("isna is not defined for MultiIndex")
212
219
  elif isinstance(obj, ENTITY_TYPE):
213
220
  if isinstance(obj, TENSOR_TYPE):
214
221
  return ~mt.isnan(obj)
215
222
  else:
216
- op = DataFrameCheckNA(positive=False)
223
+ op = DataFrameCheckNA(positive=False, use_inf_as_na=use_inf_as_na)
217
224
  return op(obj)
218
225
  else:
219
226
  return _from_pandas(pd.notna(obj))
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import numpy as np
16
+ import pandas as pd
16
17
 
17
18
  from ... import opcodes
18
19
  from ...core import OutputType
@@ -40,6 +41,8 @@ class DataFrameDropNA(DataFrameOperator, DataFrameOperatorMixin):
40
41
  # if True, drop index
41
42
  ignore_index = BoolField("ignore_index", default=False)
42
43
 
44
+ use_inf_as_na = BoolField("use_inf_as_na", default=None)
45
+
43
46
  def __init__(self, sparse=None, output_types=None, **kw):
44
47
  super().__init__(_output_types=output_types, sparse=sparse, **kw)
45
48
 
@@ -155,6 +158,7 @@ def df_dropna(
155
158
  1 Batman Batmobile 1940-04-25
156
159
  """
157
160
  axis = validate_axis(axis, df)
161
+ use_inf_as_na = pd.get_option("mode.use_inf_as_na")
158
162
  if axis != 0:
159
163
  raise NotImplementedError("Does not support dropna on DataFrame when axis=1")
160
164
  if (
@@ -174,6 +178,7 @@ def df_dropna(
174
178
  thresh=thresh,
175
179
  subset=subset,
176
180
  ignore_index=ignore_index,
181
+ use_inf_as_na=use_inf_as_na,
177
182
  output_types=[OutputType.dataframe],
178
183
  )
179
184
  out_df = op(df)
@@ -26,7 +26,7 @@ from ..utils import validate_axis
26
26
 
27
27
  class DataFrameFillNA(DataFrameOperator, DataFrameOperatorMixin):
28
28
  _op_type_ = opcodes.FILL_NA
29
- _legacy_name = "FillNA"
29
+ _legacy_name = "FillNA" # since v2.0.0
30
30
 
31
31
  value = AnyField(
32
32
  "value", on_serialize=lambda x: x.data if isinstance(x, Entity) else x
@@ -15,8 +15,8 @@
15
15
  from typing import List
16
16
 
17
17
  from ... import opcodes
18
- from ...core import EntityData
19
- from ...serialization.serializables import AnyField, Int32Field
18
+ from ...core import ENTITY_TYPE, EntityData
19
+ from ...serialization.serializables import AnyField, FieldTypes, Int32Field, ListField
20
20
  from ...utils import no_default
21
21
  from ..operators import SERIES_TYPE, DataFrameOperator, DataFrameOperatorMixin
22
22
  from ..utils import build_df, build_series
@@ -31,15 +31,18 @@ class DataFrameReplace(DataFrameOperator, DataFrameOperatorMixin):
31
31
  regex = AnyField("regex", default=None)
32
32
  method = AnyField("method", default=no_default)
33
33
 
34
+ fill_chunks = ListField("fill_chunks", FieldTypes.key, default=None)
35
+
34
36
  @classmethod
35
37
  def _set_inputs(cls, op: "DataFrameReplace", inputs: List[EntityData]):
36
38
  super()._set_inputs(op, inputs)
37
39
  input_iter = iter(inputs)
38
40
  next(input_iter)
39
- if isinstance(op.to_replace, SERIES_TYPE):
41
+ if isinstance(op.to_replace, ENTITY_TYPE):
40
42
  op.to_replace = next(input_iter)
41
- if isinstance(op.value, SERIES_TYPE):
43
+ if isinstance(op.value, ENTITY_TYPE):
42
44
  op.value = next(input_iter)
45
+ op.fill_chunks = list(input_iter)
43
46
 
44
47
  def __call__(self, df_or_series):
45
48
  inputs = [df_or_series]
@@ -15,6 +15,8 @@
15
15
  from .aggregation import DataFrameAggregate
16
16
  from .all import DataFrameAll
17
17
  from .any import DataFrameAny
18
+ from .argmax import DataFrameArgMax
19
+ from .argmin import DataFrameArgMin
18
20
  from .core import CustomReduction
19
21
  from .count import DataFrameCount
20
22
  from .cummax import DataFrameCummax
@@ -22,6 +24,8 @@ from .cummin import DataFrameCummin
22
24
  from .cumprod import DataFrameCumprod
23
25
  from .cumsum import DataFrameCumsum
24
26
  from .custom_reduction import DataFrameCustomReduction
27
+ from .idxmax import DataFrameIdxMax
28
+ from .idxmin import DataFrameIdxMin
25
29
  from .kurtosis import DataFrameKurtosis
26
30
  from .max import DataFrameMax
27
31
  from .mean import DataFrameMean
@@ -43,11 +47,16 @@ def _install():
43
47
  from .aggregation import aggregate
44
48
  from .all import all_dataframe, all_index, all_series
45
49
  from .any import any_dataframe, any_index, any_series
50
+ from .argmax import argmax_series
51
+ from .argmin import argmin_series
46
52
  from .count import count_dataframe, count_series
53
+ from .cov import cov_dataframe, cov_series
47
54
  from .cummax import cummax
48
55
  from .cummin import cummin
49
56
  from .cumprod import cumprod
50
57
  from .cumsum import cumsum
58
+ from .idxmax import idxmax_dataframe, idxmax_series
59
+ from .idxmin import idxmin_dataframe, idxmin_series
51
60
  from .kurtosis import kurt_dataframe, kurt_series
52
61
  from .max import max_dataframe, max_index, max_series
53
62
  from .mean import mean_dataframe, mean_series
@@ -63,31 +72,36 @@ def _install():
63
72
  from .var import var_dataframe, var_series
64
73
 
65
74
  funcs = [
66
- ("sum", sum_series, sum_dataframe),
67
- ("prod", prod_series, prod_dataframe),
68
- ("product", prod_series, prod_dataframe),
69
- ("max", max_series, max_dataframe),
70
- ("min", min_series, min_dataframe),
71
- ("count", count_series, count_dataframe),
72
- ("mean", mean_series, mean_dataframe),
73
- ("median", median_series, median_dataframe),
74
- ("var", var_series, var_dataframe),
75
- ("std", std_series, std_dataframe),
75
+ ("agg", aggregate, aggregate),
76
+ ("aggregate", aggregate, aggregate),
76
77
  ("all", all_series, all_dataframe),
77
78
  ("any", any_series, any_dataframe),
79
+ ("argmax", argmax_series, None),
80
+ ("argmin", argmin_series, None),
81
+ ("count", count_series, count_dataframe),
82
+ ("cov", cov_series, cov_dataframe),
78
83
  ("cummax", cummax, cummax),
79
84
  ("cummin", cummin, cummin),
80
85
  ("cumprod", cumprod, cumprod),
81
86
  ("cumsum", cumsum, cumsum),
82
- ("agg", aggregate, aggregate),
83
- ("aggregate", aggregate, aggregate),
87
+ ("idxmax", idxmax_series, idxmax_dataframe),
88
+ ("idxmin", idxmin_series, idxmin_dataframe),
89
+ ("kurt", kurt_series, kurt_dataframe),
90
+ ("kurtosis", kurt_series, kurt_dataframe),
91
+ ("max", max_series, max_dataframe),
92
+ ("mean", mean_series, mean_dataframe),
93
+ ("median", median_series, median_dataframe),
94
+ ("min", min_series, min_dataframe),
84
95
  ("nunique", nunique_series, nunique_dataframe),
96
+ ("prod", prod_series, prod_dataframe),
97
+ ("product", prod_series, prod_dataframe),
85
98
  ("sem", sem_series, sem_dataframe),
86
99
  ("skew", skew_series, skew_dataframe),
87
- ("kurt", kurt_series, kurt_dataframe),
88
- ("kurtosis", kurt_series, kurt_dataframe),
100
+ ("std", std_series, std_dataframe),
101
+ ("sum", sum_series, sum_dataframe),
89
102
  ("unique", unique, None),
90
- ("_reduction_size", size_dataframe, size_series),
103
+ ("var", var_series, var_dataframe),
104
+ ("_reduction_size", size_series, size_dataframe),
91
105
  ]
92
106
  for func_name, series_func, df_func in funcs:
93
107
  if df_func is not None: # pragma: no branch
@@ -29,8 +29,15 @@ from ... import tensor as maxframe_tensor
29
29
  from ...core import ENTITY_TYPE, OutputType, enter_mode
30
30
  from ...io.odpsio.schema import pandas_dtype_to_arrow_type
31
31
  from ...lib.dtypes_extension import ArrowDtype
32
- from ...serialization.serializables import AnyField, BoolField, DictField, ListField
32
+ from ...serialization.serializables import (
33
+ AnyField,
34
+ BoolField,
35
+ DictField,
36
+ Int32Field,
37
+ ListField,
38
+ )
33
39
  from ...typing_ import TileableType
40
+ from ...udf import BuiltinFunction
34
41
  from ...utils import lazy_import, pd_release_version
35
42
  from ..operators import DataFrameOperator, DataFrameOperatorMixin
36
43
  from ..utils import build_df, build_empty_df, build_series, parse_index, validate_axis
@@ -89,12 +96,21 @@ class DataFrameAggregate(DataFrameOperator, DataFrameOperatorMixin):
89
96
  func = AnyField("func")
90
97
  func_rename = ListField("func_rename", default=None)
91
98
  axis = AnyField("axis", default=0)
92
- numeric_only = BoolField("numeric_only")
93
- bool_only = BoolField("bool_only")
94
-
95
- pre_funcs: List[ReductionPreStep] = ListField("pre_funcs")
96
- agg_funcs: List[ReductionAggStep] = ListField("agg_funcs")
97
- post_funcs: List[ReductionPostStep] = ListField("post_funcs")
99
+ numeric_only = BoolField("numeric_only", default=None)
100
+ bool_only = BoolField("bool_only", default=None)
101
+
102
+ pre_funcs: List[ReductionPreStep] = ListField("pre_funcs", default=None)
103
+ agg_funcs: List[ReductionAggStep] = ListField("agg_funcs", default=None)
104
+ post_funcs: List[ReductionPostStep] = ListField("post_funcs", default=None)
105
+ combine_size = Int32Field("combine_size", default=None)
106
+ use_inf_as_na = BoolField("use_inf_as_na", default=False)
107
+
108
+ def has_custom_code(self) -> bool:
109
+ return any(
110
+ fun.custom_reduction
111
+ and not isinstance(fun.custom_reduction, BuiltinFunction)
112
+ for fun in self.agg_funcs or ()
113
+ )
98
114
 
99
115
  @staticmethod
100
116
  def _filter_dtypes(op: "DataFrameAggregate", dtypes):
@@ -237,7 +253,11 @@ def is_funcs_aggregate(func, func_kw=None, ndim=2):
237
253
  elif isinstance(func, dict):
238
254
  if ndim == 2:
239
255
  for f in func.values():
240
- if isinstance(f, Iterable) and not isinstance(f, str):
256
+ if (
257
+ isinstance(f, Iterable)
258
+ and not isinstance(f, ENTITY_TYPE)
259
+ and not isinstance(f, str)
260
+ ):
241
261
  to_check.extend(f)
242
262
  else:
243
263
  to_check.append(f)
@@ -293,7 +313,11 @@ def normalize_reduction_funcs(op, ndim=None):
293
313
  else:
294
314
  op.func = list(raw_func.values())
295
315
  op.func_rename = list(raw_func.keys())
296
- elif isinstance(raw_func, Iterable) and not isinstance(raw_func, str):
316
+ elif (
317
+ isinstance(raw_func, Iterable)
318
+ and not isinstance(raw_func, ENTITY_TYPE)
319
+ and not isinstance(raw_func, str)
320
+ ):
297
321
  op.func = list(raw_func)
298
322
  else:
299
323
  op.func = [raw_func]
@@ -432,6 +456,7 @@ def aggregate(df, func=None, axis=0, **kw):
432
456
  min 1
433
457
  """
434
458
  axis = validate_axis(axis, df)
459
+ use_inf_as_na = kw.pop("_use_inf_as_na", pd.get_option("mode.use_inf_as_na"))
435
460
  if func == "unique":
436
461
  # workaround for direct call of unique function which
437
462
  # returns a tensor directly
@@ -456,6 +481,8 @@ def aggregate(df, func=None, axis=0, **kw):
456
481
  dtypes = kw.pop("_dtypes", None)
457
482
  index = kw.pop("_index", None)
458
483
 
484
+ combine_size = kw.pop("_combine_size", None) or kw.pop("combine_size", None)
485
+
459
486
  if not is_funcs_aggregate(func, func_kw=kw, ndim=df.ndim):
460
487
  return df.transform(func, axis=axis, _call_agg=True)
461
488
 
@@ -465,6 +492,8 @@ def aggregate(df, func=None, axis=0, **kw):
465
492
  axis=axis,
466
493
  numeric_only=numeric_only,
467
494
  bool_only=bool_only,
495
+ combine_size=combine_size,
496
+ use_inf_as_na=use_inf_as_na,
468
497
  )
469
498
 
470
499
  return op(df, output_type=output_type, dtypes=dtypes, index=index)
@@ -16,10 +16,10 @@ import numpy as np
16
16
 
17
17
  from ... import opcodes
18
18
  from ...core import OutputType
19
- from .core import DATAFRAME_TYPE, DataFrameReductionMixin, DataFrameReductionOperator
19
+ from .core import DATAFRAME_TYPE, DataFrameReduction, DataFrameReductionMixin
20
20
 
21
21
 
22
- class DataFrameAll(DataFrameReductionOperator, DataFrameReductionMixin):
22
+ class DataFrameAll(DataFrameReduction, DataFrameReductionMixin):
23
23
  _op_type_ = opcodes.ALL
24
24
  _func_name = "all"
25
25
 
@@ -16,10 +16,10 @@ import numpy as np
16
16
 
17
17
  from ... import opcodes
18
18
  from ...core import OutputType
19
- from .core import DATAFRAME_TYPE, DataFrameReductionMixin, DataFrameReductionOperator
19
+ from .core import DATAFRAME_TYPE, DataFrameReduction, DataFrameReductionMixin
20
20
 
21
21
 
22
- class DataFrameAny(DataFrameReductionOperator, DataFrameReductionMixin):
22
+ class DataFrameAny(DataFrameReduction, DataFrameReductionMixin):
23
23
  _op_type_ = opcodes.ANY
24
24
  _func_name = "any"
25
25
 
@@ -0,0 +1,100 @@
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 opcodes
16
+ from ...core import OutputType
17
+ from ..utils import validate_axis
18
+ from .core import DataFrameReduction, DataFrameReductionMixin, ReductionCallable
19
+
20
+
21
+ class DataFrameArgMax(DataFrameReduction, DataFrameReductionMixin):
22
+ _op_type_ = opcodes.ARGMAX
23
+ _func_name = "argmax"
24
+
25
+ @property
26
+ def is_atomic(self):
27
+ return True
28
+
29
+ def get_reduction_args(self, axis=None):
30
+ args = dict(skipna=self.skipna)
31
+ if self.inputs and self.inputs[0].ndim > 1:
32
+ args["axis"] = axis
33
+ return {k: v for k, v in args.items() if v is not None}
34
+
35
+ @classmethod
36
+ def get_reduction_callable(cls, op):
37
+ func_name = getattr(op, "_func_name")
38
+ kw = dict(skipna=op.skipna)
39
+ kw = {k: v for k, v in kw.items() if v is not None}
40
+ return ReductionCallable(func_name=func_name, kwargs=kw)
41
+
42
+
43
+ def argmax_series(series, axis=0, skipna=True):
44
+ """
45
+ Return int position of the smallest value in the Series.
46
+
47
+ If the maximum is achieved in multiple locations,
48
+ the first row position is returned.
49
+
50
+ Parameters
51
+ ----------
52
+ axis : {None}
53
+ Unused. Parameter needed for compatibility with DataFrame.
54
+ skipna : bool, default True
55
+ Exclude NA/null values when showing the result.
56
+ *args, **kwargs
57
+ Additional arguments and keywords for compatibility with NumPy.
58
+
59
+ Returns
60
+ -------
61
+ int
62
+ Row position of the maximum value.
63
+
64
+ See Also
65
+ --------
66
+ Series.argmin : Return position of the minimum value.
67
+ Series.argmax : Return position of the maximum value.
68
+ numpy.ndarray.argmax : Equivalent method for numpy arrays.
69
+ Series.idxmax : Return index label of the maximum values.
70
+ Series.idxmin : Return index label of the minimum values.
71
+
72
+ Examples
73
+ --------
74
+ Consider dataset containing cereal calories
75
+
76
+ >>> import maxframe.dataframe as md
77
+ >>> s = md.Series({'Corn Flakes': 100.0, 'Almond Delight': 110.0,
78
+ ... 'Cinnamon Toast Crunch': 120.0, 'Cocoa Puff': 110.0})
79
+ >>> s.execute()
80
+ Corn Flakes 100.0
81
+ Almond Delight 110.0
82
+ Cinnamon Toast Crunch 120.0
83
+ Cocoa Puff 110.0
84
+ dtype: float64
85
+
86
+ >>> s.argmax().execute()
87
+ 2
88
+ >>> s.argmin().execute()
89
+ 0
90
+
91
+ The maximum cereal calories is the third element and
92
+ the minimum cereal calories is the first element,
93
+ since series is zero-indexed.
94
+ """
95
+ validate_axis(axis, series)
96
+ op = DataFrameArgMax(
97
+ dropna=skipna,
98
+ output_types=[OutputType.scalar],
99
+ )
100
+ return op(series)
@@ -0,0 +1,100 @@
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 opcodes
16
+ from ...core import OutputType
17
+ from ..utils import validate_axis
18
+ from .core import DataFrameReduction, DataFrameReductionMixin, ReductionCallable
19
+
20
+
21
+ class DataFrameArgMin(DataFrameReduction, DataFrameReductionMixin):
22
+ _op_type_ = opcodes.ARGMIN
23
+ _func_name = "argmin"
24
+
25
+ @property
26
+ def is_atomic(self):
27
+ return True
28
+
29
+ def get_reduction_args(self, axis=None):
30
+ args = dict(skipna=self.skipna)
31
+ if self.inputs and self.inputs[0].ndim > 1:
32
+ args["axis"] = axis
33
+ return {k: v for k, v in args.items() if v is not None}
34
+
35
+ @classmethod
36
+ def get_reduction_callable(cls, op):
37
+ func_name = getattr(op, "_func_name")
38
+ kw = dict(skipna=op.skipna)
39
+ kw = {k: v for k, v in kw.items() if v is not None}
40
+ return ReductionCallable(func_name=func_name, kwargs=kw)
41
+
42
+
43
+ def argmin_series(series, axis=0, skipna=True):
44
+ """
45
+ Return int position of the smallest value in the Series.
46
+
47
+ If the minimum is achieved in multiple locations,
48
+ the first row position is returned.
49
+
50
+ Parameters
51
+ ----------
52
+ axis : {None}
53
+ Unused. Parameter needed for compatibility with DataFrame.
54
+ skipna : bool, default True
55
+ Exclude NA/null values when showing the result.
56
+ *args, **kwargs
57
+ Additional arguments and keywords for compatibility with NumPy.
58
+
59
+ Returns
60
+ -------
61
+ int
62
+ Row position of the minimum value.
63
+
64
+ See Also
65
+ --------
66
+ Series.argmin : Return position of the minimum value.
67
+ Series.argmax : Return position of the maximum value.
68
+ numpy.ndarray.argmin : Equivalent method for numpy arrays.
69
+ Series.idxmax : Return index label of the maximum values.
70
+ Series.idxmin : Return index label of the minimum values.
71
+
72
+ Examples
73
+ --------
74
+ Consider dataset containing cereal calories
75
+
76
+ >>> import maxframe.dataframe as md
77
+ >>> s = md.Series({'Corn Flakes': 100.0, 'Almond Delight': 110.0,
78
+ ... 'Cinnamon Toast Crunch': 120.0, 'Cocoa Puff': 110.0})
79
+ >>> s.execute()
80
+ Corn Flakes 100.0
81
+ Almond Delight 110.0
82
+ Cinnamon Toast Crunch 120.0
83
+ Cocoa Puff 110.0
84
+ dtype: float64
85
+
86
+ >>> s.argmax().execute()
87
+ 2
88
+ >>> s.argmin().execute()
89
+ 0
90
+
91
+ The maximum cereal calories is the third element and
92
+ the minimum cereal calories is the first element,
93
+ since series is zero-indexed.
94
+ """
95
+ validate_axis(axis, series)
96
+ op = DataFrameArgMin(
97
+ dropna=skipna,
98
+ output_types=[OutputType.scalar],
99
+ )
100
+ return op(series)