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
@@ -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)]
@@ -0,0 +1,140 @@
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 truncate(df, before=None, after=None, axis=0, copy=None):
19
+ """
20
+ Truncate a Series or DataFrame before and after some index value.
21
+
22
+ This is a useful shorthand for boolean indexing based on index
23
+ values above or below certain thresholds.
24
+
25
+ Parameters
26
+ ----------
27
+ before : date, str, int
28
+ Truncate all rows before this index value.
29
+ after : date, str, int
30
+ Truncate all rows after this index value.
31
+ axis : {0 or 'index', 1 or 'columns'}, optional
32
+ Axis to truncate. Truncates the index (rows) by default.
33
+ For `Series` this parameter is unused and defaults to 0.
34
+ copy : bool, default is True,
35
+ This parameter is only kept for compatibility with pandas.
36
+
37
+ Returns
38
+ -------
39
+ type of caller
40
+ The truncated Series or DataFrame.
41
+
42
+ See Also
43
+ --------
44
+ DataFrame.loc : Select a subset of a DataFrame by label.
45
+ DataFrame.iloc : Select a subset of a DataFrame by position.
46
+
47
+ Notes
48
+ -----
49
+ If the index being truncated contains only datetime values,
50
+ `before` and `after` may be specified as strings instead of
51
+ Timestamps.
52
+
53
+ Examples
54
+ --------
55
+ >>> import maxframe.dataframe as md
56
+ >>> df = md.DataFrame({'A': ['a', 'b', 'c', 'd', 'e'],
57
+ ... 'B': ['f', 'g', 'h', 'i', 'j'],
58
+ ... 'C': ['k', 'l', 'm', 'n', 'o']},
59
+ ... index=[1, 2, 3, 4, 5])
60
+ >>> df.execute()
61
+ A B C
62
+ 1 a f k
63
+ 2 b g l
64
+ 3 c h m
65
+ 4 d i n
66
+ 5 e j o
67
+
68
+ >>> df.truncate(before=2, after=4).execute()
69
+ A B C
70
+ 2 b g l
71
+ 3 c h m
72
+ 4 d i n
73
+
74
+ The columns of a DataFrame can be truncated.
75
+
76
+ >>> df.truncate(before="A", after="B", axis="columns").execute()
77
+ A B
78
+ 1 a f
79
+ 2 b g
80
+ 3 c h
81
+ 4 d i
82
+ 5 e j
83
+
84
+ For Series, only rows can be truncated.
85
+
86
+ >>> df['A'].truncate(before=2, after=4).execute()
87
+ 2 b
88
+ 3 c
89
+ 4 d
90
+ Name: A, dtype: object
91
+
92
+ The index values in ``truncate`` can be datetimes or string
93
+ dates.
94
+
95
+ >>> dates = md.date_range('2016-01-01', '2016-02-01', freq='s')
96
+ >>> df = md.DataFrame(index=dates, data={'A': 1})
97
+ >>> df.tail().execute()
98
+ A
99
+ 2016-01-31 23:59:56 1
100
+ 2016-01-31 23:59:57 1
101
+ 2016-01-31 23:59:58 1
102
+ 2016-01-31 23:59:59 1
103
+ 2016-02-01 00:00:00 1
104
+
105
+ >>> df.truncate(before=md.Timestamp('2016-01-05'),
106
+ ... after=md.Timestamp('2016-01-10')).tail().execute()
107
+ A
108
+ 2016-01-09 23:59:56 1
109
+ 2016-01-09 23:59:57 1
110
+ 2016-01-09 23:59:58 1
111
+ 2016-01-09 23:59:59 1
112
+ 2016-01-10 00:00:00 1
113
+
114
+ Because the index is a DatetimeIndex containing only dates, we can
115
+ specify `before` and `after` as strings. They will be coerced to
116
+ Timestamps before truncation.
117
+
118
+ >>> df.truncate('2016-01-05', '2016-01-10').tail().execute()
119
+ A
120
+ 2016-01-09 23:59:56 1
121
+ 2016-01-09 23:59:57 1
122
+ 2016-01-09 23:59:58 1
123
+ 2016-01-09 23:59:59 1
124
+ 2016-01-10 00:00:00 1
125
+
126
+ Note that ``truncate`` assumes a 0 value for any unspecified time
127
+ component (midnight). This differs from partial string slicing, which
128
+ returns any partially matching dates.
129
+
130
+ >>> df.loc['2016-01-05':'2016-01-10', :].tail().execute()
131
+ A
132
+ 2016-01-10 23:59:55 1
133
+ 2016-01-10 23:59:56 1
134
+ 2016-01-10 23:59:57 1
135
+ 2016-01-10 23:59:58 1
136
+ 2016-01-10 23:59:59 1
137
+ """
138
+ _ = copy
139
+ axis = validate_axis(axis, df)
140
+ return df.loc[before:after, :] if axis == 0 else df.loc[:, before:after]
@@ -79,8 +79,6 @@ class DataFrameWhere(DataFrameOperator, DataFrameOperatorMixin):
79
79
  other=mock_other,
80
80
  axis=self.axis,
81
81
  level=self.level,
82
- errors=self.errors,
83
- try_cast=self.try_cast,
84
82
  )
85
83
 
86
84
  inputs = filter_inputs([df_or_series, self.cond, self.other])
@@ -135,15 +133,6 @@ axis : int, default None
135
133
  Alignment axis if needed.
136
134
  level : int, default None
137
135
  Alignment level if needed.
138
- errors : str, {{'raise', 'ignore'}}, default 'raise'
139
- Note that currently this parameter won't affect
140
- the results and will always coerce to a suitable dtype.
141
-
142
- - 'raise' : allow exceptions to be raised.
143
- - 'ignore' : suppress exceptions. On error return original object.
144
-
145
- try_cast : bool, default False
146
- Try to cast the result back to the input type (if possible).
147
136
 
148
137
  Returns
149
138
  -------
@@ -0,0 +1,148 @@
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 pandas.api.types import is_list_like
16
+
17
+ from ..utils import validate_axis
18
+
19
+
20
+ def xs(df_or_series, key, axis=0, level=None, drop_level=True):
21
+ """
22
+ Return cross-section from the Series/DataFrame.
23
+
24
+ This method takes a `key` argument to select data at a particular
25
+ level of a MultiIndex.
26
+
27
+ Parameters
28
+ ----------
29
+ key : label or tuple of label
30
+ Label contained in the index, or partially in a MultiIndex.
31
+ axis : {0 or 'index', 1 or 'columns'}, default 0
32
+ Axis to retrieve cross-section on.
33
+ level : object, defaults to first n levels (n=1 or len(key))
34
+ In case of a key partially contained in a MultiIndex, indicate
35
+ which levels are used. Levels can be referred by label or position.
36
+ drop_level : bool, default True
37
+ If False, returns object with same levels as self.
38
+
39
+ Returns
40
+ -------
41
+ Series or DataFrame
42
+ Cross-section from the original Series or DataFrame
43
+ corresponding to the selected index levels.
44
+
45
+ See Also
46
+ --------
47
+ DataFrame.loc : Access a group of rows and columns
48
+ by label(s) or a boolean array.
49
+ DataFrame.iloc : Purely integer-location based indexing
50
+ for selection by position.
51
+
52
+ Notes
53
+ -----
54
+ `xs` can not be used to set values.
55
+
56
+ MultiIndex Slicers is a generic way to get/set values on
57
+ any level or levels.
58
+ It is a superset of `xs` functionality, see
59
+ :ref:`MultiIndex Slicers <advanced.mi_slicers>`.
60
+
61
+ Examples
62
+ --------
63
+ >>> import maxframe.dataframe as md
64
+ >>> d = {'num_legs': [4, 4, 2, 2],
65
+ ... 'num_wings': [0, 0, 2, 2],
66
+ ... 'class': ['mammal', 'mammal', 'mammal', 'bird'],
67
+ ... 'animal': ['cat', 'dog', 'bat', 'penguin'],
68
+ ... 'locomotion': ['walks', 'walks', 'flies', 'walks']}
69
+ >>> df = md.DataFrame(data=d)
70
+ >>> df = df.set_index(['class', 'animal', 'locomotion'])
71
+ >>> df.execute()
72
+ num_legs num_wings
73
+ class animal locomotion
74
+ mammal cat walks 4 0
75
+ dog walks 4 0
76
+ bat flies 2 2
77
+ bird penguin walks 2 2
78
+
79
+ Get values at specified index
80
+
81
+ >>> df.xs('mammal').execute()
82
+ num_legs num_wings
83
+ animal locomotion
84
+ cat walks 4 0
85
+ dog walks 4 0
86
+ bat flies 2 2
87
+
88
+ Get values at several indexes
89
+
90
+ >>> df.xs(('mammal', 'dog')).execute()
91
+ num_legs num_wings
92
+ locomotion
93
+ walks 4 0
94
+
95
+ Get values at specified index and level
96
+
97
+ >>> df.xs('cat', level=1).execute()
98
+ num_legs num_wings
99
+ class locomotion
100
+ mammal walks 4 0
101
+
102
+ Get values at several indexes and levels
103
+
104
+ >>> df.xs(('bird', 'walks'),
105
+ ... level=[0, 'locomotion']).execute()
106
+ num_legs num_wings
107
+ animal
108
+ penguin 2 2
109
+
110
+ Get values at specified column and axis
111
+
112
+ >>> df.xs('num_wings', axis=1).execute()
113
+ class animal locomotion
114
+ mammal cat walks 0
115
+ dog walks 0
116
+ bat flies 2
117
+ bird penguin walks 2
118
+ Name: num_wings, dtype: int64
119
+ """
120
+ axis = validate_axis(axis, df_or_series)
121
+ if level is None:
122
+ level = range(df_or_series.axes[axis].nlevels)
123
+ elif not is_list_like(level):
124
+ level = [level]
125
+
126
+ slc = [slice(None)] * df_or_series.axes[axis].nlevels
127
+ if not is_list_like(key):
128
+ key = (key,)
129
+
130
+ level_set = set()
131
+ for k, level_ in zip(key, level):
132
+ slc[level_] = k
133
+ level_set.add(level_)
134
+ left_levels = set(range(df_or_series.axes[axis].nlevels)) - level_set
135
+
136
+ if len(slc) > 1:
137
+ slc = tuple(slc)
138
+
139
+ res = df_or_series.loc(axis=axis)[slc]
140
+ if drop_level:
141
+ if len(left_levels) == 0:
142
+ if res.ndim > 1:
143
+ res = res.iloc[0, :] if axis == 0 else res.iloc[:, 0]
144
+ else:
145
+ res = res.iloc[0]
146
+ else:
147
+ res = res.droplevel(list(level_set), axis=axis)
148
+ return res
@@ -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 .append import DataFrameAppend, append
15
+ from .append import append
16
+ from .combine import DataFrameCombine, df_combine, series_combine
17
+ from .combine_first import df_combine_first, series_combine_first
18
+ from .compare import DataFrameCompare, df_compare, series_compare
16
19
  from .concat import DataFrameConcat, concat
17
20
  from .merge import (
18
21
  DataFrameMerge,
@@ -22,14 +25,25 @@ from .merge import (
22
25
  join,
23
26
  merge,
24
27
  )
28
+ from .update import DataFrameUpdate, df_update, series_update
25
29
 
26
30
 
27
31
  def _install():
28
32
  from ..core import DATAFRAME_TYPE, SERIES_TYPE
29
33
 
30
34
  for cls in DATAFRAME_TYPE:
35
+ setattr(cls, "combine_first", df_combine_first)
36
+ setattr(cls, "compare", df_compare)
31
37
  setattr(cls, "join", join)
32
38
  setattr(cls, "merge", merge)
39
+ setattr(cls, "update", df_update)
40
+ setattr(cls, "combine", df_combine)
41
+
42
+ for cls in SERIES_TYPE:
43
+ setattr(cls, "combine_first", series_combine_first)
44
+ setattr(cls, "compare", series_compare)
45
+ setattr(cls, "update", series_update)
46
+ setattr(cls, "combine", series_combine)
33
47
 
34
48
  for cls in DATAFRAME_TYPE + SERIES_TYPE:
35
49
  setattr(cls, "append", append)