maxframe 1.3.1__cp311-cp311-win32.whl → 2.0.0b1__cp311-cp311-win32.whl

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

Potentially problematic release.


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

Files changed (639) hide show
  1. maxframe/_utils.cp311-win32.pyd +0 -0
  2. maxframe/_utils.pyi +21 -0
  3. maxframe/_utils.pyx +4 -3
  4. maxframe/codegen/__init__.py +27 -0
  5. maxframe/{codegen.py → codegen/core.py} +49 -43
  6. maxframe/codegen/spe/__init__.py +16 -0
  7. maxframe/codegen/spe/core.py +307 -0
  8. maxframe/codegen/spe/dataframe/__init__.py +37 -0
  9. maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
  10. maxframe/codegen/spe/dataframe/accessors/base.py +53 -0
  11. maxframe/codegen/spe/dataframe/accessors/dict_.py +194 -0
  12. maxframe/codegen/spe/dataframe/accessors/list_.py +80 -0
  13. maxframe/codegen/spe/dataframe/arithmetic.py +84 -0
  14. maxframe/codegen/spe/dataframe/datasource.py +181 -0
  15. maxframe/codegen/spe/dataframe/datastore.py +204 -0
  16. maxframe/codegen/spe/dataframe/extensions.py +63 -0
  17. maxframe/codegen/spe/dataframe/fetch.py +26 -0
  18. maxframe/codegen/spe/dataframe/groupby.py +224 -0
  19. maxframe/codegen/spe/dataframe/indexing.py +238 -0
  20. maxframe/codegen/spe/dataframe/merge.py +73 -0
  21. maxframe/codegen/spe/dataframe/misc.py +286 -0
  22. maxframe/codegen/spe/dataframe/missing.py +64 -0
  23. maxframe/codegen/spe/dataframe/reduction.py +160 -0
  24. maxframe/codegen/spe/dataframe/sort.py +83 -0
  25. maxframe/codegen/spe/dataframe/statistics.py +46 -0
  26. maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
  27. maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
  28. maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
  29. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +310 -0
  30. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +137 -0
  31. maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
  32. maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
  33. maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
  34. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +76 -0
  35. maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
  36. maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
  37. maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
  38. maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
  39. maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
  40. maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
  41. maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
  42. maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
  43. maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
  44. maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
  45. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +234 -0
  46. maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
  47. maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
  48. maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
  49. maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
  50. maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
  51. maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
  52. maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
  53. maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
  54. maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
  55. maxframe/codegen/spe/dataframe/tests/test_groupby.py +225 -0
  56. maxframe/codegen/spe/dataframe/tests/test_merge.py +400 -0
  57. maxframe/codegen/spe/dataframe/tests/test_reduction.py +104 -0
  58. maxframe/codegen/spe/dataframe/tests/test_sort.py +159 -0
  59. maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
  60. maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
  61. maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
  62. maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
  63. maxframe/codegen/spe/dataframe/tseries.py +46 -0
  64. maxframe/codegen/spe/dataframe/udf.py +62 -0
  65. maxframe/codegen/spe/dataframe/value_counts.py +31 -0
  66. maxframe/codegen/spe/dataframe/window.py +65 -0
  67. maxframe/codegen/spe/learn/__init__.py +15 -0
  68. maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
  69. maxframe/codegen/spe/learn/contrib/lightgbm.py +160 -0
  70. maxframe/codegen/spe/learn/contrib/models.py +41 -0
  71. maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
  72. maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
  73. maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
  74. maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
  75. maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
  76. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +98 -0
  77. maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
  78. maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
  79. maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
  80. maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
  81. maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
  82. maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
  83. maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
  84. maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
  85. maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
  86. maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
  87. maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
  88. maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
  89. maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
  90. maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
  91. maxframe/codegen/spe/learn/utils/__init__.py +15 -0
  92. maxframe/codegen/spe/learn/utils/checks.py +55 -0
  93. maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
  94. maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
  95. maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
  96. maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
  97. maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
  98. maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
  99. maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
  100. maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
  101. maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
  102. maxframe/codegen/spe/learn/utils/validation.py +35 -0
  103. maxframe/codegen/spe/objects.py +26 -0
  104. maxframe/codegen/spe/remote.py +29 -0
  105. maxframe/codegen/spe/tensor/__init__.py +28 -0
  106. maxframe/codegen/spe/tensor/arithmetic.py +95 -0
  107. maxframe/codegen/spe/tensor/core.py +41 -0
  108. maxframe/codegen/spe/tensor/datasource.py +165 -0
  109. maxframe/codegen/spe/tensor/extensions.py +35 -0
  110. maxframe/codegen/spe/tensor/fetch.py +26 -0
  111. maxframe/codegen/spe/tensor/indexing.py +63 -0
  112. maxframe/codegen/spe/tensor/linalg.py +63 -0
  113. maxframe/codegen/spe/tensor/merge.py +31 -0
  114. maxframe/codegen/spe/tensor/misc.py +121 -0
  115. maxframe/codegen/spe/tensor/random.py +29 -0
  116. maxframe/codegen/spe/tensor/reduction.py +39 -0
  117. maxframe/codegen/spe/tensor/reshape.py +26 -0
  118. maxframe/codegen/spe/tensor/sort.py +42 -0
  119. maxframe/codegen/spe/tensor/special.py +35 -0
  120. maxframe/codegen/spe/tensor/statistics.py +24 -0
  121. maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
  122. maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
  123. maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
  124. maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
  125. maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
  126. maxframe/codegen/spe/tensor/tests/test_linalg.py +38 -0
  127. maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
  128. maxframe/codegen/spe/tensor/tests/test_misc.py +94 -0
  129. maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
  130. maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
  131. maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
  132. maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
  133. maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
  134. maxframe/codegen/spe/tensor/tests/test_statistics.py +29 -0
  135. maxframe/codegen/spe/tests/__init__.py +13 -0
  136. maxframe/codegen/spe/tests/test_remote.py +29 -0
  137. maxframe/codegen/spe/tests/test_spe_codegen.py +141 -0
  138. maxframe/codegen/spe/utils.py +54 -0
  139. maxframe/codegen/tests/__init__.py +13 -0
  140. maxframe/{tests → codegen/tests}/test_codegen.py +3 -5
  141. maxframe/config/__init__.py +1 -1
  142. maxframe/config/config.py +50 -23
  143. maxframe/config/tests/test_config.py +4 -12
  144. maxframe/config/validators.py +5 -0
  145. maxframe/conftest.py +38 -10
  146. maxframe/core/__init__.py +1 -0
  147. maxframe/core/context.py +110 -0
  148. maxframe/core/entity/__init__.py +1 -0
  149. maxframe/core/entity/core.py +0 -7
  150. maxframe/core/entity/objects.py +19 -5
  151. maxframe/core/entity/output_types.py +11 -0
  152. maxframe/core/entity/tests/test_objects.py +11 -12
  153. maxframe/core/entity/tileables.py +3 -1
  154. maxframe/core/entity/utils.py +15 -0
  155. maxframe/core/graph/__init__.py +6 -1
  156. maxframe/core/graph/builder/base.py +5 -1
  157. maxframe/core/graph/core.cp311-win32.pyd +0 -0
  158. maxframe/core/graph/core.pyx +17 -6
  159. maxframe/core/graph/entity.py +18 -6
  160. maxframe/core/operator/__init__.py +8 -3
  161. maxframe/core/operator/base.py +35 -12
  162. maxframe/core/operator/core.py +37 -14
  163. maxframe/core/operator/fetch.py +5 -18
  164. maxframe/core/operator/objects.py +0 -20
  165. maxframe/core/operator/shuffle.py +6 -72
  166. maxframe/dataframe/__init__.py +1 -0
  167. maxframe/dataframe/accessors/datetime_/core.py +7 -4
  168. maxframe/dataframe/accessors/string_/core.py +9 -6
  169. maxframe/dataframe/arithmetic/core.py +31 -20
  170. maxframe/dataframe/arithmetic/tests/test_arithmetic.py +6 -0
  171. maxframe/dataframe/core.py +98 -91
  172. maxframe/dataframe/datasource/core.py +8 -1
  173. maxframe/dataframe/datasource/date_range.py +8 -0
  174. maxframe/dataframe/datasource/from_index.py +9 -5
  175. maxframe/dataframe/datasource/from_records.py +9 -2
  176. maxframe/dataframe/datasource/from_tensor.py +32 -21
  177. maxframe/dataframe/datasource/read_csv.py +8 -2
  178. maxframe/dataframe/datasource/read_odps_query.py +33 -3
  179. maxframe/dataframe/datasource/read_odps_table.py +20 -5
  180. maxframe/dataframe/datasource/read_parquet.py +8 -3
  181. maxframe/dataframe/datasource/tests/test_datasource.py +33 -0
  182. maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
  183. maxframe/dataframe/datastore/to_csv.py +7 -3
  184. maxframe/dataframe/datastore/to_odps.py +42 -6
  185. maxframe/dataframe/extensions/__init__.py +6 -1
  186. maxframe/dataframe/extensions/apply_chunk.py +96 -136
  187. maxframe/dataframe/extensions/flatjson.py +3 -2
  188. maxframe/dataframe/extensions/flatmap.py +15 -7
  189. maxframe/dataframe/fetch/core.py +12 -1
  190. maxframe/dataframe/groupby/__init__.py +7 -0
  191. maxframe/dataframe/groupby/aggregation.py +9 -8
  192. maxframe/dataframe/groupby/apply.py +50 -74
  193. maxframe/dataframe/groupby/apply_chunk.py +393 -0
  194. maxframe/dataframe/groupby/core.py +80 -17
  195. maxframe/dataframe/groupby/extensions.py +26 -0
  196. maxframe/dataframe/groupby/fill.py +9 -4
  197. maxframe/dataframe/groupby/sample.py +7 -7
  198. maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
  199. maxframe/dataframe/groupby/transform.py +57 -54
  200. maxframe/dataframe/indexing/align.py +7 -6
  201. maxframe/dataframe/indexing/getitem.py +9 -8
  202. maxframe/dataframe/indexing/iloc.py +28 -23
  203. maxframe/dataframe/indexing/insert.py +7 -3
  204. maxframe/dataframe/indexing/loc.py +9 -8
  205. maxframe/dataframe/indexing/reindex.py +36 -30
  206. maxframe/dataframe/indexing/rename_axis.py +18 -10
  207. maxframe/dataframe/indexing/reset_index.py +0 -2
  208. maxframe/dataframe/indexing/sample.py +13 -9
  209. maxframe/dataframe/indexing/set_axis.py +9 -6
  210. maxframe/dataframe/indexing/setitem.py +8 -5
  211. maxframe/dataframe/indexing/where.py +12 -9
  212. maxframe/dataframe/merge/__init__.py +0 -1
  213. maxframe/dataframe/merge/concat.py +10 -31
  214. maxframe/dataframe/merge/merge.py +2 -24
  215. maxframe/dataframe/misc/__init__.py +6 -0
  216. maxframe/dataframe/misc/_duplicate.py +7 -3
  217. maxframe/dataframe/misc/apply.py +106 -139
  218. maxframe/dataframe/misc/astype.py +3 -2
  219. maxframe/dataframe/misc/case_when.py +11 -7
  220. maxframe/dataframe/misc/cut.py +11 -10
  221. maxframe/dataframe/misc/describe.py +7 -3
  222. maxframe/dataframe/misc/drop.py +13 -11
  223. maxframe/dataframe/misc/eval.py +0 -2
  224. maxframe/dataframe/misc/get_dummies.py +78 -49
  225. maxframe/dataframe/misc/isin.py +13 -10
  226. maxframe/dataframe/misc/map.py +21 -6
  227. maxframe/dataframe/misc/melt.py +8 -1
  228. maxframe/dataframe/misc/pivot.py +232 -0
  229. maxframe/dataframe/misc/pivot_table.py +52 -40
  230. maxframe/dataframe/misc/rechunk.py +59 -0
  231. maxframe/dataframe/misc/shift.py +7 -4
  232. maxframe/dataframe/misc/stack.py +5 -3
  233. maxframe/dataframe/misc/tests/test_misc.py +167 -1
  234. maxframe/dataframe/misc/transform.py +63 -65
  235. maxframe/dataframe/misc/value_counts.py +7 -4
  236. maxframe/dataframe/missing/dropna.py +16 -7
  237. maxframe/dataframe/missing/fillna.py +18 -10
  238. maxframe/dataframe/missing/replace.py +10 -6
  239. maxframe/dataframe/missing/tests/test_missing.py +2 -2
  240. maxframe/dataframe/operators.py +1 -27
  241. maxframe/dataframe/reduction/aggregation.py +65 -3
  242. maxframe/dataframe/reduction/core.py +3 -1
  243. maxframe/dataframe/reduction/median.py +1 -1
  244. maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
  245. maxframe/dataframe/reduction/unique.py +53 -7
  246. maxframe/dataframe/statistics/corr.py +9 -6
  247. maxframe/dataframe/statistics/quantile.py +9 -6
  248. maxframe/dataframe/tseries/to_datetime.py +6 -4
  249. maxframe/dataframe/utils.py +219 -31
  250. maxframe/dataframe/window/rolling.py +7 -4
  251. maxframe/env.py +1 -0
  252. maxframe/errors.py +9 -0
  253. maxframe/extension.py +13 -2
  254. maxframe/io/objects/core.py +67 -51
  255. maxframe/io/objects/tensor.py +73 -17
  256. maxframe/io/objects/tests/test_object_io.py +8 -55
  257. maxframe/io/odpsio/arrow.py +15 -2
  258. maxframe/io/odpsio/schema.py +43 -13
  259. maxframe/io/odpsio/tableio.py +63 -11
  260. maxframe/io/odpsio/tests/test_arrow.py +1 -2
  261. maxframe/io/odpsio/tests/test_schema.py +114 -1
  262. maxframe/io/odpsio/tests/test_tableio.py +42 -0
  263. maxframe/io/odpsio/tests/test_volumeio.py +22 -48
  264. maxframe/learn/__init__.py +2 -2
  265. maxframe/learn/contrib/__init__.py +2 -2
  266. maxframe/learn/contrib/graph/connected_components.py +2 -1
  267. maxframe/learn/contrib/lightgbm/__init__.py +33 -0
  268. maxframe/learn/contrib/lightgbm/_predict.py +138 -0
  269. maxframe/learn/contrib/lightgbm/_train.py +163 -0
  270. maxframe/learn/contrib/lightgbm/callback.py +114 -0
  271. maxframe/learn/contrib/lightgbm/classifier.py +199 -0
  272. maxframe/learn/contrib/lightgbm/core.py +372 -0
  273. maxframe/learn/contrib/lightgbm/dataset.py +153 -0
  274. maxframe/learn/contrib/lightgbm/regressor.py +29 -0
  275. maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
  276. maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
  277. maxframe/learn/contrib/models.py +38 -9
  278. maxframe/learn/contrib/utils.py +55 -0
  279. maxframe/learn/contrib/xgboost/callback.py +86 -0
  280. maxframe/learn/contrib/xgboost/classifier.py +26 -30
  281. maxframe/learn/contrib/xgboost/core.py +53 -42
  282. maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
  283. maxframe/learn/contrib/xgboost/predict.py +16 -9
  284. maxframe/learn/contrib/xgboost/regressor.py +28 -27
  285. maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
  286. maxframe/learn/contrib/xgboost/train.py +59 -16
  287. maxframe/learn/core.py +252 -0
  288. maxframe/learn/datasets/__init__.py +20 -0
  289. maxframe/learn/datasets/samples_generator.py +628 -0
  290. maxframe/learn/linear_model/__init__.py +15 -0
  291. maxframe/learn/linear_model/_base.py +163 -0
  292. maxframe/learn/linear_model/_lin_reg.py +175 -0
  293. maxframe/learn/metrics/__init__.py +25 -0
  294. maxframe/learn/metrics/_check_targets.py +95 -0
  295. maxframe/learn/metrics/_classification.py +1121 -0
  296. maxframe/learn/metrics/_regression.py +256 -0
  297. maxframe/learn/model_selection/__init__.py +15 -0
  298. maxframe/learn/model_selection/_split.py +451 -0
  299. maxframe/learn/model_selection/tests/__init__.py +13 -0
  300. maxframe/learn/model_selection/tests/test_split.py +156 -0
  301. maxframe/learn/preprocessing/__init__.py +16 -0
  302. maxframe/learn/preprocessing/_data/__init__.py +17 -0
  303. maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
  304. maxframe/learn/preprocessing/_data/normalize.py +127 -0
  305. maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
  306. maxframe/learn/preprocessing/_data/utils.py +79 -0
  307. maxframe/learn/preprocessing/_label/__init__.py +16 -0
  308. maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
  309. maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
  310. maxframe/learn/utils/__init__.py +4 -0
  311. maxframe/learn/utils/_encode.py +314 -0
  312. maxframe/learn/utils/checks.py +161 -0
  313. maxframe/learn/utils/core.py +33 -0
  314. maxframe/learn/utils/extmath.py +176 -0
  315. maxframe/learn/utils/multiclass.py +292 -0
  316. maxframe/learn/utils/shuffle.py +114 -0
  317. maxframe/learn/utils/sparsefuncs.py +87 -0
  318. maxframe/learn/utils/validation.py +775 -0
  319. maxframe/lib/__init__.py +0 -2
  320. maxframe/lib/compat.py +145 -0
  321. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  322. maxframe/lib/mmh3.cp311-win32.pyd +0 -0
  323. maxframe/lib/sparse/__init__.py +10 -15
  324. maxframe/lib/sparse/array.py +45 -33
  325. maxframe/lib/sparse/core.py +0 -2
  326. maxframe/lib/sparse/linalg.py +31 -0
  327. maxframe/lib/sparse/matrix.py +5 -2
  328. maxframe/lib/sparse/tests/__init__.py +0 -2
  329. maxframe/lib/sparse/tests/test_sparse.py +53 -53
  330. maxframe/lib/sparse/vector.py +0 -2
  331. maxframe/mixin.py +59 -2
  332. maxframe/opcodes.py +13 -5
  333. maxframe/protocol.py +67 -14
  334. maxframe/remote/core.py +16 -14
  335. maxframe/remote/run_script.py +6 -3
  336. maxframe/serialization/__init__.py +2 -0
  337. maxframe/serialization/core.cp311-win32.pyd +0 -0
  338. maxframe/serialization/core.pxd +3 -0
  339. maxframe/serialization/core.pyi +3 -1
  340. maxframe/serialization/core.pyx +82 -4
  341. maxframe/serialization/pandas.py +5 -1
  342. maxframe/serialization/serializables/core.py +6 -5
  343. maxframe/serialization/serializables/field.py +2 -2
  344. maxframe/serialization/serializables/tests/test_field_type.py +3 -5
  345. maxframe/serialization/tests/test_serial.py +27 -0
  346. maxframe/session.py +4 -71
  347. maxframe/sperunner.py +165 -0
  348. maxframe/tensor/__init__.py +35 -2
  349. maxframe/tensor/arithmetic/__init__.py +2 -4
  350. maxframe/tensor/arithmetic/abs.py +0 -2
  351. maxframe/tensor/arithmetic/absolute.py +0 -2
  352. maxframe/tensor/arithmetic/add.py +34 -4
  353. maxframe/tensor/arithmetic/angle.py +0 -2
  354. maxframe/tensor/arithmetic/arccos.py +1 -4
  355. maxframe/tensor/arithmetic/arccosh.py +1 -3
  356. maxframe/tensor/arithmetic/arcsin.py +0 -2
  357. maxframe/tensor/arithmetic/arcsinh.py +0 -2
  358. maxframe/tensor/arithmetic/arctan.py +0 -2
  359. maxframe/tensor/arithmetic/arctan2.py +0 -2
  360. maxframe/tensor/arithmetic/arctanh.py +0 -2
  361. maxframe/tensor/arithmetic/around.py +0 -2
  362. maxframe/tensor/arithmetic/bitand.py +0 -2
  363. maxframe/tensor/arithmetic/bitor.py +1 -3
  364. maxframe/tensor/arithmetic/bitxor.py +1 -3
  365. maxframe/tensor/arithmetic/cbrt.py +0 -2
  366. maxframe/tensor/arithmetic/ceil.py +0 -2
  367. maxframe/tensor/arithmetic/clip.py +13 -13
  368. maxframe/tensor/arithmetic/conj.py +0 -2
  369. maxframe/tensor/arithmetic/copysign.py +0 -2
  370. maxframe/tensor/arithmetic/core.py +47 -39
  371. maxframe/tensor/arithmetic/cos.py +1 -3
  372. maxframe/tensor/arithmetic/cosh.py +0 -2
  373. maxframe/tensor/arithmetic/deg2rad.py +0 -2
  374. maxframe/tensor/arithmetic/degrees.py +0 -2
  375. maxframe/tensor/arithmetic/divide.py +0 -2
  376. maxframe/tensor/arithmetic/equal.py +0 -2
  377. maxframe/tensor/arithmetic/exp.py +1 -3
  378. maxframe/tensor/arithmetic/exp2.py +0 -2
  379. maxframe/tensor/arithmetic/expm1.py +0 -2
  380. maxframe/tensor/arithmetic/fabs.py +0 -2
  381. maxframe/tensor/arithmetic/fix.py +0 -2
  382. maxframe/tensor/arithmetic/float_power.py +0 -2
  383. maxframe/tensor/arithmetic/floor.py +0 -2
  384. maxframe/tensor/arithmetic/floordiv.py +0 -2
  385. maxframe/tensor/arithmetic/fmax.py +0 -2
  386. maxframe/tensor/arithmetic/fmin.py +0 -2
  387. maxframe/tensor/arithmetic/fmod.py +0 -2
  388. maxframe/tensor/arithmetic/frexp.py +6 -2
  389. maxframe/tensor/arithmetic/greater.py +0 -2
  390. maxframe/tensor/arithmetic/greater_equal.py +0 -2
  391. maxframe/tensor/arithmetic/hypot.py +0 -2
  392. maxframe/tensor/arithmetic/i0.py +1 -3
  393. maxframe/tensor/arithmetic/imag.py +0 -2
  394. maxframe/tensor/arithmetic/invert.py +1 -3
  395. maxframe/tensor/arithmetic/isclose.py +0 -2
  396. maxframe/tensor/arithmetic/iscomplex.py +0 -2
  397. maxframe/tensor/arithmetic/isfinite.py +1 -3
  398. maxframe/tensor/arithmetic/isinf.py +0 -2
  399. maxframe/tensor/arithmetic/isnan.py +0 -2
  400. maxframe/tensor/arithmetic/isreal.py +0 -2
  401. maxframe/tensor/arithmetic/ldexp.py +0 -2
  402. maxframe/tensor/arithmetic/less.py +0 -2
  403. maxframe/tensor/arithmetic/less_equal.py +0 -2
  404. maxframe/tensor/arithmetic/log.py +1 -3
  405. maxframe/tensor/arithmetic/log10.py +1 -3
  406. maxframe/tensor/arithmetic/log1p.py +1 -3
  407. maxframe/tensor/arithmetic/log2.py +1 -3
  408. maxframe/tensor/arithmetic/logaddexp.py +0 -2
  409. maxframe/tensor/arithmetic/logaddexp2.py +0 -2
  410. maxframe/tensor/arithmetic/logical_and.py +0 -2
  411. maxframe/tensor/arithmetic/logical_not.py +1 -3
  412. maxframe/tensor/arithmetic/logical_or.py +0 -2
  413. maxframe/tensor/arithmetic/logical_xor.py +0 -2
  414. maxframe/tensor/arithmetic/lshift.py +0 -2
  415. maxframe/tensor/arithmetic/maximum.py +0 -2
  416. maxframe/tensor/arithmetic/minimum.py +0 -2
  417. maxframe/tensor/arithmetic/mod.py +0 -2
  418. maxframe/tensor/arithmetic/modf.py +6 -2
  419. maxframe/tensor/arithmetic/multiply.py +37 -4
  420. maxframe/tensor/arithmetic/nan_to_num.py +0 -2
  421. maxframe/tensor/arithmetic/negative.py +0 -2
  422. maxframe/tensor/arithmetic/nextafter.py +0 -2
  423. maxframe/tensor/arithmetic/not_equal.py +0 -2
  424. maxframe/tensor/arithmetic/positive.py +0 -2
  425. maxframe/tensor/arithmetic/power.py +0 -2
  426. maxframe/tensor/arithmetic/rad2deg.py +0 -2
  427. maxframe/tensor/arithmetic/radians.py +0 -2
  428. maxframe/tensor/arithmetic/real.py +0 -2
  429. maxframe/tensor/arithmetic/reciprocal.py +5 -3
  430. maxframe/tensor/arithmetic/rint.py +1 -3
  431. maxframe/tensor/arithmetic/rshift.py +0 -2
  432. maxframe/tensor/arithmetic/setimag.py +0 -2
  433. maxframe/tensor/arithmetic/setreal.py +0 -2
  434. maxframe/tensor/arithmetic/sign.py +0 -2
  435. maxframe/tensor/arithmetic/signbit.py +0 -2
  436. maxframe/tensor/arithmetic/sin.py +0 -2
  437. maxframe/tensor/arithmetic/sinc.py +1 -3
  438. maxframe/tensor/arithmetic/sinh.py +0 -2
  439. maxframe/tensor/arithmetic/spacing.py +0 -2
  440. maxframe/tensor/arithmetic/sqrt.py +0 -2
  441. maxframe/tensor/arithmetic/square.py +0 -2
  442. maxframe/tensor/arithmetic/subtract.py +4 -2
  443. maxframe/tensor/arithmetic/tan.py +0 -2
  444. maxframe/tensor/arithmetic/tanh.py +0 -2
  445. maxframe/tensor/arithmetic/tests/__init__.py +0 -2
  446. maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
  447. maxframe/tensor/arithmetic/truediv.py +0 -2
  448. maxframe/tensor/arithmetic/trunc.py +0 -2
  449. maxframe/tensor/arithmetic/utils.py +32 -6
  450. maxframe/tensor/array_utils.py +3 -25
  451. maxframe/tensor/core.py +6 -6
  452. maxframe/tensor/datasource/__init__.py +10 -2
  453. maxframe/tensor/datasource/arange.py +0 -2
  454. maxframe/tensor/datasource/array.py +3 -22
  455. maxframe/tensor/datasource/core.py +15 -10
  456. maxframe/tensor/datasource/diag.py +140 -0
  457. maxframe/tensor/datasource/diagflat.py +69 -0
  458. maxframe/tensor/datasource/empty.py +0 -2
  459. maxframe/tensor/datasource/eye.py +95 -0
  460. maxframe/tensor/datasource/from_dataframe.py +0 -2
  461. maxframe/tensor/datasource/from_dense.py +0 -17
  462. maxframe/tensor/datasource/from_sparse.py +0 -2
  463. maxframe/tensor/datasource/full.py +0 -2
  464. maxframe/tensor/datasource/identity.py +54 -0
  465. maxframe/tensor/datasource/indices.py +115 -0
  466. maxframe/tensor/datasource/linspace.py +140 -0
  467. maxframe/tensor/datasource/meshgrid.py +135 -0
  468. maxframe/tensor/datasource/ones.py +8 -3
  469. maxframe/tensor/datasource/tests/test_datasource.py +32 -1
  470. maxframe/tensor/datasource/tri_array.py +107 -0
  471. maxframe/tensor/datasource/zeros.py +7 -3
  472. maxframe/tensor/extensions/__init__.py +31 -0
  473. maxframe/tensor/extensions/accessor.py +25 -0
  474. maxframe/tensor/extensions/apply_chunk.py +137 -0
  475. maxframe/tensor/indexing/__init__.py +1 -1
  476. maxframe/tensor/indexing/choose.py +8 -6
  477. maxframe/tensor/indexing/compress.py +0 -2
  478. maxframe/tensor/indexing/extract.py +0 -2
  479. maxframe/tensor/indexing/fill_diagonal.py +9 -6
  480. maxframe/tensor/indexing/flatnonzero.py +1 -3
  481. maxframe/tensor/indexing/getitem.py +10 -43
  482. maxframe/tensor/indexing/nonzero.py +2 -4
  483. maxframe/tensor/indexing/setitem.py +19 -9
  484. maxframe/tensor/indexing/slice.py +6 -3
  485. maxframe/tensor/indexing/take.py +0 -2
  486. maxframe/tensor/indexing/tests/__init__.py +0 -2
  487. maxframe/tensor/indexing/tests/test_indexing.py +0 -2
  488. maxframe/tensor/indexing/unravel_index.py +6 -6
  489. maxframe/tensor/lib/__init__.py +16 -0
  490. maxframe/tensor/lib/index_tricks.py +404 -0
  491. maxframe/tensor/linalg/__init__.py +36 -0
  492. maxframe/tensor/linalg/dot.py +145 -0
  493. maxframe/tensor/linalg/inner.py +36 -0
  494. maxframe/tensor/linalg/inv.py +83 -0
  495. maxframe/tensor/linalg/lu.py +115 -0
  496. maxframe/tensor/linalg/matmul.py +225 -0
  497. maxframe/tensor/linalg/qr.py +124 -0
  498. maxframe/tensor/linalg/solve_triangular.py +103 -0
  499. maxframe/tensor/linalg/svd.py +167 -0
  500. maxframe/tensor/linalg/tensordot.py +213 -0
  501. maxframe/tensor/linalg/vdot.py +73 -0
  502. maxframe/tensor/merge/__init__.py +4 -0
  503. maxframe/tensor/merge/append.py +74 -0
  504. maxframe/tensor/merge/column_stack.py +63 -0
  505. maxframe/tensor/merge/concatenate.py +3 -2
  506. maxframe/tensor/merge/dstack.py +71 -0
  507. maxframe/tensor/merge/hstack.py +70 -0
  508. maxframe/tensor/merge/stack.py +0 -2
  509. maxframe/tensor/merge/tests/test_merge.py +0 -2
  510. maxframe/tensor/misc/__init__.py +18 -5
  511. maxframe/tensor/misc/astype.py +10 -8
  512. maxframe/tensor/misc/broadcast_to.py +1 -1
  513. maxframe/tensor/misc/copy.py +64 -0
  514. maxframe/tensor/misc/diff.py +115 -0
  515. maxframe/tensor/misc/flatten.py +63 -0
  516. maxframe/tensor/misc/in1d.py +94 -0
  517. maxframe/tensor/misc/isin.py +130 -0
  518. maxframe/tensor/misc/ndim.py +53 -0
  519. maxframe/tensor/misc/ravel.py +0 -2
  520. maxframe/tensor/misc/repeat.py +129 -0
  521. maxframe/tensor/misc/searchsorted.py +147 -0
  522. maxframe/tensor/misc/setdiff1d.py +58 -0
  523. maxframe/tensor/misc/squeeze.py +117 -0
  524. maxframe/tensor/misc/swapaxes.py +113 -0
  525. maxframe/tensor/misc/tests/test_misc.py +0 -2
  526. maxframe/tensor/misc/transpose.py +8 -4
  527. maxframe/tensor/misc/trapezoid.py +123 -0
  528. maxframe/tensor/misc/unique.py +0 -1
  529. maxframe/tensor/misc/where.py +10 -8
  530. maxframe/tensor/operators.py +0 -34
  531. maxframe/tensor/random/__init__.py +3 -5
  532. maxframe/tensor/random/binomial.py +0 -2
  533. maxframe/tensor/random/bytes.py +0 -2
  534. maxframe/tensor/random/chisquare.py +0 -2
  535. maxframe/tensor/random/choice.py +9 -8
  536. maxframe/tensor/random/core.py +20 -5
  537. maxframe/tensor/random/dirichlet.py +0 -2
  538. maxframe/tensor/random/exponential.py +0 -2
  539. maxframe/tensor/random/f.py +2 -4
  540. maxframe/tensor/random/gamma.py +0 -2
  541. maxframe/tensor/random/geometric.py +0 -2
  542. maxframe/tensor/random/gumbel.py +0 -2
  543. maxframe/tensor/random/hypergeometric.py +0 -2
  544. maxframe/tensor/random/laplace.py +2 -4
  545. maxframe/tensor/random/logistic.py +0 -2
  546. maxframe/tensor/random/lognormal.py +0 -2
  547. maxframe/tensor/random/logseries.py +0 -2
  548. maxframe/tensor/random/multinomial.py +0 -2
  549. maxframe/tensor/random/multivariate_normal.py +0 -2
  550. maxframe/tensor/random/negative_binomial.py +0 -2
  551. maxframe/tensor/random/noncentral_chisquare.py +0 -2
  552. maxframe/tensor/random/noncentral_f.py +1 -3
  553. maxframe/tensor/random/normal.py +0 -2
  554. maxframe/tensor/random/pareto.py +0 -2
  555. maxframe/tensor/random/permutation.py +6 -3
  556. maxframe/tensor/random/poisson.py +0 -2
  557. maxframe/tensor/random/power.py +0 -2
  558. maxframe/tensor/random/rand.py +0 -2
  559. maxframe/tensor/random/randint.py +0 -2
  560. maxframe/tensor/random/randn.py +0 -2
  561. maxframe/tensor/random/random_integers.py +0 -2
  562. maxframe/tensor/random/random_sample.py +0 -2
  563. maxframe/tensor/random/rayleigh.py +0 -2
  564. maxframe/tensor/random/standard_cauchy.py +0 -2
  565. maxframe/tensor/random/standard_exponential.py +0 -2
  566. maxframe/tensor/random/standard_gamma.py +0 -2
  567. maxframe/tensor/random/standard_normal.py +0 -2
  568. maxframe/tensor/random/standard_t.py +0 -2
  569. maxframe/tensor/random/tests/__init__.py +0 -2
  570. maxframe/tensor/random/tests/test_random.py +0 -2
  571. maxframe/tensor/random/triangular.py +0 -2
  572. maxframe/tensor/random/uniform.py +0 -2
  573. maxframe/tensor/random/vonmises.py +0 -2
  574. maxframe/tensor/random/wald.py +0 -2
  575. maxframe/tensor/random/weibull.py +0 -2
  576. maxframe/tensor/random/zipf.py +0 -2
  577. maxframe/tensor/reduction/__init__.py +0 -2
  578. maxframe/tensor/reduction/all.py +0 -2
  579. maxframe/tensor/reduction/allclose.py +0 -2
  580. maxframe/tensor/reduction/any.py +0 -2
  581. maxframe/tensor/reduction/argmax.py +1 -3
  582. maxframe/tensor/reduction/argmin.py +1 -3
  583. maxframe/tensor/reduction/array_equal.py +0 -2
  584. maxframe/tensor/reduction/core.py +0 -2
  585. maxframe/tensor/reduction/count_nonzero.py +0 -2
  586. maxframe/tensor/reduction/cumprod.py +0 -2
  587. maxframe/tensor/reduction/cumsum.py +0 -2
  588. maxframe/tensor/reduction/max.py +0 -2
  589. maxframe/tensor/reduction/mean.py +0 -2
  590. maxframe/tensor/reduction/min.py +0 -2
  591. maxframe/tensor/reduction/nanargmax.py +0 -2
  592. maxframe/tensor/reduction/nanargmin.py +0 -2
  593. maxframe/tensor/reduction/nancumprod.py +0 -2
  594. maxframe/tensor/reduction/nancumsum.py +0 -2
  595. maxframe/tensor/reduction/nanmax.py +0 -2
  596. maxframe/tensor/reduction/nanmean.py +0 -2
  597. maxframe/tensor/reduction/nanmin.py +0 -2
  598. maxframe/tensor/reduction/nanprod.py +0 -2
  599. maxframe/tensor/reduction/nanstd.py +0 -2
  600. maxframe/tensor/reduction/nansum.py +0 -2
  601. maxframe/tensor/reduction/nanvar.py +0 -2
  602. maxframe/tensor/reduction/prod.py +0 -2
  603. maxframe/tensor/reduction/std.py +0 -2
  604. maxframe/tensor/reduction/sum.py +0 -2
  605. maxframe/tensor/reduction/tests/test_reduction.py +1 -4
  606. maxframe/tensor/reduction/var.py +0 -2
  607. maxframe/tensor/reshape/__init__.py +0 -2
  608. maxframe/tensor/reshape/reshape.py +6 -5
  609. maxframe/tensor/reshape/tests/__init__.py +0 -2
  610. maxframe/tensor/reshape/tests/test_reshape.py +0 -2
  611. maxframe/tensor/sort/__init__.py +16 -0
  612. maxframe/tensor/sort/argsort.py +150 -0
  613. maxframe/tensor/sort/sort.py +295 -0
  614. maxframe/tensor/special/__init__.py +37 -0
  615. maxframe/tensor/special/core.py +38 -0
  616. maxframe/tensor/special/misc.py +142 -0
  617. maxframe/tensor/special/statistical.py +56 -0
  618. maxframe/tensor/statistics/__init__.py +5 -0
  619. maxframe/tensor/statistics/average.py +143 -0
  620. maxframe/tensor/statistics/bincount.py +133 -0
  621. maxframe/tensor/statistics/quantile.py +10 -8
  622. maxframe/tensor/ufunc/__init__.py +0 -2
  623. maxframe/tensor/ufunc/ufunc.py +0 -2
  624. maxframe/tensor/utils.py +21 -3
  625. maxframe/tests/test_protocol.py +3 -3
  626. maxframe/tests/test_utils.py +210 -1
  627. maxframe/tests/utils.py +67 -1
  628. maxframe/udf.py +76 -6
  629. maxframe/utils.py +418 -17
  630. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/METADATA +4 -1
  631. maxframe-2.0.0b1.dist-info/RECORD +939 -0
  632. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/WHEEL +1 -1
  633. maxframe_client/clients/framedriver.py +19 -3
  634. maxframe_client/fetcher.py +113 -6
  635. maxframe_client/session/odps.py +173 -38
  636. maxframe_client/session/task.py +3 -1
  637. maxframe_client/tests/test_session.py +41 -5
  638. maxframe-1.3.1.dist-info/RECORD +0 -705
  639. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1121 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import List
16
+
17
+ import numpy as np
18
+
19
+ from ... import opcodes
20
+ from ... import tensor as mt
21
+ from ...core import ENTITY_TYPE, ExecutableTuple, OutputType
22
+ from ...core.operator import Operator
23
+ from ...serialization.serializables import (
24
+ AnyField,
25
+ BoolField,
26
+ FieldTypes,
27
+ Float64Field,
28
+ Int64Field,
29
+ KeyField,
30
+ ListField,
31
+ StringField,
32
+ )
33
+ from ...tensor.core import TensorOrder
34
+ from ...typing_ import EntityType
35
+ from ..core import LearnOperatorMixin
36
+ from ._check_targets import _check_targets
37
+
38
+
39
+ def _weighted_sum(sample_score, sample_weight, normalize=False):
40
+ if normalize:
41
+ return mt.average(sample_score, weights=sample_weight)
42
+ elif sample_weight is not None:
43
+ return mt.dot(sample_score, sample_weight)
44
+ else:
45
+ return sample_score.sum()
46
+
47
+
48
+ class AccuracyScore(Operator, LearnOperatorMixin):
49
+ _op_type_ = opcodes.ACCURACY_SCORE
50
+
51
+ y_true = AnyField("y_true", default=None)
52
+ y_pred = AnyField("y_pred", default=None)
53
+ normalize = BoolField("normalize", default=None)
54
+ sample_weight = AnyField("sample_weight", default=None)
55
+ type_true = KeyField("type_true", default=None)
56
+
57
+ @classmethod
58
+ def _set_inputs(cls, op: "AccuracyScore", inputs: List[EntityType]):
59
+ super()._set_inputs(op, inputs)
60
+ inputs_iter = iter(op.inputs)
61
+ if op.y_true is not None:
62
+ op.y_true = next(inputs_iter)
63
+ if op.y_pred is not None:
64
+ op.y_pred = next(inputs_iter)
65
+ if op.type_true is not None:
66
+ op.type_true = next(inputs_iter)
67
+ if isinstance(op.sample_weight, ENTITY_TYPE):
68
+ op.sample_weight = next(inputs_iter)
69
+
70
+ def __call__(self, y_true, y_pred):
71
+ self._output_types = [OutputType.tensor]
72
+ type_true, y_true, y_pred = _check_targets(y_true, y_pred)
73
+ self.type_true = type_true
74
+ inputs = [y_true, y_pred, type_true]
75
+ if isinstance(self.sample_weight, ENTITY_TYPE):
76
+ inputs.append(self.sample_weight)
77
+
78
+ dtype = (
79
+ np.dtype(float)
80
+ if self.normalize
81
+ else np.result_type(y_true.dtype, y_pred.dtype)
82
+ )
83
+ return self.new_tileable(
84
+ inputs, dtype=dtype, shape=(), order=TensorOrder.C_ORDER
85
+ )
86
+
87
+
88
+ def accuracy_score(
89
+ y_true,
90
+ y_pred,
91
+ normalize=True,
92
+ sample_weight=None,
93
+ execute=False,
94
+ session=None,
95
+ run_kwargs=None,
96
+ ):
97
+ """Accuracy classification score.
98
+
99
+ In multilabel classification, this function computes subset accuracy:
100
+ the set of labels predicted for a sample must *exactly* match the
101
+ corresponding set of labels in y_true.
102
+
103
+ Read more in the :ref:`User Guide <accuracy_score>`.
104
+
105
+ Parameters
106
+ ----------
107
+ y_true : 1d array-like, or label indicator tensor / sparse tensor
108
+ Ground truth (correct) labels.
109
+
110
+ y_pred : 1d array-like, or label indicator tensor / sparse tensor
111
+ Predicted labels, as returned by a classifier.
112
+
113
+ normalize : bool, optional (default=True)
114
+ If ``False``, return the number of correctly classified samples.
115
+ Otherwise, return the fraction of correctly classified samples.
116
+
117
+ sample_weight : array-like of shape (n_samples,), default=None
118
+ Sample weights.
119
+
120
+ Returns
121
+ -------
122
+ score : float
123
+ If ``normalize == True``, return the fraction of correctly
124
+ classified samples (float), else returns the number of correctly
125
+ classified samples (int).
126
+
127
+ The best performance is 1 with ``normalize == True`` and the number
128
+ of samples with ``normalize == False``.
129
+
130
+ See also
131
+ --------
132
+ jaccard_score, hamming_loss, zero_one_loss
133
+
134
+ Notes
135
+ -----
136
+ In binary and multiclass classification, this function is equal
137
+ to the ``jaccard_score`` function.
138
+
139
+ Examples
140
+ --------
141
+ >>> from maxframe.learn.metrics import accuracy_score
142
+ >>> y_pred = [0, 2, 1, 3]
143
+ >>> y_true = [0, 1, 2, 3]
144
+ >>> accuracy_score(y_true, y_pred).execute()
145
+ 0.5
146
+ >>> accuracy_score(y_true, y_pred, normalize=False).execute()
147
+ 2
148
+
149
+ In the multilabel case with binary label indicators:
150
+
151
+ >>> import maxframe.tensor as mt
152
+ >>> accuracy_score(mt.array([[0, 1], [1, 1]]), mt.ones((2, 2))).execute()
153
+ 0.5
154
+ """
155
+
156
+ # Compute accuracy for each possible representation
157
+ op = AccuracyScore(
158
+ y_true=y_true, y_pred=y_pred, normalize=normalize, sample_weight=sample_weight
159
+ )
160
+ score = op(y_true, y_pred)
161
+ if not execute:
162
+ return score
163
+ return score.execute(session=session, **(run_kwargs or dict()))
164
+
165
+
166
+ class MultiLabelConfusionMatrix(Operator, LearnOperatorMixin):
167
+ _op_type_ = opcodes.MULTILABEL_CONFUSION_MATRIX
168
+
169
+ y_true = KeyField("y_true", default=None)
170
+ y_pred = KeyField("y_pred", default=None)
171
+ sample_weight = AnyField("sample_weight", default=None)
172
+ labels = AnyField("labels", default=None)
173
+ samplewise = BoolField("samplewise", default=False)
174
+
175
+ @classmethod
176
+ def _set_inputs(cls, op: "MultiLabelConfusionMatrix", inputs: List[EntityType]):
177
+ super()._set_inputs(op, inputs)
178
+ inputs_iter = iter(op.inputs)
179
+ if isinstance(op.y_true, ENTITY_TYPE):
180
+ op.y_true = next(inputs_iter)
181
+ if isinstance(op.y_pred, ENTITY_TYPE):
182
+ op.y_pred = next(inputs_iter)
183
+ if isinstance(op.sample_weight, ENTITY_TYPE):
184
+ op.sample_weight = next(inputs_iter)
185
+ if isinstance(op.labels, ENTITY_TYPE):
186
+ op.labels = next(inputs_iter)
187
+
188
+ def __call__(self, y_true, y_pred, sample_weight=None, labels=None):
189
+ self._output_types = [OutputType.tensor]
190
+
191
+ self.y_true = y_true
192
+ self.y_pred = y_pred
193
+ self.sample_weight = sample_weight
194
+ self.labels = labels
195
+
196
+ if not self.samplewise:
197
+ tensor_size = np.nan
198
+ else:
199
+ tensor_size = y_true.shape[0]
200
+
201
+ inputs = [y_true, y_pred, sample_weight, labels]
202
+ inputs = [t for t in inputs if isinstance(t, ENTITY_TYPE)]
203
+ return self.new_tileable(inputs, shape=(tensor_size, 2, 2), dtype=np.dtype(int))
204
+
205
+
206
+ def multilabel_confusion_matrix(
207
+ y_true,
208
+ y_pred,
209
+ *,
210
+ sample_weight=None,
211
+ labels=None,
212
+ samplewise=False,
213
+ execute=False,
214
+ session=None,
215
+ run_kwargs=None,
216
+ ):
217
+ """
218
+ Compute a confusion matrix for each class or sample.
219
+
220
+ Compute class-wise (default) or sample-wise (samplewise=True) multilabel
221
+ confusion matrix to evaluate the accuracy of a classification, and output
222
+ confusion matrices for each class or sample.
223
+
224
+ In multilabel confusion matrix :math:`MCM`, the count of true negatives
225
+ is :math:`MCM_{:,0,0}`, false negatives is :math:`MCM_{:,1,0}`,
226
+ true positives is :math:`MCM_{:,1,1}` and false positives is
227
+ :math:`MCM_{:,0,1}`.
228
+
229
+ Multiclass data will be treated as if binarized under a one-vs-rest
230
+ transformation. Returned confusion matrices will be in the order of
231
+ sorted unique labels in the union of (y_true, y_pred).
232
+
233
+ Read more in the :ref:`User Guide <multilabel_confusion_matrix>`.
234
+
235
+ Parameters
236
+ ----------
237
+ y_true : {array-like, sparse matrix} of shape (n_samples, n_outputs) or \
238
+ (n_samples,)
239
+ Ground truth (correct) target values.
240
+
241
+ y_pred : {array-like, sparse matrix} of shape (n_samples, n_outputs) or \
242
+ (n_samples,)
243
+ Estimated targets as returned by a classifier.
244
+
245
+ sample_weight : array-like of shape (n_samples,), default=None
246
+ Sample weights.
247
+
248
+ labels : array-like of shape (n_classes,), default=None
249
+ A list of classes or column indices to select some (or to force
250
+ inclusion of classes absent from the data).
251
+
252
+ samplewise : bool, default=False
253
+ In the multilabel case, this calculates a confusion matrix per sample.
254
+
255
+ Returns
256
+ -------
257
+ multi_confusion : ndarray of shape (n_outputs, 2, 2)
258
+ A 2x2 confusion matrix corresponding to each output in the input.
259
+ When calculating class-wise multi_confusion (default), then
260
+ n_outputs = n_labels; when calculating sample-wise multi_confusion
261
+ (samplewise=True), n_outputs = n_samples. If ``labels`` is defined,
262
+ the results will be returned in the order specified in ``labels``,
263
+ otherwise the results will be returned in sorted order by default.
264
+
265
+ See Also
266
+ --------
267
+ confusion_matrix : Compute confusion matrix to evaluate the accuracy of a
268
+ classifier.
269
+
270
+ Notes
271
+ -----
272
+ The `multilabel_confusion_matrix` calculates class-wise or sample-wise
273
+ multilabel confusion matrices, and in multiclass tasks, labels are
274
+ binarized under a one-vs-rest way; while
275
+ :func:`~sklearn.metrics.confusion_matrix` calculates one confusion matrix
276
+ for confusion between every two classes.
277
+
278
+ Examples
279
+ --------
280
+ Multiclass case:
281
+
282
+ >>> import maxframe.tensor as mt
283
+ >>> from maxframe.learn.metrics import multilabel_confusion_matrix
284
+ >>> y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]
285
+ >>> y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]
286
+ >>> multilabel_confusion_matrix(y_true, y_pred,
287
+ ... labels=["ant", "bird", "cat"]).execute()
288
+ array([[[3, 1],
289
+ [0, 2]],
290
+ <BLANKLINE>
291
+ [[5, 0],
292
+ [1, 0]],
293
+ <BLANKLINE>
294
+ [[2, 1],
295
+ [1, 2]]])
296
+
297
+ Multilabel-indicator case not implemented yet.
298
+ """
299
+ if not isinstance(y_true, (ENTITY_TYPE, np.ndarray)):
300
+ y_true = mt.array(y_true)
301
+ if not isinstance(y_pred, (ENTITY_TYPE, np.ndarray)):
302
+ y_pred = mt.array(y_pred)
303
+ if sample_weight is not None and not isinstance(y_pred, (ENTITY_TYPE, np.ndarray)):
304
+ sample_weight = mt.array(sample_weight)
305
+ if labels is not None and not isinstance(labels, (ENTITY_TYPE, np.ndarray)):
306
+ labels = mt.array(labels)
307
+
308
+ op = MultiLabelConfusionMatrix(samplewise=samplewise)
309
+ res = op(
310
+ y_true=y_true,
311
+ y_pred=y_pred,
312
+ sample_weight=sample_weight,
313
+ labels=labels,
314
+ )
315
+ if execute:
316
+ return res.execute(session=session, **(run_kwargs or {}))
317
+ return res
318
+
319
+
320
+ def _check_zero_division(zero_division): # pragma: no cover
321
+ if isinstance(zero_division, str) and zero_division == "warn":
322
+ return
323
+ elif isinstance(zero_division, (int, float)) and zero_division in [0, 1]:
324
+ return
325
+ raise ValueError(
326
+ "Got zero_division={0}." ' Must be one of ["warn", 0, 1]'.format(zero_division)
327
+ )
328
+
329
+
330
+ class PrecisionRecallFScoreSupport(Operator, LearnOperatorMixin):
331
+ _op_type_ = opcodes.PRECISION_RECALL_F_SCORE_SUPPORT
332
+
333
+ y_true = KeyField("y_true", default=None)
334
+ y_pred = KeyField("y_pred", default=None)
335
+ beta = Float64Field("beta", default=1.0)
336
+ labels = AnyField("labels", default=None)
337
+ pos_label = Int64Field("pos_label", default=1)
338
+ average = StringField("average", default=None)
339
+ warn_for = ListField("warn_for", FieldTypes.string, default=None)
340
+ sample_weight = KeyField("sample_weight", default=None)
341
+ zero_division = AnyField("zero_division", default=None)
342
+
343
+ @property
344
+ def output_limit(self) -> int:
345
+ return 3 if self.average else 4
346
+
347
+ @classmethod
348
+ def _set_inputs(cls, op: "PrecisionRecallFScoreSupport", inputs: List[EntityType]):
349
+ super()._set_inputs(op, inputs)
350
+ inputs_iter = iter(op.inputs)
351
+ if op.y_true is not None:
352
+ op.y_true = next(inputs_iter)
353
+ if op.y_pred is not None:
354
+ op.y_pred = next(inputs_iter)
355
+ if isinstance(op.sample_weight, ENTITY_TYPE):
356
+ op.sample_weight = next(inputs_iter)
357
+ if isinstance(op.labels, ENTITY_TYPE):
358
+ op.labels = next(inputs_iter)
359
+
360
+ def __call__(self, y_true, y_pred, sample_weight=None, labels=None):
361
+ self._output_types = [OutputType.tensor] * 4
362
+
363
+ self.y_true = y_true
364
+ self.y_pred = y_pred
365
+ self.sample_weight = sample_weight
366
+ self.labels = labels
367
+
368
+ inputs = [y_true, y_pred, sample_weight, labels]
369
+ inputs = [t for t in inputs if isinstance(t, ENTITY_TYPE)]
370
+
371
+ if self.average:
372
+ if self.average == "samples":
373
+ tensor_shape = (y_true.shape[0],)
374
+ else:
375
+ tensor_shape = ()
376
+ else:
377
+ tensor_shape = (np.nan,)
378
+
379
+ kws = [{"dtype": np.dtype(float), "shape": tensor_shape}] * 3
380
+ if not self.average:
381
+ kws.append({"dtype": np.dtype(int), "shape": tensor_shape})
382
+ return self.new_tileables(inputs, kws=kws)
383
+
384
+
385
+ def precision_recall_fscore_support(
386
+ y_true,
387
+ y_pred,
388
+ *,
389
+ beta=1.0,
390
+ labels=None,
391
+ pos_label=1,
392
+ average=None,
393
+ warn_for=("precision", "recall", "f-score"),
394
+ sample_weight=None,
395
+ zero_division="warn",
396
+ execute=False,
397
+ session=None,
398
+ run_kwargs=None,
399
+ ):
400
+ """Compute precision, recall, F-measure and support for each class
401
+
402
+ The precision is the ratio ``tp / (tp + fp)`` where ``tp`` is the number of
403
+ true positives and ``fp`` the number of false positives. The precision is
404
+ intuitively the ability of the classifier not to label as positive a sample
405
+ that is negative.
406
+
407
+ The recall is the ratio ``tp / (tp + fn)`` where ``tp`` is the number of
408
+ true positives and ``fn`` the number of false negatives. The recall is
409
+ intuitively the ability of the classifier to find all the positive samples.
410
+
411
+ The F-beta score can be interpreted as a weighted harmonic mean of
412
+ the precision and recall, where an F-beta score reaches its best
413
+ value at 1 and worst score at 0.
414
+
415
+ The F-beta score weights recall more than precision by a factor of
416
+ ``beta``. ``beta == 1.0`` means recall and precision are equally important.
417
+
418
+ The support is the number of occurrences of each class in ``y_true``.
419
+
420
+ If ``pos_label is None`` and in binary classification, this function
421
+ returns the average precision, recall and F-measure if ``average``
422
+ is one of ``'micro'``, ``'macro'``, ``'weighted'`` or ``'samples'``.
423
+
424
+ Read more in the :ref:`User Guide <precision_recall_f_measure_metrics>`.
425
+
426
+ Parameters
427
+ ----------
428
+ y_true : 1d array-like, or label indicator array / sparse matrix
429
+ Ground truth (correct) target values.
430
+
431
+ y_pred : 1d array-like, or label indicator array / sparse matrix
432
+ Estimated targets as returned by a classifier.
433
+
434
+ beta : float, 1.0 by default
435
+ The strength of recall versus precision in the F-score.
436
+
437
+ labels : list, optional
438
+ The set of labels to include when ``average != 'binary'``, and their
439
+ order if ``average is None``. Labels present in the data can be
440
+ excluded, for example to calculate a multiclass average ignoring a
441
+ majority negative class, while labels not present in the data will
442
+ result in 0 components in a macro average. For multilabel targets,
443
+ labels are column indices. By default, all labels in ``y_true`` and
444
+ ``y_pred`` are used in sorted order.
445
+
446
+ pos_label : str or int, 1 by default
447
+ The class to report if ``average='binary'`` and the data is binary.
448
+ If the data are multiclass or multilabel, this will be ignored;
449
+ setting ``labels=[pos_label]`` and ``average != 'binary'`` will report
450
+ scores for that label only.
451
+
452
+ average : string, [None (default), 'binary', 'micro', 'macro', 'samples', \
453
+ 'weighted']
454
+ If ``None``, the scores for each class are returned. Otherwise, this
455
+ determines the type of averaging performed on the data:
456
+
457
+ ``'binary'``:
458
+ Only report results for the class specified by ``pos_label``.
459
+ This is applicable only if targets (``y_{true,pred}``) are binary.
460
+ ``'micro'``:
461
+ Calculate metrics globally by counting the total true positives,
462
+ false negatives and false positives.
463
+ ``'macro'``:
464
+ Calculate metrics for each label, and find their unweighted
465
+ mean. This does not take label imbalance into account.
466
+ ``'weighted'``:
467
+ Calculate metrics for each label, and find their average weighted
468
+ by support (the number of true instances for each label). This
469
+ alters 'macro' to account for label imbalance; it can result in an
470
+ F-score that is not between precision and recall.
471
+ ``'samples'``:
472
+ Calculate metrics for each instance, and find their average (only
473
+ meaningful for multilabel classification where this differs from
474
+ :func:`accuracy_score`).
475
+
476
+ warn_for : tuple or set, for internal use
477
+ This determines which warnings will be made in the case that this
478
+ function is being used to return only one of its metrics.
479
+
480
+ sample_weight : array-like of shape (n_samples,), default=None
481
+ Sample weights.
482
+
483
+ zero_division : "warn", 0 or 1, default="warn"
484
+ Sets the value to return when there is a zero division:
485
+ - recall: when there are no positive labels
486
+ - precision: when there are no positive predictions
487
+ - f-score: both
488
+
489
+ If set to "warn", this acts as 0, but warnings are also raised.
490
+
491
+ Returns
492
+ -------
493
+ precision : float (if average is not None) or array of float, shape =\
494
+ [n_unique_labels]
495
+
496
+ recall : float (if average is not None) or array of float, , shape =\
497
+ [n_unique_labels]
498
+
499
+ fbeta_score : float (if average is not None) or array of float, shape =\
500
+ [n_unique_labels]
501
+
502
+ support : None (if average is not None) or array of int, shape =\
503
+ [n_unique_labels]
504
+ The number of occurrences of each label in ``y_true``.
505
+
506
+ References
507
+ ----------
508
+ .. [1] `Wikipedia entry for the Precision and recall
509
+ <https://en.wikipedia.org/wiki/Precision_and_recall>`_
510
+
511
+ .. [2] `Wikipedia entry for the F1-score
512
+ <https://en.wikipedia.org/wiki/F1_score>`_
513
+
514
+ .. [3] `Discriminative Methods for Multi-labeled Classification Advances
515
+ in Knowledge Discovery and Data Mining (2004), pp. 22-30 by Shantanu
516
+ Godbole, Sunita Sarawagi
517
+ <http://www.godbole.net/shantanu/pubs/multilabelsvm-pakdd04.pdf>`_
518
+
519
+ Examples
520
+ --------
521
+ >>> import numpy as np
522
+ >>> from maxframe.learn.metrics import precision_recall_fscore_support
523
+ >>> y_true = np.array(['cat', 'dog', 'pig', 'cat', 'dog', 'pig'])
524
+ >>> y_pred = np.array(['cat', 'pig', 'dog', 'cat', 'cat', 'dog'])
525
+ >>> precision_recall_fscore_support(y_true, y_pred, average='macro')
526
+ (0.22..., 0.33..., 0.26..., None)
527
+ >>> precision_recall_fscore_support(y_true, y_pred, average='micro')
528
+ (0.33..., 0.33..., 0.33..., None)
529
+ >>> precision_recall_fscore_support(y_true, y_pred, average='weighted')
530
+ (0.22..., 0.33..., 0.26..., None)
531
+
532
+ It is possible to compute per-label precisions, recalls, F1-scores and
533
+ supports instead of averaging:
534
+
535
+ >>> precision_recall_fscore_support(y_true, y_pred, average=None,
536
+ ... labels=['pig', 'dog', 'cat'])
537
+ (array([0. , 0. , 0.66...]),
538
+ array([0., 0., 1.]), array([0. , 0. , 0.8]),
539
+ array([2, 2, 2]))
540
+
541
+ Notes
542
+ -----
543
+ When ``true positive + false positive == 0``, precision is undefined;
544
+ When ``true positive + false negative == 0``, recall is undefined.
545
+ In such cases, by default the metric will be set to 0, as will f-score,
546
+ and ``UndefinedMetricWarning`` will be raised. This behavior can be
547
+ modified with ``zero_division``.
548
+ """
549
+ _check_zero_division(zero_division)
550
+ if beta < 0:
551
+ raise ValueError("beta should be >=0 in the F-beta score")
552
+
553
+ if not isinstance(y_true, (ENTITY_TYPE, np.ndarray)):
554
+ y_true = mt.array(y_true)
555
+ if not isinstance(y_pred, (ENTITY_TYPE, np.ndarray)):
556
+ y_pred = mt.array(y_pred)
557
+ if sample_weight is not None and not isinstance(y_pred, (ENTITY_TYPE, np.ndarray)):
558
+ sample_weight = mt.array(sample_weight)
559
+ if labels is not None and not isinstance(labels, (ENTITY_TYPE, np.ndarray)):
560
+ labels = mt.array(labels)
561
+
562
+ op = PrecisionRecallFScoreSupport(
563
+ beta=beta,
564
+ pos_label=pos_label,
565
+ average=average,
566
+ warn_for=warn_for,
567
+ zero_division=zero_division,
568
+ )
569
+ res = ExecutableTuple(
570
+ op(y_true, y_pred, sample_weight=sample_weight, labels=labels)
571
+ )
572
+ if execute:
573
+ res = res.execute(session=session, **(run_kwargs or {}))
574
+ return res if op.output_limit == 4 else res + (None,)
575
+
576
+
577
+ def precision_score(
578
+ y_true,
579
+ y_pred,
580
+ *,
581
+ labels=None,
582
+ pos_label=1,
583
+ average="binary",
584
+ sample_weight=None,
585
+ zero_division="warn",
586
+ execute=False,
587
+ session=None,
588
+ run_kwargs=None,
589
+ ):
590
+ """Compute the precision
591
+
592
+ The precision is the ratio ``tp / (tp + fp)`` where ``tp`` is the number of
593
+ true positives and ``fp`` the number of false positives. The precision is
594
+ intuitively the ability of the classifier not to label as positive a sample
595
+ that is negative.
596
+
597
+ The best value is 1 and the worst value is 0.
598
+
599
+ Read more in the :ref:`User Guide <precision_recall_f_measure_metrics>`.
600
+
601
+ Parameters
602
+ ----------
603
+ y_true : 1d array-like, or label indicator array / sparse matrix
604
+ Ground truth (correct) target values.
605
+
606
+ y_pred : 1d array-like, or label indicator array / sparse matrix
607
+ Estimated targets as returned by a classifier.
608
+
609
+ labels : list, optional
610
+ The set of labels to include when ``average != 'binary'``, and their
611
+ order if ``average is None``. Labels present in the data can be
612
+ excluded, for example to calculate a multiclass average ignoring a
613
+ majority negative class, while labels not present in the data will
614
+ result in 0 components in a macro average. For multilabel targets,
615
+ labels are column indices. By default, all labels in ``y_true`` and
616
+ ``y_pred`` are used in sorted order.
617
+
618
+ pos_label : str or int, 1 by default
619
+ The class to report if ``average='binary'`` and the data is binary.
620
+ If the data are multiclass or multilabel, this will be ignored;
621
+ setting ``labels=[pos_label]`` and ``average != 'binary'`` will report
622
+ scores for that label only.
623
+
624
+ average : string, [None, 'binary' (default), 'micro', 'macro', 'samples', \
625
+ 'weighted']
626
+ This parameter is required for multiclass/multilabel targets.
627
+ If ``None``, the scores for each class are returned. Otherwise, this
628
+ determines the type of averaging performed on the data:
629
+
630
+ ``'binary'``:
631
+ Only report results for the class specified by ``pos_label``.
632
+ This is applicable only if targets (``y_{true,pred}``) are binary.
633
+ ``'micro'``:
634
+ Calculate metrics globally by counting the total true positives,
635
+ false negatives and false positives.
636
+ ``'macro'``:
637
+ Calculate metrics for each label, and find their unweighted
638
+ mean. This does not take label imbalance into account.
639
+ ``'weighted'``:
640
+ Calculate metrics for each label, and find their average weighted
641
+ by support (the number of true instances for each label). This
642
+ alters 'macro' to account for label imbalance; it can result in an
643
+ F-score that is not between precision and recall.
644
+ ``'samples'``:
645
+ Calculate metrics for each instance, and find their average (only
646
+ meaningful for multilabel classification where this differs from
647
+ :func:`accuracy_score`).
648
+
649
+ sample_weight : array-like of shape (n_samples,), default=None
650
+ Sample weights.
651
+
652
+ zero_division : "warn", 0 or 1, default="warn"
653
+ Sets the value to return when there is a zero division. If set to
654
+ "warn", this acts as 0, but warnings are also raised.
655
+
656
+ Returns
657
+ -------
658
+ precision : float (if average is not None) or array of float, shape =\
659
+ [n_unique_labels]
660
+ Precision of the positive class in binary classification or weighted
661
+ average of the precision of each class for the multiclass task.
662
+
663
+ See also
664
+ --------
665
+ precision_recall_fscore_support, multilabel_confusion_matrix
666
+
667
+ Examples
668
+ --------
669
+ >>> from maxframe.learn.metrics import precision_score
670
+ >>> y_true = [0, 1, 2, 0, 1, 2]
671
+ >>> y_pred = [0, 2, 1, 0, 0, 1]
672
+ >>> precision_score(y_true, y_pred, average='macro')
673
+ 0.22...
674
+ >>> precision_score(y_true, y_pred, average='micro')
675
+ 0.33...
676
+ >>> precision_score(y_true, y_pred, average='weighted')
677
+ 0.22...
678
+ >>> precision_score(y_true, y_pred, average=None)
679
+ array([0.66..., 0. , 0. ])
680
+ >>> y_pred = [0, 0, 0, 0, 0, 0]
681
+ >>> precision_score(y_true, y_pred, average=None)
682
+ array([0.33..., 0. , 0. ])
683
+ >>> precision_score(y_true, y_pred, average=None, zero_division=1)
684
+ array([0.33..., 1. , 1. ])
685
+
686
+ Notes
687
+ -----
688
+ When ``true positive + false positive == 0``, precision returns 0 and
689
+ raises ``UndefinedMetricWarning``. This behavior can be
690
+ modified with ``zero_division``.
691
+
692
+ """
693
+ p, _, _, _ = precision_recall_fscore_support(
694
+ y_true,
695
+ y_pred,
696
+ labels=labels,
697
+ pos_label=pos_label,
698
+ average=average,
699
+ warn_for=("precision",),
700
+ sample_weight=sample_weight,
701
+ zero_division=zero_division,
702
+ execute=execute,
703
+ session=session,
704
+ run_kwargs=run_kwargs,
705
+ )
706
+ return p
707
+
708
+
709
+ def recall_score(
710
+ y_true,
711
+ y_pred,
712
+ *,
713
+ labels=None,
714
+ pos_label=1,
715
+ average="binary",
716
+ sample_weight=None,
717
+ zero_division="warn",
718
+ execute=False,
719
+ session=None,
720
+ run_kwargs=None,
721
+ ):
722
+ """Compute the recall
723
+
724
+ The recall is the ratio ``tp / (tp + fn)`` where ``tp`` is the number of
725
+ true positives and ``fn`` the number of false negatives. The recall is
726
+ intuitively the ability of the classifier to find all the positive samples.
727
+
728
+ The best value is 1 and the worst value is 0.
729
+
730
+ Read more in the :ref:`User Guide <precision_recall_f_measure_metrics>`.
731
+
732
+ Parameters
733
+ ----------
734
+ y_true : 1d array-like, or label indicator array / sparse matrix
735
+ Ground truth (correct) target values.
736
+
737
+ y_pred : 1d array-like, or label indicator array / sparse matrix
738
+ Estimated targets as returned by a classifier.
739
+
740
+ labels : list, optional
741
+ The set of labels to include when ``average != 'binary'``, and their
742
+ order if ``average is None``. Labels present in the data can be
743
+ excluded, for example to calculate a multiclass average ignoring a
744
+ majority negative class, while labels not present in the data will
745
+ result in 0 components in a macro average. For multilabel targets,
746
+ labels are column indices. By default, all labels in ``y_true`` and
747
+ ``y_pred`` are used in sorted order.
748
+
749
+ pos_label : str or int, 1 by default
750
+ The class to report if ``average='binary'`` and the data is binary.
751
+ If the data are multiclass or multilabel, this will be ignored;
752
+ setting ``labels=[pos_label]`` and ``average != 'binary'`` will report
753
+ scores for that label only.
754
+
755
+ average : string, [None, 'binary' (default), 'micro', 'macro', 'samples', \
756
+ 'weighted']
757
+ This parameter is required for multiclass/multilabel targets.
758
+ If ``None``, the scores for each class are returned. Otherwise, this
759
+ determines the type of averaging performed on the data:
760
+
761
+ ``'binary'``:
762
+ Only report results for the class specified by ``pos_label``.
763
+ This is applicable only if targets (``y_{true,pred}``) are binary.
764
+ ``'micro'``:
765
+ Calculate metrics globally by counting the total true positives,
766
+ false negatives and false positives.
767
+ ``'macro'``:
768
+ Calculate metrics for each label, and find their unweighted
769
+ mean. This does not take label imbalance into account.
770
+ ``'weighted'``:
771
+ Calculate metrics for each label, and find their average weighted
772
+ by support (the number of true instances for each label). This
773
+ alters 'macro' to account for label imbalance; it can result in an
774
+ F-score that is not between precision and recall.
775
+ ``'samples'``:
776
+ Calculate metrics for each instance, and find their average (only
777
+ meaningful for multilabel classification where this differs from
778
+ :func:`accuracy_score`).
779
+
780
+ sample_weight : array-like of shape (n_samples,), default=None
781
+ Sample weights.
782
+
783
+ zero_division : "warn", 0 or 1, default="warn"
784
+ Sets the value to return when there is a zero division. If set to
785
+ "warn", this acts as 0, but warnings are also raised.
786
+
787
+ Returns
788
+ -------
789
+ recall : float (if average is not None) or array of float, shape =\
790
+ [n_unique_labels]
791
+ Recall of the positive class in binary classification or weighted
792
+ average of the recall of each class for the multiclass task.
793
+
794
+ See also
795
+ --------
796
+ precision_recall_fscore_support, balanced_accuracy_score,
797
+ multilabel_confusion_matrix
798
+
799
+ Examples
800
+ --------
801
+ >>> from maxframe.learn.metrics import recall_score
802
+ >>> y_true = [0, 1, 2, 0, 1, 2]
803
+ >>> y_pred = [0, 2, 1, 0, 0, 1]
804
+ >>> recall_score(y_true, y_pred, average='macro')
805
+ 0.33...
806
+ >>> recall_score(y_true, y_pred, average='micro')
807
+ 0.33...
808
+ >>> recall_score(y_true, y_pred, average='weighted')
809
+ 0.33...
810
+ >>> recall_score(y_true, y_pred, average=None)
811
+ array([1., 0., 0.])
812
+ >>> y_true = [0, 0, 0, 0, 0, 0]
813
+ >>> recall_score(y_true, y_pred, average=None)
814
+ array([0.5, 0. , 0. ])
815
+ >>> recall_score(y_true, y_pred, average=None, zero_division=1)
816
+ array([0.5, 1. , 1. ])
817
+
818
+ Notes
819
+ -----
820
+ When ``true positive + false negative == 0``, recall returns 0 and raises
821
+ ``UndefinedMetricWarning``. This behavior can be modified with
822
+ ``zero_division``.
823
+ """
824
+ _, r, _, _ = precision_recall_fscore_support(
825
+ y_true,
826
+ y_pred,
827
+ labels=labels,
828
+ pos_label=pos_label,
829
+ average=average,
830
+ warn_for=("recall",),
831
+ sample_weight=sample_weight,
832
+ zero_division=zero_division,
833
+ execute=execute,
834
+ session=session,
835
+ run_kwargs=run_kwargs,
836
+ )
837
+ return r
838
+
839
+
840
+ def f1_score(
841
+ y_true,
842
+ y_pred,
843
+ *,
844
+ labels=None,
845
+ pos_label=1,
846
+ average="binary",
847
+ sample_weight=None,
848
+ zero_division="warn",
849
+ execute=False,
850
+ session=None,
851
+ run_kwargs=None,
852
+ ):
853
+ """Compute the F1 score, also known as balanced F-score or F-measure
854
+
855
+ The F1 score can be interpreted as a weighted average of the precision and
856
+ recall, where an F1 score reaches its best value at 1 and worst score at 0.
857
+ The relative contribution of precision and recall to the F1 score are
858
+ equal. The formula for the F1 score is::
859
+
860
+ F1 = 2 * (precision * recall) / (precision + recall)
861
+
862
+ In the multi-class and multi-label case, this is the average of
863
+ the F1 score of each class with weighting depending on the ``average``
864
+ parameter.
865
+
866
+ Read more in the :ref:`User Guide <precision_recall_f_measure_metrics>`.
867
+
868
+ Parameters
869
+ ----------
870
+ y_true : 1d array-like, or label indicator array / sparse matrix
871
+ Ground truth (correct) target values.
872
+
873
+ y_pred : 1d array-like, or label indicator array / sparse matrix
874
+ Estimated targets as returned by a classifier.
875
+
876
+ labels : list, optional
877
+ The set of labels to include when ``average != 'binary'``, and their
878
+ order if ``average is None``. Labels present in the data can be
879
+ excluded, for example to calculate a multiclass average ignoring a
880
+ majority negative class, while labels not present in the data will
881
+ result in 0 components in a macro average. For multilabel targets,
882
+ labels are column indices. By default, all labels in ``y_true`` and
883
+ ``y_pred`` are used in sorted order.
884
+
885
+ pos_label : str or int, 1 by default
886
+ The class to report if ``average='binary'`` and the data is binary.
887
+ If the data are multiclass or multilabel, this will be ignored;
888
+ setting ``labels=[pos_label]`` and ``average != 'binary'`` will report
889
+ scores for that label only.
890
+
891
+ average : string, [None, 'binary' (default), 'micro', 'macro', 'samples', \
892
+ 'weighted']
893
+ This parameter is required for multiclass/multilabel targets.
894
+ If ``None``, the scores for each class are returned. Otherwise, this
895
+ determines the type of averaging performed on the data:
896
+
897
+ ``'binary'``:
898
+ Only report results for the class specified by ``pos_label``.
899
+ This is applicable only if targets (``y_{true,pred}``) are binary.
900
+ ``'micro'``:
901
+ Calculate metrics globally by counting the total true positives,
902
+ false negatives and false positives.
903
+ ``'macro'``:
904
+ Calculate metrics for each label, and find their unweighted
905
+ mean. This does not take label imbalance into account.
906
+ ``'weighted'``:
907
+ Calculate metrics for each label, and find their average weighted
908
+ by support (the number of true instances for each label). This
909
+ alters 'macro' to account for label imbalance; it can result in an
910
+ F-score that is not between precision and recall.
911
+ ``'samples'``:
912
+ Calculate metrics for each instance, and find their average (only
913
+ meaningful for multilabel classification where this differs from
914
+ :func:`accuracy_score`).
915
+
916
+ sample_weight : array-like of shape (n_samples,), default=None
917
+ Sample weights.
918
+
919
+ zero_division : "warn", 0 or 1, default="warn"
920
+ Sets the value to return when there is a zero division, i.e. when all
921
+ predictions and labels are negative. If set to "warn", this acts as 0,
922
+ but warnings are also raised.
923
+
924
+ Returns
925
+ -------
926
+ f1_score : float or array of float, shape = [n_unique_labels]
927
+ F1 score of the positive class in binary classification or weighted
928
+ average of the F1 scores of each class for the multiclass task.
929
+
930
+ See also
931
+ --------
932
+ fbeta_score, precision_recall_fscore_support, jaccard_score,
933
+ multilabel_confusion_matrix
934
+
935
+ References
936
+ ----------
937
+ .. [1] `Wikipedia entry for the F1-score
938
+ <https://en.wikipedia.org/wiki/F1_score>`_
939
+
940
+ Examples
941
+ --------
942
+ >>> from maxframe.learn.metrics import f1_score
943
+ >>> y_true = [0, 1, 2, 0, 1, 2]
944
+ >>> y_pred = [0, 2, 1, 0, 0, 1]
945
+ >>> f1_score(y_true, y_pred, average='macro')
946
+ 0.26...
947
+ >>> f1_score(y_true, y_pred, average='micro')
948
+ 0.33...
949
+ >>> f1_score(y_true, y_pred, average='weighted')
950
+ 0.26...
951
+ >>> f1_score(y_true, y_pred, average=None)
952
+ array([0.8, 0. , 0. ])
953
+ >>> y_true = [0, 0, 0, 0, 0, 0]
954
+ >>> y_pred = [0, 0, 0, 0, 0, 0]
955
+ >>> f1_score(y_true, y_pred, zero_division=1)
956
+ 1.0...
957
+
958
+ Notes
959
+ -----
960
+ When ``true positive + false positive == 0``, precision is undefined;
961
+ When ``true positive + false negative == 0``, recall is undefined.
962
+ In such cases, by default the metric will be set to 0, as will f-score,
963
+ and ``UndefinedMetricWarning`` will be raised. This behavior can be
964
+ modified with ``zero_division``.
965
+ """
966
+ return fbeta_score(
967
+ y_true,
968
+ y_pred,
969
+ beta=1,
970
+ labels=labels,
971
+ pos_label=pos_label,
972
+ average=average,
973
+ sample_weight=sample_weight,
974
+ zero_division=zero_division,
975
+ execute=execute,
976
+ session=session,
977
+ run_kwargs=run_kwargs,
978
+ )
979
+
980
+
981
+ def fbeta_score(
982
+ y_true,
983
+ y_pred,
984
+ *,
985
+ beta,
986
+ labels=None,
987
+ pos_label=1,
988
+ average="binary",
989
+ sample_weight=None,
990
+ zero_division="warn",
991
+ execute=False,
992
+ session=None,
993
+ run_kwargs=None,
994
+ ):
995
+ """Compute the F-beta score
996
+
997
+ The F-beta score is the weighted harmonic mean of precision and recall,
998
+ reaching its optimal value at 1 and its worst value at 0.
999
+
1000
+ The `beta` parameter determines the weight of recall in the combined
1001
+ score. ``beta < 1`` lends more weight to precision, while ``beta > 1``
1002
+ favors recall (``beta -> 0`` considers only precision, ``beta -> +inf``
1003
+ only recall).
1004
+
1005
+ Read more in the :ref:`User Guide <precision_recall_f_measure_metrics>`.
1006
+
1007
+ Parameters
1008
+ ----------
1009
+ y_true : 1d array-like, or label indicator array / sparse matrix
1010
+ Ground truth (correct) target values.
1011
+
1012
+ y_pred : 1d array-like, or label indicator array / sparse matrix
1013
+ Estimated targets as returned by a classifier.
1014
+
1015
+ beta : float
1016
+ Determines the weight of recall in the combined score.
1017
+
1018
+ labels : list, optional
1019
+ The set of labels to include when ``average != 'binary'``, and their
1020
+ order if ``average is None``. Labels present in the data can be
1021
+ excluded, for example to calculate a multiclass average ignoring a
1022
+ majority negative class, while labels not present in the data will
1023
+ result in 0 components in a macro average. For multilabel targets,
1024
+ labels are column indices. By default, all labels in ``y_true`` and
1025
+ ``y_pred`` are used in sorted order.
1026
+
1027
+ pos_label : str or int, 1 by default
1028
+ The class to report if ``average='binary'`` and the data is binary.
1029
+ If the data are multiclass or multilabel, this will be ignored;
1030
+ setting ``labels=[pos_label]`` and ``average != 'binary'`` will report
1031
+ scores for that label only.
1032
+
1033
+ average : string, [None, 'binary' (default), 'micro', 'macro', 'samples', \
1034
+ 'weighted']
1035
+ This parameter is required for multiclass/multilabel targets.
1036
+ If ``None``, the scores for each class are returned. Otherwise, this
1037
+ determines the type of averaging performed on the data:
1038
+
1039
+ ``'binary'``:
1040
+ Only report results for the class specified by ``pos_label``.
1041
+ This is applicable only if targets (``y_{true,pred}``) are binary.
1042
+ ``'micro'``:
1043
+ Calculate metrics globally by counting the total true positives,
1044
+ false negatives and false positives.
1045
+ ``'macro'``:
1046
+ Calculate metrics for each label, and find their unweighted
1047
+ mean. This does not take label imbalance into account.
1048
+ ``'weighted'``:
1049
+ Calculate metrics for each label, and find their average weighted
1050
+ by support (the number of true instances for each label). This
1051
+ alters 'macro' to account for label imbalance; it can result in an
1052
+ F-score that is not between precision and recall.
1053
+ ``'samples'``:
1054
+ Calculate metrics for each instance, and find their average (only
1055
+ meaningful for multilabel classification where this differs from
1056
+ :func:`accuracy_score`).
1057
+
1058
+ sample_weight : array-like of shape (n_samples,), default=None
1059
+ Sample weights.
1060
+
1061
+ zero_division : "warn", 0 or 1, default="warn"
1062
+ Sets the value to return when there is a zero division, i.e. when all
1063
+ predictions and labels are negative. If set to "warn", this acts as 0,
1064
+ but warnings are also raised.
1065
+
1066
+ Returns
1067
+ -------
1068
+ fbeta_score : float (if average is not None) or array of float, shape =\
1069
+ [n_unique_labels]
1070
+ F-beta score of the positive class in binary classification or weighted
1071
+ average of the F-beta score of each class for the multiclass task.
1072
+
1073
+ See also
1074
+ --------
1075
+ precision_recall_fscore_support, multilabel_confusion_matrix
1076
+
1077
+ References
1078
+ ----------
1079
+ .. [1] R. Baeza-Yates and B. Ribeiro-Neto (2011).
1080
+ Modern Information Retrieval. Addison Wesley, pp. 327-328.
1081
+
1082
+ .. [2] `Wikipedia entry for the F1-score
1083
+ <https://en.wikipedia.org/wiki/F1_score>`_
1084
+
1085
+ Examples
1086
+ --------
1087
+ >>> from maxframe.learn.metrics import fbeta_score
1088
+ >>> y_true = [0, 1, 2, 0, 1, 2]
1089
+ >>> y_pred = [0, 2, 1, 0, 0, 1]
1090
+ >>> fbeta_score(y_true, y_pred, average='macro', beta=0.5)
1091
+ 0.23...
1092
+ >>> fbeta_score(y_true, y_pred, average='micro', beta=0.5)
1093
+ 0.33...
1094
+ >>> fbeta_score(y_true, y_pred, average='weighted', beta=0.5)
1095
+ 0.23...
1096
+ >>> fbeta_score(y_true, y_pred, average=None, beta=0.5)
1097
+ array([0.71..., 0. , 0. ])
1098
+
1099
+ Notes
1100
+ -----
1101
+ When ``true positive + false positive == 0`` or
1102
+ ``true positive + false negative == 0``, f-score returns 0 and raises
1103
+ ``UndefinedMetricWarning``. This behavior can be
1104
+ modified with ``zero_division``.
1105
+ """
1106
+
1107
+ _, _, f, _ = precision_recall_fscore_support(
1108
+ y_true,
1109
+ y_pred,
1110
+ beta=beta,
1111
+ labels=labels,
1112
+ pos_label=pos_label,
1113
+ average=average,
1114
+ warn_for=("f-score",),
1115
+ sample_weight=sample_weight,
1116
+ zero_division=zero_division,
1117
+ execute=execute,
1118
+ session=session,
1119
+ run_kwargs=run_kwargs,
1120
+ )
1121
+ return f