maxframe 2.0.0b1__cp38-cp38-macosx_10_9_universal2.whl → 2.2.0__cp38-cp38-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 (395) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cpython-38-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-38-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/read_odps_query.py +76 -16
  96. maxframe/dataframe/datasource/tests/test_datasource.py +84 -1
  97. maxframe/dataframe/datastore/__init__.py +5 -1
  98. maxframe/dataframe/datastore/to_csv.py +29 -41
  99. maxframe/dataframe/datastore/to_odps.py +30 -4
  100. maxframe/dataframe/extensions/__init__.py +20 -4
  101. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  102. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  103. maxframe/dataframe/extensions/collect_kv.py +126 -0
  104. maxframe/dataframe/extensions/extract_kv.py +177 -0
  105. maxframe/dataframe/extensions/map_reduce.py +263 -0
  106. maxframe/dataframe/extensions/rebalance.py +62 -0
  107. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  108. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  109. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  110. maxframe/dataframe/groupby/__init__.py +12 -1
  111. maxframe/dataframe/groupby/aggregation.py +78 -45
  112. maxframe/dataframe/groupby/apply.py +1 -1
  113. maxframe/dataframe/groupby/apply_chunk.py +18 -2
  114. maxframe/dataframe/groupby/core.py +96 -12
  115. maxframe/dataframe/groupby/cum.py +4 -25
  116. maxframe/dataframe/groupby/expanding.py +264 -0
  117. maxframe/dataframe/groupby/fill.py +1 -1
  118. maxframe/dataframe/groupby/getitem.py +12 -5
  119. maxframe/dataframe/groupby/head.py +11 -1
  120. maxframe/dataframe/groupby/rank.py +136 -0
  121. maxframe/dataframe/groupby/rolling.py +206 -0
  122. maxframe/dataframe/groupby/shift.py +114 -0
  123. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  124. maxframe/dataframe/indexing/__init__.py +20 -1
  125. maxframe/dataframe/indexing/droplevel.py +195 -0
  126. maxframe/dataframe/indexing/filter.py +169 -0
  127. maxframe/dataframe/indexing/get_level_values.py +76 -0
  128. maxframe/dataframe/indexing/iat.py +45 -0
  129. maxframe/dataframe/indexing/iloc.py +152 -12
  130. maxframe/dataframe/indexing/insert.py +1 -1
  131. maxframe/dataframe/indexing/loc.py +287 -7
  132. maxframe/dataframe/indexing/reindex.py +14 -5
  133. maxframe/dataframe/indexing/rename.py +6 -0
  134. maxframe/dataframe/indexing/rename_axis.py +2 -2
  135. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  136. maxframe/dataframe/indexing/reset_index.py +33 -6
  137. maxframe/dataframe/indexing/sample.py +8 -0
  138. maxframe/dataframe/indexing/setitem.py +3 -3
  139. maxframe/dataframe/indexing/swaplevel.py +185 -0
  140. maxframe/dataframe/indexing/take.py +99 -0
  141. maxframe/dataframe/indexing/truncate.py +140 -0
  142. maxframe/dataframe/indexing/where.py +0 -11
  143. maxframe/dataframe/indexing/xs.py +148 -0
  144. maxframe/dataframe/merge/__init__.py +12 -1
  145. maxframe/dataframe/merge/append.py +97 -98
  146. maxframe/dataframe/merge/combine_first.py +120 -0
  147. maxframe/dataframe/merge/compare.py +387 -0
  148. maxframe/dataframe/merge/concat.py +183 -0
  149. maxframe/dataframe/merge/update.py +271 -0
  150. maxframe/dataframe/misc/__init__.py +16 -10
  151. maxframe/dataframe/misc/_duplicate.py +10 -4
  152. maxframe/dataframe/misc/apply.py +1 -1
  153. maxframe/dataframe/misc/check_unique.py +51 -0
  154. maxframe/dataframe/misc/clip.py +145 -0
  155. maxframe/dataframe/misc/describe.py +175 -9
  156. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  157. maxframe/dataframe/misc/duplicated.py +2 -2
  158. maxframe/dataframe/misc/get_dummies.py +5 -1
  159. maxframe/dataframe/misc/isin.py +2 -2
  160. maxframe/dataframe/misc/map.py +94 -0
  161. maxframe/dataframe/misc/tests/test_misc.py +13 -2
  162. maxframe/dataframe/misc/to_numeric.py +3 -0
  163. maxframe/dataframe/misc/transform.py +12 -5
  164. maxframe/dataframe/misc/transpose.py +13 -1
  165. maxframe/dataframe/misc/valid_index.py +115 -0
  166. maxframe/dataframe/misc/value_counts.py +38 -4
  167. maxframe/dataframe/missing/checkna.py +13 -6
  168. maxframe/dataframe/missing/dropna.py +5 -0
  169. maxframe/dataframe/missing/fillna.py +1 -1
  170. maxframe/dataframe/missing/replace.py +7 -4
  171. maxframe/dataframe/reduction/__init__.py +29 -15
  172. maxframe/dataframe/reduction/aggregation.py +38 -9
  173. maxframe/dataframe/reduction/all.py +2 -2
  174. maxframe/dataframe/reduction/any.py +2 -2
  175. maxframe/dataframe/reduction/argmax.py +100 -0
  176. maxframe/dataframe/reduction/argmin.py +100 -0
  177. maxframe/dataframe/reduction/core.py +65 -18
  178. maxframe/dataframe/reduction/count.py +13 -9
  179. maxframe/dataframe/reduction/cov.py +166 -0
  180. maxframe/dataframe/reduction/cummax.py +2 -2
  181. maxframe/dataframe/reduction/cummin.py +2 -2
  182. maxframe/dataframe/reduction/cumprod.py +2 -2
  183. maxframe/dataframe/reduction/cumsum.py +2 -2
  184. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  185. maxframe/dataframe/reduction/idxmax.py +185 -0
  186. maxframe/dataframe/reduction/idxmin.py +185 -0
  187. maxframe/dataframe/reduction/kurtosis.py +37 -30
  188. maxframe/dataframe/reduction/max.py +2 -2
  189. maxframe/dataframe/reduction/mean.py +9 -7
  190. maxframe/dataframe/reduction/median.py +2 -2
  191. maxframe/dataframe/reduction/min.py +2 -2
  192. maxframe/dataframe/reduction/nunique.py +9 -8
  193. maxframe/dataframe/reduction/prod.py +18 -13
  194. maxframe/dataframe/reduction/reduction_size.py +2 -2
  195. maxframe/dataframe/reduction/sem.py +13 -9
  196. maxframe/dataframe/reduction/skew.py +31 -27
  197. maxframe/dataframe/reduction/str_concat.py +10 -7
  198. maxframe/dataframe/reduction/sum.py +18 -14
  199. maxframe/dataframe/reduction/unique.py +20 -3
  200. maxframe/dataframe/reduction/var.py +16 -12
  201. maxframe/dataframe/reshape/__init__.py +38 -0
  202. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  203. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  204. maxframe/dataframe/reshape/unstack.py +114 -0
  205. maxframe/dataframe/sort/__init__.py +8 -0
  206. maxframe/dataframe/sort/argsort.py +62 -0
  207. maxframe/dataframe/sort/core.py +1 -0
  208. maxframe/dataframe/sort/nlargest.py +238 -0
  209. maxframe/dataframe/sort/nsmallest.py +228 -0
  210. maxframe/dataframe/statistics/__init__.py +3 -3
  211. maxframe/dataframe/statistics/corr.py +1 -0
  212. maxframe/dataframe/statistics/quantile.py +2 -2
  213. maxframe/dataframe/tests/test_typing.py +104 -0
  214. maxframe/dataframe/tests/test_utils.py +66 -2
  215. maxframe/dataframe/typing_.py +185 -0
  216. maxframe/dataframe/utils.py +95 -26
  217. maxframe/dataframe/window/aggregation.py +8 -4
  218. maxframe/dataframe/window/core.py +14 -1
  219. maxframe/dataframe/window/ewm.py +1 -3
  220. maxframe/dataframe/window/expanding.py +37 -35
  221. maxframe/dataframe/window/rolling.py +49 -39
  222. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  223. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  224. maxframe/env.py +7 -4
  225. maxframe/errors.py +2 -2
  226. maxframe/io/objects/tests/test_object_io.py +4 -2
  227. maxframe/io/odpsio/schema.py +9 -3
  228. maxframe/io/odpsio/tableio.py +7 -2
  229. maxframe/io/odpsio/tests/test_schema.py +198 -83
  230. maxframe/io/odpsio/tests/test_volumeio.py +4 -15
  231. maxframe/io/odpsio/volumeio.py +23 -8
  232. maxframe/learn/__init__.py +10 -2
  233. maxframe/learn/cluster/__init__.py +15 -0
  234. maxframe/learn/cluster/_kmeans.py +782 -0
  235. maxframe/learn/contrib/llm/core.py +2 -0
  236. maxframe/learn/contrib/xgboost/core.py +87 -1
  237. maxframe/learn/contrib/xgboost/train.py +5 -2
  238. maxframe/learn/core.py +66 -0
  239. maxframe/learn/linear_model/_base.py +58 -1
  240. maxframe/learn/linear_model/_lin_reg.py +1 -1
  241. maxframe/learn/metrics/__init__.py +6 -0
  242. maxframe/learn/metrics/_classification.py +145 -0
  243. maxframe/learn/metrics/_ranking.py +477 -0
  244. maxframe/learn/metrics/_scorer.py +60 -0
  245. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  246. maxframe/learn/metrics/pairwise/core.py +77 -0
  247. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  248. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  249. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  250. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  251. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  252. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  253. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  254. maxframe/learn/metrics/tests/__init__.py +13 -0
  255. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  256. maxframe/learn/utils/__init__.py +1 -1
  257. maxframe/learn/utils/checks.py +1 -2
  258. maxframe/learn/utils/core.py +59 -0
  259. maxframe/learn/utils/extmath.py +37 -0
  260. maxframe/learn/utils/odpsio.py +193 -0
  261. maxframe/learn/utils/validation.py +2 -2
  262. maxframe/lib/compat.py +40 -0
  263. maxframe/lib/dtypes_extension/__init__.py +16 -1
  264. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  265. maxframe/lib/dtypes_extension/blob.py +304 -0
  266. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  267. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  268. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  269. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  270. maxframe/lib/filesystem/_oss_lib/common.py +122 -50
  271. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  272. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  273. maxframe/lib/filesystem/base.py +1 -1
  274. maxframe/lib/filesystem/core.py +1 -1
  275. maxframe/lib/filesystem/oss.py +115 -46
  276. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  277. maxframe/lib/mmh3.cpython-38-darwin.so +0 -0
  278. maxframe/lib/wrapped_pickle.py +10 -0
  279. maxframe/opcodes.py +33 -15
  280. maxframe/protocol.py +12 -0
  281. maxframe/serialization/__init__.py +11 -2
  282. maxframe/serialization/arrow.py +38 -13
  283. maxframe/serialization/blob.py +32 -0
  284. maxframe/serialization/core.cpython-38-darwin.so +0 -0
  285. maxframe/serialization/core.pyx +39 -1
  286. maxframe/serialization/exception.py +2 -4
  287. maxframe/serialization/numpy.py +11 -0
  288. maxframe/serialization/pandas.py +46 -9
  289. maxframe/serialization/serializables/core.py +2 -2
  290. maxframe/serialization/tests/test_serial.py +29 -2
  291. maxframe/tensor/__init__.py +38 -8
  292. maxframe/tensor/arithmetic/__init__.py +19 -10
  293. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  294. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -0
  295. maxframe/tensor/core.py +3 -2
  296. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  297. maxframe/tensor/extensions/__init__.py +2 -0
  298. maxframe/tensor/extensions/apply_chunk.py +3 -3
  299. maxframe/tensor/extensions/rebalance.py +65 -0
  300. maxframe/tensor/fft/__init__.py +32 -0
  301. maxframe/tensor/fft/core.py +168 -0
  302. maxframe/tensor/fft/fft.py +112 -0
  303. maxframe/tensor/fft/fft2.py +118 -0
  304. maxframe/tensor/fft/fftfreq.py +80 -0
  305. maxframe/tensor/fft/fftn.py +123 -0
  306. maxframe/tensor/fft/fftshift.py +79 -0
  307. maxframe/tensor/fft/hfft.py +112 -0
  308. maxframe/tensor/fft/ifft.py +114 -0
  309. maxframe/tensor/fft/ifft2.py +115 -0
  310. maxframe/tensor/fft/ifftn.py +123 -0
  311. maxframe/tensor/fft/ifftshift.py +73 -0
  312. maxframe/tensor/fft/ihfft.py +93 -0
  313. maxframe/tensor/fft/irfft.py +118 -0
  314. maxframe/tensor/fft/irfft2.py +62 -0
  315. maxframe/tensor/fft/irfftn.py +114 -0
  316. maxframe/tensor/fft/rfft.py +116 -0
  317. maxframe/tensor/fft/rfft2.py +63 -0
  318. maxframe/tensor/fft/rfftfreq.py +87 -0
  319. maxframe/tensor/fft/rfftn.py +113 -0
  320. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  321. maxframe/tensor/linalg/__init__.py +7 -0
  322. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  323. maxframe/tensor/linalg/cholesky.py +117 -0
  324. maxframe/tensor/linalg/einsum.py +339 -0
  325. maxframe/tensor/linalg/lstsq.py +100 -0
  326. maxframe/tensor/linalg/matrix_norm.py +75 -0
  327. maxframe/tensor/linalg/norm.py +249 -0
  328. maxframe/tensor/linalg/solve.py +72 -0
  329. maxframe/tensor/linalg/solve_triangular.py +2 -2
  330. maxframe/tensor/linalg/vector_norm.py +113 -0
  331. maxframe/tensor/misc/__init__.py +24 -1
  332. maxframe/tensor/misc/argwhere.py +72 -0
  333. maxframe/tensor/misc/array_split.py +46 -0
  334. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  335. maxframe/tensor/misc/copyto.py +130 -0
  336. maxframe/tensor/misc/delete.py +104 -0
  337. maxframe/tensor/misc/dsplit.py +68 -0
  338. maxframe/tensor/misc/ediff1d.py +74 -0
  339. maxframe/tensor/misc/expand_dims.py +85 -0
  340. maxframe/tensor/misc/flip.py +90 -0
  341. maxframe/tensor/misc/fliplr.py +64 -0
  342. maxframe/tensor/misc/flipud.py +68 -0
  343. maxframe/tensor/misc/hsplit.py +85 -0
  344. maxframe/tensor/misc/insert.py +139 -0
  345. maxframe/tensor/misc/moveaxis.py +83 -0
  346. maxframe/tensor/misc/result_type.py +88 -0
  347. maxframe/tensor/misc/roll.py +124 -0
  348. maxframe/tensor/misc/rollaxis.py +77 -0
  349. maxframe/tensor/misc/shape.py +89 -0
  350. maxframe/tensor/misc/split.py +190 -0
  351. maxframe/tensor/misc/tile.py +109 -0
  352. maxframe/tensor/misc/vsplit.py +74 -0
  353. maxframe/tensor/reduction/array_equal.py +2 -1
  354. maxframe/tensor/sort/__init__.py +2 -0
  355. maxframe/tensor/sort/argpartition.py +98 -0
  356. maxframe/tensor/sort/partition.py +228 -0
  357. maxframe/tensor/spatial/__init__.py +15 -0
  358. maxframe/tensor/spatial/distance/__init__.py +17 -0
  359. maxframe/tensor/spatial/distance/cdist.py +421 -0
  360. maxframe/tensor/spatial/distance/pdist.py +398 -0
  361. maxframe/tensor/spatial/distance/squareform.py +153 -0
  362. maxframe/tensor/special/__init__.py +159 -21
  363. maxframe/tensor/special/airy.py +55 -0
  364. maxframe/tensor/special/bessel.py +199 -0
  365. maxframe/tensor/special/core.py +65 -4
  366. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  367. maxframe/tensor/special/ellip_harm.py +55 -0
  368. maxframe/tensor/special/err_fresnel.py +223 -0
  369. maxframe/tensor/special/gamma_funcs.py +303 -0
  370. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  371. maxframe/tensor/special/info_theory.py +189 -0
  372. maxframe/tensor/special/misc.py +21 -0
  373. maxframe/tensor/statistics/__init__.py +6 -0
  374. maxframe/tensor/statistics/corrcoef.py +77 -0
  375. maxframe/tensor/statistics/cov.py +222 -0
  376. maxframe/tensor/statistics/digitize.py +126 -0
  377. maxframe/tensor/statistics/histogram.py +520 -0
  378. maxframe/tensor/statistics/median.py +85 -0
  379. maxframe/tensor/statistics/ptp.py +89 -0
  380. maxframe/tensor/utils.py +3 -3
  381. maxframe/tests/test_utils.py +43 -1
  382. maxframe/tests/utils.py +3 -13
  383. maxframe/typing_.py +2 -0
  384. maxframe/udf.py +27 -2
  385. maxframe/utils.py +193 -19
  386. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/METADATA +3 -2
  387. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/RECORD +395 -240
  388. maxframe_client/fetcher.py +35 -4
  389. maxframe_client/session/odps.py +7 -2
  390. maxframe_client/tests/test_fetcher.py +76 -3
  391. maxframe_client/tests/test_session.py +4 -1
  392. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  393. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  394. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/WHEEL +0 -0
  395. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,143 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import pandas as pd
16
+
17
+ from ... import opcodes
18
+ from ...core import get_output_types
19
+ from ...serialization.serializables import AnyField, Int32Field
20
+ from ..operators import DataFrameOperator, DataFrameOperatorMixin
21
+ from ..utils import parse_index, validate_axis
22
+
23
+
24
+ class DataFrameReorderLevels(DataFrameOperator, DataFrameOperatorMixin):
25
+ _op_type_ = opcodes.REORDER_LEVELS
26
+
27
+ order = AnyField("order")
28
+ axis = Int32Field("axis", default=0)
29
+
30
+ def __call__(self, df_or_series):
31
+ # Determine output type
32
+ self._output_types = get_output_types(df_or_series)
33
+
34
+ if self.axis == 0:
35
+ src_idx_value = df_or_series.index_value
36
+ else:
37
+ src_idx_value = df_or_series.columns_value
38
+
39
+ # Create reordered index
40
+ pd_index = src_idx_value.to_pandas()
41
+ if not isinstance(pd_index, pd.MultiIndex):
42
+ raise ValueError("reorder_levels can only be used with MultiIndex")
43
+ pd_index = pd_index.reorder_levels(self.order)
44
+
45
+ params = df_or_series.params
46
+ if self.axis == 0:
47
+ params["index_value"] = parse_index(pd_index)
48
+ else:
49
+ params["columns_value"] = parse_index(pd_index, store_data=True)
50
+ return self.new_tileable([df_or_series], **params)
51
+
52
+
53
+ def _reorder_levels(df_or_series, order, axis=0):
54
+ axis = validate_axis(axis, df_or_series)
55
+ op = DataFrameReorderLevels(order=order, axis=axis)
56
+ return op(df_or_series)
57
+
58
+
59
+ def df_reorder_levels(df, order, axis=0):
60
+ """
61
+ Rearrange index levels using input order. May not drop or duplicate levels.
62
+
63
+ Parameters
64
+ ----------
65
+ order : list of int or list of str
66
+ List representing new level order. Reference level by number
67
+ (position) or by key (label).
68
+ axis : {0 or 'index', 1 or 'columns'}, default 0
69
+ Where to reorder levels.
70
+
71
+ Returns
72
+ -------
73
+ DataFrame
74
+
75
+ Examples
76
+ --------
77
+ >>> import maxframe.dataframe as md
78
+ >>> data = {
79
+ ... "class": ["Mammals", "Mammals", "Reptiles"],
80
+ ... "diet": ["Omnivore", "Carnivore", "Carnivore"],
81
+ ... "species": ["Humans", "Dogs", "Snakes"],
82
+ ... }
83
+ >>> df = md.DataFrame(data, columns=["class", "diet", "species"])
84
+ >>> df = df.set_index(["class", "diet"])
85
+ >>> df.execute()
86
+ species
87
+ class diet
88
+ Mammals Omnivore Humans
89
+ Carnivore Dogs
90
+ Reptiles Carnivore Snakes
91
+
92
+ Let's reorder the levels of the index:
93
+
94
+ >>> df.reorder_levels(["diet", "class"]).execute()
95
+ species
96
+ diet class
97
+ Omnivore Mammals Humans
98
+ Carnivore Mammals Dogs
99
+ Reptiles Snakes
100
+ """
101
+ return _reorder_levels(df, order, axis=axis)
102
+
103
+
104
+ def series_reorder_levels(series, order):
105
+ """
106
+ Rearrange index levels using input order.
107
+
108
+ May not drop or duplicate levels.
109
+
110
+ Parameters
111
+ ----------
112
+ order : list of int representing new level order
113
+ Reference level by number or key.
114
+
115
+ Returns
116
+ -------
117
+ type of caller (new object)
118
+
119
+ Examples
120
+ --------
121
+ >>> import maxframe.tensor as mt
122
+ >>> import maxframe.dataframe as md
123
+ >>> arrays = [mt.array(["dog", "dog", "cat", "cat", "bird", "bird"]),
124
+ ... mt.array(["white", "black", "white", "black", "white", "black"])]
125
+ >>> s = md.Series([1, 2, 3, 3, 5, 2], index=arrays)
126
+ >>> s.execute()
127
+ dog white 1
128
+ black 2
129
+ cat white 3
130
+ black 3
131
+ bird white 5
132
+ black 2
133
+ dtype: int64
134
+ >>> s.reorder_levels([1, 0]).execute()
135
+ white dog 1
136
+ black dog 2
137
+ white cat 3
138
+ black cat 3
139
+ white bird 5
140
+ black bird 2
141
+ dtype: int64
142
+ """
143
+ return _reorder_levels(series, order)
@@ -18,10 +18,12 @@ import pandas as pd
18
18
  from ... import opcodes
19
19
  from ...core import OutputType
20
20
  from ...serialization.serializables import AnyField, BoolField
21
- from ...utils import no_default
21
+ from ...utils import no_default, pd_release_version
22
22
  from ..operators import DATAFRAME_TYPE, DataFrameOperator, DataFrameOperatorMixin
23
23
  from ..utils import build_empty_df, build_empty_series, parse_index
24
24
 
25
+ _reset_index_has_names = pd_release_version >= (1, 5)
26
+
25
27
 
26
28
  class DataFrameResetIndex(DataFrameOperator, DataFrameOperatorMixin):
27
29
  _op_type_ = opcodes.RESET_INDEX
@@ -29,8 +31,10 @@ class DataFrameResetIndex(DataFrameOperator, DataFrameOperatorMixin):
29
31
  level = AnyField("level", default=None)
30
32
  drop = BoolField("drop", default=False)
31
33
  name = AnyField("name", default=None)
32
- col_level = AnyField("col_level", default=0)
33
- col_fill = AnyField("col_fill", default="")
34
+ col_level = AnyField("col_level", default=None)
35
+ col_fill = AnyField("col_fill", default=None)
36
+ incremental_index = BoolField("incremental_index", default=False)
37
+ names = AnyField("names", default=None)
34
38
 
35
39
  def __init__(self, output_types=None, **kwargs):
36
40
  super().__init__(_output_types=output_types, **kwargs)
@@ -76,9 +80,26 @@ class DataFrameResetIndex(DataFrameOperator, DataFrameOperatorMixin):
76
80
  else:
77
81
  empty_df = build_empty_df(a.dtypes)
78
82
  empty_df.index = a.index_value.to_pandas()[:0]
79
- empty_df = empty_df.reset_index(
80
- level=self.level, col_level=self.col_level, col_fill=self.col_fill
81
- )
83
+
84
+ if self.names and _reset_index_has_names:
85
+ empty_df = empty_df.reset_index(
86
+ level=self.level,
87
+ col_level=self.col_level,
88
+ col_fill=self.col_fill,
89
+ names=self.names,
90
+ )
91
+ else:
92
+ empty_df = empty_df.reset_index(
93
+ level=self.level, col_level=self.col_level, col_fill=self.col_fill
94
+ )
95
+ if self.names:
96
+ names = (
97
+ [self.names] if not isinstance(self.names, list) else self.names
98
+ )
99
+ cols = list(empty_df.columns)
100
+ cols[: len(names)] = names
101
+ empty_df.columns = pd.Index(cols, name=empty_df.columns.name)
102
+
82
103
  shape = (a.shape[0], len(empty_df.columns))
83
104
  columns_value = parse_index(empty_df.columns, store_data=True)
84
105
  dtypes = empty_df.dtypes
@@ -105,6 +126,8 @@ def df_reset_index(
105
126
  inplace=False,
106
127
  col_level=0,
107
128
  col_fill="",
129
+ names=None,
130
+ incremental_index=False,
108
131
  ):
109
132
  """
110
133
  Reset the index, or a level of it.
@@ -255,6 +278,8 @@ def df_reset_index(
255
278
  drop=drop,
256
279
  col_level=col_level,
257
280
  col_fill=col_fill,
281
+ names=names,
282
+ incremental_index=incremental_index,
258
283
  output_types=[OutputType.dataframe],
259
284
  )
260
285
  ret = op(df)
@@ -270,6 +295,7 @@ def series_reset_index(
270
295
  drop=False,
271
296
  name=no_default,
272
297
  inplace=False,
298
+ incremental_index=False,
273
299
  ):
274
300
  """
275
301
  Generate a new DataFrame or Series with the index reset.
@@ -389,6 +415,7 @@ def series_reset_index(
389
415
  level=level,
390
416
  drop=drop,
391
417
  name=name,
418
+ incremental_index=incremental_index,
392
419
  output_types=[OutputType.series if drop else OutputType.dataframe],
393
420
  )
394
421
  ret = op(series)
@@ -25,6 +25,7 @@ from ...serialization.serializables import (
25
25
  Float64Field,
26
26
  Int8Field,
27
27
  Int64Field,
28
+ KeyField,
28
29
  )
29
30
  from ...tensor.random import RandomStateField
30
31
  from ..operators import DataFrameOperator, DataFrameOperatorMixin
@@ -41,6 +42,11 @@ class DataFrameSample(DataFrameOperator, DataFrameOperatorMixin):
41
42
  axis = Int8Field("axis", default=None)
42
43
  seed = Int64Field("seed", default=None)
43
44
  random_state = RandomStateField("random_state", default=None)
45
+ always_multinomial = BoolField("always_multinomial", default=None)
46
+
47
+ # for chunks
48
+ # num of instances for chunks
49
+ chunk_samples = KeyField("chunk_samples", default=None)
44
50
 
45
51
  def __init__(self, random_state=None, seed=None, **kw):
46
52
  if random_state is None:
@@ -54,6 +60,8 @@ class DataFrameSample(DataFrameOperator, DataFrameOperatorMixin):
54
60
  next(it)
55
61
  if isinstance(op.weights, ENTITY_TYPE):
56
62
  op.weights = next(it)
63
+ if isinstance(op.chunk_samples, ENTITY_TYPE):
64
+ op.chunk_samples = next(it)
57
65
 
58
66
  def __call__(self, df):
59
67
  params = df.params
@@ -23,7 +23,7 @@ from ...core import EntityData, OutputType
23
23
  from ...serialization.serializables import AnyField, KeyField
24
24
  from ...tensor.core import TENSOR_TYPE
25
25
  from ...utils import pd_release_version
26
- from ..core import DATAFRAME_TYPE, SERIES_TYPE, DataFrame
26
+ from ..core import DATAFRAME_TYPE, ENTITY_TYPE, SERIES_TYPE, DataFrame
27
27
  from ..initializer import DataFrame as asframe
28
28
  from ..initializer import Series as asseries
29
29
  from ..operators import DataFrameOperator, DataFrameOperatorMixin
@@ -77,7 +77,7 @@ class DataFrameSetitem(DataFrameOperator, DataFrameOperatorMixin):
77
77
  value_dtype = pd.Series(list(value.dtypes), index=self.indexes)
78
78
  elif is_list_like(value) or isinstance(value, TENSOR_TYPE):
79
79
  # convert to numpy to get actual dim and shape
80
- if is_list_like(value):
80
+ if is_list_like(value) and not isinstance(value, ENTITY_TYPE):
81
81
  value = np.array(value)
82
82
 
83
83
  if value.ndim == 1:
@@ -108,7 +108,7 @@ class DataFrameSetitem(DataFrameOperator, DataFrameOperatorMixin):
108
108
 
109
109
  try:
110
110
  dtypes.loc[self.indexes] = value_dtype
111
- except KeyError:
111
+ except (AttributeError, KeyError):
112
112
  # when some index not exist, try update one by one
113
113
  if isinstance(value_dtype, pd.Series):
114
114
  for idx in self.indexes:
@@ -0,0 +1,185 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import pandas as pd
16
+
17
+ from ..utils import validate_axis
18
+
19
+
20
+ def _swaplevel(df_or_series, i=-2, j=-1, axis=0):
21
+ axis = validate_axis(axis, df_or_series)
22
+
23
+ if axis == 0:
24
+ src_idx_value = df_or_series.index_value
25
+ else:
26
+ src_idx_value = df_or_series.columns_value
27
+
28
+ pd_index = src_idx_value.to_pandas()
29
+ if not isinstance(pd_index, pd.MultiIndex):
30
+ raise ValueError("swaplevel can only be used with MultiIndex")
31
+
32
+ name_to_idx = {name: idx for idx, name in enumerate(pd_index.names)}
33
+ src_idx, dest_idx = name_to_idx.get(i, i), name_to_idx.get(j, j)
34
+
35
+ new_idxes = list(range(len(pd_index.names)))
36
+ new_idxes[src_idx], new_idxes[dest_idx] = new_idxes[dest_idx], new_idxes[src_idx]
37
+ if df_or_series.ndim == 2:
38
+ return df_or_series.reorder_levels(new_idxes, axis=axis)
39
+ else:
40
+ return df_or_series.reorder_levels(new_idxes)
41
+
42
+
43
+ def df_swaplevel(df, i=-2, j=-1, axis=0):
44
+ """
45
+ Swap levels i and j in a :class:`MultiIndex`.
46
+
47
+ Default is to swap the two innermost levels of the index.
48
+
49
+ Parameters
50
+ ----------
51
+ i, j : int or str
52
+ Levels of the indices to be swapped. Can pass level name as string.
53
+ axis : {0 or 'index', 1 or 'columns'}, default 0
54
+ The axis to swap levels on. 0 or 'index' for row-wise, 1 or
55
+ 'columns' for column-wise.
56
+
57
+ Returns
58
+ -------
59
+ DataFrame
60
+ DataFrame with levels swapped in MultiIndex.
61
+
62
+ Examples
63
+ --------
64
+ >>> import maxframe.dataframe as md
65
+ >>> df = md.DataFrame(
66
+ ... {"Grade": ["A", "B", "A", "C"]},
67
+ ... index=[
68
+ ... ["Final exam", "Final exam", "Coursework", "Coursework"],
69
+ ... ["History", "Geography", "History", "Geography"],
70
+ ... ["January", "February", "March", "April"],
71
+ ... ],
72
+ ... )
73
+ >>> df.execute()
74
+ Grade
75
+ Final exam History January A
76
+ Geography February B
77
+ Coursework History March A
78
+ Geography April C
79
+
80
+ In the following example, we will swap the levels of the indices.
81
+ Here, we will swap the levels column-wise, but levels can be swapped row-wise
82
+ in a similar manner. Note that column-wise is the default behaviour.
83
+ By not supplying any arguments for i and j, we swap the last and second to
84
+ last indices.
85
+
86
+ >>> df.swaplevel().execute()
87
+ Grade
88
+ Final exam January History A
89
+ February Geography B
90
+ Coursework March History A
91
+ April Geography C
92
+
93
+ By supplying one argument, we can choose which index to swap the last
94
+ index with. We can for example swap the first index with the last one as
95
+ follows.
96
+
97
+ >>> df.swaplevel(0).execute()
98
+ Grade
99
+ January History Final exam A
100
+ February Geography Final exam B
101
+ March History Coursework A
102
+ April Geography Coursework C
103
+
104
+ We can also define explicitly which indices we want to swap by supplying values
105
+ for both i and j. Here, we for example swap the first and second indices.
106
+
107
+ >>> df.swaplevel(0, 1).execute()
108
+ Grade
109
+ History Final exam January A
110
+ Geography Final exam February B
111
+ History Coursework March A
112
+ Geography Coursework April C
113
+ """
114
+ return _swaplevel(df, i, j, axis=axis)
115
+
116
+
117
+ def series_swaplevel(series, i=-2, j=-1):
118
+ """
119
+ Swap levels i and j in a :class:`MultiIndex`.
120
+
121
+ Default is to swap the two innermost levels of the index.
122
+
123
+ Parameters
124
+ ----------
125
+ i, j : int or str
126
+ Levels of the indices to be swapped. Can pass level name as string.
127
+
128
+ Returns
129
+ -------
130
+ Series
131
+ Series with levels swapped in MultiIndex.
132
+
133
+ Examples
134
+ --------
135
+ >>> import maxframe.dataframe as md
136
+ >>> s = md.Series(
137
+ ... ["A", "B", "A", "C"],
138
+ ... index=[
139
+ ... ["Final exam", "Final exam", "Coursework", "Coursework"],
140
+ ... ["History", "Geography", "History", "Geography"],
141
+ ... ["January", "February", "March", "April"],
142
+ ... ],
143
+ ... )
144
+ >>> s.execute()
145
+ Final exam History January A
146
+ Geography February B
147
+ Coursework History March A
148
+ Geography April C
149
+ dtype: object
150
+
151
+ In the following example, we will swap the levels of the indices.
152
+ Here, we will swap the levels column-wise, but levels can be swapped row-wise
153
+ in a similar manner. Note that column-wise is the default behaviour.
154
+ By not supplying any arguments for i and j, we swap the last and second to
155
+ last indices.
156
+
157
+ >>> s.swaplevel().execute()
158
+ Final exam January History A
159
+ February Geography B
160
+ Coursework March History A
161
+ April Geography C
162
+ dtype: object
163
+
164
+ By supplying one argument, we can choose which index to swap the last
165
+ index with. We can for example swap the first index with the last one as
166
+ follows.
167
+
168
+ >>> s.swaplevel(0).execute()
169
+ January History Final exam A
170
+ February Geography Final exam B
171
+ March History Coursework A
172
+ April Geography Coursework C
173
+ dtype: object
174
+
175
+ We can also define explicitly which indices we want to swap by supplying values
176
+ for both i and j. Here, we for example swap the first and second indices.
177
+
178
+ >>> s.swaplevel(0, 1).execute()
179
+ History Final exam January A
180
+ Geography Final exam February B
181
+ History Coursework March A
182
+ Geography Coursework April C
183
+ dtype: object
184
+ """
185
+ return _swaplevel(series, i, j)
@@ -0,0 +1,99 @@
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 ..utils import validate_axis
16
+
17
+
18
+ def take(df_or_series, indices, axis=0, **kwargs):
19
+ """
20
+ Return the elements in the given *positional* indices along an axis.
21
+
22
+ This means that we are not indexing according to actual values in
23
+ the index attribute of the object. We are indexing according to the
24
+ actual position of the element in the object.
25
+
26
+ Parameters
27
+ ----------
28
+ indices : array-like
29
+ An array of ints indicating which positions to take.
30
+ axis : {0 or 'index', 1 or 'columns', None}, default 0
31
+ The axis on which to select elements. ``0`` means that we are
32
+ selecting rows, ``1`` means that we are selecting columns.
33
+ For `Series` this parameter is unused and defaults to 0.
34
+ **kwargs
35
+ For compatibility with :meth:`numpy.take`. Has no effect on the
36
+ output.
37
+
38
+ Returns
39
+ -------
40
+ same type as caller
41
+ An array-like containing the elements taken from the object.
42
+
43
+ See Also
44
+ --------
45
+ DataFrame.loc : Select a subset of a DataFrame by labels.
46
+ DataFrame.iloc : Select a subset of a DataFrame by positions.
47
+ numpy.take : Take elements from an array along an axis.
48
+
49
+ Examples
50
+ --------
51
+ >>> import maxframe.tensor as mt
52
+ >>> import maxframe.dataframe as md
53
+ >>> df = md.DataFrame([('falcon', 'bird', 389.0),
54
+ ... ('parrot', 'bird', 24.0),
55
+ ... ('lion', 'mammal', 80.5),
56
+ ... ('monkey', 'mammal', mt.nan)],
57
+ ... columns=['name', 'class', 'max_speed'],
58
+ ... index=[0, 2, 3, 1])
59
+ >>> df.execute()
60
+ name class max_speed
61
+ 0 falcon bird 389.0
62
+ 2 parrot bird 24.0
63
+ 3 lion mammal 80.5
64
+ 1 monkey mammal NaN
65
+
66
+ Take elements at positions 0 and 3 along the axis 0 (default).
67
+
68
+ Note how the actual indices selected (0 and 1) do not correspond to
69
+ our selected indices 0 and 3. That's because we are selecting the 0th
70
+ and 3rd rows, not rows whose indices equal 0 and 3.
71
+
72
+ >>> df.take([0, 3]).execute()
73
+ name class max_speed
74
+ 0 falcon bird 389.0
75
+ 1 monkey mammal NaN
76
+
77
+ Take elements at indices 1 and 2 along the axis 1 (column selection).
78
+
79
+ >>> df.take([1, 2], axis=1).execute()
80
+ class max_speed
81
+ 0 bird 389.0
82
+ 2 bird 24.0
83
+ 3 mammal 80.5
84
+ 1 mammal NaN
85
+
86
+ We may take elements using negative integers for positive indices,
87
+ starting from the end of the object, just like with Python lists.
88
+
89
+ >>> df.take([-1, -2]).execute()
90
+ name class max_speed
91
+ 1 monkey mammal NaN
92
+ 3 lion mammal 80.5
93
+ """
94
+ kwargs.clear()
95
+
96
+ axis = validate_axis(axis, df_or_series)
97
+ slc = [slice(None), slice(None)][: df_or_series.ndim]
98
+ slc[axis] = indices
99
+ return df_or_series.iloc[tuple(slc)]