maxframe 2.0.0b2__cp311-cp311-win32.whl → 2.2.0__cp311-cp311-win32.whl

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

Potentially problematic release.


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

Files changed (391) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp311-win32.pyd +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +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.cp311-win32.pyd +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.cp311-win32.pyd +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.cp311-win32.pyd +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
maxframe/tensor/utils.py CHANGED
@@ -167,7 +167,7 @@ def normalize_axis_tuple(axis, ndim, argname=None, allow_duplicate=False):
167
167
  except TypeError:
168
168
  pass
169
169
  # Going via an iterator directly is slower than via list comprehension.
170
- axis = tuple([validate_axis(ndim, ax, argname) for ax in axis])
170
+ axis = tuple(validate_axis(ndim, ax, argname) for ax in axis)
171
171
  if not allow_duplicate and len(set(axis)) != len(axis):
172
172
  if argname:
173
173
  raise ValueError(f"repeated axis in `{argname}` argument")
@@ -709,8 +709,8 @@ def implement_scipy(scipy_fun_name):
709
709
  return wrapper
710
710
 
711
711
 
712
- def infer_scipy_dtype(scipy_fun_name):
712
+ def infer_scipy_dtype(scipy_fun_name, **kw):
713
713
  scipy_fun = _load_scipy_func(scipy_fun_name)
714
714
  if scipy_fun is None:
715
715
  return lambda x: x
716
- return infer_dtype(scipy_fun)
716
+ return infer_dtype(scipy_fun, **kw)
@@ -32,7 +32,7 @@ import pytest
32
32
 
33
33
  from .. import utils
34
34
  from ..serialization import PickleContainer
35
- from ..utils import parse_size_to_megabytes
35
+ from ..utils import parse_size_to_megabytes, validate_and_adjust_resource_ratio
36
36
 
37
37
 
38
38
  def test_string_conversion():
@@ -369,6 +369,12 @@ def test_arrow_type_from_string():
369
369
  _assert_arrow_type_convert(
370
370
  pa.struct([("key", pa.string()), ("value", pa.list_(pa.int64()))])
371
371
  )
372
+ _assert_arrow_type_convert(
373
+ pa.struct([("key", pa.string(), False), ("value", pa.list_(pa.int64()))])
374
+ )
375
+ _assert_arrow_type_convert(
376
+ pa.struct([("key", pa.string()), ("value", pa.list_(pa.int64()), False)])
377
+ )
372
378
 
373
379
 
374
380
  @pytest.mark.parametrize("use_async", [False, True])
@@ -527,6 +533,7 @@ def test_numeric_inputs_with_default_units(value, default_unit):
527
533
  "input_string, expected",
528
534
  [
529
535
  # Basic binary units
536
+ ("1B", 1 / BYTES_PER_MIB),
530
537
  ("1KiB", BYTES_PER_KIB / BYTES_PER_MIB),
531
538
  ("5miB", 5),
532
539
  ("2giB", 2 * BYTES_PER_GIB / BYTES_PER_MIB),
@@ -571,3 +578,38 @@ def test_parse_size_to_mega_bytes_invalid_inputs(invalid_input, default_unit):
571
578
  """Test invalid inputs that should raise ValueError"""
572
579
  with pytest.raises(ValueError): # Catch ValueError
573
580
  parse_size_to_megabytes(invalid_input, default_number_unit=default_unit)
581
+
582
+
583
+ @pytest.mark.parametrize(
584
+ "udf_resources, max_memory_cpu_ratio, adjust, expected_resources, expected_adjusted, should_warn",
585
+ [
586
+ ({"other": "value"}, 4, False, {"other": "value"}, False, False),
587
+ ({"memory": 8}, 4, False, {"memory": 8}, False, False),
588
+ ({"cpu": 2}, 4, False, {"cpu": 2}, False, False),
589
+ ({"cpu": 2, "memory": 2}, 4, True, {"cpu": 2, "memory": 2}, False, False),
590
+ ({"cpu": 2, "memory": 8}, 4, False, {"cpu": 2, "memory": 8}, False, False),
591
+ ({"cpu": 1, "memory": 8}, 4, False, {"cpu": 1, "memory": 8}, False, False),
592
+ ({"cpu": 2, "memory": 8}, 4, False, {"cpu": 2, "memory": 8}, False, False),
593
+ ({"cpu": 2, "memory": 8}, 4, False, {"cpu": 2, "memory": 8}, False, False),
594
+ ({"cpu": 1, "memory": 8}, 4, True, {"cpu": 2, "memory": 8}, True, True),
595
+ ({"cpu": 1, "memory": 18}, 7, True, {"cpu": 3, "memory": 18}, True, True),
596
+ ({"cpu": 1, "memory": 7.5}, 4, True, {"cpu": 2, "memory": 7.5}, True, True),
597
+ ],
598
+ )
599
+ def test_validate_and_adjust_resource_ratio(
600
+ udf_resources,
601
+ max_memory_cpu_ratio,
602
+ adjust,
603
+ expected_resources,
604
+ expected_adjusted,
605
+ should_warn,
606
+ recwarn,
607
+ ):
608
+ result_resources, was_adjusted = validate_and_adjust_resource_ratio(
609
+ udf_resources, max_memory_cpu_ratio, adjust
610
+ )
611
+ assert result_resources == expected_resources
612
+ assert was_adjusted == expected_adjusted
613
+ if should_warn:
614
+ # check warning
615
+ assert len(recwarn) == 1
maxframe/tests/utils.py CHANGED
@@ -16,7 +16,6 @@ import asyncio
16
16
  import contextlib
17
17
  import functools
18
18
  import hashlib
19
- import logging
20
19
  import os
21
20
  import queue
22
21
  import socket
@@ -233,7 +232,6 @@ def create_test_volume(vol_name, oss_config):
233
232
  yield vol_name
234
233
  finally:
235
234
  try:
236
- logging.warning("Deleting test volume %s", vol_name)
237
235
  odps_entry.delete_volume(vol_name, auto_remove_dir=True, recursive=True)
238
236
  except:
239
237
  pass
maxframe/typing_.py CHANGED
@@ -15,6 +15,7 @@
15
15
  from numbers import Integral
16
16
  from typing import List, TypeVar, Union
17
17
 
18
+ import numpy as np
18
19
  import pandas as pd
19
20
  import pyarrow as pa
20
21
 
@@ -22,6 +23,7 @@ SlicesType = List[Union[None, Integral, slice]]
22
23
 
23
24
  TimeoutType = Union[int, float, None]
24
25
 
26
+ PandasDType = Union[np.dtype, pd.api.extensions.ExtensionDtype]
25
27
 
26
28
  ArrowTableType = Union[pa.Table, pa.RecordBatch]
27
29
  PandasObjectTypes = Union[
maxframe/udf.py CHANGED
@@ -17,6 +17,7 @@ from typing import Callable, List, Optional, Union
17
17
 
18
18
  from odps.models import Resource
19
19
 
20
+ from .config.validators import is_positive_integer
20
21
  from .serialization import load_member
21
22
  from .serialization.serializables import (
22
23
  BoolField,
@@ -106,6 +107,7 @@ class MarkedFunction(Serializable):
106
107
  expect_resources = DictField(
107
108
  "expect_resources", FieldTypes.string, default_factory=dict
108
109
  )
110
+ gpu = BoolField("gpu", default=False)
109
111
 
110
112
  def __init__(self, func: Optional[Callable] = None, **kw):
111
113
  super().__init__(func=func, **kw)
@@ -177,6 +179,8 @@ def with_running_options(
177
179
  engine: Optional[str] = None,
178
180
  cpu: Optional[int] = None,
179
181
  memory: Optional[Union[str, int]] = None,
182
+ gu: Optional[int] = None,
183
+ gu_quota: Optional[Union[str, List[str]]] = None,
180
184
  **kwargs,
181
185
  ):
182
186
  """
@@ -191,6 +195,10 @@ def with_running_options(
191
195
  memory: Optional[Union[str, int]]
192
196
  The memory to run the UDF. If it is an int, it is in GB.
193
197
  If it is a str, it is in the format of "10GiB", "30MiB", etc.
198
+ gu: Optional[int]
199
+ The GU number to run the UDF.
200
+ gu_quota: Optional[Union[str, List[str]]]
201
+ The GU quota nicknames to run the UDF. The order is the priority of the usage.
194
202
  kwargs
195
203
  Other running options.
196
204
  """
@@ -204,20 +212,37 @@ def with_running_options(
204
212
  raise TypeError("memory must be an int or str")
205
213
  if isinstance(memory, int) and memory <= 0:
206
214
  raise ValueError("memory must be greater than 0")
215
+ if gu is not None and gu <= 0:
216
+ raise ValueError("gu must be greater than 0")
217
+ if gu is not None and (cpu or memory):
218
+ raise ValueError("gu can't be specified with cpu or memory")
207
219
 
208
220
  if cpu:
209
221
  resources["cpu"] = cpu
210
222
  if memory:
211
223
  resources["memory"] = memory
212
224
 
225
+ if isinstance(gu_quota, str):
226
+ gu_quota = [gu_quota]
227
+
228
+ resources["gpu"] = gu
229
+ resources["gu_quota"] = gu_quota
230
+ use_gpu = is_positive_integer(gu)
231
+
213
232
  def func_wrapper(func):
214
- if all(v is None for v in (engine, cpu, memory)):
233
+ if all(v is None for v in (engine, cpu, memory, gu, gu_quota)):
215
234
  return func
216
235
  if isinstance(func, MarkedFunction):
217
236
  func.expect_engine = engine
218
237
  func.expect_resources = resources
238
+ func.gpu = use_gpu
219
239
  return func
220
- return MarkedFunction(func, expect_engine=engine, expect_resources=resources)
240
+ return MarkedFunction(
241
+ func,
242
+ expect_engine=engine,
243
+ expect_resources=resources,
244
+ gpu=use_gpu,
245
+ )
221
246
 
222
247
  return func_wrapper
223
248
 
maxframe/utils.py CHANGED
@@ -25,6 +25,7 @@ import inspect
25
25
  import io
26
26
  import itertools
27
27
  import logging
28
+ import math
28
29
  import numbers
29
30
  import os
30
31
  import pkgutil
@@ -32,10 +33,12 @@ import random
32
33
  import re
33
34
  import struct
34
35
  import sys
36
+ import tempfile
35
37
  import threading
36
38
  import time
37
39
  import tokenize as pytokenize
38
40
  import types
41
+ import warnings
39
42
  import weakref
40
43
  import zlib
41
44
  from collections.abc import Hashable, Mapping
@@ -45,6 +48,7 @@ from typing import (
45
48
  Awaitable,
46
49
  Callable,
47
50
  Dict,
51
+ Generator,
48
52
  Iterable,
49
53
  List,
50
54
  Optional,
@@ -547,6 +551,20 @@ class ToThreadMixin:
547
551
  return self.to_thread(func, *args, wait_on_cancel=wait_on_cancel, **kwargs)
548
552
 
549
553
 
554
+ class PatchableMixin:
555
+ """Patch not None field to dest_obj"""
556
+
557
+ __slots__ = ()
558
+
559
+ _patchable_attrs = tuple()
560
+
561
+ def patch_to(self, dest_obj) -> None:
562
+ for attr in self._patchable_attrs:
563
+ val = getattr(self, attr, None)
564
+ if val is not None:
565
+ setattr(dest_obj, attr, val)
566
+
567
+
550
568
  def config_odps_default_options():
551
569
  from odps import options as odps_options
552
570
 
@@ -712,7 +730,10 @@ def sbytes(x: Any) -> bytes:
712
730
  elif isinstance(x, str):
713
731
  return bytes(x, encoding="utf-8")
714
732
  else:
715
- return bytes(x)
733
+ try:
734
+ return bytes(x)
735
+ except TypeError:
736
+ return bytes(str(x), encoding="utf-8")
716
737
 
717
738
 
718
739
  def is_full_slice(slc: Any) -> bool:
@@ -914,7 +935,7 @@ def stringify_path(path: Union[str, os.PathLike]) -> str:
914
935
  raise TypeError("not a path-like object")
915
936
 
916
937
 
917
- _memory_size_indices = {"": 0, "k": 1, "m": 2, "g": 3, "t": 4}
938
+ _memory_size_indices = {"": 0, "b": 0, "k": 1, "m": 2, "g": 3, "t": 4}
918
939
 
919
940
  _size_pattern = re.compile(r"^([0-9.-]+)\s*([a-z]*)$")
920
941
 
@@ -1050,13 +1071,19 @@ def remove_suffix(value: str, suffix: str) -> Tuple[str, bool]:
1050
1071
  return value, match
1051
1072
 
1052
1073
 
1053
- def find_objects(nested: Union[List, Dict], types: Union[Type, Tuple[Type]]) -> List:
1074
+ def find_objects(
1075
+ nested: Union[List, Dict],
1076
+ types: Union[None, Type, Tuple[Type]] = None,
1077
+ checker: Callable[..., bool] = None,
1078
+ ) -> List:
1054
1079
  found = []
1055
1080
  stack = [nested]
1056
1081
 
1057
1082
  while len(stack) > 0:
1058
1083
  it = stack.pop()
1059
- if isinstance(it, types):
1084
+ if (types is not None and isinstance(it, types)) or (
1085
+ checker is not None and checker(it)
1086
+ ):
1060
1087
  found.append(it)
1061
1088
  continue
1062
1089
 
@@ -1184,7 +1211,7 @@ def arrow_type_from_str(type_str: str) -> pa.DataType:
1184
1211
  token_iter = pytokenize.tokenize(io.BytesIO(type_str.encode()).readline)
1185
1212
  value_stack, op_stack = [], []
1186
1213
 
1187
- def _pop_make_type(with_args: bool = False, combined: bool = True) -> None:
1214
+ def _pop_make_type(with_args: bool = False, combined: bool = True):
1188
1215
  """
1189
1216
  Pops tops of value stacks, creates a DataType instance and push back
1190
1217
 
@@ -1208,6 +1235,23 @@ def arrow_type_from_str(type_str: str) -> pa.DataType:
1208
1235
  else: # pragma: no cover
1209
1236
  value_stack.append(type_name)
1210
1237
 
1238
+ def _pop_make_struct_field():
1239
+ """parameterized sub-types need to be represented as tuples"""
1240
+ nonlocal value_stack
1241
+
1242
+ op_stack.pop(-1)
1243
+ if isinstance(value_stack[-1], str) and value_stack[-1].lower() in (
1244
+ "null",
1245
+ "not null",
1246
+ ):
1247
+ values = value_stack[-3:]
1248
+ value_stack = value_stack[:-3]
1249
+ values[-1] = values[-1] == "null"
1250
+ else:
1251
+ values = value_stack[-2:]
1252
+ value_stack = value_stack[:-2]
1253
+ value_stack.append(tuple(values))
1254
+
1211
1255
  for token in token_iter:
1212
1256
  if token.type == pytokenize.OP:
1213
1257
  if token.string == ":":
@@ -1216,13 +1260,9 @@ def arrow_type_from_str(type_str: str) -> pa.DataType:
1216
1260
  # gather previous sub-types
1217
1261
  if op_stack[-1] in ("<", ":"):
1218
1262
  _pop_make_type()
1219
-
1220
1263
  if op_stack[-1] == ":":
1221
- # parameterized sub-types need to be represented as tuples
1222
- op_stack.pop(-1)
1223
- values = value_stack[-2:]
1224
- value_stack = value_stack[:-2]
1225
- value_stack.append(tuple(values))
1264
+ _pop_make_struct_field()
1265
+
1226
1266
  # put generated item into the parameter list
1227
1267
  val = value_stack.pop(-1)
1228
1268
  value_stack[-1].append(val)
@@ -1239,22 +1279,20 @@ def arrow_type_from_str(type_str: str) -> pa.DataType:
1239
1279
  op_stack.pop(-1)
1240
1280
  elif token.string == ">":
1241
1281
  _pop_make_type()
1242
-
1243
1282
  if op_stack[-1] == ":":
1244
- # parameterized sub-types need to be represented as tuples
1245
- op_stack.pop(-1)
1246
- values = value_stack[-2:]
1247
- value_stack = value_stack[:-2]
1248
- value_stack.append(tuple(values))
1283
+ _pop_make_struct_field()
1249
1284
 
1250
1285
  # put generated item into the parameter list
1251
1286
  val = value_stack.pop(-1)
1252
1287
  value_stack[-1].append(val)
1253
1288
  # make DataType (i.e., list / map / struct) given args
1254
- _pop_make_type(True)
1289
+ _pop_make_type(with_args=True)
1255
1290
  op_stack.pop(-1)
1256
1291
  elif token.type == pytokenize.NAME:
1257
- value_stack.append(token.string)
1292
+ if value_stack and value_stack[-1] == "not":
1293
+ value_stack[-1] += " " + token.string
1294
+ else:
1295
+ value_stack.append(token.string)
1258
1296
  elif token.type == pytokenize.NUMBER:
1259
1297
  value_stack.append(int(token.string))
1260
1298
  elif token.type == pytokenize.ENDMARKER:
@@ -1545,3 +1583,139 @@ def cache_tileables(*tileables):
1545
1583
  for t in tileables:
1546
1584
  if isinstance(t, ENTITY_TYPE):
1547
1585
  t.cache = True
1586
+
1587
+
1588
+ def ignore_warning(func: Callable):
1589
+ @functools.wraps(func)
1590
+ def inner(*args, **kwargs):
1591
+ with warnings.catch_warnings():
1592
+ warnings.simplefilter("ignore")
1593
+ return func(*args, **kwargs)
1594
+
1595
+ return inner
1596
+
1597
+
1598
+ class ServiceLoggerAdapter(logging.LoggerAdapter):
1599
+ extra_key_mapping = {}
1600
+
1601
+ def process(self, msg, kwargs):
1602
+ merged_extra = (self.extra or {}).copy()
1603
+ merged_extra.update(kwargs)
1604
+
1605
+ prefix = " ".join(
1606
+ f"{self.extra_key_mapping.get(k) or k.capitalize()}={merged_extra[k]}"
1607
+ for k in merged_extra.keys()
1608
+ )
1609
+ msg = f"[{prefix}] {msg}"
1610
+ return msg, kwargs
1611
+
1612
+
1613
+ @contextmanager
1614
+ def atomic_writer(filename, mode="w", **kwargs):
1615
+ """
1616
+ Write to a file in an atomic way.
1617
+ """
1618
+ temp_fd, temp_path = tempfile.mkstemp(dir=os.path.dirname(filename) or ".")
1619
+ os.chmod(temp_path, 0o644)
1620
+ os.close(temp_fd) # Close the file descriptor immediately and we reopen this later.
1621
+
1622
+ try:
1623
+ # Write to temp file.
1624
+ with open(temp_path, mode, **kwargs) as temp_file:
1625
+ yield temp_file
1626
+
1627
+ # Replace the original file with the temp file atomically.
1628
+ os.replace(temp_path, filename)
1629
+ finally:
1630
+ try:
1631
+ os.remove(temp_path)
1632
+ except OSError:
1633
+ pass
1634
+
1635
+
1636
+ def prevent_called_from_pandas(level=2):
1637
+ """Prevent method from being called from pandas"""
1638
+ frame = sys._getframe(level)
1639
+ called_frame = sys._getframe(1)
1640
+ pd_pack_location = os.path.dirname(pd.__file__)
1641
+ if frame.f_code.co_filename.startswith(pd_pack_location):
1642
+ raise AttributeError(called_frame.f_code.co_name)
1643
+
1644
+
1645
+ def combine_error_message_and_traceback(
1646
+ messages: List[str], tracebacks: List[List[str]]
1647
+ ) -> str:
1648
+ tbs = []
1649
+ for msg, tb in zip(messages, tracebacks):
1650
+ tbs.append("".join([msg + "\n"] + tb))
1651
+ return "\nCaused by:\n".join(tbs)
1652
+
1653
+
1654
+ def generate_unique_id(byte_len: int) -> Generator[str, None, None]:
1655
+ """
1656
+ The ids are ensured to be unique in one generator.
1657
+ DO NOT use this generator in global scope or singleton class members,
1658
+ as it may not free the set.
1659
+ """
1660
+ generated_ids = set()
1661
+ while True:
1662
+ new_id = new_random_id(byte_len).hex()
1663
+ if new_id not in generated_ids:
1664
+ generated_ids.add(new_id)
1665
+ yield new_id
1666
+
1667
+
1668
+ def validate_and_adjust_resource_ratio(
1669
+ expect_resources: Dict[str, Any],
1670
+ max_memory_cpu_ratio: float = None,
1671
+ adjust: bool = False,
1672
+ ) -> Tuple[Dict[str, Any], bool]:
1673
+ """
1674
+ Validate and optionally adjust CPU:memory ratio to meet maximum requirements.
1675
+
1676
+ Args:
1677
+ expect_resources: Dictionary containing resource specifications
1678
+ max_memory_cpu_ratio: Maximum memory/cpu ratio (if None, will use config value)
1679
+ adjust: Whether to automatically adjust resources to meet ratio
1680
+
1681
+ Returns:
1682
+ Tuple of (adjusted_resources, was_adjusted)
1683
+ """
1684
+ cpu = expect_resources.get("cpu") or 1
1685
+ memory = expect_resources.get("memory")
1686
+
1687
+ if cpu is None or memory is None or max_memory_cpu_ratio is None:
1688
+ return expect_resources, False
1689
+
1690
+ # Convert memory to GiB if it's a string
1691
+ cpu = max(cpu, 1)
1692
+ memory_gib = parse_size_to_megabytes(memory, default_number_unit="GiB") / 1024
1693
+ current_ratio = memory_gib / cpu
1694
+
1695
+ if current_ratio > max_memory_cpu_ratio:
1696
+ # Adjust CPU to meet maximum ratio, don't reduce resources
1697
+ recommended_cpu = math.ceil(memory_gib / max_memory_cpu_ratio)
1698
+ new_ratio = memory_gib / recommended_cpu
1699
+ if adjust:
1700
+ adjusted_resources = expect_resources.copy()
1701
+ adjusted_resources["cpu"] = recommended_cpu
1702
+
1703
+ warnings.warn(
1704
+ f"UDF resource auto-adjustment: Current UDF settings"
1705
+ f" (CPU: {cpu}, Memory: {memory_gib}Gib, Ratio: {current_ratio:.2f})"
1706
+ f" exceed maximum allowed ratio {max_memory_cpu_ratio:.1f}. "
1707
+ f"Automatically adjusted to (CPU: {recommended_cpu},"
1708
+ f" Memory: {memory_gib:.2f}:1Gib,"
1709
+ f" Ratio: {new_ratio:.2f}:1) to meet requirements."
1710
+ )
1711
+ return adjusted_resources, True
1712
+ else:
1713
+ warnings.warn(
1714
+ f"UDF resource ratio warning: Current UDF settings"
1715
+ f" (CPU: {cpu}, Memory: {memory_gib}Gib, Ratio: {current_ratio:.2f})"
1716
+ f" exceed maximum allowed ratio {max_memory_cpu_ratio:.1f}. "
1717
+ f"Consider adjusting CPU to at least {recommended_cpu}"
1718
+ f" (which would result in Ratio: {new_ratio:.2f}) to meet requirements."
1719
+ )
1720
+
1721
+ return expect_resources, False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maxframe
3
- Version: 2.0.0b2
3
+ Version: 2.2.0
4
4
  Summary: MaxFrame operator-based data analyze framework
5
5
  Requires-Dist: numpy<2.0.0,>=1.19.0
6
6
  Requires-Dist: pandas>=1.0.0
@@ -19,6 +19,7 @@ Requires-Dist: importlib_metadata>=1.4
19
19
  Provides-Extra: dev
20
20
  Requires-Dist: black>=22.3.0; extra == "dev"
21
21
  Requires-Dist: flake8>=5.0.4; extra == "dev"
22
+ Requires-Dist: flake8-type-checking>=1.0.3; extra == "dev"
22
23
  Requires-Dist: pre-commit>=2.15.0; extra == "dev"
23
24
  Requires-Dist: graphviz>=0.20.1; extra == "dev"
24
25
  Provides-Extra: test
@@ -30,7 +31,7 @@ Requires-Dist: pytest-timeout>=2.1.0; extra == "test"
30
31
  Requires-Dist: matplotlib>=2.0.0; extra == "test"
31
32
  Requires-Dist: lightgbm<4.0.0,>=3.0.0; extra == "test"
32
33
  Requires-Dist: scikit-learn>=1.0; extra == "test"
33
- Requires-Dist: xgboost<3.0.0,>=1.4.0; extra == "test"
34
+ Requires-Dist: xgboost<2.1.0,>=1.6.2; extra == "test"
34
35
  Dynamic: description
35
36
 
36
37
  MaxCompute MaxFrame Client