maxframe 0.1.0b5__cp310-cp310-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-310-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-310-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-310-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-310-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,164 @@
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
+ from collections.abc import MutableMapping
16
+ from urllib.parse import urlparse
17
+
18
+ from .local import LocalFileSystem
19
+
20
+
21
+ class FSMap(MutableMapping):
22
+ """
23
+ Wrap a FileSystem instance as a mutable wrapping.
24
+ The keys of the mapping become files under the given root, and the
25
+ values (which must be bytes) the contents of those files.
26
+
27
+ Parameters
28
+ ----------
29
+ root: string
30
+ prefix for all the files
31
+ fs: FileSystem instance
32
+ check: bool (=True)
33
+ performs a touch at the location, to check for write access.
34
+ """
35
+
36
+ def __init__(self, root, fs, check=False, create=False):
37
+ self.fs = fs
38
+ self.root = self._get_path(fs, root)
39
+ if create:
40
+ if not self.fs.exists(root):
41
+ self.fs.mkdir(root)
42
+ if check:
43
+ if not self.fs.exists(root):
44
+ raise ValueError(
45
+ f"Path {root} does not exist. Create with the ``create=True`` keyword"
46
+ )
47
+ with self.fs.open(fs.pathsep.join([root, "a"]), "w"):
48
+ pass
49
+ self.fs.rm(fs.pathsep.join([root, "a"]))
50
+
51
+ @staticmethod
52
+ def _get_path(fs, path):
53
+ return path if isinstance(fs, LocalFileSystem) else urlparse(path).path
54
+
55
+ @staticmethod
56
+ def _normalize_path(fs, path, lstrip=False, rstrip=False):
57
+ if fs.pathsep != "/": # pragma: no cover
58
+ path = path.replace("/", fs.pathsep)
59
+ if lstrip:
60
+ path = path.lstrip(fs.pathsep)
61
+ if rstrip:
62
+ path = path.rstrip(fs.pathsep)
63
+ return path
64
+
65
+ @staticmethod
66
+ def _join_path(fs, paths):
67
+ if fs.pathsep == "/":
68
+ return "/".join(paths)
69
+
70
+ new_paths = []
71
+ for i, path in enumerate(paths):
72
+ path = FSMap._normalize_path(
73
+ fs, path, lstrip=i > 0, rstrip=i < len(paths) - 1
74
+ )
75
+ new_paths.append(path)
76
+ return fs.pathsep.join(new_paths)
77
+
78
+ def clear(self):
79
+ """Remove all keys below root - empties out mapping"""
80
+ try:
81
+ self.fs.rm(self.root, True)
82
+ self.fs.mkdir(self.root)
83
+ except: # noqa: E722 # pragma: no cover
84
+ pass
85
+
86
+ def _key_to_str(self, key):
87
+ """Generate full path for the key"""
88
+ if isinstance(key, (tuple, list)):
89
+ key = str(tuple(key))
90
+ else:
91
+ key = str(key)
92
+ return self._join_path(self.fs, [self.root, key]) if self.root else key
93
+
94
+ def _str_to_key(self, s):
95
+ """Strip path of to leave key name"""
96
+ key = self._normalize_path(self.fs, s[len(self.root) :], lstrip=True)
97
+ if self.fs.pathsep != "/": # pragma: no cover
98
+ key = key.replace(self.fs.pathsep, "/")
99
+ return key
100
+
101
+ def __getitem__(self, key, default=None):
102
+ """Retrieve data"""
103
+ key = self._key_to_str(key)
104
+ try:
105
+ result = self.fs.cat(key)
106
+ except: # noqa: E722
107
+ if default is not None:
108
+ return default
109
+ raise KeyError(key)
110
+ return result
111
+
112
+ def pop(self, key, default=None):
113
+ result = self.__getitem__(key, default)
114
+ try:
115
+ del self[key]
116
+ except KeyError:
117
+ pass
118
+ return result
119
+
120
+ @staticmethod
121
+ def _parent(fs, path):
122
+ path = FSMap._get_path(fs, path.rstrip(fs.pathsep))
123
+ if fs.pathsep in path:
124
+ return path.rsplit(fs.pathsep, 1)[0]
125
+ else: # pragma: no cover
126
+ return ""
127
+
128
+ def __setitem__(self, key, value):
129
+ """Store value in key"""
130
+ key = self._key_to_str(key)
131
+ try:
132
+ self.fs.mkdir(self._parent(self.fs, key))
133
+ except FileExistsError:
134
+ pass
135
+ with self.fs.open(key, "wb") as f:
136
+ f.write(value)
137
+
138
+ @staticmethod
139
+ def _find(fs, path):
140
+ out = set()
141
+ for path, dirs, files in fs.walk(path):
142
+ out.update(fs.pathsep.join([path, f]) for f in files)
143
+ if fs.isfile(path) and path not in out:
144
+ # walk works on directories, but find should also return [path]
145
+ # when path happens to be a file
146
+ out.add(path)
147
+ return sorted(out)
148
+
149
+ def __iter__(self):
150
+ return (self._str_to_key(x) for x in self._find(self.fs, self.root))
151
+
152
+ def __len__(self):
153
+ return len(self._find(self.fs, self.root))
154
+
155
+ def __delitem__(self, key):
156
+ """Remove key"""
157
+ try:
158
+ self.fs.rm(self._key_to_str(key))
159
+ except: # noqa: E722
160
+ raise KeyError
161
+
162
+ def __contains__(self, key):
163
+ """Does key exist in mapping?"""
164
+ return self.fs.exists(self._key_to_str(key))
@@ -0,0 +1,31 @@
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
+ try:
16
+ from pyarrow.fs import HadoopFileSystem as _ArrowHadoopFileSystem
17
+
18
+ from .arrow import HadoopFileSystem
19
+
20
+ del _ArrowHadoopFileSystem
21
+ except ImportError: # pragma: no cover
22
+ try:
23
+ # pyarrow < 2.0.0
24
+ from pyarrow import HadoopFileSystem
25
+ except ImportError:
26
+ HadoopFileSystem = None
27
+
28
+ from .core import register_filesystem
29
+
30
+ if HadoopFileSystem is not None: # pragma: no branch
31
+ register_filesystem("hdfs", HadoopFileSystem)
@@ -0,0 +1,112 @@
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 glob
16
+ import os
17
+ import shutil
18
+ from typing import BinaryIO, Dict, Iterator, List, TextIO, Tuple, Union
19
+
20
+ from ...utils import implements, stringify_path
21
+ from .base import FileSystem, path_type
22
+
23
+
24
+ class LocalFileSystem(FileSystem):
25
+ _instance = None
26
+
27
+ @classmethod
28
+ def get_instance(cls):
29
+ if cls._instance is None:
30
+ cls._instance = LocalFileSystem()
31
+ return cls._instance
32
+
33
+ @implements(FileSystem.cat)
34
+ def cat(self, path: path_type):
35
+ with self.open(path, "rb") as f:
36
+ return f.read()
37
+
38
+ @implements(FileSystem.ls)
39
+ def ls(self, path: path_type) -> List[path_type]:
40
+ path = stringify_path(path)
41
+ return sorted(os.path.join(path, x) for x in os.listdir(path))
42
+
43
+ @implements(FileSystem.delete)
44
+ def delete(self, path: path_type, recursive: bool = False):
45
+ if os.path.isfile(path):
46
+ os.remove(path)
47
+ elif not recursive:
48
+ os.rmdir(path)
49
+ else:
50
+ shutil.rmtree(path)
51
+
52
+ @implements(FileSystem.rename)
53
+ def rename(self, path: path_type, new_path: path_type):
54
+ os.rename(path, new_path)
55
+
56
+ @implements(FileSystem.stat)
57
+ def stat(self, path: path_type) -> Dict:
58
+ os_stat = os.stat(path)
59
+ stat = dict(name=path, size=os_stat.st_size, modified_time=os_stat.st_mtime)
60
+ if os.path.isfile(path):
61
+ stat["type"] = "file"
62
+ elif os.path.isdir(path):
63
+ stat["type"] = "directory"
64
+ else: # pragma: no cover
65
+ stat["type"] = "other"
66
+ return stat
67
+
68
+ @implements(FileSystem.mkdir)
69
+ def mkdir(self, path: path_type, create_parents: bool = True):
70
+ path = stringify_path(path)
71
+ if create_parents:
72
+ os.makedirs(path)
73
+ else:
74
+ os.mkdir(path)
75
+
76
+ @implements(FileSystem.isdir)
77
+ def isdir(self, path: path_type) -> bool:
78
+ path = stringify_path(path)
79
+ return os.path.isdir(path)
80
+
81
+ @implements(FileSystem.isfile)
82
+ def isfile(self, path: path_type) -> bool:
83
+ path = stringify_path(path)
84
+ return os.path.isfile(path)
85
+
86
+ @implements(FileSystem._isfilestore)
87
+ def _isfilestore(self) -> bool:
88
+ return True
89
+
90
+ @implements(FileSystem.exists)
91
+ def exists(self, path: path_type):
92
+ path = stringify_path(path)
93
+ return os.path.exists(path)
94
+
95
+ @implements(FileSystem.open)
96
+ def open(self, path: path_type, mode: str = "rb") -> Union[BinaryIO, TextIO]:
97
+ path = stringify_path(path)
98
+ return open(path, mode=mode)
99
+
100
+ @implements(FileSystem.walk)
101
+ def walk(self, path: path_type) -> Iterator[Tuple[str, List[str], List[str]]]:
102
+ path = stringify_path(path)
103
+ return os.walk(path)
104
+
105
+ @implements(FileSystem.glob)
106
+ def glob(self, path: path_type, recursive: bool = False) -> List[path_type]:
107
+ path = stringify_path(path)
108
+ return glob.glob(path, recursive=recursive)
109
+
110
+ @property
111
+ def pathsep(self) -> str:
112
+ return os.path.sep
@@ -0,0 +1,157 @@
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
+ from typing import Dict, Iterator, List, Tuple
16
+ from urllib import parse
17
+
18
+ from ...utils import implements, lazy_import
19
+ from ._oss_lib import common as oc
20
+ from ._oss_lib.glob import glob
21
+ from ._oss_lib.handle import OSSIOBase
22
+ from .base import FileSystem, path_type
23
+
24
+ oss2 = lazy_import("oss2", placeholder=True)
25
+
26
+ _oss_time_out = 10
27
+
28
+
29
+ class OSSFileSystem(FileSystem):
30
+ _instance = None
31
+
32
+ @classmethod
33
+ def get_instance(cls):
34
+ if cls._instance is None:
35
+ cls._instance = OSSFileSystem()
36
+ return cls._instance
37
+
38
+ @implements(FileSystem.cat)
39
+ def cat(self, path: path_type):
40
+ raise NotImplementedError
41
+
42
+ @implements(FileSystem.ls)
43
+ def ls(self, path: path_type) -> List[path_type]:
44
+ file_list = []
45
+ file_entry = oc.OSSFileEntry(path)
46
+ if not file_entry.is_dir():
47
+ raise OSError("ls for file is not supported")
48
+ else:
49
+ bucket, key, access_key_id, access_key_secret, end_point = oc.parse_osspath(
50
+ path
51
+ )
52
+ oss_bucket = oss2.Bucket(
53
+ auth=oss2.Auth(
54
+ access_key_id=access_key_id, access_key_secret=access_key_secret
55
+ ),
56
+ endpoint=end_point,
57
+ bucket_name=bucket,
58
+ connect_timeout=_oss_time_out,
59
+ )
60
+ for obj in oss2.ObjectIteratorV2(oss_bucket, prefix=key):
61
+ if obj.key.endswith("/"):
62
+ continue
63
+ obj_path = rf"oss://{bucket}/{obj.key}"
64
+ file_list.append(
65
+ build_oss_path(
66
+ obj_path, access_key_id, access_key_secret, end_point
67
+ )
68
+ )
69
+ return file_list
70
+
71
+ @implements(FileSystem.delete)
72
+ def delete(self, path: path_type, recursive: bool = False):
73
+ raise NotImplementedError
74
+
75
+ @implements(FileSystem.rename)
76
+ def rename(self, path: path_type, new_path: path_type):
77
+ raise NotImplementedError
78
+
79
+ @implements(FileSystem.stat)
80
+ def stat(self, path: path_type) -> Dict:
81
+ ofe = oc.OSSFileEntry(path)
82
+ return ofe.stat()
83
+
84
+ @implements(FileSystem.mkdir)
85
+ def mkdir(self, path: path_type, create_parents: bool = True):
86
+ raise NotImplementedError
87
+
88
+ @implements(FileSystem.isdir)
89
+ def isdir(self, path: path_type) -> bool:
90
+ file_entry = oc.OSSFileEntry(path)
91
+ return file_entry.is_dir()
92
+
93
+ @implements(FileSystem.isfile)
94
+ def isfile(self, path: path_type) -> bool:
95
+ file_entry = oc.OSSFileEntry(path)
96
+ return file_entry.is_file()
97
+
98
+ @implements(FileSystem._isfilestore)
99
+ def _isfilestore(self) -> bool:
100
+ raise NotImplementedError
101
+
102
+ @implements(FileSystem.exists)
103
+ def exists(self, path: path_type):
104
+ return oc.oss_exists(path)
105
+
106
+ @implements(FileSystem.open)
107
+ def open(self, path: path_type, mode: str = "rb") -> OSSIOBase:
108
+ file_handle = OSSIOBase(path, mode)
109
+ return file_handle
110
+
111
+ @implements(FileSystem.walk)
112
+ def walk(self, path: path_type) -> Iterator[Tuple[str, List[str], List[str]]]:
113
+ raise NotImplementedError
114
+
115
+ @implements(FileSystem.glob)
116
+ def glob(self, path: path_type, recursive: bool = False) -> List[path_type]:
117
+ return glob(path, recursive=recursive)
118
+
119
+
120
+ def build_oss_path(path: path_type, access_key_id, access_key_secret, end_point):
121
+ """
122
+ Returns a path with oss info.
123
+ Used to register the access_key_id, access_key_secret and
124
+ endpoint of OSS. The access_key_id and endpoint are put
125
+ into the url with url-safe-base64 encoding.
126
+
127
+ Parameters
128
+ ----------
129
+ path : path_type
130
+ The original oss url.
131
+
132
+ access_key_id : str
133
+ The access key id of oss.
134
+
135
+ access_key_secret : str
136
+ The access key secret of oss.
137
+
138
+ end_point : str
139
+ The endpoint of oss.
140
+
141
+ Returns
142
+ -------
143
+ path_type
144
+ Path include the encoded access key id, end point and
145
+ access key secret of oss.
146
+ """
147
+ if isinstance(path, (list, tuple)):
148
+ path = path[0]
149
+ param_dict = {"access_key_id": access_key_id, "end_point": end_point}
150
+ id_endpoint = oc.dict_to_url(param_dict)
151
+ password = access_key_secret
152
+ parse_result = parse.urlparse(path)
153
+ new_path = (
154
+ f"{parse_result.scheme}://{id_endpoint}:{password}"
155
+ f"@{parse_result.netloc}{parse_result.path}"
156
+ )
157
+ return new_path
@@ -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,223 @@
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 glob as _glob
16
+ import os
17
+ import tempfile
18
+
19
+ import numpy as np
20
+ import pytest
21
+
22
+ try:
23
+ import pyarrow as pa
24
+ except ImportError: # pragma: no cover
25
+ pa = None
26
+
27
+ from ....tests.utils import require_hadoop
28
+ from ....utils import lazy_import
29
+ from .. import FileSystem, FSMap, LocalFileSystem, glob
30
+
31
+ if pa is not None:
32
+ from ..arrow import ArrowBasedLocalFileSystem, HadoopFileSystem
33
+ else: # pragma: no cover
34
+ ArrowBasedLocalFileSystem = None
35
+
36
+ fsspec_installed = lazy_import("fsspec") is not None
37
+
38
+
39
+ def test_path_parser():
40
+ path = "hdfs://user:password@localhost:8080/test"
41
+ parsed_result = FileSystem.parse_from_path(path)
42
+ assert parsed_result["host"] == "localhost"
43
+ assert parsed_result["port"] == 8080
44
+ assert parsed_result["user"] == "user"
45
+ assert parsed_result["password"] == "password"
46
+
47
+
48
+ def test_local_filesystem():
49
+ local_fs1 = LocalFileSystem.get_instance()
50
+ local_fs2 = LocalFileSystem.get_instance()
51
+ assert local_fs1 is local_fs2
52
+
53
+ with tempfile.TemporaryDirectory() as tempdir:
54
+ file_path = os.path.join(tempdir, "test")
55
+
56
+ with open(file_path, "wb") as f:
57
+ f.write(b"text for test")
58
+ assert local_fs1.stat(tempdir)["type"] == "directory"
59
+ assert local_fs1.stat(file_path)["type"] == "file"
60
+ assert len(glob(tempdir + "*")) == 1
61
+
62
+
63
+ @pytest.mark.parametrize(
64
+ "fs_type",
65
+ [LocalFileSystem, ArrowBasedLocalFileSystem]
66
+ if pa is not None
67
+ else [LocalFileSystem],
68
+ )
69
+ def test_filesystems(fs_type):
70
+ fs = fs_type.get_instance()
71
+
72
+ with tempfile.TemporaryDirectory() as root:
73
+ test1_dir = os.path.join(root, "test1")
74
+ fs.mkdir(test1_dir, create_parents=False)
75
+ test2_dir = os.path.join(root, "test2")
76
+ sub_test2_dir = os.path.join(test2_dir, "sub_test2")
77
+ fs.mkdir(sub_test2_dir)
78
+
79
+ sub_test2_dir_stat = fs.stat(sub_test2_dir)
80
+ assert sub_test2_dir_stat["type"] == "directory"
81
+ assert sub_test2_dir_stat["name"] == sub_test2_dir
82
+ assert fs.isdir(sub_test2_dir)
83
+
84
+ test1_file = os.path.join(test1_dir, "test1")
85
+ with fs.open(test1_file, "wb") as f:
86
+ f.write(b"abc test")
87
+ with fs.open(test1_file, "ab") as f:
88
+ f.write(b"\nappend test")
89
+ with fs.open(test1_file, "rb") as f:
90
+ content = f.read()
91
+ with open(test1_file, "rb") as f2:
92
+ expected = f2.read()
93
+ assert content == expected
94
+
95
+ assert fs.cat(test1_file) == expected
96
+
97
+ assert fs.isfile(test1_file)
98
+ test1_file_stat = fs.stat(test1_file)
99
+ assert test1_file_stat["type"] == "file"
100
+ assert test1_file_stat["name"] == test1_file
101
+ assert test1_file_stat["size"] == os.stat(test1_file).st_size
102
+ np.testing.assert_almost_equal(
103
+ test1_file_stat["modified_time"], os.stat(test1_file).st_mtime, decimal=6
104
+ )
105
+
106
+ walked = [
107
+ (os.path.normpath(root), dirs, files) for root, dirs, files in fs.walk(root)
108
+ ]
109
+ expected = os.walk(root)
110
+ assert sorted(walked) == sorted(expected)
111
+
112
+ test2_file = os.path.join(sub_test2_dir, "test2")
113
+ with fs.open(test2_file, "wb") as f:
114
+ f.write(b"def test")
115
+
116
+ for recursive in [False, True]:
117
+ globs = [
118
+ os.path.normpath(p)
119
+ for p in fs.glob(os.path.join(root, "*"), recursive=recursive)
120
+ ]
121
+ expected = [
122
+ os.path.normpath(p)
123
+ for p in _glob.glob(os.path.join(root, "*"), recursive=recursive)
124
+ ]
125
+ assert sorted(globs) == sorted(expected)
126
+
127
+ for path in [os.path.join(root, "*", "*"), test1_dir]:
128
+ globs = [os.path.normpath(p) for p in fs.glob(path)]
129
+ expected = [os.path.normpath(p) for p in _glob.glob(path)]
130
+ assert sorted(globs) == sorted(expected)
131
+
132
+ test1_new_file = os.path.join(test1_dir, "test1_new")
133
+ fs.rename(test1_file, test1_new_file)
134
+ test1_new_file2 = os.path.join(test1_dir, "test1_new2")
135
+ fs.mv(test1_new_file, test1_new_file2)
136
+ assert fs.exists(test1_new_file2)
137
+ assert not fs.exists(test1_file)
138
+
139
+ assert fs.disk_usage(test1_dir) > 0
140
+
141
+ fs.delete(test2_file)
142
+ assert not fs.exists(test2_file)
143
+
144
+ assert fs._isfilestore()
145
+
146
+ with pytest.raises(OSError):
147
+ fs.delete(test1_dir)
148
+ fs.delete(test1_dir, recursive=True)
149
+ assert not fs.exists(test1_dir)
150
+
151
+
152
+ @require_hadoop
153
+ def test_hadoop_filesystem():
154
+ fs = HadoopFileSystem(host="localhost", port=8020)
155
+
156
+ test_dir = "/tmp/test/test_hadoop_fs"
157
+ fs.mkdir(test_dir)
158
+ test_file = f"{test_dir}/my_file.txt"
159
+ test_file_content = b"text for text"
160
+ with fs.open(test_file, "wb") as f:
161
+ f.write(test_file_content)
162
+ with fs.open(test_file, "rb") as f:
163
+ assert test_file_content == f.read()
164
+ # test file with hdfs:// prefix
165
+ assert fs.exists(f"hdfs://{test_dir}")
166
+
167
+
168
+ def test_fsmap():
169
+ fs = LocalFileSystem.get_instance()
170
+ with tempfile.TemporaryDirectory() as root:
171
+ fs_map = FSMap(root, fs, check=True)
172
+
173
+ path = "/to/path/test_file"
174
+ test_content = b"text for test"
175
+ fs_map[path] = test_content
176
+ assert fs_map[path] == test_content
177
+ assert len(fs_map) == 1
178
+ assert path in fs_map
179
+
180
+ path2 = "/to/path2/test_file2"
181
+ fs_map[path2] = test_content
182
+ assert len(fs_map) == 2
183
+
184
+ del fs_map[path]
185
+ assert list(fs_map) == ["to/path2/test_file2"]
186
+
187
+ path3 = "/to2/path3/test_file3"
188
+ fs_map[path3] = test_content
189
+ assert fs_map.pop(path3) == test_content
190
+ assert fs_map.pop(path3, "fake_content") == "fake_content"
191
+ with pytest.raises(KeyError):
192
+ fs_map.pop("not_exist")
193
+
194
+ fs_map.clear()
195
+ assert len(fs_map) == 0
196
+
197
+ # test root not exist
198
+ with pytest.raises(ValueError):
199
+ _ = FSMap(root + "/path2", fs, check=True)
200
+
201
+ # create root
202
+ fs_map = FSMap(root + "/path2", fs, create=True)
203
+ assert len(fs_map) == 0
204
+
205
+
206
+ @pytest.mark.skipif(not fsspec_installed, reason="fsspec not installed")
207
+ def test_get_fs():
208
+ from .. import get_fs, register_filesystem
209
+ from ..fsspec_adapter import FsSpecAdapter
210
+
211
+ class InMemoryFileSystemAdapter(FsSpecAdapter):
212
+ def __init__(self, **kwargs):
213
+ super().__init__("memory", **kwargs)
214
+
215
+ register_filesystem("memory", InMemoryFileSystemAdapter)
216
+
217
+ assert isinstance(get_fs("file://"), LocalFileSystem)
218
+ assert isinstance(get_fs("memory://"), InMemoryFileSystemAdapter)
219
+
220
+ try:
221
+ get_fs("unknown://")
222
+ except ValueError as e:
223
+ assert "Unknown file system type" in e.__str__()