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

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

Potentially problematic release.


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

Files changed (391) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cpython-310-darwin.so +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +6 -6
  5. maxframe/codegen/spe/core.py +1 -1
  6. maxframe/codegen/spe/dataframe/__init__.py +1 -0
  7. maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
  8. maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
  9. maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
  10. maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
  11. maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
  12. maxframe/codegen/spe/dataframe/groupby.py +88 -0
  13. maxframe/codegen/spe/dataframe/indexing.py +99 -4
  14. maxframe/codegen/spe/dataframe/merge.py +34 -1
  15. maxframe/codegen/spe/dataframe/misc.py +9 -33
  16. maxframe/codegen/spe/dataframe/reduction.py +14 -9
  17. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  18. maxframe/codegen/spe/dataframe/sort.py +30 -17
  19. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
  20. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
  21. maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
  22. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
  23. maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
  24. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
  25. maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
  26. maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
  27. maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
  28. maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
  29. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
  30. maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
  31. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  32. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  33. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  34. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  35. maxframe/codegen/spe/tensor/__init__.py +3 -0
  36. maxframe/codegen/spe/tensor/fft.py +74 -0
  37. maxframe/codegen/spe/tensor/linalg.py +29 -2
  38. maxframe/codegen/spe/tensor/misc.py +79 -25
  39. maxframe/codegen/spe/tensor/spatial.py +45 -0
  40. maxframe/codegen/spe/tensor/statistics.py +44 -0
  41. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  42. maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
  43. maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
  44. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  45. maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
  46. maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
  47. maxframe/codegen/spe/utils.py +2 -0
  48. maxframe/config/config.py +70 -9
  49. maxframe/config/tests/test_validators.py +13 -1
  50. maxframe/config/validators.py +49 -0
  51. maxframe/conftest.py +44 -17
  52. maxframe/core/accessor.py +2 -2
  53. maxframe/core/entity/core.py +5 -0
  54. maxframe/core/entity/tileables.py +1 -1
  55. maxframe/core/graph/core.cpython-310-darwin.so +0 -0
  56. maxframe/core/graph/entity.py +1 -2
  57. maxframe/core/operator/base.py +9 -2
  58. maxframe/core/operator/core.py +10 -2
  59. maxframe/core/operator/utils.py +13 -0
  60. maxframe/dataframe/__init__.py +10 -3
  61. maxframe/dataframe/accessors/__init__.py +1 -1
  62. maxframe/dataframe/accessors/compat.py +45 -0
  63. maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
  64. maxframe/dataframe/accessors/dict_/contains.py +7 -16
  65. maxframe/dataframe/accessors/dict_/core.py +48 -0
  66. maxframe/dataframe/accessors/dict_/getitem.py +17 -21
  67. maxframe/dataframe/accessors/dict_/length.py +7 -16
  68. maxframe/dataframe/accessors/dict_/remove.py +6 -18
  69. maxframe/dataframe/accessors/dict_/setitem.py +8 -18
  70. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
  71. maxframe/dataframe/accessors/list_/__init__.py +2 -2
  72. maxframe/dataframe/accessors/list_/core.py +48 -0
  73. maxframe/dataframe/accessors/list_/getitem.py +12 -19
  74. maxframe/dataframe/accessors/list_/length.py +7 -16
  75. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
  76. maxframe/dataframe/accessors/string_/__init__.py +4 -1
  77. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  78. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  79. maxframe/dataframe/accessors/struct_/core.py +43 -0
  80. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  81. maxframe/dataframe/accessors/struct_/field.py +123 -0
  82. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  83. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  84. maxframe/dataframe/arithmetic/__init__.py +14 -4
  85. maxframe/dataframe/arithmetic/between.py +106 -0
  86. maxframe/dataframe/arithmetic/dot.py +237 -0
  87. maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
  88. maxframe/dataframe/core.py +63 -118
  89. maxframe/dataframe/datasource/__init__.py +18 -0
  90. maxframe/dataframe/datasource/from_dict.py +124 -0
  91. maxframe/dataframe/datasource/from_index.py +1 -1
  92. maxframe/dataframe/datasource/from_records.py +77 -0
  93. maxframe/dataframe/datasource/from_tensor.py +109 -41
  94. maxframe/dataframe/datasource/read_csv.py +2 -3
  95. maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
  96. maxframe/dataframe/datastore/__init__.py +5 -1
  97. maxframe/dataframe/datastore/to_csv.py +29 -41
  98. maxframe/dataframe/datastore/to_odps.py +30 -4
  99. maxframe/dataframe/extensions/__init__.py +20 -4
  100. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  101. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  102. maxframe/dataframe/extensions/collect_kv.py +126 -0
  103. maxframe/dataframe/extensions/extract_kv.py +177 -0
  104. maxframe/dataframe/extensions/map_reduce.py +263 -0
  105. maxframe/dataframe/extensions/rebalance.py +62 -0
  106. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  107. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  108. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  109. maxframe/dataframe/groupby/__init__.py +12 -1
  110. maxframe/dataframe/groupby/aggregation.py +78 -45
  111. maxframe/dataframe/groupby/apply.py +1 -1
  112. maxframe/dataframe/groupby/apply_chunk.py +18 -2
  113. maxframe/dataframe/groupby/core.py +96 -12
  114. maxframe/dataframe/groupby/cum.py +4 -25
  115. maxframe/dataframe/groupby/expanding.py +264 -0
  116. maxframe/dataframe/groupby/fill.py +1 -1
  117. maxframe/dataframe/groupby/getitem.py +12 -5
  118. maxframe/dataframe/groupby/head.py +11 -1
  119. maxframe/dataframe/groupby/rank.py +136 -0
  120. maxframe/dataframe/groupby/rolling.py +206 -0
  121. maxframe/dataframe/groupby/shift.py +114 -0
  122. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  123. maxframe/dataframe/indexing/__init__.py +20 -1
  124. maxframe/dataframe/indexing/droplevel.py +195 -0
  125. maxframe/dataframe/indexing/filter.py +169 -0
  126. maxframe/dataframe/indexing/get_level_values.py +76 -0
  127. maxframe/dataframe/indexing/iat.py +45 -0
  128. maxframe/dataframe/indexing/iloc.py +152 -12
  129. maxframe/dataframe/indexing/insert.py +1 -1
  130. maxframe/dataframe/indexing/loc.py +287 -7
  131. maxframe/dataframe/indexing/reindex.py +14 -5
  132. maxframe/dataframe/indexing/rename.py +6 -0
  133. maxframe/dataframe/indexing/rename_axis.py +2 -2
  134. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  135. maxframe/dataframe/indexing/reset_index.py +33 -6
  136. maxframe/dataframe/indexing/sample.py +8 -0
  137. maxframe/dataframe/indexing/setitem.py +3 -3
  138. maxframe/dataframe/indexing/swaplevel.py +185 -0
  139. maxframe/dataframe/indexing/take.py +99 -0
  140. maxframe/dataframe/indexing/truncate.py +140 -0
  141. maxframe/dataframe/indexing/where.py +0 -11
  142. maxframe/dataframe/indexing/xs.py +148 -0
  143. maxframe/dataframe/merge/__init__.py +12 -1
  144. maxframe/dataframe/merge/append.py +97 -98
  145. maxframe/dataframe/merge/combine_first.py +120 -0
  146. maxframe/dataframe/merge/compare.py +387 -0
  147. maxframe/dataframe/merge/concat.py +183 -0
  148. maxframe/dataframe/merge/update.py +271 -0
  149. maxframe/dataframe/misc/__init__.py +16 -10
  150. maxframe/dataframe/misc/_duplicate.py +10 -4
  151. maxframe/dataframe/misc/apply.py +1 -1
  152. maxframe/dataframe/misc/check_unique.py +51 -0
  153. maxframe/dataframe/misc/clip.py +145 -0
  154. maxframe/dataframe/misc/describe.py +175 -9
  155. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  156. maxframe/dataframe/misc/duplicated.py +2 -2
  157. maxframe/dataframe/misc/get_dummies.py +5 -1
  158. maxframe/dataframe/misc/isin.py +2 -2
  159. maxframe/dataframe/misc/map.py +94 -0
  160. maxframe/dataframe/misc/tests/test_misc.py +13 -2
  161. maxframe/dataframe/misc/to_numeric.py +3 -0
  162. maxframe/dataframe/misc/transform.py +12 -5
  163. maxframe/dataframe/misc/transpose.py +13 -1
  164. maxframe/dataframe/misc/valid_index.py +115 -0
  165. maxframe/dataframe/misc/value_counts.py +38 -4
  166. maxframe/dataframe/missing/checkna.py +13 -6
  167. maxframe/dataframe/missing/dropna.py +5 -0
  168. maxframe/dataframe/missing/fillna.py +1 -1
  169. maxframe/dataframe/missing/replace.py +7 -4
  170. maxframe/dataframe/reduction/__init__.py +29 -15
  171. maxframe/dataframe/reduction/aggregation.py +38 -9
  172. maxframe/dataframe/reduction/all.py +2 -2
  173. maxframe/dataframe/reduction/any.py +2 -2
  174. maxframe/dataframe/reduction/argmax.py +100 -0
  175. maxframe/dataframe/reduction/argmin.py +100 -0
  176. maxframe/dataframe/reduction/core.py +65 -18
  177. maxframe/dataframe/reduction/count.py +13 -9
  178. maxframe/dataframe/reduction/cov.py +166 -0
  179. maxframe/dataframe/reduction/cummax.py +2 -2
  180. maxframe/dataframe/reduction/cummin.py +2 -2
  181. maxframe/dataframe/reduction/cumprod.py +2 -2
  182. maxframe/dataframe/reduction/cumsum.py +2 -2
  183. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  184. maxframe/dataframe/reduction/idxmax.py +185 -0
  185. maxframe/dataframe/reduction/idxmin.py +185 -0
  186. maxframe/dataframe/reduction/kurtosis.py +37 -30
  187. maxframe/dataframe/reduction/max.py +2 -2
  188. maxframe/dataframe/reduction/mean.py +9 -7
  189. maxframe/dataframe/reduction/median.py +2 -2
  190. maxframe/dataframe/reduction/min.py +2 -2
  191. maxframe/dataframe/reduction/nunique.py +9 -8
  192. maxframe/dataframe/reduction/prod.py +18 -13
  193. maxframe/dataframe/reduction/reduction_size.py +2 -2
  194. maxframe/dataframe/reduction/sem.py +13 -9
  195. maxframe/dataframe/reduction/skew.py +31 -27
  196. maxframe/dataframe/reduction/str_concat.py +10 -7
  197. maxframe/dataframe/reduction/sum.py +18 -14
  198. maxframe/dataframe/reduction/unique.py +20 -3
  199. maxframe/dataframe/reduction/var.py +16 -12
  200. maxframe/dataframe/reshape/__init__.py +38 -0
  201. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  202. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  203. maxframe/dataframe/reshape/unstack.py +114 -0
  204. maxframe/dataframe/sort/__init__.py +8 -0
  205. maxframe/dataframe/sort/argsort.py +62 -0
  206. maxframe/dataframe/sort/core.py +1 -0
  207. maxframe/dataframe/sort/nlargest.py +238 -0
  208. maxframe/dataframe/sort/nsmallest.py +228 -0
  209. maxframe/dataframe/statistics/__init__.py +3 -3
  210. maxframe/dataframe/statistics/corr.py +1 -0
  211. maxframe/dataframe/statistics/quantile.py +2 -2
  212. maxframe/dataframe/tests/test_typing.py +104 -0
  213. maxframe/dataframe/tests/test_utils.py +66 -2
  214. maxframe/dataframe/typing_.py +185 -0
  215. maxframe/dataframe/utils.py +95 -26
  216. maxframe/dataframe/window/aggregation.py +8 -4
  217. maxframe/dataframe/window/core.py +14 -1
  218. maxframe/dataframe/window/ewm.py +1 -3
  219. maxframe/dataframe/window/expanding.py +37 -35
  220. maxframe/dataframe/window/rolling.py +49 -39
  221. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  222. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  223. maxframe/env.py +7 -4
  224. maxframe/errors.py +2 -2
  225. maxframe/io/odpsio/schema.py +9 -3
  226. maxframe/io/odpsio/tableio.py +7 -2
  227. maxframe/io/odpsio/tests/test_schema.py +198 -83
  228. maxframe/learn/__init__.py +10 -2
  229. maxframe/learn/cluster/__init__.py +15 -0
  230. maxframe/learn/cluster/_kmeans.py +782 -0
  231. maxframe/learn/contrib/llm/core.py +2 -0
  232. maxframe/learn/contrib/xgboost/core.py +86 -1
  233. maxframe/learn/contrib/xgboost/train.py +5 -2
  234. maxframe/learn/core.py +66 -0
  235. maxframe/learn/linear_model/_base.py +58 -1
  236. maxframe/learn/linear_model/_lin_reg.py +1 -1
  237. maxframe/learn/metrics/__init__.py +6 -0
  238. maxframe/learn/metrics/_classification.py +145 -0
  239. maxframe/learn/metrics/_ranking.py +477 -0
  240. maxframe/learn/metrics/_scorer.py +60 -0
  241. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  242. maxframe/learn/metrics/pairwise/core.py +77 -0
  243. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  244. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  245. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  246. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  247. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  248. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  249. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  250. maxframe/learn/metrics/tests/__init__.py +13 -0
  251. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  252. maxframe/learn/utils/__init__.py +1 -1
  253. maxframe/learn/utils/checks.py +1 -2
  254. maxframe/learn/utils/core.py +59 -0
  255. maxframe/learn/utils/extmath.py +37 -0
  256. maxframe/learn/utils/odpsio.py +193 -0
  257. maxframe/learn/utils/validation.py +2 -2
  258. maxframe/lib/compat.py +40 -0
  259. maxframe/lib/dtypes_extension/__init__.py +16 -1
  260. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  261. maxframe/lib/dtypes_extension/blob.py +304 -0
  262. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  263. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  264. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  265. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  266. maxframe/lib/filesystem/_oss_lib/common.py +122 -50
  267. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  268. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  269. maxframe/lib/filesystem/base.py +1 -1
  270. maxframe/lib/filesystem/core.py +1 -1
  271. maxframe/lib/filesystem/oss.py +115 -46
  272. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  273. maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
  274. maxframe/lib/wrapped_pickle.py +10 -0
  275. maxframe/opcodes.py +33 -15
  276. maxframe/protocol.py +12 -0
  277. maxframe/serialization/__init__.py +11 -2
  278. maxframe/serialization/arrow.py +38 -13
  279. maxframe/serialization/blob.py +32 -0
  280. maxframe/serialization/core.cpython-310-darwin.so +0 -0
  281. maxframe/serialization/core.pyx +39 -1
  282. maxframe/serialization/exception.py +2 -4
  283. maxframe/serialization/numpy.py +11 -0
  284. maxframe/serialization/pandas.py +46 -9
  285. maxframe/serialization/serializables/core.py +2 -2
  286. maxframe/serialization/tests/test_serial.py +29 -2
  287. maxframe/tensor/__init__.py +38 -8
  288. maxframe/tensor/arithmetic/__init__.py +19 -10
  289. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  290. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -0
  291. maxframe/tensor/core.py +3 -2
  292. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  293. maxframe/tensor/extensions/__init__.py +2 -0
  294. maxframe/tensor/extensions/apply_chunk.py +3 -3
  295. maxframe/tensor/extensions/rebalance.py +65 -0
  296. maxframe/tensor/fft/__init__.py +32 -0
  297. maxframe/tensor/fft/core.py +168 -0
  298. maxframe/tensor/fft/fft.py +112 -0
  299. maxframe/tensor/fft/fft2.py +118 -0
  300. maxframe/tensor/fft/fftfreq.py +80 -0
  301. maxframe/tensor/fft/fftn.py +123 -0
  302. maxframe/tensor/fft/fftshift.py +79 -0
  303. maxframe/tensor/fft/hfft.py +112 -0
  304. maxframe/tensor/fft/ifft.py +114 -0
  305. maxframe/tensor/fft/ifft2.py +115 -0
  306. maxframe/tensor/fft/ifftn.py +123 -0
  307. maxframe/tensor/fft/ifftshift.py +73 -0
  308. maxframe/tensor/fft/ihfft.py +93 -0
  309. maxframe/tensor/fft/irfft.py +118 -0
  310. maxframe/tensor/fft/irfft2.py +62 -0
  311. maxframe/tensor/fft/irfftn.py +114 -0
  312. maxframe/tensor/fft/rfft.py +116 -0
  313. maxframe/tensor/fft/rfft2.py +63 -0
  314. maxframe/tensor/fft/rfftfreq.py +87 -0
  315. maxframe/tensor/fft/rfftn.py +113 -0
  316. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  317. maxframe/tensor/linalg/__init__.py +7 -0
  318. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  319. maxframe/tensor/linalg/cholesky.py +117 -0
  320. maxframe/tensor/linalg/einsum.py +339 -0
  321. maxframe/tensor/linalg/lstsq.py +100 -0
  322. maxframe/tensor/linalg/matrix_norm.py +75 -0
  323. maxframe/tensor/linalg/norm.py +249 -0
  324. maxframe/tensor/linalg/solve.py +72 -0
  325. maxframe/tensor/linalg/solve_triangular.py +2 -2
  326. maxframe/tensor/linalg/vector_norm.py +113 -0
  327. maxframe/tensor/misc/__init__.py +24 -1
  328. maxframe/tensor/misc/argwhere.py +72 -0
  329. maxframe/tensor/misc/array_split.py +46 -0
  330. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  331. maxframe/tensor/misc/copyto.py +130 -0
  332. maxframe/tensor/misc/delete.py +104 -0
  333. maxframe/tensor/misc/dsplit.py +68 -0
  334. maxframe/tensor/misc/ediff1d.py +74 -0
  335. maxframe/tensor/misc/expand_dims.py +85 -0
  336. maxframe/tensor/misc/flip.py +90 -0
  337. maxframe/tensor/misc/fliplr.py +64 -0
  338. maxframe/tensor/misc/flipud.py +68 -0
  339. maxframe/tensor/misc/hsplit.py +85 -0
  340. maxframe/tensor/misc/insert.py +139 -0
  341. maxframe/tensor/misc/moveaxis.py +83 -0
  342. maxframe/tensor/misc/result_type.py +88 -0
  343. maxframe/tensor/misc/roll.py +124 -0
  344. maxframe/tensor/misc/rollaxis.py +77 -0
  345. maxframe/tensor/misc/shape.py +89 -0
  346. maxframe/tensor/misc/split.py +190 -0
  347. maxframe/tensor/misc/tile.py +109 -0
  348. maxframe/tensor/misc/vsplit.py +74 -0
  349. maxframe/tensor/reduction/array_equal.py +2 -1
  350. maxframe/tensor/sort/__init__.py +2 -0
  351. maxframe/tensor/sort/argpartition.py +98 -0
  352. maxframe/tensor/sort/partition.py +228 -0
  353. maxframe/tensor/spatial/__init__.py +15 -0
  354. maxframe/tensor/spatial/distance/__init__.py +17 -0
  355. maxframe/tensor/spatial/distance/cdist.py +421 -0
  356. maxframe/tensor/spatial/distance/pdist.py +398 -0
  357. maxframe/tensor/spatial/distance/squareform.py +153 -0
  358. maxframe/tensor/special/__init__.py +159 -21
  359. maxframe/tensor/special/airy.py +55 -0
  360. maxframe/tensor/special/bessel.py +199 -0
  361. maxframe/tensor/special/core.py +65 -4
  362. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  363. maxframe/tensor/special/ellip_harm.py +55 -0
  364. maxframe/tensor/special/err_fresnel.py +223 -0
  365. maxframe/tensor/special/gamma_funcs.py +303 -0
  366. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  367. maxframe/tensor/special/info_theory.py +189 -0
  368. maxframe/tensor/special/misc.py +21 -0
  369. maxframe/tensor/statistics/__init__.py +6 -0
  370. maxframe/tensor/statistics/corrcoef.py +77 -0
  371. maxframe/tensor/statistics/cov.py +222 -0
  372. maxframe/tensor/statistics/digitize.py +126 -0
  373. maxframe/tensor/statistics/histogram.py +520 -0
  374. maxframe/tensor/statistics/median.py +85 -0
  375. maxframe/tensor/statistics/ptp.py +89 -0
  376. maxframe/tensor/utils.py +3 -3
  377. maxframe/tests/test_utils.py +43 -1
  378. maxframe/tests/utils.py +0 -2
  379. maxframe/typing_.py +2 -0
  380. maxframe/udf.py +27 -2
  381. maxframe/utils.py +193 -19
  382. {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/METADATA +3 -2
  383. {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/RECORD +391 -236
  384. maxframe_client/fetcher.py +35 -4
  385. maxframe_client/session/odps.py +7 -2
  386. maxframe_client/tests/test_fetcher.py +76 -3
  387. maxframe_client/tests/test_session.py +4 -1
  388. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  389. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  390. {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/WHEEL +0 -0
  391. {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/top_level.txt +0 -0
@@ -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,9 @@
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_first import df_combine_first, series_combine_first
17
+ from .compare import DataFrameCompare, df_compare, series_compare
16
18
  from .concat import DataFrameConcat, concat
17
19
  from .merge import (
18
20
  DataFrameMerge,
@@ -22,14 +24,23 @@ from .merge import (
22
24
  join,
23
25
  merge,
24
26
  )
27
+ from .update import DataFrameUpdate, df_update, series_update
25
28
 
26
29
 
27
30
  def _install():
28
31
  from ..core import DATAFRAME_TYPE, SERIES_TYPE
29
32
 
30
33
  for cls in DATAFRAME_TYPE:
34
+ setattr(cls, "combine_first", df_combine_first)
35
+ setattr(cls, "compare", df_compare)
31
36
  setattr(cls, "join", join)
32
37
  setattr(cls, "merge", merge)
38
+ setattr(cls, "update", df_update)
39
+
40
+ for cls in SERIES_TYPE:
41
+ setattr(cls, "combine_first", series_combine_first)
42
+ setattr(cls, "compare", series_compare)
43
+ setattr(cls, "update", series_update)
33
44
 
34
45
  for cls in DATAFRAME_TYPE + SERIES_TYPE:
35
46
  setattr(cls, "append", append)
@@ -14,108 +14,107 @@
14
14
 
15
15
  import pandas as pd
16
16
 
17
- from ... import opcodes
18
- from ...core import OutputType
19
- from ...serialization.serializables import BoolField
20
17
  from ..datasource.dataframe import from_pandas
21
- from ..operators import (
22
- DATAFRAME_TYPE,
23
- SERIES_TYPE,
24
- DataFrameOperator,
25
- DataFrameOperatorMixin,
26
- )
27
- from ..utils import parse_index
28
-
29
-
30
- class DataFrameAppend(DataFrameOperator, DataFrameOperatorMixin):
31
- _op_type_ = opcodes.APPEND
32
-
33
- ignore_index = BoolField("ignore_index", default=False)
34
- verify_integrity = BoolField("verify_integrity", default=False)
35
- sort = BoolField("sort", default=False)
36
-
37
- def __init__(self, output_types=None, **kw):
38
- super().__init__(_output_types=output_types, **kw)
39
-
40
- def _call_dataframe(self, df, other):
41
- if isinstance(other, DATAFRAME_TYPE):
42
- shape = (df.shape[0] + other.shape[0], df.shape[1])
43
- inputs = [df, other]
44
- if self.ignore_index:
45
- index_value = parse_index(pd.RangeIndex(shape[0]))
46
- else:
47
- index_value = parse_index(
48
- df.index_value.to_pandas().append(other.index_value.to_pandas())
49
- )
50
- elif isinstance(other, list):
51
- row_length = df.shape[0]
52
- index = df.index_value.to_pandas()
53
- for item in other:
54
- if not isinstance(item, DATAFRAME_TYPE): # pragma: no cover
55
- raise ValueError(f"Invalid type {type(item)} to append")
56
- row_length += item.shape[0]
57
- index = index.append(item.index_value.to_pandas())
58
- shape = (row_length, df.shape[1])
59
- if self.ignore_index: # pragma: no cover
60
- index_value = parse_index(pd.RangeIndex(shape[0]))
61
- else:
62
- index_value = parse_index(index)
63
- inputs = [df] + other
64
- else: # pragma: no cover
65
- raise ValueError(f"Invalid type {type(other)} to append")
66
- return self.new_dataframe(
67
- inputs,
68
- shape=shape,
69
- dtypes=df.dtypes,
70
- index_value=index_value,
71
- columns_value=df.columns_value,
72
- )
73
-
74
- def _call_series(self, df, other):
75
- if isinstance(other, SERIES_TYPE):
76
- shape = (df.shape[0] + other.shape[0],)
77
- inputs = [df, other]
78
- if self.ignore_index:
79
- index_value = parse_index(pd.RangeIndex(shape[0]))
80
- else:
81
- index_value = parse_index(
82
- df.index_value.to_pandas().append(other.index_value.to_pandas())
83
- )
84
- elif isinstance(other, list):
85
- row_length = df.shape[0]
86
- index = df.index_value.to_pandas()
87
- for item in other:
88
- if not isinstance(item, SERIES_TYPE): # pragma: no cover
89
- raise ValueError(f"Invalid type {type(item)} to append")
90
- row_length += item.shape[0]
91
- index = index.append(item.index_value.to_pandas())
92
- shape = (row_length,)
93
- if self.ignore_index: # pragma: no cover
94
- index_value = parse_index(pd.RangeIndex(shape[0]))
95
- else:
96
- index_value = parse_index(index)
97
- inputs = [df] + other
98
- else: # pragma: no cover
99
- raise ValueError(f"Invalid type {type(other)} to append")
100
- return self.new_series(
101
- inputs, shape=shape, dtype=df.dtype, index_value=index_value, name=df.name
102
- )
103
-
104
- def __call__(self, df, other):
105
- if isinstance(df, DATAFRAME_TYPE):
106
- self.output_types = [OutputType.dataframe]
107
- return self._call_dataframe(df, other)
108
- else:
109
- self.output_types = [OutputType.series]
110
- return self._call_series(df, other)
111
18
 
112
19
 
113
20
  def append(df, other, ignore_index=False, verify_integrity=False, sort=False):
114
- if verify_integrity or sort: # pragma: no cover
115
- raise NotImplementedError("verify_integrity and sort are not supported now")
21
+ """
22
+ Append rows of `other` to the end of caller, returning a new object.
23
+
24
+ Columns in `other` that are not in the caller are added as new columns.
25
+
26
+ Parameters
27
+ ----------
28
+ other : DataFrame or Series/dict-like object, or list of these
29
+ The data to append.
30
+ ignore_index : bool, default False
31
+ If True, the resulting axis will be labeled 0, 1, …, n - 1.
32
+ verify_integrity : bool, default False
33
+ If True, raise ValueError on creating index with duplicates.
34
+ sort : bool, default False
35
+ Sort columns if the columns of `self` and `other` are not aligned.
36
+
37
+ Returns
38
+ -------
39
+ DataFrame
40
+ A new DataFrame consisting of the rows of caller and the rows of `other`.
41
+
42
+ See Also
43
+ --------
44
+ concat : General function to concatenate DataFrame or Series objects.
45
+
46
+ Notes
47
+ -----
48
+ If a list of dict/series is passed and the keys are all contained in
49
+ the DataFrame's index, the order of the columns in the resulting
50
+ DataFrame will be unchanged.
51
+
52
+ Iteratively appending rows to a DataFrame can be more computationally
53
+ intensive than a single concatenate. A better solution is to append
54
+ those rows to a list and then concatenate the list with the original
55
+ DataFrame all at once.
56
+
57
+ Examples
58
+ --------
59
+ >>> import maxframe.dataframe as md
60
+ >>> df = md.DataFrame([[1, 2], [3, 4]], columns=list('AB'), index=['x', 'y'])
61
+ >>> df.execute()
62
+ A B
63
+ x 1 2
64
+ y 3 4
65
+ >>> df2 = md.DataFrame([[5, 6], [7, 8]], columns=list('AB'), index=['x', 'y'])
66
+ >>> df.append(df2).execute()
67
+ A B
68
+ x 1 2
69
+ y 3 4
70
+ x 5 6
71
+ y 7 8
72
+
73
+ With `ignore_index` set to True:
74
+
75
+ >>> df.append(df2, ignore_index=True).execute()
76
+ A B
77
+ 0 1 2
78
+ 1 3 4
79
+ 2 5 6
80
+ 3 7 8
81
+
82
+ The following, while not recommended methods for generating DataFrames,
83
+ show two ways to generate a DataFrame from multiple data sources.
84
+
85
+ Less efficient:
86
+
87
+ >>> df = md.DataFrame(columns=['A'])
88
+ >>> for i in range(5):
89
+ ... df = df.append({'A': i}, ignore_index=True)
90
+ >>> df.execute()
91
+ A
92
+ 0 0
93
+ 1 1
94
+ 2 2
95
+ 3 3
96
+ 4 4
97
+
98
+ More efficient:
99
+
100
+ >>> md.concat([md.DataFrame([i], columns=['A']) for i in range(5)],
101
+ ... ignore_index=True).execute()
102
+ A
103
+ 0 0
104
+ 1 1
105
+ 2 2
106
+ 3 3
107
+ 4 4
108
+ """
109
+ from .concat import concat
110
+
116
111
  if isinstance(other, dict):
117
112
  other = from_pandas(pd.DataFrame(dict((k, [v]) for k, v in other.items())))
118
- op = DataFrameAppend(
119
- ignore_index=ignore_index, verify_integrity=verify_integrity, sort=sort
113
+ if not isinstance(other, list):
114
+ other = [other]
115
+ return concat(
116
+ [df] + other,
117
+ ignore_index=ignore_index,
118
+ verify_integrity=verify_integrity,
119
+ sort=sort,
120
120
  )
121
- return op(df, other)
@@ -0,0 +1,120 @@
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 df_combine_first(df, other):
17
+ """
18
+ Update null elements with value in the same location in `other`.
19
+
20
+ Combine two DataFrame objects by filling null values in one DataFrame
21
+ with non-null values from other DataFrame. The row and column indexes
22
+ of the resulting DataFrame will be the union of the two. The resulting
23
+ dataframe contains the 'first' dataframe values and overrides the
24
+ second one values where both first.loc[index, col] and
25
+ second.loc[index, col] are not missing values, upon calling
26
+ first.combine_first(second).
27
+
28
+ Parameters
29
+ ----------
30
+ other : DataFrame
31
+ Provided DataFrame to use to fill null values.
32
+
33
+ Returns
34
+ -------
35
+ DataFrame
36
+ The result of combining the provided DataFrame with the other object.
37
+
38
+ See Also
39
+ --------
40
+ DataFrame.combine : Perform series-wise operation on two DataFrames
41
+ using a given function.
42
+
43
+ Examples
44
+ --------
45
+ >>> import maxframe.dataframe as md
46
+ >>> df1 = md.DataFrame({'A': [None, 0], 'B': [None, 4]})
47
+ >>> df2 = md.DataFrame({'A': [1, 1], 'B': [3, 3]})
48
+ >>> df1.combine_first(df2).execute()
49
+ A B
50
+ 0 1.0 3.0
51
+ 1 0.0 4.0
52
+
53
+ Null values still persist if the location of that null value
54
+ does not exist in `other`
55
+
56
+ >>> df1 = md.DataFrame({'A': [None, 0], 'B': [4, None]})
57
+ >>> df2 = md.DataFrame({'B': [3, 3], 'C': [1, 1]}, index=[1, 2])
58
+ >>> df1.combine_first(df2).execute()
59
+ A B C
60
+ 0 NaN 4.0 NaN
61
+ 1 0.0 3.0 1.0
62
+ 2 NaN 3.0 1.0
63
+ """
64
+ ret = df.copy()
65
+ ret.update(other, join="outer", overwrite=False)
66
+ return ret
67
+
68
+
69
+ def series_combine_first(series, other):
70
+ """
71
+ Update null elements with value in the same location in 'other'.
72
+
73
+ Combine two Series objects by filling null values in one Series with
74
+ non-null values from the other Series. Result index will be the union
75
+ of the two indexes.
76
+
77
+ Parameters
78
+ ----------
79
+ other : Series
80
+ The value(s) to be used for filling null values.
81
+
82
+ Returns
83
+ -------
84
+ Series
85
+ The result of combining the provided Series with the other object.
86
+
87
+ See Also
88
+ --------
89
+ Series.combine : Perform element-wise operation on two Series
90
+ using a given function.
91
+
92
+ Examples
93
+ --------
94
+ >>> import maxframe.tensor as mt
95
+ >>> import maxframe.dataframe as md
96
+ >>> s1 = md.Series([1, mt.nan])
97
+ >>> s2 = md.Series([3, 4, 5])
98
+ >>> s1.combine_first(s2).execute()
99
+ 0 1.0
100
+ 1 4.0
101
+ 2 5.0
102
+ dtype: float64
103
+
104
+ Null values still persist if the location of that null value
105
+ does not exist in `other`
106
+
107
+ >>> s1 = md.Series({'falcon': mt.nan, 'eagle': 160.0})
108
+ >>> s2 = md.Series({'eagle': 200.0, 'duck': 30.0})
109
+ >>> s1.combine_first(s2).execute()
110
+ duck 30.0
111
+ eagle 160.0
112
+ falcon NaN
113
+ dtype: float64
114
+ """
115
+ ret = series.copy()
116
+ # as Series.update does not have other args, we add them manually
117
+ # to the operator object
118
+ ret.update(other)
119
+ ret.op.join, ret.op.overwrite = "outer", False
120
+ return ret