maxframe 0.1.0b5__cp39-cp39-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-39-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-39-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-39-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-39-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,728 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # Copyright 1999-2024 Alibaba Group Holding Ltd.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ import ast
18
+ import binascii
19
+ import operator
20
+ import sys
21
+ import textwrap
22
+ import tokenize
23
+ from collections import OrderedDict
24
+ from functools import reduce
25
+ from io import StringIO
26
+
27
+ import numpy as np
28
+ import pandas as pd
29
+
30
+ from ... import opcodes
31
+ from ...core import ENTITY_TYPE, OutputType, get_output_types
32
+ from ...serialization.serializables import BoolField, DictField, StringField
33
+ from ..operators import DataFrameOperator, DataFrameOperatorMixin
34
+ from ..utils import parse_index
35
+
36
+ LOCAL_TAG = "_local_var_"
37
+ BACKTICK_TAG = "_backtick_var_"
38
+
39
+
40
+ def _tokenize_str(reader):
41
+ token_generator = tokenize.generate_tokens(reader)
42
+
43
+ def _iter_backtick_string(gen, line, back_start):
44
+ for _, tokval, start, _, _ in gen:
45
+ if tokval == "`":
46
+ return (
47
+ BACKTICK_TAG
48
+ + binascii.b2a_hex(
49
+ line[back_start[1] + 1 : start[1]].encode()
50
+ ).decode()
51
+ )
52
+ else:
53
+ raise SyntaxError(f"backtick quote at {back_start} does not match")
54
+
55
+ for toknum, tokval, start, _, line in token_generator:
56
+ if toknum == tokenize.OP:
57
+ if tokval == "@":
58
+ tokval = LOCAL_TAG
59
+ if tokval == "&":
60
+ toknum = tokenize.NAME
61
+ tokval = "and"
62
+ elif tokval == "|":
63
+ toknum = tokenize.NAME
64
+ tokval = "or"
65
+ elif tokval == "`":
66
+ yield tokenize.NAME, _iter_backtick_string(token_generator, line, start)
67
+ continue
68
+ yield toknum, tokval
69
+
70
+
71
+ class CollectionVisitor(ast.NodeVisitor):
72
+ _op_handlers = {
73
+ ast.Add: operator.add,
74
+ ast.Sub: operator.sub,
75
+ ast.Mult: operator.mul,
76
+ ast.Div: operator.truediv,
77
+ ast.FloorDiv: operator.floordiv,
78
+ ast.mod: operator.mod,
79
+ ast.Pow: operator.pow,
80
+ ast.Eq: operator.eq,
81
+ ast.NotEq: operator.ne,
82
+ ast.Lt: operator.lt,
83
+ ast.LtE: operator.le,
84
+ ast.Gt: operator.gt,
85
+ ast.GtE: operator.ge,
86
+ ast.In: lambda x, y: y.isin(x),
87
+ ast.NotIn: lambda x, y: ~y.isin(x),
88
+ ast.UAdd: operator.pos,
89
+ ast.USub: operator.neg,
90
+ ast.Invert: operator.invert,
91
+ ast.And: operator.and_,
92
+ ast.Or: operator.or_,
93
+ }
94
+
95
+ def __init__(self, resolvers, target, env):
96
+ self.env = env
97
+ self.target = target
98
+ self.resolvers = resolvers
99
+
100
+ self.referenced_vars = set()
101
+ self.assigned = False
102
+ self.entity_subscribe = False
103
+
104
+ def _preparse(self, expr):
105
+ reader = StringIO(expr).readline
106
+ return tokenize.untokenize(list(_tokenize_str(reader)))
107
+
108
+ def eval(self, expr, rewrite=True):
109
+ if rewrite:
110
+ expr = self._preparse(expr)
111
+ node = ast.fix_missing_locations(ast.parse(expr))
112
+ return self.visit(node)
113
+
114
+ def get_named_object(self, obj_name):
115
+ for resolver in self.resolvers:
116
+ try:
117
+ return resolver[obj_name]
118
+ except (IndexError, KeyError):
119
+ continue
120
+ if obj_name in self.env:
121
+ self.referenced_vars.add(obj_name)
122
+ return self.env[obj_name]
123
+ raise KeyError(f"name {obj_name} is not defined")
124
+
125
+ def visit(self, node):
126
+ if isinstance(node, ENTITY_TYPE):
127
+ return node
128
+ node_name = node.__class__.__name__
129
+ method = "visit_" + node_name
130
+ try:
131
+ visitor = getattr(self, method)
132
+ except AttributeError:
133
+ raise SyntaxError(
134
+ "Query string contains unsupported syntax: {}".format(node_name)
135
+ )
136
+ return visitor(node)
137
+
138
+ def visit_Module(self, node):
139
+ if self.target is None and len(node.body) != 1:
140
+ raise SyntaxError("Only a single expression is allowed")
141
+ result = None
142
+ for expr in node.body:
143
+ result = self.visit(expr)
144
+ return result
145
+
146
+ def visit_Expr(self, node):
147
+ return self.visit(node.value)
148
+
149
+ def visit_BinOp(self, node):
150
+ left = self.visit(node.left)
151
+ right = self.visit(node.right)
152
+ return self._op_handlers[type(node.op)](left, right)
153
+
154
+ def visit_Call(self, node):
155
+ func = self.visit(node.func)
156
+ args = [self.visit(n) for n in node.args]
157
+ kwargs = OrderedDict([(kw.arg, self.visit(kw.value)) for kw in node.keywords])
158
+ return func(*args, **kwargs)
159
+
160
+ def visit_Compare(self, node):
161
+ ops = node.ops
162
+ comps = node.comparators
163
+
164
+ if len(comps) == 1:
165
+ binop = ast.BinOp(op=ops[0], left=node.left, right=comps[0])
166
+ return self.visit(binop)
167
+
168
+ left = node.left
169
+ values = []
170
+ for op, comp in zip(ops, comps):
171
+ new_node = ast.Compare(comparators=[comp], left=left, ops=[op])
172
+ left = comp
173
+ values.append(new_node)
174
+ return self.visit(ast.BoolOp(op=ast.And(), values=values))
175
+
176
+ def visit_BoolOp(self, node):
177
+ def func(lhs, rhs):
178
+ binop = ast.BinOp(op=node.op, left=lhs, right=rhs)
179
+ return self.visit(binop)
180
+
181
+ return reduce(func, node.values)
182
+
183
+ def visit_UnaryOp(self, node):
184
+ op = self.visit(node.operand)
185
+ return self._op_handlers[type(node.op)](op)
186
+
187
+ def visit_Name(self, node):
188
+ if node.id.startswith(LOCAL_TAG):
189
+ local_name = node.id.replace(LOCAL_TAG, "")
190
+ self.referenced_vars.add(local_name)
191
+ return self.env[local_name]
192
+ if node.id.startswith(BACKTICK_TAG):
193
+ local_name = binascii.a2b_hex(
194
+ node.id.replace(BACKTICK_TAG, "").encode()
195
+ ).decode()
196
+ return self.get_named_object(local_name)
197
+ return self.get_named_object(node.id)
198
+
199
+ def visit_NameConstant(self, node): # pragma: no cover
200
+ return node.value
201
+
202
+ def visit_Num(self, node): # pragma: no cover
203
+ return node.n
204
+
205
+ def visit_Str(self, node): # pragma: no cover
206
+ return node.s
207
+
208
+ def visit_Constant(self, node):
209
+ return node.value
210
+
211
+ def visit_List(self, node):
212
+ return [self.visit(e) for e in node.elts]
213
+
214
+ def visit_Assign(self, node):
215
+ if self.target is None:
216
+ raise ValueError("Target not specified for assignment")
217
+ if isinstance(node.targets[0], ast.Tuple):
218
+ raise ValueError("Does not support assigning to multiple objects")
219
+
220
+ target = node.targets[0].id
221
+ value = self.visit(node.value)
222
+ self.target[target] = value
223
+ self.assigned = True
224
+
225
+ visit_Tuple = visit_List
226
+
227
+ def visit_Attribute(self, node):
228
+ attr = node.attr
229
+ value = node.value
230
+
231
+ ctx = node.ctx
232
+ if isinstance(ctx, ast.Load):
233
+ resolved = self.visit(value)
234
+ return getattr(resolved, attr)
235
+
236
+ raise ValueError("Invalid Attribute context {0}".format(ctx.__name__))
237
+
238
+ def visit_Subscript(self, node):
239
+ value = self.visit(node.value)
240
+ sub = self.visit(node.slice)
241
+ if isinstance(value, ENTITY_TYPE):
242
+ self.entity_subscribe = True
243
+ return value[sub]
244
+
245
+ def visit_Index(self, node):
246
+ return self.visit(node.value)
247
+
248
+ def visit_Slice(self, node):
249
+ lower = node.lower
250
+ if lower is not None:
251
+ lower = self.visit(lower)
252
+ upper = node.upper
253
+ if upper is not None:
254
+ upper = self.visit(upper)
255
+ step = node.step
256
+ if step is not None:
257
+ step = self.visit(step)
258
+
259
+ return slice(lower, upper, step)
260
+
261
+
262
+ class DataFrameEval(DataFrameOperator, DataFrameOperatorMixin):
263
+ _op_type_ = opcodes.DATAFRAME_EVAL
264
+
265
+ expr = StringField("expr", default=None)
266
+ parser = StringField("parser", default=None)
267
+ engine = StringField("engine", default=None)
268
+ variables = DictField("variables", default=None)
269
+ self_target = BoolField("self_target", default=None)
270
+ is_query = BoolField("is_query", default=None)
271
+
272
+ def __call__(self, df, output_type, shape, dtypes):
273
+ self._output_types = [output_type]
274
+ params = df.params
275
+ new_index_value = (
276
+ df.index_value if not np.isnan(shape[0]) else parse_index(pd.RangeIndex(-1))
277
+ )
278
+ if output_type == OutputType.dataframe:
279
+ params.update(
280
+ dict(
281
+ dtypes=dtypes,
282
+ shape=shape,
283
+ columns_value=parse_index(dtypes.index, store_data=True),
284
+ index_value=new_index_value,
285
+ )
286
+ )
287
+ else:
288
+ name, dtype = dtypes
289
+ params = dict(
290
+ name=name,
291
+ dtype=dtype,
292
+ shape=shape,
293
+ index_value=new_index_value,
294
+ )
295
+ return self.new_tileable([df], **params)
296
+
297
+ def convert_to_query(self, df, output_type, shape, dtypes):
298
+ new_op = self.copy().reset_key()
299
+ new_op.is_query = True
300
+ new_op.self_target = False
301
+ return new_op(df, output_type, shape, dtypes)
302
+
303
+
304
+ def maxframe_eval(
305
+ expr,
306
+ parser="maxframe",
307
+ engine=None,
308
+ local_dict=None,
309
+ global_dict=None,
310
+ resolvers=(),
311
+ level=0,
312
+ target=None,
313
+ inplace=False,
314
+ ):
315
+ """
316
+
317
+ Evaluate a Python expression as a string using various backends.
318
+
319
+ The following arithmetic operations are supported: ``+``, ``-``, ``*``,
320
+ ``/``, ``**``, ``%``, ``//`` (python engine only) along with the following
321
+ boolean operations: ``|`` (or), ``&`` (and), and ``~`` (not).
322
+ Additionally, the ``'pandas'`` parser allows the use of :keyword:`and`,
323
+ :keyword:`or`, and :keyword:`not` with the same semantics as the
324
+ corresponding bitwise operators. :class:`~pandas.Series` and
325
+ :class:`~pandas.DataFrame` objects are supported and behave as they would
326
+ with plain ol' Python evaluation.
327
+
328
+ Parameters
329
+ ----------
330
+ expr : str
331
+ The expression to evaluate. This string cannot contain any Python
332
+ `statements
333
+ <https://docs.python.org/3/reference/simple_stmts.html#simple-statements>`__,
334
+ only Python `expressions
335
+ <https://docs.python.org/3/reference/simple_stmts.html#expression-statements>`__.
336
+ local_dict : dict or None, optional
337
+ A dictionary of local variables, taken from locals() by default.
338
+ global_dict : dict or None, optional
339
+ A dictionary of global variables, taken from globals() by default.
340
+ resolvers : list of dict-like or None, optional
341
+ A list of objects implementing the ``__getitem__`` special method that
342
+ you can use to inject an additional collection of namespaces to use for
343
+ variable lookup. For example, this is used in the
344
+ :meth:`~DataFrame.query` method to inject the
345
+ ``DataFrame.index`` and ``DataFrame.columns``
346
+ variables that refer to their respective :class:`~pandas.DataFrame`
347
+ instance attributes.
348
+ level : int, optional
349
+ The number of prior stack frames to traverse and add to the current
350
+ scope. Most users will **not** need to change this parameter.
351
+ target : object, optional, default None
352
+ This is the target object for assignment. It is used when there is
353
+ variable assignment in the expression. If so, then `target` must
354
+ support item assignment with string keys, and if a copy is being
355
+ returned, it must also support `.copy()`.
356
+ inplace : bool, default False
357
+ If `target` is provided, and the expression mutates `target`, whether
358
+ to modify `target` inplace. Otherwise, return a copy of `target` with
359
+ the mutation.
360
+
361
+ Returns
362
+ -------
363
+ ndarray, numeric scalar, DataFrame, Series
364
+
365
+ Raises
366
+ ------
367
+ ValueError
368
+ There are many instances where such an error can be raised:
369
+
370
+ - `target=None`, but the expression is multiline.
371
+ - The expression is multiline, but not all them have item assignment.
372
+ An example of such an arrangement is this:
373
+
374
+ a = b + 1
375
+ a + 2
376
+
377
+ Here, there are expressions on different lines, making it multiline,
378
+ but the last line has no variable assigned to the output of `a + 2`.
379
+ - `inplace=True`, but the expression is missing item assignment.
380
+ - Item assignment is provided, but the `target` does not support
381
+ string item assignment.
382
+ - Item assignment is provided and `inplace=False`, but the `target`
383
+ does not support the `.copy()` method
384
+
385
+ See Also
386
+ --------
387
+ DataFrame.query : Evaluates a boolean expression to query the columns
388
+ of a frame.
389
+ DataFrame.eval : Evaluate a string describing operations on
390
+ DataFrame columns.
391
+
392
+ Notes
393
+ -----
394
+ The ``dtype`` of any objects involved in an arithmetic ``%`` operation are
395
+ recursively cast to ``float64``.
396
+
397
+ See the :ref:`enhancing performance <enhancingperf.eval>` documentation for
398
+ more details.
399
+
400
+ Examples
401
+ --------
402
+ >>> import maxframe.dataframe as md
403
+ >>> df = md.DataFrame({"animal": ["dog", "pig"], "age": [10, 20]})
404
+ >>> df.execute()
405
+ animal age
406
+ 0 dog 10
407
+ 1 pig 20
408
+
409
+ We can add a new column using ``pd.eval``:
410
+
411
+ >>> md.eval("double_age = df.age * 2", target=df).execute()
412
+ animal age double_age
413
+ 0 dog 10 20
414
+ 1 pig 20 40
415
+ """
416
+ if not isinstance(expr, str):
417
+ raise TypeError("expr must be a string")
418
+
419
+ expr = textwrap.dedent(expr)
420
+
421
+ try:
422
+ frame = sys._getframe(level + 1)
423
+ local_dict = local_dict or dict()
424
+ local_dict.update(frame.f_locals)
425
+ global_dict = global_dict or dict()
426
+ global_dict.update(frame.f_globals)
427
+ finally:
428
+ del frame
429
+
430
+ env = dict()
431
+ env.update(global_dict)
432
+ env.update(local_dict)
433
+
434
+ ref_frames = set(resolvers) | set([target] if target is not None else [])
435
+ self_target = len(resolvers) > 0 and resolvers[0] is target
436
+
437
+ if target is not None and not inplace:
438
+ target = target.copy()
439
+
440
+ visitor = CollectionVisitor(resolvers, target, env)
441
+ result = visitor.eval(expr)
442
+ result = result if result is not None else target
443
+ has_var_frame = any(
444
+ isinstance(env[k], ENTITY_TYPE) for k in visitor.referenced_vars
445
+ )
446
+ if len(ref_frames) != 1 or visitor.entity_subscribe or has_var_frame:
447
+ if parser != "maxframe":
448
+ raise NotImplementedError(
449
+ "Does not support parser names other than maxframe"
450
+ )
451
+ if engine is not None:
452
+ raise NotImplementedError("Does not support specifying engine names")
453
+ return result
454
+ else:
455
+ parser = "pandas" if parser == "maxframe" else parser
456
+ referenced_env = {k: env[k] for k in visitor.referenced_vars}
457
+ op = DataFrameEval(
458
+ expr=expr,
459
+ parser=parser,
460
+ engine=engine,
461
+ variables=referenced_env,
462
+ self_target=visitor.assigned and self_target,
463
+ is_query=False,
464
+ )
465
+ output_type = get_output_types(result)[0]
466
+ dtypes = result.dtypes if result.ndim == 2 else (result.name, result.dtype)
467
+ return op(resolvers[0], output_type, result.shape, dtypes)
468
+
469
+
470
+ def df_eval(df, expr, inplace=False, **kwargs):
471
+ """
472
+ Evaluate a string describing operations on DataFrame columns.
473
+
474
+ Operates on columns only, not specific rows or elements. This allows
475
+ `eval` to run arbitrary code, which can make you vulnerable to code
476
+ injection if you pass user input to this function.
477
+
478
+ Parameters
479
+ ----------
480
+ expr : str
481
+ The expression string to evaluate.
482
+ inplace : bool, default False
483
+ If the expression contains an assignment, whether to perform the
484
+ operation inplace and mutate the existing DataFrame. Otherwise,
485
+ a new DataFrame is returned.
486
+ **kwargs
487
+ See the documentation for :func:`eval` for complete details
488
+ on the keyword arguments accepted by
489
+ :meth:`~pandas.DataFrame.query`.
490
+
491
+ Returns
492
+ -------
493
+ ndarray, scalar, or pandas object
494
+ The result of the evaluation.
495
+
496
+ See Also
497
+ --------
498
+ DataFrame.query : Evaluates a boolean expression to query the columns
499
+ of a frame.
500
+ DataFrame.assign : Can evaluate an expression or function to create new
501
+ values for a column.
502
+ eval : Evaluate a Python expression as a string using various
503
+ backends.
504
+
505
+ Notes
506
+ -----
507
+ For more details see the API documentation for :func:`~eval`.
508
+ For detailed examples see :ref:`enhancing performance with eval
509
+ <enhancingperf.eval>`.
510
+
511
+ Examples
512
+ --------
513
+ >>> import maxframe.dataframe as md
514
+ >>> df = md.DataFrame({'A': range(1, 6), 'B': range(10, 0, -2)})
515
+ >>> df.execute()
516
+ A B
517
+ 0 1 10
518
+ 1 2 8
519
+ 2 3 6
520
+ 3 4 4
521
+ 4 5 2
522
+ >>> df.eval('A + B').execute()
523
+ 0 11
524
+ 1 10
525
+ 2 9
526
+ 3 8
527
+ 4 7
528
+ dtype: int64
529
+
530
+ Assignment is allowed though by default the original DataFrame is not
531
+ modified.
532
+
533
+ >>> df.eval('C = A + B').execute()
534
+ A B C
535
+ 0 1 10 11
536
+ 1 2 8 10
537
+ 2 3 6 9
538
+ 3 4 4 8
539
+ 4 5 2 7
540
+ >>> df.execute()
541
+ A B
542
+ 0 1 10
543
+ 1 2 8
544
+ 2 3 6
545
+ 3 4 4
546
+ 4 5 2
547
+
548
+ Use ``inplace=True`` to modify the original DataFrame.
549
+
550
+ >>> df.eval('C = A + B', inplace=True)
551
+ >>> df.execute()
552
+ A B C
553
+ 0 1 10 11
554
+ 1 2 8 10
555
+ 2 3 6 9
556
+ 3 4 4 8
557
+ 4 5 2 7
558
+
559
+ Multiple columns can be assigned to using multi-line expressions:
560
+
561
+ >>> df.eval('''
562
+ ... C = A + B
563
+ ... D = A - B
564
+ ... ''').execute()
565
+ A B C D
566
+ 0 1 10 11 -9
567
+ 1 2 8 10 -6
568
+ 2 3 6 9 -3
569
+ 3 4 4 8 0
570
+ 4 5 2 7 3
571
+ """
572
+ level = kwargs.pop("level", None) or 0
573
+ kwargs["inplace"] = inplace
574
+ val = maxframe_eval(expr, resolvers=(df,), target=df, level=level + 1, **kwargs)
575
+ if not inplace:
576
+ return val
577
+
578
+
579
+ def df_query(df, expr, inplace=False, **kwargs):
580
+ """
581
+ Query the columns of a DataFrame with a boolean expression.
582
+
583
+ Parameters
584
+ ----------
585
+ expr : str
586
+ The query string to evaluate.
587
+
588
+ You can refer to variables
589
+ in the environment by prefixing them with an '@' character like
590
+ ``@a + b``.
591
+
592
+ You can refer to column names that contain spaces or operators by
593
+ surrounding them in backticks. This way you can also escape
594
+ names that start with a digit, or those that are a Python keyword.
595
+ Basically when it is not valid Python identifier. See notes down
596
+ for more details.
597
+
598
+ For example, if one of your columns is called ``a a`` and you want
599
+ to sum it with ``b``, your query should be ```a a` + b``.
600
+
601
+ inplace : bool
602
+ Whether the query should modify the data in place or return
603
+ a modified copy.
604
+ **kwargs
605
+ See the documentation for :func:`eval` for complete details
606
+ on the keyword arguments accepted by :meth:`DataFrame.query`.
607
+
608
+ Returns
609
+ -------
610
+ DataFrame
611
+ DataFrame resulting from the provided query expression.
612
+
613
+ See Also
614
+ --------
615
+ eval : Evaluate a string describing operations on
616
+ DataFrame columns.
617
+ DataFrame.eval : Evaluate a string describing operations on
618
+ DataFrame columns.
619
+
620
+ Notes
621
+ -----
622
+ The result of the evaluation of this expression is first passed to
623
+ :attr:`DataFrame.loc` and if that fails because of a
624
+ multidimensional key (e.g., a DataFrame) then the result will be passed
625
+ to :meth:`DataFrame.__getitem__`.
626
+
627
+ This method uses the top-level :func:`eval` function to
628
+ evaluate the passed query.
629
+
630
+ The :meth:`~pandas.DataFrame.query` method uses a slightly
631
+ modified Python syntax by default. For example, the ``&`` and ``|``
632
+ (bitwise) operators have the precedence of their boolean cousins,
633
+ :keyword:`and` and :keyword:`or`. This *is* syntactically valid Python,
634
+ however the semantics are different.
635
+
636
+ You can change the semantics of the expression by passing the keyword
637
+ argument ``parser='python'``. This enforces the same semantics as
638
+ evaluation in Python space. Likewise, you can pass ``engine='python'``
639
+ to evaluate an expression using Python itself as a backend. This is not
640
+ recommended as it is inefficient compared to using ``numexpr`` as the
641
+ engine.
642
+
643
+ The :attr:`DataFrame.index` and
644
+ :attr:`DataFrame.columns` attributes of the
645
+ :class:`~pandas.DataFrame` instance are placed in the query namespace
646
+ by default, which allows you to treat both the index and columns of the
647
+ frame as a column in the frame.
648
+ The identifier ``index`` is used for the frame index; you can also
649
+ use the name of the index to identify it in a query. Please note that
650
+ Python keywords may not be used as identifiers.
651
+
652
+ For further details and examples see the ``query`` documentation in
653
+ :ref:`indexing <indexing.query>`.
654
+
655
+ *Backtick quoted variables*
656
+
657
+ Backtick quoted variables are parsed as literal Python code and
658
+ are converted internally to a Python valid identifier.
659
+ This can lead to the following problems.
660
+
661
+ During parsing a number of disallowed characters inside the backtick
662
+ quoted string are replaced by strings that are allowed as a Python identifier.
663
+ These characters include all operators in Python, the space character, the
664
+ question mark, the exclamation mark, the dollar sign, and the euro sign.
665
+ For other characters that fall outside the ASCII range (U+0001..U+007F)
666
+ and those that are not further specified in PEP 3131,
667
+ the query parser will raise an error.
668
+ This excludes whitespace different than the space character,
669
+ but also the hashtag (as it is used for comments) and the backtick
670
+ itself (backtick can also not be escaped).
671
+
672
+ In a special case, quotes that make a pair around a backtick can
673
+ confuse the parser.
674
+ For example, ```it's` > `that's``` will raise an error,
675
+ as it forms a quoted string (``'s > `that'``) with a backtick inside.
676
+
677
+ See also the Python documentation about lexical analysis
678
+ (https://docs.python.org/3/reference/lexical_analysis.html)
679
+ in combination with the source code in :mod:`pandas.core.computation.parsing`.
680
+
681
+ Examples
682
+ --------
683
+ >>> import maxframe.dataframe as md
684
+ >>> df = md.DataFrame({'A': range(1, 6),
685
+ ... 'B': range(10, 0, -2),
686
+ ... 'C C': range(10, 5, -1)})
687
+ >>> df.execute()
688
+ A B C C
689
+ 0 1 10 10
690
+ 1 2 8 9
691
+ 2 3 6 8
692
+ 3 4 4 7
693
+ 4 5 2 6
694
+ >>> df.query('A > B').execute()
695
+ A B C C
696
+ 4 5 2 6
697
+
698
+ The previous expression is equivalent to
699
+
700
+ >>> df[df.A > df.B].execute()
701
+ A B C C
702
+ 4 5 2 6
703
+
704
+ For columns with spaces in their name, you can use backtick quoting.
705
+
706
+ >>> df.query('B == `C C`').execute()
707
+ A B C C
708
+ 0 1 10 10
709
+
710
+ The previous expression is equivalent to
711
+
712
+ >>> df[df.B == df['C C']].execute()
713
+ A B C C
714
+ 0 1 10 10
715
+ """
716
+ level = kwargs.pop("level", None) or 0
717
+ predicate = maxframe_eval(expr, resolvers=(df,), level=level + 1, **kwargs)
718
+ result = df[predicate]
719
+
720
+ if isinstance(predicate.op, DataFrameEval):
721
+ output_type = get_output_types(result)[0]
722
+ dtypes = result.dtypes if result.ndim == 2 else (result.name, result.dtype)
723
+ result = predicate.op.convert_to_query(df, output_type, result.shape, dtypes)
724
+
725
+ if inplace:
726
+ df.data = result.data
727
+ else:
728
+ return result