maxframe 0.1.0b5__cp311-cp311-macosx_11_0_arm64.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 (647) hide show
  1. maxframe/__init__.py +32 -0
  2. maxframe/_utils.cpython-311-darwin.so +0 -0
  3. maxframe/_utils.pxd +33 -0
  4. maxframe/_utils.pyx +547 -0
  5. maxframe/codegen.py +528 -0
  6. maxframe/config/__init__.py +15 -0
  7. maxframe/config/config.py +443 -0
  8. maxframe/config/tests/__init__.py +13 -0
  9. maxframe/config/tests/test_config.py +103 -0
  10. maxframe/config/tests/test_validators.py +34 -0
  11. maxframe/config/validators.py +57 -0
  12. maxframe/conftest.py +139 -0
  13. maxframe/core/__init__.py +65 -0
  14. maxframe/core/base.py +156 -0
  15. maxframe/core/entity/__init__.py +44 -0
  16. maxframe/core/entity/chunks.py +68 -0
  17. maxframe/core/entity/core.py +152 -0
  18. maxframe/core/entity/executable.py +337 -0
  19. maxframe/core/entity/fuse.py +73 -0
  20. maxframe/core/entity/objects.py +100 -0
  21. maxframe/core/entity/output_types.py +90 -0
  22. maxframe/core/entity/tileables.py +438 -0
  23. maxframe/core/entity/utils.py +24 -0
  24. maxframe/core/graph/__init__.py +17 -0
  25. maxframe/core/graph/builder/__init__.py +16 -0
  26. maxframe/core/graph/builder/base.py +86 -0
  27. maxframe/core/graph/builder/chunk.py +430 -0
  28. maxframe/core/graph/builder/tileable.py +34 -0
  29. maxframe/core/graph/builder/utils.py +41 -0
  30. maxframe/core/graph/core.cpython-311-darwin.so +0 -0
  31. maxframe/core/graph/core.pyx +467 -0
  32. maxframe/core/graph/entity.py +171 -0
  33. maxframe/core/graph/tests/__init__.py +13 -0
  34. maxframe/core/graph/tests/test_graph.py +205 -0
  35. maxframe/core/mode.py +96 -0
  36. maxframe/core/operator/__init__.py +34 -0
  37. maxframe/core/operator/base.py +450 -0
  38. maxframe/core/operator/core.py +276 -0
  39. maxframe/core/operator/fetch.py +53 -0
  40. maxframe/core/operator/fuse.py +29 -0
  41. maxframe/core/operator/objects.py +72 -0
  42. maxframe/core/operator/shuffle.py +111 -0
  43. maxframe/core/operator/tests/__init__.py +13 -0
  44. maxframe/core/operator/tests/test_core.py +64 -0
  45. maxframe/core/tests/__init__.py +13 -0
  46. maxframe/core/tests/test_mode.py +75 -0
  47. maxframe/dataframe/__init__.py +81 -0
  48. maxframe/dataframe/arithmetic/__init__.py +359 -0
  49. maxframe/dataframe/arithmetic/abs.py +33 -0
  50. maxframe/dataframe/arithmetic/add.py +60 -0
  51. maxframe/dataframe/arithmetic/arccos.py +28 -0
  52. maxframe/dataframe/arithmetic/arccosh.py +28 -0
  53. maxframe/dataframe/arithmetic/arcsin.py +28 -0
  54. maxframe/dataframe/arithmetic/arcsinh.py +28 -0
  55. maxframe/dataframe/arithmetic/arctan.py +28 -0
  56. maxframe/dataframe/arithmetic/arctanh.py +28 -0
  57. maxframe/dataframe/arithmetic/around.py +152 -0
  58. maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
  59. maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
  60. maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
  61. maxframe/dataframe/arithmetic/ceil.py +28 -0
  62. maxframe/dataframe/arithmetic/core.py +342 -0
  63. maxframe/dataframe/arithmetic/cos.py +28 -0
  64. maxframe/dataframe/arithmetic/cosh.py +28 -0
  65. maxframe/dataframe/arithmetic/degrees.py +28 -0
  66. maxframe/dataframe/arithmetic/docstring.py +442 -0
  67. maxframe/dataframe/arithmetic/equal.py +56 -0
  68. maxframe/dataframe/arithmetic/exp.py +28 -0
  69. maxframe/dataframe/arithmetic/exp2.py +28 -0
  70. maxframe/dataframe/arithmetic/expm1.py +28 -0
  71. maxframe/dataframe/arithmetic/floor.py +28 -0
  72. maxframe/dataframe/arithmetic/floordiv.py +64 -0
  73. maxframe/dataframe/arithmetic/greater.py +57 -0
  74. maxframe/dataframe/arithmetic/greater_equal.py +57 -0
  75. maxframe/dataframe/arithmetic/invert.py +33 -0
  76. maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
  77. maxframe/dataframe/arithmetic/less.py +57 -0
  78. maxframe/dataframe/arithmetic/less_equal.py +57 -0
  79. maxframe/dataframe/arithmetic/log.py +28 -0
  80. maxframe/dataframe/arithmetic/log10.py +28 -0
  81. maxframe/dataframe/arithmetic/log2.py +28 -0
  82. maxframe/dataframe/arithmetic/mod.py +60 -0
  83. maxframe/dataframe/arithmetic/multiply.py +60 -0
  84. maxframe/dataframe/arithmetic/negative.py +33 -0
  85. maxframe/dataframe/arithmetic/not_equal.py +56 -0
  86. maxframe/dataframe/arithmetic/power.py +68 -0
  87. maxframe/dataframe/arithmetic/radians.py +28 -0
  88. maxframe/dataframe/arithmetic/sin.py +28 -0
  89. maxframe/dataframe/arithmetic/sinh.py +28 -0
  90. maxframe/dataframe/arithmetic/sqrt.py +28 -0
  91. maxframe/dataframe/arithmetic/subtract.py +64 -0
  92. maxframe/dataframe/arithmetic/tan.py +28 -0
  93. maxframe/dataframe/arithmetic/tanh.py +28 -0
  94. maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
  95. maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
  96. maxframe/dataframe/arithmetic/truediv.py +64 -0
  97. maxframe/dataframe/arithmetic/trunc.py +28 -0
  98. maxframe/dataframe/arrays.py +864 -0
  99. maxframe/dataframe/core.py +2417 -0
  100. maxframe/dataframe/datasource/__init__.py +15 -0
  101. maxframe/dataframe/datasource/core.py +81 -0
  102. maxframe/dataframe/datasource/dataframe.py +59 -0
  103. maxframe/dataframe/datasource/date_range.py +504 -0
  104. maxframe/dataframe/datasource/from_index.py +54 -0
  105. maxframe/dataframe/datasource/from_records.py +107 -0
  106. maxframe/dataframe/datasource/from_tensor.py +419 -0
  107. maxframe/dataframe/datasource/index.py +117 -0
  108. maxframe/dataframe/datasource/read_csv.py +528 -0
  109. maxframe/dataframe/datasource/read_odps_query.py +299 -0
  110. maxframe/dataframe/datasource/read_odps_table.py +253 -0
  111. maxframe/dataframe/datasource/read_parquet.py +421 -0
  112. maxframe/dataframe/datasource/series.py +55 -0
  113. maxframe/dataframe/datasource/tests/__init__.py +13 -0
  114. maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
  115. maxframe/dataframe/datastore/__init__.py +26 -0
  116. maxframe/dataframe/datastore/core.py +19 -0
  117. maxframe/dataframe/datastore/to_csv.py +227 -0
  118. maxframe/dataframe/datastore/to_odps.py +162 -0
  119. maxframe/dataframe/extensions/__init__.py +41 -0
  120. maxframe/dataframe/extensions/accessor.py +50 -0
  121. maxframe/dataframe/extensions/reshuffle.py +83 -0
  122. maxframe/dataframe/extensions/tests/__init__.py +13 -0
  123. maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
  124. maxframe/dataframe/fetch/__init__.py +15 -0
  125. maxframe/dataframe/fetch/core.py +86 -0
  126. maxframe/dataframe/groupby/__init__.py +82 -0
  127. maxframe/dataframe/groupby/aggregation.py +350 -0
  128. maxframe/dataframe/groupby/apply.py +251 -0
  129. maxframe/dataframe/groupby/core.py +179 -0
  130. maxframe/dataframe/groupby/cum.py +124 -0
  131. maxframe/dataframe/groupby/fill.py +141 -0
  132. maxframe/dataframe/groupby/getitem.py +92 -0
  133. maxframe/dataframe/groupby/head.py +105 -0
  134. maxframe/dataframe/groupby/sample.py +214 -0
  135. maxframe/dataframe/groupby/tests/__init__.py +13 -0
  136. maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
  137. maxframe/dataframe/groupby/transform.py +255 -0
  138. maxframe/dataframe/indexing/__init__.py +84 -0
  139. maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
  140. maxframe/dataframe/indexing/align.py +349 -0
  141. maxframe/dataframe/indexing/at.py +83 -0
  142. maxframe/dataframe/indexing/getitem.py +204 -0
  143. maxframe/dataframe/indexing/iat.py +37 -0
  144. maxframe/dataframe/indexing/iloc.py +566 -0
  145. maxframe/dataframe/indexing/insert.py +86 -0
  146. maxframe/dataframe/indexing/loc.py +411 -0
  147. maxframe/dataframe/indexing/reindex.py +526 -0
  148. maxframe/dataframe/indexing/rename.py +462 -0
  149. maxframe/dataframe/indexing/rename_axis.py +209 -0
  150. maxframe/dataframe/indexing/reset_index.py +402 -0
  151. maxframe/dataframe/indexing/sample.py +221 -0
  152. maxframe/dataframe/indexing/set_axis.py +194 -0
  153. maxframe/dataframe/indexing/set_index.py +61 -0
  154. maxframe/dataframe/indexing/setitem.py +130 -0
  155. maxframe/dataframe/indexing/tests/__init__.py +13 -0
  156. maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
  157. maxframe/dataframe/indexing/where.py +308 -0
  158. maxframe/dataframe/initializer.py +288 -0
  159. maxframe/dataframe/merge/__init__.py +32 -0
  160. maxframe/dataframe/merge/append.py +121 -0
  161. maxframe/dataframe/merge/concat.py +325 -0
  162. maxframe/dataframe/merge/merge.py +593 -0
  163. maxframe/dataframe/merge/tests/__init__.py +13 -0
  164. maxframe/dataframe/merge/tests/test_merge.py +215 -0
  165. maxframe/dataframe/misc/__init__.py +134 -0
  166. maxframe/dataframe/misc/_duplicate.py +46 -0
  167. maxframe/dataframe/misc/accessor.py +276 -0
  168. maxframe/dataframe/misc/apply.py +692 -0
  169. maxframe/dataframe/misc/astype.py +236 -0
  170. maxframe/dataframe/misc/case_when.py +141 -0
  171. maxframe/dataframe/misc/check_monotonic.py +84 -0
  172. maxframe/dataframe/misc/cut.py +383 -0
  173. maxframe/dataframe/misc/datetimes.py +79 -0
  174. maxframe/dataframe/misc/describe.py +108 -0
  175. maxframe/dataframe/misc/diff.py +210 -0
  176. maxframe/dataframe/misc/drop.py +440 -0
  177. maxframe/dataframe/misc/drop_duplicates.py +248 -0
  178. maxframe/dataframe/misc/duplicated.py +292 -0
  179. maxframe/dataframe/misc/eval.py +728 -0
  180. maxframe/dataframe/misc/explode.py +171 -0
  181. maxframe/dataframe/misc/get_dummies.py +208 -0
  182. maxframe/dataframe/misc/isin.py +217 -0
  183. maxframe/dataframe/misc/map.py +236 -0
  184. maxframe/dataframe/misc/melt.py +162 -0
  185. maxframe/dataframe/misc/memory_usage.py +248 -0
  186. maxframe/dataframe/misc/pct_change.py +150 -0
  187. maxframe/dataframe/misc/pivot_table.py +262 -0
  188. maxframe/dataframe/misc/qcut.py +104 -0
  189. maxframe/dataframe/misc/select_dtypes.py +104 -0
  190. maxframe/dataframe/misc/shift.py +256 -0
  191. maxframe/dataframe/misc/stack.py +238 -0
  192. maxframe/dataframe/misc/string_.py +221 -0
  193. maxframe/dataframe/misc/tests/__init__.py +13 -0
  194. maxframe/dataframe/misc/tests/test_misc.py +468 -0
  195. maxframe/dataframe/misc/to_numeric.py +178 -0
  196. maxframe/dataframe/misc/transform.py +361 -0
  197. maxframe/dataframe/misc/transpose.py +136 -0
  198. maxframe/dataframe/misc/value_counts.py +182 -0
  199. maxframe/dataframe/missing/__init__.py +53 -0
  200. maxframe/dataframe/missing/checkna.py +223 -0
  201. maxframe/dataframe/missing/dropna.py +280 -0
  202. maxframe/dataframe/missing/fillna.py +275 -0
  203. maxframe/dataframe/missing/replace.py +439 -0
  204. maxframe/dataframe/missing/tests/__init__.py +13 -0
  205. maxframe/dataframe/missing/tests/test_missing.py +89 -0
  206. maxframe/dataframe/operators.py +273 -0
  207. maxframe/dataframe/plotting/__init__.py +40 -0
  208. maxframe/dataframe/plotting/core.py +78 -0
  209. maxframe/dataframe/plotting/tests/__init__.py +13 -0
  210. maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
  211. maxframe/dataframe/reduction/__init__.py +107 -0
  212. maxframe/dataframe/reduction/aggregation.py +344 -0
  213. maxframe/dataframe/reduction/all.py +78 -0
  214. maxframe/dataframe/reduction/any.py +78 -0
  215. maxframe/dataframe/reduction/core.py +837 -0
  216. maxframe/dataframe/reduction/count.py +59 -0
  217. maxframe/dataframe/reduction/cummax.py +30 -0
  218. maxframe/dataframe/reduction/cummin.py +30 -0
  219. maxframe/dataframe/reduction/cumprod.py +30 -0
  220. maxframe/dataframe/reduction/cumsum.py +30 -0
  221. maxframe/dataframe/reduction/custom_reduction.py +42 -0
  222. maxframe/dataframe/reduction/kurtosis.py +104 -0
  223. maxframe/dataframe/reduction/max.py +65 -0
  224. maxframe/dataframe/reduction/mean.py +61 -0
  225. maxframe/dataframe/reduction/min.py +65 -0
  226. maxframe/dataframe/reduction/nunique.py +141 -0
  227. maxframe/dataframe/reduction/prod.py +76 -0
  228. maxframe/dataframe/reduction/reduction_size.py +36 -0
  229. maxframe/dataframe/reduction/sem.py +69 -0
  230. maxframe/dataframe/reduction/skew.py +89 -0
  231. maxframe/dataframe/reduction/std.py +53 -0
  232. maxframe/dataframe/reduction/str_concat.py +48 -0
  233. maxframe/dataframe/reduction/sum.py +77 -0
  234. maxframe/dataframe/reduction/tests/__init__.py +13 -0
  235. maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
  236. maxframe/dataframe/reduction/unique.py +90 -0
  237. maxframe/dataframe/reduction/var.py +72 -0
  238. maxframe/dataframe/sort/__init__.py +34 -0
  239. maxframe/dataframe/sort/core.py +36 -0
  240. maxframe/dataframe/sort/sort_index.py +153 -0
  241. maxframe/dataframe/sort/sort_values.py +311 -0
  242. maxframe/dataframe/sort/tests/__init__.py +13 -0
  243. maxframe/dataframe/sort/tests/test_sort.py +81 -0
  244. maxframe/dataframe/statistics/__init__.py +33 -0
  245. maxframe/dataframe/statistics/corr.py +280 -0
  246. maxframe/dataframe/statistics/quantile.py +341 -0
  247. maxframe/dataframe/statistics/tests/__init__.py +13 -0
  248. maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
  249. maxframe/dataframe/tests/__init__.py +13 -0
  250. maxframe/dataframe/tests/test_initializer.py +29 -0
  251. maxframe/dataframe/tseries/__init__.py +13 -0
  252. maxframe/dataframe/tseries/tests/__init__.py +13 -0
  253. maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
  254. maxframe/dataframe/tseries/to_datetime.py +297 -0
  255. maxframe/dataframe/ufunc/__init__.py +27 -0
  256. maxframe/dataframe/ufunc/tensor.py +54 -0
  257. maxframe/dataframe/ufunc/ufunc.py +52 -0
  258. maxframe/dataframe/utils.py +1267 -0
  259. maxframe/dataframe/window/__init__.py +29 -0
  260. maxframe/dataframe/window/aggregation.py +96 -0
  261. maxframe/dataframe/window/core.py +69 -0
  262. maxframe/dataframe/window/ewm.py +249 -0
  263. maxframe/dataframe/window/expanding.py +147 -0
  264. maxframe/dataframe/window/rolling.py +376 -0
  265. maxframe/dataframe/window/tests/__init__.py +13 -0
  266. maxframe/dataframe/window/tests/test_ewm.py +70 -0
  267. maxframe/dataframe/window/tests/test_expanding.py +66 -0
  268. maxframe/dataframe/window/tests/test_rolling.py +57 -0
  269. maxframe/env.py +33 -0
  270. maxframe/errors.py +21 -0
  271. maxframe/extension.py +81 -0
  272. maxframe/learn/__init__.py +17 -0
  273. maxframe/learn/contrib/__init__.py +17 -0
  274. maxframe/learn/contrib/pytorch/__init__.py +16 -0
  275. maxframe/learn/contrib/pytorch/run_function.py +110 -0
  276. maxframe/learn/contrib/pytorch/run_script.py +102 -0
  277. maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
  278. maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
  279. maxframe/learn/contrib/utils.py +52 -0
  280. maxframe/learn/contrib/xgboost/__init__.py +26 -0
  281. maxframe/learn/contrib/xgboost/classifier.py +86 -0
  282. maxframe/learn/contrib/xgboost/core.py +156 -0
  283. maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
  284. maxframe/learn/contrib/xgboost/predict.py +138 -0
  285. maxframe/learn/contrib/xgboost/regressor.py +78 -0
  286. maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
  287. maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
  288. maxframe/learn/contrib/xgboost/train.py +121 -0
  289. maxframe/learn/utils/__init__.py +15 -0
  290. maxframe/learn/utils/core.py +29 -0
  291. maxframe/lib/__init__.py +15 -0
  292. maxframe/lib/aio/__init__.py +27 -0
  293. maxframe/lib/aio/_runners.py +162 -0
  294. maxframe/lib/aio/_threads.py +35 -0
  295. maxframe/lib/aio/base.py +82 -0
  296. maxframe/lib/aio/file.py +85 -0
  297. maxframe/lib/aio/isolation.py +100 -0
  298. maxframe/lib/aio/lru.py +242 -0
  299. maxframe/lib/aio/parallelism.py +37 -0
  300. maxframe/lib/aio/tests/__init__.py +13 -0
  301. maxframe/lib/aio/tests/test_aio_file.py +55 -0
  302. maxframe/lib/compression.py +55 -0
  303. maxframe/lib/cython/__init__.py +13 -0
  304. maxframe/lib/cython/libcpp.pxd +30 -0
  305. maxframe/lib/filesystem/__init__.py +21 -0
  306. maxframe/lib/filesystem/_glob.py +173 -0
  307. maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
  308. maxframe/lib/filesystem/_oss_lib/common.py +198 -0
  309. maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
  310. maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
  311. maxframe/lib/filesystem/arrow.py +236 -0
  312. maxframe/lib/filesystem/base.py +263 -0
  313. maxframe/lib/filesystem/core.py +95 -0
  314. maxframe/lib/filesystem/fsmap.py +164 -0
  315. maxframe/lib/filesystem/hdfs.py +31 -0
  316. maxframe/lib/filesystem/local.py +112 -0
  317. maxframe/lib/filesystem/oss.py +157 -0
  318. maxframe/lib/filesystem/tests/__init__.py +13 -0
  319. maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
  320. maxframe/lib/filesystem/tests/test_oss.py +182 -0
  321. maxframe/lib/functools_compat.py +81 -0
  322. maxframe/lib/mmh3.cpython-311-darwin.so +0 -0
  323. maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
  324. maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
  325. maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
  326. maxframe/lib/sparse/__init__.py +861 -0
  327. maxframe/lib/sparse/array.py +1604 -0
  328. maxframe/lib/sparse/core.py +92 -0
  329. maxframe/lib/sparse/matrix.py +241 -0
  330. maxframe/lib/sparse/tests/__init__.py +15 -0
  331. maxframe/lib/sparse/tests/test_sparse.py +476 -0
  332. maxframe/lib/sparse/vector.py +150 -0
  333. maxframe/lib/tblib/LICENSE +20 -0
  334. maxframe/lib/tblib/__init__.py +327 -0
  335. maxframe/lib/tblib/cpython.py +83 -0
  336. maxframe/lib/tblib/decorators.py +44 -0
  337. maxframe/lib/tblib/pickling_support.py +90 -0
  338. maxframe/lib/tests/__init__.py +13 -0
  339. maxframe/lib/tests/test_wrapped_pickle.py +51 -0
  340. maxframe/lib/version.py +620 -0
  341. maxframe/lib/wrapped_pickle.py +139 -0
  342. maxframe/mixin.py +100 -0
  343. maxframe/odpsio/__init__.py +21 -0
  344. maxframe/odpsio/arrow.py +91 -0
  345. maxframe/odpsio/schema.py +364 -0
  346. maxframe/odpsio/tableio.py +322 -0
  347. maxframe/odpsio/tests/__init__.py +13 -0
  348. maxframe/odpsio/tests/test_arrow.py +88 -0
  349. maxframe/odpsio/tests/test_schema.py +297 -0
  350. maxframe/odpsio/tests/test_tableio.py +136 -0
  351. maxframe/odpsio/tests/test_volumeio.py +90 -0
  352. maxframe/odpsio/volumeio.py +95 -0
  353. maxframe/opcodes.py +590 -0
  354. maxframe/protocol.py +415 -0
  355. maxframe/remote/__init__.py +18 -0
  356. maxframe/remote/core.py +210 -0
  357. maxframe/remote/run_script.py +121 -0
  358. maxframe/serialization/__init__.py +26 -0
  359. maxframe/serialization/arrow.py +95 -0
  360. maxframe/serialization/core.cpython-311-darwin.so +0 -0
  361. maxframe/serialization/core.pxd +44 -0
  362. maxframe/serialization/core.pyi +61 -0
  363. maxframe/serialization/core.pyx +1094 -0
  364. maxframe/serialization/exception.py +86 -0
  365. maxframe/serialization/maxframe_objects.py +39 -0
  366. maxframe/serialization/numpy.py +91 -0
  367. maxframe/serialization/pandas.py +202 -0
  368. maxframe/serialization/scipy.py +71 -0
  369. maxframe/serialization/serializables/__init__.py +55 -0
  370. maxframe/serialization/serializables/core.py +262 -0
  371. maxframe/serialization/serializables/field.py +624 -0
  372. maxframe/serialization/serializables/field_type.py +589 -0
  373. maxframe/serialization/serializables/tests/__init__.py +13 -0
  374. maxframe/serialization/serializables/tests/test_field_type.py +121 -0
  375. maxframe/serialization/serializables/tests/test_serializable.py +250 -0
  376. maxframe/serialization/tests/__init__.py +13 -0
  377. maxframe/serialization/tests/test_serial.py +412 -0
  378. maxframe/session.py +1310 -0
  379. maxframe/tensor/__init__.py +183 -0
  380. maxframe/tensor/arithmetic/__init__.py +315 -0
  381. maxframe/tensor/arithmetic/abs.py +68 -0
  382. maxframe/tensor/arithmetic/absolute.py +68 -0
  383. maxframe/tensor/arithmetic/add.py +82 -0
  384. maxframe/tensor/arithmetic/angle.py +72 -0
  385. maxframe/tensor/arithmetic/arccos.py +104 -0
  386. maxframe/tensor/arithmetic/arccosh.py +91 -0
  387. maxframe/tensor/arithmetic/arcsin.py +94 -0
  388. maxframe/tensor/arithmetic/arcsinh.py +86 -0
  389. maxframe/tensor/arithmetic/arctan.py +106 -0
  390. maxframe/tensor/arithmetic/arctan2.py +128 -0
  391. maxframe/tensor/arithmetic/arctanh.py +86 -0
  392. maxframe/tensor/arithmetic/around.py +114 -0
  393. maxframe/tensor/arithmetic/bitand.py +95 -0
  394. maxframe/tensor/arithmetic/bitor.py +102 -0
  395. maxframe/tensor/arithmetic/bitxor.py +95 -0
  396. maxframe/tensor/arithmetic/cbrt.py +66 -0
  397. maxframe/tensor/arithmetic/ceil.py +71 -0
  398. maxframe/tensor/arithmetic/clip.py +165 -0
  399. maxframe/tensor/arithmetic/conj.py +74 -0
  400. maxframe/tensor/arithmetic/copysign.py +78 -0
  401. maxframe/tensor/arithmetic/core.py +544 -0
  402. maxframe/tensor/arithmetic/cos.py +85 -0
  403. maxframe/tensor/arithmetic/cosh.py +72 -0
  404. maxframe/tensor/arithmetic/deg2rad.py +72 -0
  405. maxframe/tensor/arithmetic/degrees.py +77 -0
  406. maxframe/tensor/arithmetic/divide.py +114 -0
  407. maxframe/tensor/arithmetic/equal.py +76 -0
  408. maxframe/tensor/arithmetic/exp.py +106 -0
  409. maxframe/tensor/arithmetic/exp2.py +67 -0
  410. maxframe/tensor/arithmetic/expm1.py +79 -0
  411. maxframe/tensor/arithmetic/fabs.py +74 -0
  412. maxframe/tensor/arithmetic/fix.py +69 -0
  413. maxframe/tensor/arithmetic/float_power.py +103 -0
  414. maxframe/tensor/arithmetic/floor.py +77 -0
  415. maxframe/tensor/arithmetic/floordiv.py +94 -0
  416. maxframe/tensor/arithmetic/fmax.py +105 -0
  417. maxframe/tensor/arithmetic/fmin.py +106 -0
  418. maxframe/tensor/arithmetic/fmod.py +99 -0
  419. maxframe/tensor/arithmetic/frexp.py +92 -0
  420. maxframe/tensor/arithmetic/greater.py +77 -0
  421. maxframe/tensor/arithmetic/greater_equal.py +69 -0
  422. maxframe/tensor/arithmetic/hypot.py +77 -0
  423. maxframe/tensor/arithmetic/i0.py +89 -0
  424. maxframe/tensor/arithmetic/imag.py +67 -0
  425. maxframe/tensor/arithmetic/invert.py +110 -0
  426. maxframe/tensor/arithmetic/isclose.py +115 -0
  427. maxframe/tensor/arithmetic/iscomplex.py +64 -0
  428. maxframe/tensor/arithmetic/isfinite.py +106 -0
  429. maxframe/tensor/arithmetic/isinf.py +103 -0
  430. maxframe/tensor/arithmetic/isnan.py +82 -0
  431. maxframe/tensor/arithmetic/isreal.py +63 -0
  432. maxframe/tensor/arithmetic/ldexp.py +99 -0
  433. maxframe/tensor/arithmetic/less.py +69 -0
  434. maxframe/tensor/arithmetic/less_equal.py +69 -0
  435. maxframe/tensor/arithmetic/log.py +92 -0
  436. maxframe/tensor/arithmetic/log10.py +85 -0
  437. maxframe/tensor/arithmetic/log1p.py +95 -0
  438. maxframe/tensor/arithmetic/log2.py +85 -0
  439. maxframe/tensor/arithmetic/logaddexp.py +80 -0
  440. maxframe/tensor/arithmetic/logaddexp2.py +78 -0
  441. maxframe/tensor/arithmetic/logical_and.py +81 -0
  442. maxframe/tensor/arithmetic/logical_not.py +74 -0
  443. maxframe/tensor/arithmetic/logical_or.py +82 -0
  444. maxframe/tensor/arithmetic/logical_xor.py +88 -0
  445. maxframe/tensor/arithmetic/lshift.py +82 -0
  446. maxframe/tensor/arithmetic/maximum.py +108 -0
  447. maxframe/tensor/arithmetic/minimum.py +108 -0
  448. maxframe/tensor/arithmetic/mod.py +104 -0
  449. maxframe/tensor/arithmetic/modf.py +83 -0
  450. maxframe/tensor/arithmetic/multiply.py +81 -0
  451. maxframe/tensor/arithmetic/nan_to_num.py +99 -0
  452. maxframe/tensor/arithmetic/negative.py +65 -0
  453. maxframe/tensor/arithmetic/nextafter.py +68 -0
  454. maxframe/tensor/arithmetic/not_equal.py +72 -0
  455. maxframe/tensor/arithmetic/positive.py +47 -0
  456. maxframe/tensor/arithmetic/power.py +106 -0
  457. maxframe/tensor/arithmetic/rad2deg.py +71 -0
  458. maxframe/tensor/arithmetic/radians.py +77 -0
  459. maxframe/tensor/arithmetic/real.py +70 -0
  460. maxframe/tensor/arithmetic/reciprocal.py +76 -0
  461. maxframe/tensor/arithmetic/rint.py +68 -0
  462. maxframe/tensor/arithmetic/rshift.py +81 -0
  463. maxframe/tensor/arithmetic/setimag.py +29 -0
  464. maxframe/tensor/arithmetic/setreal.py +29 -0
  465. maxframe/tensor/arithmetic/sign.py +81 -0
  466. maxframe/tensor/arithmetic/signbit.py +65 -0
  467. maxframe/tensor/arithmetic/sin.py +98 -0
  468. maxframe/tensor/arithmetic/sinc.py +102 -0
  469. maxframe/tensor/arithmetic/sinh.py +93 -0
  470. maxframe/tensor/arithmetic/spacing.py +72 -0
  471. maxframe/tensor/arithmetic/sqrt.py +81 -0
  472. maxframe/tensor/arithmetic/square.py +69 -0
  473. maxframe/tensor/arithmetic/subtract.py +81 -0
  474. maxframe/tensor/arithmetic/tan.py +88 -0
  475. maxframe/tensor/arithmetic/tanh.py +92 -0
  476. maxframe/tensor/arithmetic/tests/__init__.py +15 -0
  477. maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
  478. maxframe/tensor/arithmetic/truediv.py +104 -0
  479. maxframe/tensor/arithmetic/trunc.py +72 -0
  480. maxframe/tensor/arithmetic/utils.py +65 -0
  481. maxframe/tensor/array_utils.py +186 -0
  482. maxframe/tensor/base/__init__.py +34 -0
  483. maxframe/tensor/base/astype.py +119 -0
  484. maxframe/tensor/base/atleast_1d.py +74 -0
  485. maxframe/tensor/base/broadcast_to.py +89 -0
  486. maxframe/tensor/base/ravel.py +92 -0
  487. maxframe/tensor/base/tests/__init__.py +13 -0
  488. maxframe/tensor/base/tests/test_base.py +114 -0
  489. maxframe/tensor/base/transpose.py +125 -0
  490. maxframe/tensor/base/unique.py +205 -0
  491. maxframe/tensor/base/where.py +127 -0
  492. maxframe/tensor/core.py +724 -0
  493. maxframe/tensor/datasource/__init__.py +32 -0
  494. maxframe/tensor/datasource/arange.py +156 -0
  495. maxframe/tensor/datasource/array.py +415 -0
  496. maxframe/tensor/datasource/core.py +109 -0
  497. maxframe/tensor/datasource/empty.py +169 -0
  498. maxframe/tensor/datasource/from_dataframe.py +70 -0
  499. maxframe/tensor/datasource/from_dense.py +54 -0
  500. maxframe/tensor/datasource/from_sparse.py +47 -0
  501. maxframe/tensor/datasource/full.py +186 -0
  502. maxframe/tensor/datasource/ones.py +173 -0
  503. maxframe/tensor/datasource/scalar.py +40 -0
  504. maxframe/tensor/datasource/tests/__init__.py +13 -0
  505. maxframe/tensor/datasource/tests/test_datasource.py +278 -0
  506. maxframe/tensor/datasource/zeros.py +188 -0
  507. maxframe/tensor/fetch/__init__.py +15 -0
  508. maxframe/tensor/fetch/core.py +54 -0
  509. maxframe/tensor/indexing/__init__.py +47 -0
  510. maxframe/tensor/indexing/choose.py +196 -0
  511. maxframe/tensor/indexing/compress.py +124 -0
  512. maxframe/tensor/indexing/core.py +190 -0
  513. maxframe/tensor/indexing/extract.py +71 -0
  514. maxframe/tensor/indexing/fill_diagonal.py +183 -0
  515. maxframe/tensor/indexing/flatnonzero.py +60 -0
  516. maxframe/tensor/indexing/getitem.py +175 -0
  517. maxframe/tensor/indexing/nonzero.py +120 -0
  518. maxframe/tensor/indexing/setitem.py +132 -0
  519. maxframe/tensor/indexing/slice.py +29 -0
  520. maxframe/tensor/indexing/take.py +130 -0
  521. maxframe/tensor/indexing/tests/__init__.py +15 -0
  522. maxframe/tensor/indexing/tests/test_indexing.py +234 -0
  523. maxframe/tensor/indexing/unravel_index.py +103 -0
  524. maxframe/tensor/merge/__init__.py +15 -0
  525. maxframe/tensor/merge/stack.py +132 -0
  526. maxframe/tensor/merge/tests/__init__.py +13 -0
  527. maxframe/tensor/merge/tests/test_merge.py +52 -0
  528. maxframe/tensor/operators.py +123 -0
  529. maxframe/tensor/random/__init__.py +168 -0
  530. maxframe/tensor/random/beta.py +87 -0
  531. maxframe/tensor/random/binomial.py +137 -0
  532. maxframe/tensor/random/bytes.py +39 -0
  533. maxframe/tensor/random/chisquare.py +110 -0
  534. maxframe/tensor/random/choice.py +186 -0
  535. maxframe/tensor/random/core.py +234 -0
  536. maxframe/tensor/random/dirichlet.py +123 -0
  537. maxframe/tensor/random/exponential.py +94 -0
  538. maxframe/tensor/random/f.py +135 -0
  539. maxframe/tensor/random/gamma.py +128 -0
  540. maxframe/tensor/random/geometric.py +93 -0
  541. maxframe/tensor/random/gumbel.py +167 -0
  542. maxframe/tensor/random/hypergeometric.py +148 -0
  543. maxframe/tensor/random/laplace.py +133 -0
  544. maxframe/tensor/random/logistic.py +129 -0
  545. maxframe/tensor/random/lognormal.py +159 -0
  546. maxframe/tensor/random/logseries.py +122 -0
  547. maxframe/tensor/random/multinomial.py +133 -0
  548. maxframe/tensor/random/multivariate_normal.py +192 -0
  549. maxframe/tensor/random/negative_binomial.py +125 -0
  550. maxframe/tensor/random/noncentral_chisquare.py +132 -0
  551. maxframe/tensor/random/noncentral_f.py +126 -0
  552. maxframe/tensor/random/normal.py +143 -0
  553. maxframe/tensor/random/pareto.py +140 -0
  554. maxframe/tensor/random/permutation.py +104 -0
  555. maxframe/tensor/random/poisson.py +111 -0
  556. maxframe/tensor/random/power.py +142 -0
  557. maxframe/tensor/random/rand.py +82 -0
  558. maxframe/tensor/random/randint.py +121 -0
  559. maxframe/tensor/random/randn.py +96 -0
  560. maxframe/tensor/random/random_integers.py +123 -0
  561. maxframe/tensor/random/random_sample.py +86 -0
  562. maxframe/tensor/random/rayleigh.py +110 -0
  563. maxframe/tensor/random/shuffle.py +61 -0
  564. maxframe/tensor/random/standard_cauchy.py +105 -0
  565. maxframe/tensor/random/standard_exponential.py +72 -0
  566. maxframe/tensor/random/standard_gamma.py +120 -0
  567. maxframe/tensor/random/standard_normal.py +74 -0
  568. maxframe/tensor/random/standard_t.py +135 -0
  569. maxframe/tensor/random/tests/__init__.py +15 -0
  570. maxframe/tensor/random/tests/test_random.py +167 -0
  571. maxframe/tensor/random/triangular.py +119 -0
  572. maxframe/tensor/random/uniform.py +131 -0
  573. maxframe/tensor/random/vonmises.py +131 -0
  574. maxframe/tensor/random/wald.py +114 -0
  575. maxframe/tensor/random/weibull.py +140 -0
  576. maxframe/tensor/random/zipf.py +122 -0
  577. maxframe/tensor/rechunk/__init__.py +26 -0
  578. maxframe/tensor/rechunk/rechunk.py +43 -0
  579. maxframe/tensor/reduction/__init__.py +66 -0
  580. maxframe/tensor/reduction/all.py +103 -0
  581. maxframe/tensor/reduction/allclose.py +88 -0
  582. maxframe/tensor/reduction/any.py +105 -0
  583. maxframe/tensor/reduction/argmax.py +103 -0
  584. maxframe/tensor/reduction/argmin.py +103 -0
  585. maxframe/tensor/reduction/array_equal.py +64 -0
  586. maxframe/tensor/reduction/core.py +168 -0
  587. maxframe/tensor/reduction/count_nonzero.py +81 -0
  588. maxframe/tensor/reduction/cumprod.py +97 -0
  589. maxframe/tensor/reduction/cumsum.py +101 -0
  590. maxframe/tensor/reduction/max.py +120 -0
  591. maxframe/tensor/reduction/mean.py +123 -0
  592. maxframe/tensor/reduction/min.py +120 -0
  593. maxframe/tensor/reduction/nanargmax.py +82 -0
  594. maxframe/tensor/reduction/nanargmin.py +76 -0
  595. maxframe/tensor/reduction/nancumprod.py +91 -0
  596. maxframe/tensor/reduction/nancumsum.py +94 -0
  597. maxframe/tensor/reduction/nanmax.py +111 -0
  598. maxframe/tensor/reduction/nanmean.py +106 -0
  599. maxframe/tensor/reduction/nanmin.py +111 -0
  600. maxframe/tensor/reduction/nanprod.py +94 -0
  601. maxframe/tensor/reduction/nanstd.py +126 -0
  602. maxframe/tensor/reduction/nansum.py +115 -0
  603. maxframe/tensor/reduction/nanvar.py +149 -0
  604. maxframe/tensor/reduction/prod.py +130 -0
  605. maxframe/tensor/reduction/std.py +134 -0
  606. maxframe/tensor/reduction/sum.py +125 -0
  607. maxframe/tensor/reduction/tests/__init__.py +13 -0
  608. maxframe/tensor/reduction/tests/test_reduction.py +181 -0
  609. maxframe/tensor/reduction/var.py +176 -0
  610. maxframe/tensor/reshape/__init__.py +17 -0
  611. maxframe/tensor/reshape/reshape.py +188 -0
  612. maxframe/tensor/reshape/tests/__init__.py +15 -0
  613. maxframe/tensor/reshape/tests/test_reshape.py +37 -0
  614. maxframe/tensor/statistics/__init__.py +13 -0
  615. maxframe/tensor/statistics/percentile.py +175 -0
  616. maxframe/tensor/statistics/quantile.py +288 -0
  617. maxframe/tensor/ufunc/__init__.py +26 -0
  618. maxframe/tensor/ufunc/ufunc.py +200 -0
  619. maxframe/tensor/utils.py +718 -0
  620. maxframe/tests/__init__.py +13 -0
  621. maxframe/tests/test_codegen.py +69 -0
  622. maxframe/tests/test_protocol.py +144 -0
  623. maxframe/tests/test_utils.py +376 -0
  624. maxframe/tests/utils.py +164 -0
  625. maxframe/typing_.py +37 -0
  626. maxframe/udf.py +134 -0
  627. maxframe/utils.py +1114 -0
  628. maxframe-0.1.0b5.dist-info/METADATA +104 -0
  629. maxframe-0.1.0b5.dist-info/RECORD +647 -0
  630. maxframe-0.1.0b5.dist-info/WHEEL +5 -0
  631. maxframe-0.1.0b5.dist-info/top_level.txt +3 -0
  632. maxframe_client/__init__.py +17 -0
  633. maxframe_client/clients/__init__.py +13 -0
  634. maxframe_client/clients/framedriver.py +118 -0
  635. maxframe_client/clients/spe.py +104 -0
  636. maxframe_client/conftest.py +15 -0
  637. maxframe_client/fetcher.py +264 -0
  638. maxframe_client/session/__init__.py +22 -0
  639. maxframe_client/session/consts.py +36 -0
  640. maxframe_client/session/graph.py +119 -0
  641. maxframe_client/session/odps.py +482 -0
  642. maxframe_client/session/task.py +280 -0
  643. maxframe_client/session/tests/__init__.py +13 -0
  644. maxframe_client/session/tests/test_task.py +85 -0
  645. maxframe_client/tests/__init__.py +13 -0
  646. maxframe_client/tests/test_fetcher.py +89 -0
  647. maxframe_client/tests/test_session.py +255 -0
@@ -0,0 +1,13 @@
1
+ # Copyright 1999-2024 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.
@@ -0,0 +1,69 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 1999-2024 Alibaba Group Holding Ltd.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import base64
17
+ from typing import List, Tuple
18
+
19
+ # 使用pytest生成单元测试
20
+ import pytest
21
+
22
+ from maxframe.codegen import UserCodeMixin
23
+ from maxframe.lib import wrapped_pickle
24
+ from maxframe.serialization.core import PickleContainer
25
+
26
+
27
+ @pytest.mark.parametrize(
28
+ "input_obj, expected_output",
29
+ [
30
+ (None, "None"),
31
+ (10, "10"),
32
+ (3.14, "3.14"),
33
+ (True, "True"),
34
+ (False, "False"),
35
+ (b"hello", "base64.b64decode(b'aGVsbG8=')"),
36
+ ("hello", "'hello'"),
37
+ ([1, 2, 3], "[1, 2, 3]"),
38
+ ({"a": 1, "b": 2}, "{'a': 1, 'b': 2}"),
39
+ ((1, 2, 3), "(1, 2, 3)"),
40
+ ((1,), "(1,)"),
41
+ ((), "()"),
42
+ ({1, 2, 3}, "{1, 2, 3}"),
43
+ (set(), "set()"),
44
+ ],
45
+ )
46
+ def test_obj_to_python_expr(input_obj, expected_output):
47
+ assert UserCodeMixin.obj_to_python_expr(input_obj) == expected_output
48
+
49
+
50
+ def test_obj_to_python_expr_custom_object():
51
+ class CustomClass:
52
+ def __init__(self, a: int, b: List[int], c: Tuple[int, int]):
53
+ self.a = a
54
+ self.b = b
55
+ self.c = c
56
+
57
+ custom_obj = CustomClass(1, [2, 3], (4, 5))
58
+ pickle_data = wrapped_pickle.dumps(custom_obj)
59
+ pickle_str = base64.b64encode(pickle_data)
60
+ custom_obj_pickle_container = PickleContainer([pickle_data])
61
+
62
+ # with class obj will not support currently
63
+ with pytest.raises(ValueError):
64
+ UserCodeMixin.obj_to_python_expr(custom_obj)
65
+
66
+ assert (
67
+ UserCodeMixin.obj_to_python_expr(custom_obj_pickle_container)
68
+ == f"cloudpickle.loads(base64.b64decode({pickle_str}), buffers=[])"
69
+ )
@@ -0,0 +1,144 @@
1
+ # Copyright 1999-2024 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 json
16
+ import time
17
+
18
+ import pytest
19
+
20
+ from ..lib import wrapped_pickle
21
+ from ..protocol import (
22
+ DagInfo,
23
+ DagStatus,
24
+ ErrorInfo,
25
+ ODPSTableResultInfo,
26
+ ODPSVolumeResultInfo,
27
+ ResultInfo,
28
+ SessionInfo,
29
+ )
30
+ from ..serialization import RemoteException
31
+ from ..utils import deserialize_serializable, serialize_serializable
32
+
33
+
34
+ def _json_round_trip(json_data: dict) -> dict:
35
+ return json.loads(json.dumps(json_data))
36
+
37
+
38
+ def test_result_info_json_serialize():
39
+ ri = ResultInfo.from_json(_json_round_trip(ResultInfo().to_json()))
40
+ assert type(ri) is ResultInfo
41
+
42
+ ri = ODPSTableResultInfo(
43
+ full_table_name="table_name", partition_specs=["pt=partition"]
44
+ )
45
+ deserial_ri = ResultInfo.from_json(_json_round_trip(ri.to_json()))
46
+ assert type(ri) is ODPSTableResultInfo
47
+ assert ri.result_type == deserial_ri.result_type
48
+ assert ri.full_table_name == deserial_ri.full_table_name
49
+ assert ri.partition_specs == deserial_ri.partition_specs
50
+
51
+ ri = ODPSTableResultInfo(full_table_name="table_name")
52
+ deserial_ri = ResultInfo.from_json(_json_round_trip(ri.to_json()))
53
+ assert type(ri) is ODPSTableResultInfo
54
+ assert ri.result_type == deserial_ri.result_type
55
+ assert ri.full_table_name == deserial_ri.full_table_name
56
+ assert ri.partition_specs == deserial_ri.partition_specs
57
+
58
+ ri = ODPSVolumeResultInfo(volume_name="vol_name", volume_path="vol_path")
59
+ deserial_ri = ResultInfo.from_json(_json_round_trip(ri.to_json()))
60
+ assert type(ri) is ODPSVolumeResultInfo
61
+ assert ri.result_type == deserial_ri.result_type
62
+ assert ri.volume_name == deserial_ri.volume_name
63
+ assert ri.volume_path == deserial_ri.volume_path
64
+
65
+
66
+ def test_error_info_json_serialize():
67
+ try:
68
+ raise ValueError("ERR_DATA")
69
+ except ValueError as ex:
70
+ err_info = ErrorInfo.from_exception(ex)
71
+
72
+ deserial_err_info = ErrorInfo.from_json(_json_round_trip(err_info.to_json()))
73
+ assert deserial_err_info.error_messages == err_info.error_messages
74
+ assert isinstance(deserial_err_info.raw_error_data, ValueError)
75
+
76
+ with wrapped_pickle.switch_unpickle():
77
+ mf_err_info = deserialize_serializable(serialize_serializable(err_info))
78
+ assert isinstance(mf_err_info.raw_error_data, RemoteException)
79
+ with pytest.raises(RemoteException):
80
+ mf_err_info.reraise()
81
+
82
+ deserial_err_info = ErrorInfo.from_json(_json_round_trip(mf_err_info.to_json()))
83
+ assert isinstance(deserial_err_info.raw_error_data, ValueError)
84
+ with pytest.raises(ValueError):
85
+ deserial_err_info.reraise()
86
+
87
+
88
+ def test_dag_info_json_serialize():
89
+ try:
90
+ raise ValueError("ERR_DATA")
91
+ except ValueError as ex:
92
+ err_info = ErrorInfo.from_exception(ex)
93
+ info = DagInfo(
94
+ session_id="test_session_id",
95
+ dag_id="test_dag_id",
96
+ status=DagStatus.FAILED,
97
+ progress=0.65,
98
+ tileable_to_result_infos={
99
+ "tileable_key": ODPSTableResultInfo(full_table_name="table_name")
100
+ },
101
+ error_info=err_info,
102
+ )
103
+ json_info = info.to_json()
104
+ json_info["non_existing_field"] = "non_existing"
105
+ deserial_info = DagInfo.from_json(_json_round_trip(json_info))
106
+ assert deserial_info.session_id == info.session_id
107
+ assert deserial_info.dag_id == info.dag_id
108
+ assert deserial_info.status == info.status
109
+ assert deserial_info.progress == info.progress
110
+ assert (
111
+ deserial_info.tileable_to_result_infos["tileable_key"].full_table_name
112
+ == info.tileable_to_result_infos["tileable_key"].full_table_name
113
+ )
114
+ with pytest.raises(ValueError):
115
+ deserial_info.error_info.reraise()
116
+
117
+
118
+ def test_session_info_json_serialize():
119
+ dag_info = DagInfo(
120
+ session_id="test_session_id",
121
+ dag_id="test_dag_id",
122
+ status=DagStatus.RUNNING,
123
+ progress=0.65,
124
+ )
125
+ info = SessionInfo(
126
+ session_id="test_session_id",
127
+ settings={"sql.settings": {}},
128
+ start_timestamp=time.time(),
129
+ idle_timestamp=None,
130
+ dag_infos={"test_dag_id": dag_info},
131
+ )
132
+ deserial_info = SessionInfo.from_json(_json_round_trip(info.to_json()))
133
+ assert deserial_info.session_id == info.session_id
134
+ assert deserial_info.settings == info.settings
135
+ assert deserial_info.start_timestamp == info.start_timestamp
136
+ assert deserial_info.idle_timestamp == info.idle_timestamp
137
+ assert (
138
+ deserial_info.dag_infos["test_dag_id"].status
139
+ == info.dag_infos["test_dag_id"].status
140
+ )
141
+ assert (
142
+ deserial_info.dag_infos["test_dag_id"].progress
143
+ == info.dag_infos["test_dag_id"].progress
144
+ )
@@ -0,0 +1,376 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 1999-2024 Alibaba Group Holding Ltd.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import copy
17
+ import os
18
+ import shutil
19
+ import sys
20
+ import tempfile
21
+ import textwrap
22
+ import time
23
+ from enum import Enum
24
+ from functools import partial
25
+
26
+ import numpy as np
27
+ import pandas as pd
28
+ import pyarrow as pa
29
+ import pytest
30
+
31
+ from .. import utils
32
+
33
+
34
+ def test_string_conversion():
35
+ s = None
36
+ assert utils.to_binary(s) is None
37
+ assert utils.to_str(s) is None
38
+ assert utils.to_text(s) is None
39
+
40
+ s = "abcdefg"
41
+ assert isinstance(utils.to_binary(s), bytes)
42
+ assert utils.to_binary(s) == b"abcdefg"
43
+ assert isinstance(utils.to_str(s), str)
44
+ assert utils.to_str(s) == "abcdefg"
45
+ assert isinstance(utils.to_text(s), str)
46
+ assert utils.to_text(s) == "abcdefg"
47
+
48
+ ustr = type("ustr", (str,), {})
49
+ assert isinstance(utils.to_str(ustr(s)), str)
50
+ assert utils.to_str(ustr(s)) == "abcdefg"
51
+
52
+ s = b"abcdefg"
53
+ assert isinstance(utils.to_binary(s), bytes)
54
+ assert utils.to_binary(s) == b"abcdefg"
55
+ assert isinstance(utils.to_str(s), str)
56
+ assert utils.to_str(s) == "abcdefg"
57
+ assert isinstance(utils.to_text(s), str)
58
+ assert utils.to_text(s) == "abcdefg"
59
+
60
+ ubytes = type("ubytes", (bytes,), {})
61
+ assert isinstance(utils.to_binary(ubytes(s)), bytes)
62
+ assert utils.to_binary(ubytes(s)) == b"abcdefg"
63
+
64
+ s = "abcdefg"
65
+ assert isinstance(utils.to_binary(s), bytes)
66
+ assert utils.to_binary(s) == b"abcdefg"
67
+ assert isinstance(utils.to_str(s), str)
68
+ assert utils.to_str(s) == "abcdefg"
69
+ assert isinstance(utils.to_text(s), str)
70
+ assert utils.to_text(s) == "abcdefg"
71
+
72
+ uunicode = type("uunicode", (str,), {})
73
+ assert isinstance(utils.to_text(uunicode(s)), str)
74
+ assert utils.to_text(uunicode(s)) == "abcdefg"
75
+
76
+ with pytest.raises(TypeError):
77
+ utils.to_binary(utils)
78
+ with pytest.raises(TypeError):
79
+ utils.to_str(utils)
80
+ with pytest.raises(TypeError):
81
+ utils.to_text(utils)
82
+
83
+
84
+ def test_tokenize():
85
+ import shutil
86
+ import tempfile
87
+
88
+ class TestEnum(Enum):
89
+ VAL1 = "val1"
90
+
91
+ tempdir = tempfile.mkdtemp("maxframe_test_utils_")
92
+ try:
93
+ filename = os.path.join(tempdir, "test_npa.dat")
94
+ mmp_array = np.memmap(filename, dtype=float, mode="w+", shape=(3, 4))
95
+ mmp_array[:] = np.random.random((3, 4)).astype(float)
96
+ mmp_array.flush()
97
+ del mmp_array
98
+
99
+ mmp_array1 = np.memmap(filename, dtype=float, shape=(3, 4))
100
+ mmp_array2 = np.memmap(filename, dtype=float, shape=(3, 4))
101
+
102
+ try:
103
+ v = [
104
+ 1,
105
+ 2.3,
106
+ "456",
107
+ "789",
108
+ b"101112",
109
+ 2147483649,
110
+ None,
111
+ np.ndarray,
112
+ [912, "uvw"],
113
+ np.arange(0, 10),
114
+ np.array(10),
115
+ np.array([b"\x01\x32\xff"]),
116
+ np.int64,
117
+ TestEnum.VAL1,
118
+ ]
119
+ copy_v = copy.deepcopy(v)
120
+ assert utils.tokenize(v + [mmp_array1], ext_data=1234) == utils.tokenize(
121
+ copy_v + [mmp_array2], ext_data=1234
122
+ )
123
+ finally:
124
+ del mmp_array1, mmp_array2
125
+ finally:
126
+ shutil.rmtree(tempdir)
127
+
128
+ v = {"a", "xyz", "uvw"}
129
+ assert utils.tokenize(v) == utils.tokenize(copy.deepcopy(v))
130
+
131
+ v = dict(x="abcd", y=98765)
132
+ assert utils.tokenize(v) == utils.tokenize(copy.deepcopy(v))
133
+
134
+ v = dict(x=dict(a=1, b=[1, 2, 3]), y=12345)
135
+ assert utils.tokenize(v) == utils.tokenize(copy.deepcopy(v))
136
+
137
+ # pandas relative
138
+ if pd is not None:
139
+ df = pd.DataFrame(
140
+ [[utils.to_binary("测试"), utils.to_text("数据")]],
141
+ index=["a"],
142
+ columns=["中文", "data"],
143
+ )
144
+ v = [df, df.index, df.columns, df["data"], pd.Categorical(list("ABCD"))]
145
+ assert utils.tokenize(v) == utils.tokenize(copy.deepcopy(v))
146
+
147
+ class NonTokenizableCls:
148
+ def __getstate__(self):
149
+ raise SystemError
150
+
151
+ with pytest.raises(TypeError):
152
+ utils.tokenize(NonTokenizableCls())
153
+
154
+ class CustomizedTokenize(object):
155
+ def __maxframe_tokenize__(self):
156
+ return id(type(self)), id(NonTokenizableCls)
157
+
158
+ assert utils.tokenize(CustomizedTokenize()) == utils.tokenize(CustomizedTokenize())
159
+
160
+ v = lambda x: x + 1
161
+ assert utils.tokenize(v) == utils.tokenize(copy.deepcopy(v))
162
+
163
+ def f(a, b):
164
+ return np.add(a, b)
165
+
166
+ assert utils.tokenize(f) == utils.tokenize(copy.deepcopy(f))
167
+
168
+ partial_f = partial(f, 1, k=0)
169
+ partial_f2 = partial(f, 1, k=1)
170
+ assert utils.tokenize(partial_f) == utils.tokenize(copy.deepcopy(partial_f))
171
+ assert utils.tokenize(partial_f) != utils.tokenize(partial_f2)
172
+
173
+
174
+ def test_lazy_import():
175
+ old_sys_path = sys.path
176
+ mock_mod = textwrap.dedent(
177
+ """
178
+ __version__ = '0.1.0b1'
179
+ """.strip()
180
+ )
181
+ mock_mod2 = textwrap.dedent(
182
+ """
183
+ from maxframe.utils import lazy_import
184
+ mock_mod = lazy_import("mock_mod")
185
+
186
+ def get_version():
187
+ return mock_mod.__version__
188
+ """
189
+ )
190
+
191
+ temp_dir = tempfile.mkdtemp(prefix="maxframe-utils-test-")
192
+ sys.path += [temp_dir]
193
+ try:
194
+ with open(os.path.join(temp_dir, "mock_mod.py"), "w") as outf:
195
+ outf.write(mock_mod)
196
+ with open(os.path.join(temp_dir, "mock_mod2.py"), "w") as outf:
197
+ outf.write(mock_mod2)
198
+
199
+ non_exist_mod = utils.lazy_import("non_exist_mod", locals=locals())
200
+ assert non_exist_mod is None
201
+
202
+ non_exist_mod1 = utils.lazy_import("non_exist_mod1", placeholder=True)
203
+ with pytest.raises(AttributeError) as ex_data:
204
+ non_exist_mod1.meth()
205
+ assert "required" in str(ex_data.value)
206
+
207
+ mod = utils.lazy_import(
208
+ "mock_mod", globals=globals(), locals=locals(), rename="mod"
209
+ )
210
+ assert mod is not None
211
+ assert mod.__version__ == "0.1.0b1"
212
+
213
+ glob = globals().copy()
214
+ mod = utils.lazy_import("mock_mod", globals=glob, locals=locals(), rename="mod")
215
+ glob["mod"] = mod
216
+ assert mod is not None
217
+ assert mod.__version__ == "0.1.0b1"
218
+ assert type(glob["mod"]).__name__ == "module"
219
+
220
+ import mock_mod2 as mod2
221
+
222
+ assert type(mod2.mock_mod).__name__ != "module"
223
+ assert mod2.get_version() == "0.1.0b1"
224
+ assert type(mod2.mock_mod).__name__ == "module"
225
+ finally:
226
+ shutil.rmtree(temp_dir)
227
+ sys.path = old_sys_path
228
+ sys.modules.pop("mock_mod", None)
229
+ sys.modules.pop("mock_mod2", None)
230
+
231
+
232
+ def test_type_dispatcher():
233
+ dispatcher = utils.TypeDispatcher()
234
+
235
+ type1 = type("Type1", (), {})
236
+ type2 = type("Type2", (type1,), {})
237
+ type3 = type("Type3", (), {})
238
+ type4 = type("Type4", (type2,), {})
239
+ type5 = type("Type5", (type4,), {})
240
+
241
+ dispatcher.register(object, lambda x: "Object")
242
+ dispatcher.register(type1, lambda x: "Type1")
243
+ dispatcher.register(type4, lambda x: "Type4")
244
+ dispatcher.register("pandas.DataFrame", lambda x: "DataFrame")
245
+ dispatcher.register(utils.NamedType("ray", type1), lambda x: "RayType1")
246
+
247
+ assert "Type1" == dispatcher(type2())
248
+ assert "DataFrame" == dispatcher(pd.DataFrame())
249
+ assert "Object" == dispatcher(type3())
250
+
251
+ tp = utils.NamedType("ray", type1)
252
+ assert dispatcher.get_handler(tp)(tp) == "RayType1"
253
+ tp = utils.NamedType("ray", type2)
254
+ assert dispatcher.get_handler(tp)(tp) == "RayType1"
255
+ tp = utils.NamedType("xxx", type2)
256
+ assert dispatcher.get_handler(tp)(tp) == "Type1"
257
+ assert "Type1" == dispatcher(type2())
258
+ tp = utils.NamedType("ray", type5)
259
+ assert dispatcher.get_handler(tp)(tp) == "Type4"
260
+
261
+ dispatcher.unregister(object)
262
+ with pytest.raises(KeyError):
263
+ dispatcher(type3())
264
+
265
+
266
+ def test_timer():
267
+ with utils.Timer() as timer:
268
+ time.sleep(0.1)
269
+
270
+ assert timer.duration >= 0.1
271
+
272
+
273
+ def test_module_placeholder():
274
+ required_module = utils.ModulePlaceholder("required_module")
275
+
276
+ with pytest.raises(AttributeError):
277
+ required_module()
278
+ with pytest.raises(AttributeError) as e:
279
+ required_module.method()
280
+ msg = e.value.args[0]
281
+ assert msg == "required_module is required but not installed."
282
+
283
+
284
+ def test_estimate_pandas_size():
285
+ df1 = pd.DataFrame(np.random.rand(50, 10))
286
+ assert utils.estimate_pandas_size(df1) == sys.getsizeof(df1)
287
+
288
+ df2 = pd.DataFrame(np.random.rand(1000, 10))
289
+ assert utils.estimate_pandas_size(df2) == sys.getsizeof(df2)
290
+
291
+ df3 = pd.DataFrame(
292
+ {
293
+ "A": np.random.choice(["abcd", "def", "gh"], size=(1000,)),
294
+ "B": np.random.rand(1000),
295
+ "C": np.random.rand(1000),
296
+ }
297
+ )
298
+ assert utils.estimate_pandas_size(df3) != sys.getsizeof(df3)
299
+
300
+ s1 = pd.Series(np.random.rand(1000))
301
+ assert utils.estimate_pandas_size(s1) == sys.getsizeof(s1)
302
+
303
+ from ..dataframe.arrays import ArrowStringArray
304
+
305
+ array = ArrowStringArray(np.random.choice(["abcd", "def", "gh"], size=(1000,)))
306
+ s2 = pd.Series(array)
307
+ assert utils.estimate_pandas_size(s2) == sys.getsizeof(s2)
308
+
309
+ s3 = pd.Series(np.random.choice(["abcd", "def", "gh"], size=(1000,)))
310
+ assert utils.estimate_pandas_size(s3) != sys.getsizeof(s3)
311
+ assert (
312
+ pytest.approx(utils.estimate_pandas_size(s3) / sys.getsizeof(s3), abs=0.5) == 1
313
+ )
314
+
315
+ idx1 = pd.MultiIndex.from_arrays(
316
+ [np.arange(0, 1000), np.random.choice(["abcd", "def", "gh"], size=(1000,))]
317
+ )
318
+ assert utils.estimate_pandas_size(idx1) == sys.getsizeof(idx1)
319
+
320
+ string_idx = pd.Index(np.random.choice(["a", "bb", "cc"], size=(1000,)))
321
+ assert utils.estimate_pandas_size(string_idx) != sys.getsizeof(string_idx)
322
+ assert (
323
+ pytest.approx(
324
+ utils.estimate_pandas_size(string_idx) / sys.getsizeof(string_idx), abs=0.5
325
+ )
326
+ == 1
327
+ )
328
+
329
+ # dataframe with multi index
330
+ idx2 = pd.MultiIndex.from_arrays(
331
+ [np.arange(0, 1000), np.random.choice(["abcd", "def", "gh"], size=(1000,))]
332
+ )
333
+ df4 = pd.DataFrame(
334
+ {
335
+ "A": np.random.choice(["abcd", "def", "gh"], size=(1000,)),
336
+ "B": np.random.rand(1000),
337
+ "C": np.random.rand(1000),
338
+ },
339
+ index=idx2,
340
+ )
341
+ assert utils.estimate_pandas_size(df4) != sys.getsizeof(df4)
342
+ assert (
343
+ pytest.approx(utils.estimate_pandas_size(df4) / sys.getsizeof(df4), abs=0.5)
344
+ == 1
345
+ )
346
+
347
+ # series with multi index
348
+ idx3 = pd.MultiIndex.from_arrays(
349
+ [
350
+ np.random.choice(["a1", "a2", "a3"], size=(1000,)),
351
+ np.random.choice(["abcd", "def", "gh"], size=(1000,)),
352
+ ]
353
+ )
354
+ s4 = pd.Series(np.arange(1000), index=idx3)
355
+
356
+ assert utils.estimate_pandas_size(s4) == sys.getsizeof(s4)
357
+
358
+
359
+ @pytest.mark.parametrize("id_length", [0, 5, 32, 63])
360
+ def test_gen_random_id(id_length):
361
+ rnd_id = utils.new_random_id(id_length)
362
+ assert len(rnd_id) == id_length
363
+
364
+
365
+ def test_arrow_type_from_string():
366
+ def _assert_arrow_type_convert(tp: pa.DataType) -> None:
367
+ assert utils.arrow_type_from_str(str(tp)) == tp
368
+
369
+ _assert_arrow_type_convert(pa.int64())
370
+ _assert_arrow_type_convert(pa.binary(20))
371
+ _assert_arrow_type_convert(pa.decimal128(10, 2))
372
+ _assert_arrow_type_convert(pa.list_(pa.int64()))
373
+ _assert_arrow_type_convert(pa.map_(pa.string(), pa.int64()))
374
+ _assert_arrow_type_convert(
375
+ pa.struct([("key", pa.string()), ("value", pa.list_(pa.int64()))])
376
+ )