maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-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.cp37-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.cp37-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.cp37-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.cp37-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
@@ -18,13 +18,15 @@ import pyarrow as pa
18
18
  import pytest
19
19
 
20
20
  from ..... import dataframe as md
21
+ from .....core import OutputType, TileableGraph, build_fetch
21
22
  from .....lib.dtypes_extension import dict_
22
- from .....utils import ARROW_DTYPE_NOT_SUPPORTED
23
- from ..contains import SeriesDictContainsOperator
23
+ from .....utils import (
24
+ ARROW_DTYPE_NOT_SUPPORTED,
25
+ deserialize_serializable,
26
+ serialize_serializable,
27
+ )
28
+ from ..core import SeriesDictMethod
24
29
  from ..getitem import SeriesDictGetItemOperator
25
- from ..length import SeriesDictLengthOperator
26
- from ..remove import SeriesDictRemoveOperator
27
- from ..setitem import SeriesDictSetItemOperator
28
30
 
29
31
  pytestmark = pytest.mark.skipif(
30
32
  ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
@@ -58,10 +60,11 @@ def test_getitem(df):
58
60
  assert s1.shape == (1,)
59
61
  assert s1.index_value == df.index_value
60
62
  op = s1.op
61
- assert isinstance(op, SeriesDictGetItemOperator)
62
- assert op.query_key == "k1"
63
- assert op.default_value is None
64
- assert op.ignore_key_error is False
63
+ assert isinstance(op, SeriesDictMethod)
64
+ assert op.method == "getitem"
65
+ assert op.method_kwargs["query_key"] == "k1"
66
+ assert op.method_kwargs["default_value"] is None
67
+ assert op.method_kwargs["ignore_key_error"] is False
65
68
 
66
69
 
67
70
  def test_getitem_with_default_value(df):
@@ -72,10 +75,11 @@ def test_getitem_with_default_value(df):
72
75
  assert s1.shape == (1,)
73
76
  assert s1.index_value == df.index_value
74
77
  op = s1.op
75
- assert isinstance(op, SeriesDictGetItemOperator)
76
- assert op.query_key == "k1"
77
- assert op.default_value == 1
78
- assert op.ignore_key_error is True
78
+ assert isinstance(op, SeriesDictMethod)
79
+ assert op.method == "getitem"
80
+ assert op.method_kwargs["query_key"] == "k1"
81
+ assert op.method_kwargs["default_value"] == 1
82
+ assert op.method_kwargs["ignore_key_error"] is True
79
83
 
80
84
 
81
85
  def test_setitem(df):
@@ -87,9 +91,10 @@ def test_setitem(df):
87
91
  assert s1.index_value == df.index_value
88
92
  assert s1.shape == (1,)
89
93
  op = s1.op
90
- assert isinstance(op, SeriesDictSetItemOperator)
91
- assert op.query_key == "k1"
92
- assert op.value == "v3"
94
+ assert isinstance(op, SeriesDictMethod)
95
+ assert op.method == "setitem"
96
+ assert op.method_kwargs["query_key"] == "k1"
97
+ assert op.method_kwargs["value"] == "v3"
93
98
 
94
99
 
95
100
  def test_length(df):
@@ -100,7 +105,8 @@ def test_length(df):
100
105
  assert s1.shape == (1,)
101
106
  assert s1.index_value == df.index_value
102
107
  op = s1.op
103
- assert isinstance(op, SeriesDictLengthOperator)
108
+ assert op.method == "len"
109
+ assert isinstance(op, SeriesDictMethod)
104
110
 
105
111
 
106
112
  def test_remove(df):
@@ -111,9 +117,10 @@ def test_remove(df):
111
117
  assert s1.index_value == df.index_value
112
118
  assert s1.shape == (1,)
113
119
  op = s1.op
114
- assert isinstance(op, SeriesDictRemoveOperator)
115
- assert op.query_key == "k1"
116
- assert op.ignore_key_error is True
120
+ assert isinstance(op, SeriesDictMethod)
121
+ assert op.method == "remove"
122
+ assert op.method_kwargs["query_key"] == "k1"
123
+ assert op.method_kwargs["ignore_key_error"] is True
117
124
 
118
125
 
119
126
  def test_contains(df):
@@ -124,5 +131,38 @@ def test_contains(df):
124
131
  assert s1.index_value == df.index_value
125
132
  assert s1.shape == (1,)
126
133
  op = s1.op
127
- assert isinstance(op, SeriesDictContainsOperator)
128
- assert op.query_key == "k1"
134
+ assert isinstance(op, SeriesDictMethod)
135
+ assert op.method == "contains"
136
+ assert op.method_kwargs["query_key"] == "k1"
137
+
138
+
139
+ def test_legacy_compatibility(df):
140
+ in_series = df["A"]
141
+ legacy_op = SeriesDictGetItemOperator(
142
+ query_key="k1",
143
+ default_value=1,
144
+ ignore_key_error=True,
145
+ _output_types=[OutputType.series],
146
+ )
147
+ out = legacy_op.new_tileable(
148
+ [in_series],
149
+ shape=in_series.shape,
150
+ index_value=in_series.index_value,
151
+ name="k1",
152
+ dtype=pd.ArrowDtype(pa.int64()),
153
+ )
154
+ fetch_node = build_fetch(in_series).data
155
+ out.op.inputs = [fetch_node]
156
+
157
+ dag = TileableGraph([out.data])
158
+ dag.add_node(fetch_node)
159
+ dag.add_node(out.data)
160
+ dag.add_edge(fetch_node, out.data)
161
+ dag_out = deserialize_serializable(serialize_serializable(dag))
162
+
163
+ out_op = dag_out.results[0].op
164
+ assert isinstance(out_op, SeriesDictMethod)
165
+ assert out_op.method == "getitem"
166
+ assert out_op.method_kwargs["ignore_key_error"] == True
167
+ assert out_op.method_kwargs["default_value"] == 1
168
+ assert out_op.method_kwargs["query_key"] == "k1"
@@ -20,13 +20,13 @@ def _install():
20
20
  from .getitem import series_list_getitem, series_list_getitem_with_index_error
21
21
  from .length import series_list_length
22
22
 
23
- dict_method_to_handlers = {
23
+ list_method_to_handlers = {
24
24
  "__getitem__": series_list_getitem_with_index_error,
25
25
  "get": series_list_getitem,
26
26
  "len": series_list_length,
27
27
  }
28
28
 
29
- for name, handler in dict_method_to_handlers.items():
29
+ for name, handler in list_method_to_handlers.items():
30
30
  ListAccessor._register(name, handler)
31
31
 
32
32
  for series in SERIES_TYPE:
@@ -0,0 +1,48 @@
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 ....serialization.serializables import DictField, StringField, TupleField
18
+ from ....utils import no_default
19
+ from ...operators import DataFrameOperator, DataFrameOperatorMixin
20
+ from ..compat import LegacySeriesMethodOperator
21
+
22
+
23
+ class SeriesListMethod(DataFrameOperator, DataFrameOperatorMixin):
24
+ _op_type_ = opcodes.SERIES_LIST_METHOD
25
+
26
+ method = StringField("method", default=None)
27
+ method_args = TupleField("method_args", default_factory=list)
28
+ method_kwargs = DictField("method_kwargs", default_factory=dict)
29
+
30
+ def __init__(self, output_types=None, **kw):
31
+ output_types = output_types or [OutputType.series]
32
+ kw["_output_types"] = kw.get("_output_types") or output_types
33
+ super().__init__(**kw)
34
+
35
+ def __call__(self, inp, dtype=None, name=no_default):
36
+ dtype = dtype or inp.dtype
37
+ name = inp.name if name is no_default else name
38
+ return self.new_series(
39
+ [inp],
40
+ shape=inp.shape,
41
+ dtype=dtype,
42
+ index_value=inp.index_value,
43
+ name=name,
44
+ )
45
+
46
+
47
+ class LegacySeriesListOperator(LegacySeriesMethodOperator):
48
+ _method_cls = SeriesListMethod
@@ -15,28 +15,17 @@
15
15
  import pandas as pd
16
16
 
17
17
  from .... import opcodes
18
- from ....core.entity.output_types import OutputType
19
18
  from ....serialization.serializables.field import AnyField, BoolField
20
- from ...operators import DataFrameOperator, DataFrameOperatorMixin
19
+ from .core import LegacySeriesListOperator, SeriesListMethod
21
20
 
22
21
 
23
- class SeriesListGetItemOperator(DataFrameOperator, DataFrameOperatorMixin):
22
+ class SeriesListGetItemOperator(LegacySeriesListOperator):
23
+ # operator class deprecated since v2.3.0
24
24
  _op_type_ = opcodes.SERIES_LIST_GETITEM
25
+ _method_name = "getitem"
25
26
  query_index = AnyField("query_index", default=None)
26
27
  ignore_index_error = BoolField("ignore_index_error", default=False)
27
28
 
28
- def __init__(self, **kw):
29
- super().__init__(_output_types=[OutputType.series], **kw)
30
-
31
- def __call__(self, series):
32
- arrow_list_type = series.dtype.pyarrow_dtype
33
- return self.new_series(
34
- [series],
35
- shape=series.shape,
36
- dtype=pd.ArrowDtype(arrow_list_type.value_type),
37
- index_value=series.index_value,
38
- )
39
-
40
29
 
41
30
  def series_list_getitem(series, query_index):
42
31
  """
@@ -77,8 +66,10 @@ def series_list_getitem(series, query_index):
77
66
  3 <NA>
78
67
  dtype: int64[pyarrow]
79
68
  """
80
- return SeriesListGetItemOperator(query_index=query_index, ignore_index_error=True)(
81
- series
69
+ kw = dict(query_index=query_index, ignore_index_error=True)
70
+ arrow_list_type = series.dtype.pyarrow_dtype
71
+ return SeriesListMethod(method="getitem", method_kwargs=kw)(
72
+ series, dtype=pd.ArrowDtype(arrow_list_type.value_type)
82
73
  )
83
74
 
84
75
 
@@ -130,6 +121,8 @@ def series_list_getitem_with_index_error(series, query_index):
130
121
  3 <NA>
131
122
  dtype: int64[pyarrow]
132
123
  """
133
- return SeriesListGetItemOperator(query_index=query_index, ignore_index_error=False)(
134
- series
124
+ kw = dict(query_index=query_index, ignore_index_error=False)
125
+ arrow_list_type = series.dtype.pyarrow_dtype
126
+ return SeriesListMethod(method="getitem", method_kwargs=kw)(
127
+ series, dtype=pd.ArrowDtype(arrow_list_type.value_type)
135
128
  )
@@ -16,24 +16,13 @@ import pandas as pd
16
16
  import pyarrow as pa
17
17
 
18
18
  from .... import opcodes
19
- from ....core.entity.output_types import OutputType
20
- from ...operators import DataFrameOperator, DataFrameOperatorMixin
19
+ from .core import LegacySeriesListOperator, SeriesListMethod
21
20
 
22
21
 
23
- class SeriesListLengthOperator(DataFrameOperator, DataFrameOperatorMixin):
22
+ class SeriesListLengthOperator(LegacySeriesListOperator):
23
+ # operator class deprecated since v2.3.0
24
24
  _op_type_ = opcodes.SERIES_LIST_LENGTH
25
-
26
- def __init__(self, **kw):
27
- super().__init__(_output_types=[OutputType.series], **kw)
28
-
29
- def __call__(self, series):
30
- return self.new_series(
31
- [series],
32
- shape=series.shape,
33
- index_value=series.index_value,
34
- dtype=pd.ArrowDtype(pa.int64()),
35
- name=None,
36
- )
25
+ _method_name = "len"
37
26
 
38
27
 
39
28
  def series_list_length(series):
@@ -70,4 +59,6 @@ def series_list_length(series):
70
59
  3 <NA>
71
60
  dtype: int64[pyarrow]
72
61
  """
73
- return SeriesListLengthOperator()(series)
62
+ return SeriesListMethod(method="len")(
63
+ series, name=None, dtype=pd.ArrowDtype(pa.int64())
64
+ )
@@ -20,8 +20,7 @@ import pytest
20
20
  from ..... import dataframe as md
21
21
  from .....lib.dtypes_extension import list_
22
22
  from .....utils import ARROW_DTYPE_NOT_SUPPORTED
23
- from ..getitem import SeriesListGetItemOperator
24
- from ..length import SeriesListLengthOperator
23
+ from ..core import SeriesListMethod
25
24
 
26
25
  pytestmark = pytest.mark.skipif(
27
26
  ARROW_DTYPE_NOT_SUPPORTED, reason="Arrow Dtype is not supported"
@@ -52,9 +51,10 @@ def test_getitem(df):
52
51
  assert s1.shape == (1,)
53
52
  assert s1.index_value == df.index_value
54
53
  op = s1.op
55
- assert isinstance(op, SeriesListGetItemOperator)
56
- assert op.query_index == 1
57
- assert op.ignore_index_error is False
54
+ assert isinstance(op, SeriesListMethod)
55
+ assert op.method == "getitem"
56
+ assert op.method_kwargs["query_index"] == 1
57
+ assert op.method_kwargs["ignore_index_error"] is False
58
58
 
59
59
 
60
60
  def test_getitem_ignore_index_err(df):
@@ -64,9 +64,10 @@ def test_getitem_ignore_index_err(df):
64
64
  assert s1.shape == (1,)
65
65
  assert s1.index_value == df.index_value
66
66
  op = s1.op
67
- assert isinstance(op, SeriesListGetItemOperator)
68
- assert op.query_index == 1
69
- assert op.ignore_index_error is True
67
+ assert isinstance(op, SeriesListMethod)
68
+ assert op.method == "getitem"
69
+ assert op.method_kwargs["query_index"] == 1
70
+ assert op.method_kwargs["ignore_index_error"] is True
70
71
 
71
72
 
72
73
  def test_length(df):
@@ -76,4 +77,5 @@ def test_length(df):
76
77
  assert s1.shape == (1,)
77
78
  assert s1.index_value == df.index_value
78
79
  op = s1.op
79
- assert isinstance(op, SeriesListLengthOperator)
80
+ assert isinstance(op, SeriesListMethod)
81
+ assert op.method == "len"
@@ -12,7 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from .core import SeriesStringMethod
15
+ from .core import SeriesStringMethod, string_method_to_handlers
16
+
17
+ methods = set(string_method_to_handlers.keys())
18
+ del string_method_to_handlers
16
19
 
17
20
 
18
21
  def _install():
@@ -0,0 +1,37 @@
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
+
16
+ def _install():
17
+ from ....core import CachedAccessor
18
+ from ...core import SERIES_TYPE
19
+ from .accessor import StructAccessor
20
+ from .dtypes import struct_dtypes
21
+ from .field import struct_field
22
+
23
+ struct_method_to_handlers = {
24
+ "dtypes": struct_dtypes,
25
+ "field": struct_field,
26
+ }
27
+ property_names = {"dtypes"}
28
+
29
+ for name, handler in struct_method_to_handlers.items():
30
+ StructAccessor._register(name, handler, is_property=name in property_names)
31
+
32
+ for series in SERIES_TYPE:
33
+ series.struct = CachedAccessor("struct", StructAccessor)
34
+
35
+
36
+ _install()
37
+ del _install
@@ -0,0 +1,39 @@
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 TYPE_CHECKING
16
+
17
+ import pandas as pd
18
+ import pyarrow as pa
19
+
20
+ from ....core import BaseMaxFrameAccessor
21
+ from ....utils import ARROW_DTYPE_NOT_SUPPORTED
22
+
23
+ if TYPE_CHECKING:
24
+ from ...core import Series
25
+
26
+
27
+ class StructAccessor(BaseMaxFrameAccessor):
28
+ obj: "Series"
29
+ _api_count: int = 0
30
+
31
+ def __init__(self, series):
32
+ super().__init__(series)
33
+ if ARROW_DTYPE_NOT_SUPPORTED:
34
+ raise ImportError("pd.ArrowDtype is not supported in current environment")
35
+
36
+ if not isinstance(series.dtype, pd.ArrowDtype) or not isinstance(
37
+ series.dtype.pyarrow_dtype, pa.StructType
38
+ ):
39
+ raise AttributeError("Can only use .struct accessor with struct values")
@@ -0,0 +1,43 @@
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 ....serialization.serializables import DictField, StringField, TupleField
18
+ from ....utils import no_default
19
+ from ...operators import DataFrameOperator, DataFrameOperatorMixin
20
+
21
+
22
+ class SeriesStructMethod(DataFrameOperator, DataFrameOperatorMixin):
23
+ _op_type_ = opcodes.SERIES_STRUCT_METHOD
24
+
25
+ method = StringField("method", default=None)
26
+ method_args = TupleField("method_args", default_factory=list)
27
+ method_kwargs = DictField("method_kwargs", default_factory=dict)
28
+
29
+ def __init__(self, output_types=None, **kw):
30
+ output_types = output_types or [OutputType.series]
31
+ kw["_output_types"] = kw.get("_output_types") or output_types
32
+ super().__init__(**kw)
33
+
34
+ def __call__(self, inp, dtype=None, name=no_default):
35
+ dtype = dtype if dtype is not None else inp.dtype
36
+ name = inp.name if name is no_default else name
37
+ return self.new_series(
38
+ [inp],
39
+ shape=inp.shape,
40
+ dtype=dtype,
41
+ index_value=inp.index_value,
42
+ name=name,
43
+ )
@@ -0,0 +1,53 @@
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 ....lib.dtypes_extension import ArrowDtype
18
+
19
+
20
+ def struct_dtypes(series):
21
+ """
22
+ Return the dtype object of each child field of the struct.
23
+
24
+ Returns
25
+ -------
26
+ pandas.Series
27
+ The data type of each child field.
28
+
29
+ Examples
30
+ --------
31
+ >>> import maxframe.dataframe as md
32
+ >>> import pandas as pd
33
+ >>> import pyarrow as pa
34
+ >>> s = md.Series(
35
+ ... [
36
+ ... {"version": 1, "project": "pandas"},
37
+ ... {"version": 2, "project": "pandas"},
38
+ ... {"version": 1, "project": "numpy"},
39
+ ... ],
40
+ ... dtype=pd.ArrowDtype(pa.struct(
41
+ ... [("version", pa.int64()), ("project", pa.string())]
42
+ ... ))
43
+ ... )
44
+ >>> s.struct.dtypes.execute()
45
+ version int64[pyarrow]
46
+ project string[pyarrow]
47
+ dtype: object
48
+ """
49
+ pa_type = series.dtype.pyarrow_dtype
50
+ fields = [pa_type[idx] for idx in range(pa_type.num_fields)]
51
+ dtypes_list = [ArrowDtype(ft.type) for ft in fields]
52
+ dt_name = [ft.name for ft in fields]
53
+ return pd.Series(dtypes_list, index=dt_name)
@@ -0,0 +1,123 @@
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 ....lib.dtypes_extension import ArrowDtype
16
+ from .core import SeriesStructMethod
17
+
18
+
19
+ def struct_field(series, name_or_index):
20
+ """
21
+ Extract a child field of a struct as a Series.
22
+
23
+ Parameters
24
+ ----------
25
+ name_or_index : str | bytes | int | expression | list
26
+ Name or index of the child field to extract.
27
+
28
+ For list-like inputs, this will index into a nested
29
+ struct.
30
+
31
+ Returns
32
+ -------
33
+ pandas.Series
34
+ The data corresponding to the selected child field.
35
+
36
+ See Also
37
+ --------
38
+ Series.struct.explode : Return all child fields as a DataFrame.
39
+
40
+ Notes
41
+ -----
42
+ The name of the resulting Series will be set using the following
43
+ rules:
44
+
45
+ - For string, bytes, or integer `name_or_index` (or a list of these, for
46
+ a nested selection), the Series name is set to the selected
47
+ field's name.
48
+ - For a :class:`pyarrow.compute.Expression`, this is set to
49
+ the string form of the expression.
50
+ - For list-like `name_or_index`, the name will be set to the
51
+ name of the final field selected.
52
+
53
+ Examples
54
+ --------
55
+ >>> import maxframe.dataframe as md
56
+ >>> import pandas as pd
57
+ >>> import pyarrow as pa
58
+ >>> s = md.Series(
59
+ ... [
60
+ ... {"version": 1, "project": "pandas"},
61
+ ... {"version": 2, "project": "pandas"},
62
+ ... {"version": 1, "project": "numpy"},
63
+ ... ],
64
+ ... dtype=pd.ArrowDtype(pa.struct(
65
+ ... [("version", pa.int64()), ("project", pa.string())]
66
+ ... ))
67
+ ... )
68
+
69
+ Extract by field name.
70
+
71
+ >>> s.struct.field("project").execute()
72
+ 0 pandas
73
+ 1 pandas
74
+ 2 numpy
75
+ Name: project, dtype: string[pyarrow]
76
+
77
+ Extract by field index.
78
+
79
+ >>> s.struct.field(0).execute()
80
+ 0 1
81
+ 1 2
82
+ 2 1
83
+ Name: version, dtype: int64[pyarrow]
84
+
85
+ For nested struct types, you can pass a list of values to index
86
+ multiple levels:
87
+
88
+ >>> version_type = pa.struct([
89
+ ... ("major", pa.int64()),
90
+ ... ("minor", pa.int64()),
91
+ ... ])
92
+ >>> s = md.Series(
93
+ ... [
94
+ ... {"version": {"major": 1, "minor": 5}, "project": "pandas"},
95
+ ... {"version": {"major": 2, "minor": 1}, "project": "pandas"},
96
+ ... {"version": {"major": 1, "minor": 26}, "project": "numpy"},
97
+ ... ],
98
+ ... dtype=pd.ArrowDtype(pa.struct(
99
+ ... [("version", version_type), ("project", pa.string())]
100
+ ... ))
101
+ ... )
102
+ >>> s.struct.field(["version", "minor"]).execute()
103
+ 0 5
104
+ 1 1
105
+ 2 26
106
+ Name: minor, dtype: int64[pyarrow]
107
+ >>> s.struct.field([0, 0]).execute()
108
+ 0 1
109
+ 1 2
110
+ 2 1
111
+ Name: major, dtype: int64[pyarrow]
112
+ """
113
+ op = SeriesStructMethod(
114
+ method="field",
115
+ method_kwargs={"name_or_index": name_or_index},
116
+ )
117
+ names = name_or_index if isinstance(name_or_index, list) else [name_or_index]
118
+ arrow_type = series.dtype.pyarrow_dtype
119
+ arrow_name = None
120
+ for n in names:
121
+ arrow_name = arrow_type[n].name
122
+ arrow_type = arrow_type[n].type
123
+ return op(series, dtype=ArrowDtype(arrow_type), name=arrow_name)
@@ -0,0 +1,13 @@
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.