maxframe 2.0.0b2__cp311-cp311-win32.whl → 2.3.0rc1__cp311-cp311-win32.whl

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

Potentially problematic release.


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

Files changed (443) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp311-win32.pyd +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +9 -8
  5. maxframe/codegen/spe/core.py +1 -1
  6. maxframe/codegen/spe/dataframe/__init__.py +1 -0
  7. maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
  8. maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
  9. maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
  10. maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
  11. maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
  12. maxframe/codegen/spe/dataframe/groupby.py +88 -0
  13. maxframe/codegen/spe/dataframe/indexing.py +99 -4
  14. maxframe/codegen/spe/dataframe/merge.py +38 -1
  15. maxframe/codegen/spe/dataframe/misc.py +11 -33
  16. maxframe/codegen/spe/dataframe/reduction.py +32 -9
  17. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  18. maxframe/codegen/spe/dataframe/sort.py +39 -18
  19. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
  20. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
  21. maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
  22. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
  23. maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
  24. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
  25. maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
  26. maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
  27. maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
  28. maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
  29. maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
  30. maxframe/codegen/spe/dataframe/tseries.py +9 -0
  31. maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
  32. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
  33. maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
  34. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  35. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  36. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  37. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  38. maxframe/codegen/spe/tensor/__init__.py +3 -0
  39. maxframe/codegen/spe/tensor/datasource.py +1 -0
  40. maxframe/codegen/spe/tensor/fft.py +74 -0
  41. maxframe/codegen/spe/tensor/linalg.py +29 -2
  42. maxframe/codegen/spe/tensor/misc.py +79 -25
  43. maxframe/codegen/spe/tensor/spatial.py +45 -0
  44. maxframe/codegen/spe/tensor/statistics.py +44 -0
  45. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  46. maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
  47. maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
  48. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  49. maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
  50. maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
  51. maxframe/codegen/spe/utils.py +2 -0
  52. maxframe/config/config.py +73 -9
  53. maxframe/config/tests/test_validators.py +13 -1
  54. maxframe/config/validators.py +49 -0
  55. maxframe/conftest.py +54 -17
  56. maxframe/core/accessor.py +2 -2
  57. maxframe/core/base.py +2 -1
  58. maxframe/core/entity/core.py +5 -0
  59. maxframe/core/entity/tileables.py +3 -1
  60. maxframe/core/graph/core.cp311-win32.pyd +0 -0
  61. maxframe/core/graph/entity.py +8 -3
  62. maxframe/core/mode.py +6 -1
  63. maxframe/core/operator/base.py +9 -2
  64. maxframe/core/operator/core.py +10 -2
  65. maxframe/core/operator/utils.py +13 -0
  66. maxframe/dataframe/__init__.py +12 -5
  67. maxframe/dataframe/accessors/__init__.py +1 -1
  68. maxframe/dataframe/accessors/compat.py +45 -0
  69. maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
  70. maxframe/dataframe/accessors/dict_/contains.py +7 -16
  71. maxframe/dataframe/accessors/dict_/core.py +48 -0
  72. maxframe/dataframe/accessors/dict_/getitem.py +17 -21
  73. maxframe/dataframe/accessors/dict_/length.py +7 -16
  74. maxframe/dataframe/accessors/dict_/remove.py +6 -18
  75. maxframe/dataframe/accessors/dict_/setitem.py +8 -18
  76. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
  77. maxframe/dataframe/accessors/list_/__init__.py +2 -2
  78. maxframe/dataframe/accessors/list_/core.py +48 -0
  79. maxframe/dataframe/accessors/list_/getitem.py +12 -19
  80. maxframe/dataframe/accessors/list_/length.py +7 -16
  81. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
  82. maxframe/dataframe/accessors/string_/__init__.py +4 -1
  83. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  84. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  85. maxframe/dataframe/accessors/struct_/core.py +43 -0
  86. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  87. maxframe/dataframe/accessors/struct_/field.py +123 -0
  88. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  89. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  90. maxframe/dataframe/arithmetic/__init__.py +18 -4
  91. maxframe/dataframe/arithmetic/between.py +106 -0
  92. maxframe/dataframe/arithmetic/dot.py +237 -0
  93. maxframe/dataframe/arithmetic/maximum.py +33 -0
  94. maxframe/dataframe/arithmetic/minimum.py +33 -0
  95. maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
  96. maxframe/dataframe/core.py +161 -224
  97. maxframe/dataframe/datasource/__init__.py +18 -0
  98. maxframe/dataframe/datasource/core.py +6 -0
  99. maxframe/dataframe/datasource/direct.py +57 -0
  100. maxframe/dataframe/datasource/from_dict.py +124 -0
  101. maxframe/dataframe/datasource/from_index.py +1 -1
  102. maxframe/dataframe/datasource/from_records.py +77 -0
  103. maxframe/dataframe/datasource/from_tensor.py +109 -41
  104. maxframe/dataframe/datasource/read_csv.py +21 -14
  105. maxframe/dataframe/datasource/read_odps_query.py +29 -6
  106. maxframe/dataframe/datasource/read_odps_table.py +32 -10
  107. maxframe/dataframe/datasource/read_parquet.py +38 -39
  108. maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
  109. maxframe/dataframe/datastore/__init__.py +11 -1
  110. maxframe/dataframe/datastore/direct.py +268 -0
  111. maxframe/dataframe/datastore/to_csv.py +29 -41
  112. maxframe/dataframe/datastore/to_odps.py +36 -4
  113. maxframe/dataframe/extensions/__init__.py +20 -4
  114. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  115. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  116. maxframe/dataframe/extensions/collect_kv.py +126 -0
  117. maxframe/dataframe/extensions/extract_kv.py +177 -0
  118. maxframe/dataframe/extensions/flatjson.py +2 -1
  119. maxframe/dataframe/extensions/map_reduce.py +263 -0
  120. maxframe/dataframe/extensions/rebalance.py +62 -0
  121. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  122. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  123. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  124. maxframe/dataframe/groupby/__init__.py +17 -2
  125. maxframe/dataframe/groupby/aggregation.py +86 -49
  126. maxframe/dataframe/groupby/apply.py +1 -1
  127. maxframe/dataframe/groupby/apply_chunk.py +19 -5
  128. maxframe/dataframe/groupby/core.py +116 -16
  129. maxframe/dataframe/groupby/cum.py +4 -25
  130. maxframe/dataframe/groupby/expanding.py +264 -0
  131. maxframe/dataframe/groupby/fill.py +1 -1
  132. maxframe/dataframe/groupby/getitem.py +12 -5
  133. maxframe/dataframe/groupby/head.py +11 -1
  134. maxframe/dataframe/groupby/rank.py +136 -0
  135. maxframe/dataframe/groupby/rolling.py +206 -0
  136. maxframe/dataframe/groupby/shift.py +114 -0
  137. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  138. maxframe/dataframe/indexing/__init__.py +22 -2
  139. maxframe/dataframe/indexing/droplevel.py +195 -0
  140. maxframe/dataframe/indexing/filter.py +169 -0
  141. maxframe/dataframe/indexing/get_level_values.py +76 -0
  142. maxframe/dataframe/indexing/iat.py +45 -0
  143. maxframe/dataframe/indexing/iloc.py +152 -12
  144. maxframe/dataframe/indexing/insert.py +46 -18
  145. maxframe/dataframe/indexing/loc.py +287 -7
  146. maxframe/dataframe/indexing/reindex.py +14 -5
  147. maxframe/dataframe/indexing/rename.py +6 -0
  148. maxframe/dataframe/indexing/rename_axis.py +2 -2
  149. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  150. maxframe/dataframe/indexing/reset_index.py +33 -6
  151. maxframe/dataframe/indexing/sample.py +8 -0
  152. maxframe/dataframe/indexing/setitem.py +3 -3
  153. maxframe/dataframe/indexing/swaplevel.py +185 -0
  154. maxframe/dataframe/indexing/take.py +99 -0
  155. maxframe/dataframe/indexing/truncate.py +140 -0
  156. maxframe/dataframe/indexing/where.py +0 -11
  157. maxframe/dataframe/indexing/xs.py +148 -0
  158. maxframe/dataframe/merge/__init__.py +15 -1
  159. maxframe/dataframe/merge/append.py +97 -98
  160. maxframe/dataframe/merge/combine.py +244 -0
  161. maxframe/dataframe/merge/combine_first.py +120 -0
  162. maxframe/dataframe/merge/compare.py +387 -0
  163. maxframe/dataframe/merge/concat.py +183 -0
  164. maxframe/dataframe/merge/update.py +271 -0
  165. maxframe/dataframe/misc/__init__.py +28 -11
  166. maxframe/dataframe/misc/_duplicate.py +10 -4
  167. maxframe/dataframe/misc/apply.py +1 -1
  168. maxframe/dataframe/misc/check_unique.py +82 -0
  169. maxframe/dataframe/misc/clip.py +145 -0
  170. maxframe/dataframe/misc/describe.py +175 -9
  171. maxframe/dataframe/misc/drop.py +31 -0
  172. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  173. maxframe/dataframe/misc/duplicated.py +2 -2
  174. maxframe/dataframe/misc/get_dummies.py +5 -1
  175. maxframe/dataframe/misc/infer_dtypes.py +251 -0
  176. maxframe/dataframe/misc/isin.py +2 -2
  177. maxframe/dataframe/misc/map.py +125 -18
  178. maxframe/dataframe/misc/repeat.py +159 -0
  179. maxframe/dataframe/misc/tests/test_misc.py +48 -3
  180. maxframe/dataframe/misc/to_numeric.py +3 -0
  181. maxframe/dataframe/misc/transform.py +12 -5
  182. maxframe/dataframe/misc/transpose.py +13 -1
  183. maxframe/dataframe/misc/valid_index.py +115 -0
  184. maxframe/dataframe/misc/value_counts.py +38 -4
  185. maxframe/dataframe/missing/checkna.py +14 -6
  186. maxframe/dataframe/missing/dropna.py +5 -0
  187. maxframe/dataframe/missing/fillna.py +1 -1
  188. maxframe/dataframe/missing/replace.py +7 -4
  189. maxframe/dataframe/reduction/__init__.py +35 -16
  190. maxframe/dataframe/reduction/aggregation.py +43 -14
  191. maxframe/dataframe/reduction/all.py +2 -2
  192. maxframe/dataframe/reduction/any.py +2 -2
  193. maxframe/dataframe/reduction/argmax.py +103 -0
  194. maxframe/dataframe/reduction/argmin.py +103 -0
  195. maxframe/dataframe/reduction/core.py +80 -24
  196. maxframe/dataframe/reduction/count.py +13 -9
  197. maxframe/dataframe/reduction/cov.py +166 -0
  198. maxframe/dataframe/reduction/cummax.py +2 -2
  199. maxframe/dataframe/reduction/cummin.py +2 -2
  200. maxframe/dataframe/reduction/cumprod.py +2 -2
  201. maxframe/dataframe/reduction/cumsum.py +2 -2
  202. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  203. maxframe/dataframe/reduction/idxmax.py +185 -0
  204. maxframe/dataframe/reduction/idxmin.py +185 -0
  205. maxframe/dataframe/reduction/kurtosis.py +37 -30
  206. maxframe/dataframe/reduction/max.py +2 -2
  207. maxframe/dataframe/reduction/mean.py +9 -7
  208. maxframe/dataframe/reduction/median.py +2 -2
  209. maxframe/dataframe/reduction/min.py +2 -2
  210. maxframe/dataframe/reduction/mode.py +144 -0
  211. maxframe/dataframe/reduction/nunique.py +19 -11
  212. maxframe/dataframe/reduction/prod.py +18 -13
  213. maxframe/dataframe/reduction/reduction_size.py +2 -2
  214. maxframe/dataframe/reduction/sem.py +13 -9
  215. maxframe/dataframe/reduction/skew.py +31 -27
  216. maxframe/dataframe/reduction/str_concat.py +10 -7
  217. maxframe/dataframe/reduction/sum.py +18 -14
  218. maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
  219. maxframe/dataframe/reduction/unique.py +20 -3
  220. maxframe/dataframe/reduction/var.py +16 -12
  221. maxframe/dataframe/reshape/__init__.py +38 -0
  222. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  223. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  224. maxframe/dataframe/reshape/unstack.py +114 -0
  225. maxframe/dataframe/sort/__init__.py +16 -1
  226. maxframe/dataframe/sort/argsort.py +68 -0
  227. maxframe/dataframe/sort/core.py +2 -1
  228. maxframe/dataframe/sort/nlargest.py +238 -0
  229. maxframe/dataframe/sort/nsmallest.py +228 -0
  230. maxframe/dataframe/sort/rank.py +147 -0
  231. maxframe/dataframe/statistics/__init__.py +3 -3
  232. maxframe/dataframe/statistics/corr.py +1 -0
  233. maxframe/dataframe/statistics/quantile.py +2 -2
  234. maxframe/dataframe/tests/test_typing.py +104 -0
  235. maxframe/dataframe/tests/test_utils.py +66 -2
  236. maxframe/dataframe/tseries/__init__.py +19 -0
  237. maxframe/dataframe/tseries/at_time.py +61 -0
  238. maxframe/dataframe/tseries/between_time.py +122 -0
  239. maxframe/dataframe/typing_.py +185 -0
  240. maxframe/dataframe/utils.py +125 -52
  241. maxframe/dataframe/window/aggregation.py +8 -4
  242. maxframe/dataframe/window/core.py +14 -1
  243. maxframe/dataframe/window/ewm.py +1 -3
  244. maxframe/dataframe/window/expanding.py +37 -35
  245. maxframe/dataframe/window/rolling.py +49 -39
  246. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  247. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  248. maxframe/env.py +7 -4
  249. maxframe/errors.py +2 -2
  250. maxframe/io/odpsio/schema.py +9 -3
  251. maxframe/io/odpsio/tableio.py +7 -2
  252. maxframe/io/odpsio/tests/test_schema.py +198 -83
  253. maxframe/learn/__init__.py +10 -2
  254. maxframe/learn/cluster/__init__.py +15 -0
  255. maxframe/learn/cluster/_kmeans.py +782 -0
  256. maxframe/learn/contrib/llm/core.py +18 -7
  257. maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
  258. maxframe/learn/contrib/llm/deploy/config.py +221 -0
  259. maxframe/learn/contrib/llm/deploy/core.py +247 -0
  260. maxframe/learn/contrib/llm/deploy/framework.py +35 -0
  261. maxframe/learn/contrib/llm/deploy/loader.py +360 -0
  262. maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
  263. maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
  264. maxframe/learn/contrib/llm/models/__init__.py +1 -0
  265. maxframe/learn/contrib/llm/models/dashscope.py +12 -6
  266. maxframe/learn/contrib/llm/models/managed.py +76 -11
  267. maxframe/learn/contrib/llm/models/openai.py +72 -0
  268. maxframe/learn/contrib/llm/tests/__init__.py +13 -0
  269. maxframe/learn/contrib/llm/tests/test_core.py +34 -0
  270. maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
  271. maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
  272. maxframe/learn/contrib/llm/text.py +348 -42
  273. maxframe/learn/contrib/models.py +4 -1
  274. maxframe/learn/contrib/xgboost/classifier.py +2 -0
  275. maxframe/learn/contrib/xgboost/core.py +113 -4
  276. maxframe/learn/contrib/xgboost/predict.py +4 -2
  277. maxframe/learn/contrib/xgboost/regressor.py +5 -0
  278. maxframe/learn/contrib/xgboost/train.py +7 -2
  279. maxframe/learn/core.py +66 -0
  280. maxframe/learn/linear_model/_base.py +58 -1
  281. maxframe/learn/linear_model/_lin_reg.py +1 -1
  282. maxframe/learn/metrics/__init__.py +6 -0
  283. maxframe/learn/metrics/_classification.py +145 -0
  284. maxframe/learn/metrics/_ranking.py +477 -0
  285. maxframe/learn/metrics/_scorer.py +60 -0
  286. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  287. maxframe/learn/metrics/pairwise/core.py +77 -0
  288. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  289. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  290. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  291. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  292. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  293. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  294. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  295. maxframe/learn/metrics/tests/__init__.py +13 -0
  296. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  297. maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
  298. maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
  299. maxframe/learn/utils/__init__.py +2 -1
  300. maxframe/learn/utils/checks.py +1 -2
  301. maxframe/learn/utils/core.py +59 -0
  302. maxframe/learn/utils/extmath.py +79 -9
  303. maxframe/learn/utils/odpsio.py +262 -0
  304. maxframe/learn/utils/validation.py +2 -2
  305. maxframe/lib/compat.py +40 -0
  306. maxframe/lib/dtypes_extension/__init__.py +16 -1
  307. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  308. maxframe/lib/dtypes_extension/blob.py +304 -0
  309. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  310. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  311. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  312. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  313. maxframe/lib/filesystem/_oss_lib/common.py +124 -50
  314. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  315. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  316. maxframe/lib/filesystem/base.py +1 -1
  317. maxframe/lib/filesystem/core.py +1 -1
  318. maxframe/lib/filesystem/oss.py +115 -46
  319. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  320. maxframe/lib/mmh3.cp311-win32.pyd +0 -0
  321. maxframe/lib/wrapped_pickle.py +10 -0
  322. maxframe/opcodes.py +41 -15
  323. maxframe/protocol.py +12 -0
  324. maxframe/remote/core.py +4 -0
  325. maxframe/serialization/__init__.py +11 -2
  326. maxframe/serialization/arrow.py +38 -13
  327. maxframe/serialization/blob.py +32 -0
  328. maxframe/serialization/core.cp311-win32.pyd +0 -0
  329. maxframe/serialization/core.pyx +39 -1
  330. maxframe/serialization/exception.py +2 -4
  331. maxframe/serialization/numpy.py +11 -0
  332. maxframe/serialization/pandas.py +46 -9
  333. maxframe/serialization/serializables/core.py +2 -2
  334. maxframe/serialization/tests/test_serial.py +31 -4
  335. maxframe/tensor/__init__.py +38 -8
  336. maxframe/tensor/arithmetic/__init__.py +19 -10
  337. maxframe/tensor/arithmetic/core.py +2 -2
  338. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  339. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
  340. maxframe/tensor/core.py +6 -2
  341. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  342. maxframe/tensor/extensions/__init__.py +2 -0
  343. maxframe/tensor/extensions/apply_chunk.py +3 -3
  344. maxframe/tensor/extensions/rebalance.py +65 -0
  345. maxframe/tensor/fft/__init__.py +32 -0
  346. maxframe/tensor/fft/core.py +168 -0
  347. maxframe/tensor/fft/fft.py +112 -0
  348. maxframe/tensor/fft/fft2.py +118 -0
  349. maxframe/tensor/fft/fftfreq.py +80 -0
  350. maxframe/tensor/fft/fftn.py +123 -0
  351. maxframe/tensor/fft/fftshift.py +79 -0
  352. maxframe/tensor/fft/hfft.py +112 -0
  353. maxframe/tensor/fft/ifft.py +114 -0
  354. maxframe/tensor/fft/ifft2.py +115 -0
  355. maxframe/tensor/fft/ifftn.py +123 -0
  356. maxframe/tensor/fft/ifftshift.py +73 -0
  357. maxframe/tensor/fft/ihfft.py +93 -0
  358. maxframe/tensor/fft/irfft.py +118 -0
  359. maxframe/tensor/fft/irfft2.py +62 -0
  360. maxframe/tensor/fft/irfftn.py +114 -0
  361. maxframe/tensor/fft/rfft.py +116 -0
  362. maxframe/tensor/fft/rfft2.py +63 -0
  363. maxframe/tensor/fft/rfftfreq.py +87 -0
  364. maxframe/tensor/fft/rfftn.py +113 -0
  365. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  366. maxframe/tensor/linalg/__init__.py +7 -0
  367. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  368. maxframe/tensor/linalg/cholesky.py +117 -0
  369. maxframe/tensor/linalg/einsum.py +339 -0
  370. maxframe/tensor/linalg/lstsq.py +100 -0
  371. maxframe/tensor/linalg/matrix_norm.py +75 -0
  372. maxframe/tensor/linalg/norm.py +249 -0
  373. maxframe/tensor/linalg/solve.py +72 -0
  374. maxframe/tensor/linalg/solve_triangular.py +2 -2
  375. maxframe/tensor/linalg/vector_norm.py +113 -0
  376. maxframe/tensor/misc/__init__.py +24 -1
  377. maxframe/tensor/misc/argwhere.py +72 -0
  378. maxframe/tensor/misc/array_split.py +46 -0
  379. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  380. maxframe/tensor/misc/copyto.py +130 -0
  381. maxframe/tensor/misc/delete.py +104 -0
  382. maxframe/tensor/misc/dsplit.py +68 -0
  383. maxframe/tensor/misc/ediff1d.py +74 -0
  384. maxframe/tensor/misc/expand_dims.py +85 -0
  385. maxframe/tensor/misc/flip.py +90 -0
  386. maxframe/tensor/misc/fliplr.py +64 -0
  387. maxframe/tensor/misc/flipud.py +68 -0
  388. maxframe/tensor/misc/hsplit.py +85 -0
  389. maxframe/tensor/misc/insert.py +139 -0
  390. maxframe/tensor/misc/moveaxis.py +83 -0
  391. maxframe/tensor/misc/result_type.py +88 -0
  392. maxframe/tensor/misc/roll.py +124 -0
  393. maxframe/tensor/misc/rollaxis.py +77 -0
  394. maxframe/tensor/misc/shape.py +89 -0
  395. maxframe/tensor/misc/split.py +190 -0
  396. maxframe/tensor/misc/tile.py +109 -0
  397. maxframe/tensor/misc/vsplit.py +74 -0
  398. maxframe/tensor/reduction/array_equal.py +2 -1
  399. maxframe/tensor/sort/__init__.py +2 -0
  400. maxframe/tensor/sort/argpartition.py +98 -0
  401. maxframe/tensor/sort/partition.py +228 -0
  402. maxframe/tensor/spatial/__init__.py +15 -0
  403. maxframe/tensor/spatial/distance/__init__.py +17 -0
  404. maxframe/tensor/spatial/distance/cdist.py +421 -0
  405. maxframe/tensor/spatial/distance/pdist.py +398 -0
  406. maxframe/tensor/spatial/distance/squareform.py +153 -0
  407. maxframe/tensor/special/__init__.py +159 -21
  408. maxframe/tensor/special/airy.py +55 -0
  409. maxframe/tensor/special/bessel.py +199 -0
  410. maxframe/tensor/special/core.py +65 -4
  411. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  412. maxframe/tensor/special/ellip_harm.py +55 -0
  413. maxframe/tensor/special/err_fresnel.py +223 -0
  414. maxframe/tensor/special/gamma_funcs.py +303 -0
  415. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  416. maxframe/tensor/special/info_theory.py +189 -0
  417. maxframe/tensor/special/misc.py +21 -0
  418. maxframe/tensor/statistics/__init__.py +6 -0
  419. maxframe/tensor/statistics/corrcoef.py +77 -0
  420. maxframe/tensor/statistics/cov.py +222 -0
  421. maxframe/tensor/statistics/digitize.py +126 -0
  422. maxframe/tensor/statistics/histogram.py +520 -0
  423. maxframe/tensor/statistics/median.py +85 -0
  424. maxframe/tensor/statistics/ptp.py +89 -0
  425. maxframe/tensor/utils.py +3 -3
  426. maxframe/tests/test_udf.py +61 -0
  427. maxframe/tests/test_utils.py +51 -6
  428. maxframe/tests/utils.py +0 -2
  429. maxframe/typing_.py +2 -0
  430. maxframe/udf.py +130 -9
  431. maxframe/utils.py +254 -27
  432. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
  433. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
  434. maxframe_client/fetcher.py +35 -4
  435. maxframe_client/session/odps.py +7 -2
  436. maxframe_client/session/task.py +8 -1
  437. maxframe_client/tests/test_fetcher.py +76 -3
  438. maxframe_client/tests/test_session.py +28 -1
  439. maxframe/dataframe/arrays.py +0 -864
  440. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  441. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  442. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
  443. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -25,6 +25,10 @@ cudf = lazy_import("cudf")
25
25
 
26
26
 
27
27
  class GroupByCumReductionOperator(DataFrameOperatorMixin, DataFrameOperator):
28
+ """
29
+ NOTE: this operator has been deprecated and merged with GroupByExpandingAgg.
30
+ """
31
+
28
32
  _op_module_ = "dataframe.groupby"
29
33
 
30
34
  axis = AnyField("axis", default=None)
@@ -96,28 +100,3 @@ class GroupByCumprod(GroupByCumReductionOperator):
96
100
  class GroupByCumcount(GroupByCumReductionOperator):
97
101
  _op_type_ = opcodes.CUMCOUNT
98
102
  _func_name = "cumcount"
99
-
100
-
101
- def cumcount(groupby, ascending: bool = True):
102
- op = GroupByCumcount(ascending=ascending)
103
- return op(groupby)
104
-
105
-
106
- def cummin(groupby, axis=0):
107
- op = GroupByCummin(axis=axis)
108
- return op(groupby)
109
-
110
-
111
- def cummax(groupby, axis=0):
112
- op = GroupByCummax(axis=axis)
113
- return op(groupby)
114
-
115
-
116
- def cumprod(groupby, axis=0):
117
- op = GroupByCumprod(axis=axis)
118
- return op(groupby)
119
-
120
-
121
- def cumsum(groupby, axis=0):
122
- op = GroupByCumsum(axis=axis)
123
- return op(groupby)
@@ -0,0 +1,264 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Any, Dict
16
+
17
+ import pandas as pd
18
+
19
+ from ... import opcodes
20
+ from ...serialization.serializables import AnyField, DictField
21
+ from ..window.expanding import Expanding
22
+ from .core import BaseGroupByWindowOp
23
+
24
+ _supported_funcs = {
25
+ "sum",
26
+ "prod",
27
+ "mean",
28
+ "std",
29
+ "var",
30
+ "median",
31
+ "min",
32
+ "max",
33
+ "count",
34
+ }
35
+
36
+
37
+ class GroupByExpandingAgg(BaseGroupByWindowOp):
38
+ _op_type_ = opcodes.EXPANDING_AGG
39
+
40
+ func = AnyField("func", default=None)
41
+ kwargs = DictField("kwargs", default_factory=dict)
42
+
43
+ def _calc_mock_result_df(self, mock_groupby):
44
+ expanding_args = self.window_params.copy()
45
+ # exclude MF-specific args
46
+ for key in Expanding._mf_specific_fields:
47
+ expanding_args.pop(key, None)
48
+
49
+ def apply_func(frame, **_):
50
+ func = self.func
51
+ if self.func == "prod":
52
+ func = lambda x: x.prod()
53
+ return frame.expanding(**expanding_args).agg(func)
54
+
55
+ is_cumcount = self.kwargs.get("cumcount", False)
56
+ # special handling for cumcount which returns a series
57
+ if is_cumcount:
58
+ return mock_groupby.cumcount(ascending=self.kwargs.get("ascending", True))
59
+ if self.func in ["sum", "max", "min", "prod"]:
60
+ return getattr(mock_groupby, f"cum{self.func}")()
61
+ return mock_groupby.apply(apply_func, include_groups=False)
62
+
63
+ def get_sort_cols_to_asc(self) -> Dict[Any, bool]:
64
+ res = super().get_sort_cols_to_asc()
65
+ if self.func == "count" and self.kwargs.get("ascending") is not None:
66
+ res = {k: not v for k, v in res.items()}
67
+ return res
68
+
69
+
70
+ class ExpandingGroupby(Expanding):
71
+ def aggregate(self, func, **kwargs):
72
+ if func not in _supported_funcs:
73
+ raise NotImplementedError(f"func {func} is not supported")
74
+ op = GroupByExpandingAgg(
75
+ func=func,
76
+ groupby_params=self.input.op.groupby_params,
77
+ window_params=self.params,
78
+ kwargs=kwargs,
79
+ )
80
+ return op(self.input)
81
+
82
+ agg = aggregate
83
+
84
+
85
+ def expanding(
86
+ groupby,
87
+ min_periods=1,
88
+ *,
89
+ shift=0,
90
+ reverse_range=False,
91
+ order_cols=None,
92
+ ascending=True,
93
+ ):
94
+ """
95
+ Return an expanding grouper, providing expanding
96
+ functionality per group.
97
+
98
+ Parameters
99
+ ----------
100
+ min_periods : int, default None
101
+ Minimum number of observations in window required to have a value;
102
+ otherwise, result is ``np.nan``.
103
+
104
+ shift : int, default 0
105
+ If specified, the window will be shifted by `shift` rows (or data will be
106
+ shifted by `-shift` rows) before computing window function.
107
+
108
+ reverse_range : bool, default False
109
+ If True, the window for current row is expanded from the last row to
110
+ the current instead of the first row.
111
+
112
+ Returns
113
+ -------
114
+ maxframe.dataframe.groupby.ExpandingGroupby
115
+
116
+ See Also
117
+ --------
118
+ Series.groupby : Apply a function groupby to a Series.
119
+ DataFrame.groupby : Apply a function groupby
120
+ to each row or column of a DataFrame.
121
+ """
122
+ return ExpandingGroupby(
123
+ input=groupby,
124
+ min_periods=min_periods,
125
+ shift=shift,
126
+ reverse_range=reverse_range,
127
+ order_cols=order_cols,
128
+ ascending=ascending,
129
+ )
130
+
131
+
132
+ _cum_doc_template = """
133
+ Cumulative %(func_name)s for each group.
134
+
135
+ Returns
136
+ -------
137
+ Series or DataFrame
138
+
139
+ See Also
140
+ --------
141
+ Series.groupby : Apply a function groupby to a Series.
142
+ DataFrame.groupby : Apply a function groupby
143
+ to each row or column of a DataFrame.
144
+
145
+ Examples
146
+ --------
147
+ For SeriesGroupBy:
148
+
149
+ >>> import maxframe.dataframe as md
150
+ >>> lst = ['a', 'a', 'b']
151
+ >>> ser = md.Series([6, 2, 0], index=lst)
152
+ >>> ser.execute()
153
+ a 6
154
+ a 2
155
+ b 0
156
+ dtype: int64
157
+ >>> ser.groupby(level=0).cum%(func_name)s().execute()
158
+ %(series_result)s
159
+
160
+ For DataFrameGroupBy:
161
+
162
+ >>> data = [[1, 8, 2], [1, 2, 5], [2, 6, 9]]
163
+ >>> df = md.DataFrame(data, columns=["a", "b", "c"],
164
+ ... index=["fox", "gorilla", "lion"])
165
+ >>> df.execute()
166
+ a b c
167
+ fox 1 8 2
168
+ gorilla 1 2 5
169
+ lion 2 6 9
170
+ >>> df.groupby("a").groups.execute()
171
+ {1: ['fox', 'gorilla'], 2: ['lion']}
172
+ >>> df.groupby("a").cum%(func_name)s().execute()
173
+ %(df_result)s
174
+ """
175
+
176
+
177
+ def _build_cum_docs(func_name):
178
+ ser = pd.Series([6, 2, 0], index=list("aab"))
179
+ data = [[1, 8, 2], [1, 2, 5], [2, 6, 9]]
180
+ df = pd.DataFrame(data, columns=["a", "b", "c"], index=["fox", "gorilla", "lion"])
181
+ cum_func_name = f"cum{func_name}"
182
+ return _cum_doc_template % dict(
183
+ func_name=func_name,
184
+ series_result=getattr(ser.groupby(level=0), cum_func_name)().to_string(),
185
+ df_result=getattr(df.groupby("a"), cum_func_name)().to_string(),
186
+ )
187
+
188
+
189
+ def cumcount(groupby, ascending: bool = True):
190
+ """
191
+ Number each item in each group from 0 to the length of that group - 1.
192
+
193
+ Essentially this is equivalent to
194
+
195
+ .. code-block:: python
196
+
197
+ self.apply(lambda x: pd.Series(np.arange(len(x)), x.index))
198
+
199
+ Parameters
200
+ ----------
201
+ ascending : bool, default True
202
+ If False, number in reverse, from length of group - 1 to 0.
203
+
204
+ Returns
205
+ -------
206
+ Series
207
+ Sequence number of each element within each group.
208
+
209
+ See Also
210
+ --------
211
+ .ngroup : Number the groups themselves.
212
+
213
+ Examples
214
+ --------
215
+ >>> import maxframe.tensor as mt
216
+ >>> import maxframe.dataframe as md
217
+ >>> df = md.DataFrame([['a'], ['a'], ['a'], ['b'], ['b'], ['a']],
218
+ ... columns=['A'])
219
+ >>> df.execute()
220
+ A
221
+ 0 a
222
+ 1 a
223
+ 2 a
224
+ 3 b
225
+ 4 b
226
+ 5 a
227
+ >>> df.groupby('A').cumcount().execute()
228
+ 0 0
229
+ 1 1
230
+ 2 2
231
+ 3 0
232
+ 4 1
233
+ 5 3
234
+ dtype: int64
235
+ >>> df.groupby('A').cumcount(ascending=False).execute()
236
+ 0 3
237
+ 1 2
238
+ 2 1
239
+ 3 1
240
+ 4 0
241
+ 5 0
242
+ dtype: int64
243
+ """
244
+ return groupby.expanding().agg("count", ascending=ascending, cumcount=True)
245
+
246
+
247
+ def cummin(groupby):
248
+ return groupby.expanding().min()
249
+
250
+
251
+ def cummax(groupby):
252
+ return groupby.expanding().max()
253
+
254
+
255
+ def cumprod(groupby):
256
+ return groupby.expanding().prod()
257
+
258
+
259
+ def cumsum(groupby):
260
+ return groupby.expanding().sum()
261
+
262
+
263
+ for _func in (cummin, cummax, cumprod, cumsum):
264
+ _func.__doc__ = _build_cum_docs(_func.__name__[3:])
@@ -23,7 +23,7 @@ from ..utils import parse_index
23
23
 
24
24
  class GroupByFill(DataFrameOperator, DataFrameOperatorMixin):
25
25
  _op_module_ = "dataframe.groupby"
26
- _legacy_name = "GroupByFillOperator"
26
+ _legacy_name = "GroupByFillOperator" # since v2.0.0
27
27
 
28
28
  value = AnyField("value", default=None)
29
29
  method = StringField("method", default=None)
@@ -15,7 +15,7 @@
15
15
  from collections.abc import Iterable
16
16
 
17
17
  from ... import opcodes
18
- from ...core import OutputType
18
+ from ...core import ENTITY_TYPE, OutputType
19
19
  from ...serialization.serializables import AnyField
20
20
  from ..operators import DataFrameOperator, DataFrameOperatorMixin
21
21
  from ..utils import parse_index
@@ -38,7 +38,8 @@ class GroupByIndex(DataFrameOperatorMixin, DataFrameOperator):
38
38
 
39
39
  def build_mock_groupby(self, **kwargs):
40
40
  groupby_op = self.inputs[0].op
41
- return groupby_op.build_mock_groupby(**kwargs)[self.selection]
41
+ selection = kwargs.pop("selection", None) or self.selection
42
+ return groupby_op.build_mock_groupby(**kwargs)[selection]
42
43
 
43
44
  def __call__(self, groupby):
44
45
  indexed = groupby.op.build_mock_groupby()[self.selection]
@@ -55,8 +56,10 @@ class GroupByIndex(DataFrameOperatorMixin, DataFrameOperator):
55
56
  else:
56
57
  self.output_types = [OutputType.dataframe_groupby]
57
58
 
58
- if isinstance(self.selection, Iterable) and not isinstance(
59
- self.selection, str
59
+ if (
60
+ isinstance(self.selection, Iterable)
61
+ and not isinstance(self.selection, str)
62
+ and not isinstance(self.selection, ENTITY_TYPE)
60
63
  ):
61
64
  item_list = list(self.selection)
62
65
  else:
@@ -80,7 +83,11 @@ def df_groupby_getitem(df_groupby, item):
80
83
 
81
84
  if hashable and item in df_groupby.dtypes:
82
85
  output_types = [OutputType.series_groupby]
83
- elif isinstance(item, Iterable) and all(it in df_groupby.dtypes for it in item):
86
+ elif (
87
+ isinstance(item, Iterable)
88
+ and not isinstance(item, ENTITY_TYPE)
89
+ and all(it in df_groupby.dtypes for it in item)
90
+ ):
84
91
  output_types = [OutputType.dataframe_groupby]
85
92
  else:
86
93
  raise NameError(f"Cannot slice groupby with {item!r}")
@@ -17,8 +17,10 @@ import pandas as pd
17
17
 
18
18
  from ... import opcodes
19
19
  from ...core import OutputType
20
+ from ...serialization import PickleContainer
20
21
  from ...serialization.serializables import BoolField, DictField, Int64Field
21
- from ...utils import pd_release_version
22
+ from ...udf import BuiltinFunction
23
+ from ...utils import find_objects, pd_release_version
22
24
  from ..core import IndexValue
23
25
  from ..operators import DataFrameOperator, DataFrameOperatorMixin
24
26
  from ..utils import parse_index
@@ -34,6 +36,14 @@ class GroupByHead(DataFrameOperator, DataFrameOperatorMixin):
34
36
  groupby_params = DictField("groupby_params", default=dict())
35
37
  enable_negative = BoolField("enable_negative", default=_pandas_enable_negative)
36
38
 
39
+ def has_custom_code(self) -> bool:
40
+ callable_bys = find_objects(
41
+ self.groupby_params.get("by"), types=PickleContainer, checker=callable
42
+ )
43
+ if not callable_bys:
44
+ return False
45
+ return any(not isinstance(fun, BuiltinFunction) for fun in callable_bys)
46
+
37
47
  def __call__(self, groupby):
38
48
  df = groupby
39
49
  while df.op.output_types[0] not in (OutputType.dataframe, OutputType.series):
@@ -0,0 +1,136 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Any, Dict
16
+
17
+ from ... import opcodes
18
+ from ...serialization.serializables import BoolField, FieldTypes, ListField, StringField
19
+ from ..utils import make_column_list
20
+ from .core import BaseGroupByWindowOp
21
+
22
+
23
+ class GroupByRank(BaseGroupByWindowOp):
24
+ _op_type_ = opcodes.RANK
25
+
26
+ method = StringField("method", default=None)
27
+ ascending = ListField("ascending", FieldTypes.bool, default=True)
28
+ na_option = StringField("na_option", default=None)
29
+ pct = BoolField("pct", default=False)
30
+
31
+ def _calc_mock_result_df(self, mock_groupby):
32
+ return mock_groupby.rank(
33
+ method=self.method,
34
+ ascending=self.ascending,
35
+ na_option=self.na_option,
36
+ pct=self.pct,
37
+ )
38
+
39
+ def get_sort_cols_to_asc(self) -> Dict[Any, bool]:
40
+ if self.inputs[0].ndim == 1:
41
+ return {self.inputs[0].name: self.ascending}
42
+ selections = make_column_list(
43
+ self.groupby_params.get("selection", []), self.inputs[0].dtypes
44
+ )
45
+ if not selections:
46
+ by_cols = set(
47
+ make_column_list(
48
+ self.groupby_params.get("by") or [], self.inputs[0].dtypes
49
+ )
50
+ )
51
+ selections = [c for c in self.inputs[0].dtypes.index if c not in by_cols]
52
+
53
+ if len(self.ascending) < len(selections):
54
+ ascending = [self.ascending[0]] * len(selections)
55
+ else:
56
+ ascending = self.ascending
57
+ return dict(zip(selections, ascending))
58
+
59
+
60
+ def rank(groupby, method="average", ascending=True, na_option="keep", pct=False):
61
+ """
62
+ Provide the rank of values within each group.
63
+
64
+ Parameters
65
+ ----------
66
+ method : {'average', 'min', 'max', 'first', 'dense'}, default 'average'
67
+ * average: average rank of group.
68
+ * min: lowest rank in group.
69
+ * max: highest rank in group.
70
+ * first: ranks assigned in order they appear in the array.
71
+ * dense: like 'min', but rank always increases by 1 between groups.
72
+ ascending : bool, default True
73
+ False for ranks by high (1) to low (N).
74
+ na_option : {'keep', 'top', 'bottom'}, default 'keep'
75
+ * keep: leave NA values where they are.
76
+ * top: smallest rank if ascending.
77
+ * bottom: smallest rank if descending.
78
+ pct : bool, default False
79
+ Compute percentage rank of data within each group.
80
+
81
+ Returns
82
+ -------
83
+ DataFrame with ranking of values within each group
84
+
85
+ See Also
86
+ --------
87
+ Series.groupby : Apply a function groupby to a Series.
88
+ DataFrame.groupby : Apply a function groupby
89
+ to each row or column of a DataFrame.
90
+
91
+ Examples
92
+ --------
93
+ >>> import maxframe.dataframe as md
94
+ >>> df = md.DataFrame(
95
+ ... {
96
+ ... "group": ["a", "a", "a", "a", "a", "b", "b", "b", "b", "b"],
97
+ ... "value": [2, 4, 2, 3, 5, 1, 2, 4, 1, 5],
98
+ ... }
99
+ ... )
100
+ >>> df.execute()
101
+ group value
102
+ 0 a 2
103
+ 1 a 4
104
+ 2 a 2
105
+ 3 a 3
106
+ 4 a 5
107
+ 5 b 1
108
+ 6 b 2
109
+ 7 b 4
110
+ 8 b 1
111
+ 9 b 5
112
+ >>> for method in ['average', 'min', 'max', 'dense', 'first']:
113
+ ... df[f'{method}_rank'] = df.groupby('group')['value'].rank(method)
114
+ >>> df.execute()
115
+ group value average_rank min_rank max_rank dense_rank first_rank
116
+ 0 a 2 1.5 1.0 2.0 1.0 1.0
117
+ 1 a 4 4.0 4.0 4.0 3.0 4.0
118
+ 2 a 2 1.5 1.0 2.0 1.0 2.0
119
+ 3 a 3 3.0 3.0 3.0 2.0 3.0
120
+ 4 a 5 5.0 5.0 5.0 4.0 5.0
121
+ 5 b 1 1.5 1.0 2.0 1.0 1.0
122
+ 6 b 2 3.0 3.0 3.0 2.0 3.0
123
+ 7 b 4 4.0 4.0 4.0 3.0 4.0
124
+ 8 b 1 1.5 1.0 2.0 1.0 2.0
125
+ 9 b 5 5.0 5.0 5.0 4.0 5.0
126
+ """
127
+ if not isinstance(ascending, list):
128
+ ascending = [ascending]
129
+ op = GroupByRank(
130
+ method=method,
131
+ ascending=ascending,
132
+ na_option=na_option,
133
+ pct=pct,
134
+ groupby_params=groupby.op.groupby_params,
135
+ )
136
+ return op(groupby)