scitex 2.0.0__py2.py3-none-any.whl → 2.1.0__py2.py3-none-any.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.
Files changed (704) hide show
  1. scitex/__init__.py +53 -15
  2. scitex/__main__.py +72 -26
  3. scitex/__version__.py +1 -1
  4. scitex/_sh.py +145 -23
  5. scitex/ai/__init__.py +30 -16
  6. scitex/ai/_gen_ai/_Anthropic.py +5 -7
  7. scitex/ai/_gen_ai/_BaseGenAI.py +2 -2
  8. scitex/ai/_gen_ai/_DeepSeek.py +10 -2
  9. scitex/ai/_gen_ai/_Google.py +2 -2
  10. scitex/ai/_gen_ai/_Llama.py +2 -2
  11. scitex/ai/_gen_ai/_OpenAI.py +2 -2
  12. scitex/ai/_gen_ai/_PARAMS.py +51 -65
  13. scitex/ai/_gen_ai/_Perplexity.py +2 -2
  14. scitex/ai/_gen_ai/__init__.py +25 -14
  15. scitex/ai/_gen_ai/_format_output_func.py +4 -4
  16. scitex/ai/classification/{classifier_server.py → Classifier.py} +5 -5
  17. scitex/ai/classification/CrossValidationExperiment.py +374 -0
  18. scitex/ai/classification/__init__.py +43 -4
  19. scitex/ai/classification/reporters/_BaseClassificationReporter.py +281 -0
  20. scitex/ai/classification/reporters/_ClassificationReporter.py +773 -0
  21. scitex/ai/classification/reporters/_MultiClassificationReporter.py +406 -0
  22. scitex/ai/classification/reporters/_SingleClassificationReporter.py +1834 -0
  23. scitex/ai/classification/reporters/__init__.py +11 -0
  24. scitex/ai/classification/reporters/reporter_utils/_Plotter.py +1028 -0
  25. scitex/ai/classification/reporters/reporter_utils/__init__.py +80 -0
  26. scitex/ai/classification/reporters/reporter_utils/aggregation.py +457 -0
  27. scitex/ai/classification/reporters/reporter_utils/data_models.py +313 -0
  28. scitex/ai/classification/reporters/reporter_utils/reporting.py +1056 -0
  29. scitex/ai/classification/reporters/reporter_utils/storage.py +221 -0
  30. scitex/ai/classification/reporters/reporter_utils/validation.py +395 -0
  31. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
  32. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
  33. scitex/ai/classification/timeseries/_TimeSeriesMetadata.py +139 -0
  34. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
  35. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
  36. scitex/ai/classification/timeseries/_TimeSeriesStrategy.py +84 -0
  37. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
  38. scitex/ai/classification/timeseries/__init__.py +39 -0
  39. scitex/ai/classification/timeseries/_normalize_timestamp.py +436 -0
  40. scitex/ai/clustering/_umap.py +2 -2
  41. scitex/ai/feature_extraction/vit.py +1 -0
  42. scitex/ai/feature_selection/__init__.py +30 -0
  43. scitex/ai/feature_selection/feature_selection.py +364 -0
  44. scitex/ai/loss/multi_task_loss.py +1 -1
  45. scitex/ai/metrics/__init__.py +51 -4
  46. scitex/ai/metrics/_calc_bacc.py +61 -0
  47. scitex/ai/metrics/_calc_bacc_from_conf_mat.py +38 -0
  48. scitex/ai/metrics/_calc_clf_report.py +78 -0
  49. scitex/ai/metrics/_calc_conf_mat.py +93 -0
  50. scitex/ai/metrics/_calc_feature_importance.py +183 -0
  51. scitex/ai/metrics/_calc_mcc.py +61 -0
  52. scitex/ai/metrics/_calc_pre_rec_auc.py +116 -0
  53. scitex/ai/metrics/_calc_roc_auc.py +110 -0
  54. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +490 -0
  55. scitex/ai/metrics/{silhoute_score_block.py → _calc_silhouette_score.py} +15 -8
  56. scitex/ai/metrics/_normalize_labels.py +83 -0
  57. scitex/ai/plt/__init__.py +47 -8
  58. scitex/ai/plt/{_conf_mat.py → _plot_conf_mat.py} +158 -87
  59. scitex/ai/plt/_plot_feature_importance.py +323 -0
  60. scitex/ai/plt/_plot_learning_curve.py +345 -0
  61. scitex/ai/plt/_plot_optuna_study.py +225 -0
  62. scitex/ai/plt/_plot_pre_rec_curve.py +290 -0
  63. scitex/ai/plt/_plot_roc_curve.py +255 -0
  64. scitex/ai/training/{learning_curve_logger.py → _LearningCurveLogger.py} +197 -213
  65. scitex/ai/training/__init__.py +2 -2
  66. scitex/ai/utils/grid_search.py +3 -3
  67. scitex/benchmark/__init__.py +52 -0
  68. scitex/benchmark/benchmark.py +400 -0
  69. scitex/benchmark/monitor.py +370 -0
  70. scitex/benchmark/profiler.py +297 -0
  71. scitex/browser/__init__.py +48 -0
  72. scitex/browser/automation/CookieHandler.py +216 -0
  73. scitex/browser/automation/__init__.py +7 -0
  74. scitex/browser/collaboration/__init__.py +55 -0
  75. scitex/browser/collaboration/auth_helpers.py +94 -0
  76. scitex/browser/collaboration/collaborative_agent.py +136 -0
  77. scitex/browser/collaboration/credential_manager.py +188 -0
  78. scitex/browser/collaboration/interactive_panel.py +400 -0
  79. scitex/browser/collaboration/persistent_browser.py +170 -0
  80. scitex/browser/collaboration/shared_session.py +383 -0
  81. scitex/browser/collaboration/standard_interactions.py +246 -0
  82. scitex/browser/collaboration/visual_feedback.py +181 -0
  83. scitex/browser/core/BrowserMixin.py +326 -0
  84. scitex/browser/core/ChromeProfileManager.py +446 -0
  85. scitex/browser/core/__init__.py +9 -0
  86. scitex/browser/debugging/__init__.py +18 -0
  87. scitex/browser/debugging/_browser_logger.py +657 -0
  88. scitex/browser/debugging/_highlight_element.py +143 -0
  89. scitex/browser/debugging/_show_grid.py +154 -0
  90. scitex/browser/interaction/__init__.py +24 -0
  91. scitex/browser/interaction/click_center.py +149 -0
  92. scitex/browser/interaction/click_with_fallbacks.py +206 -0
  93. scitex/browser/interaction/close_popups.py +498 -0
  94. scitex/browser/interaction/fill_with_fallbacks.py +209 -0
  95. scitex/browser/pdf/__init__.py +14 -0
  96. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +200 -0
  97. scitex/browser/pdf/detect_chrome_pdf_viewer.py +198 -0
  98. scitex/browser/remote/CaptchaHandler.py +434 -0
  99. scitex/browser/remote/ZenRowsAPIClient.py +347 -0
  100. scitex/browser/remote/ZenRowsBrowserManager.py +570 -0
  101. scitex/browser/remote/__init__.py +11 -0
  102. scitex/browser/stealth/HumanBehavior.py +344 -0
  103. scitex/browser/stealth/StealthManager.py +1008 -0
  104. scitex/browser/stealth/__init__.py +9 -0
  105. scitex/browser/template.py +122 -0
  106. scitex/capture/__init__.py +110 -0
  107. scitex/capture/__main__.py +25 -0
  108. scitex/capture/capture.py +848 -0
  109. scitex/capture/cli.py +233 -0
  110. scitex/capture/gif.py +344 -0
  111. scitex/capture/mcp_server.py +961 -0
  112. scitex/capture/session.py +70 -0
  113. scitex/capture/utils.py +705 -0
  114. scitex/cli/__init__.py +17 -0
  115. scitex/cli/cloud.py +447 -0
  116. scitex/cli/main.py +42 -0
  117. scitex/cli/scholar.py +280 -0
  118. scitex/context/_suppress_output.py +5 -3
  119. scitex/db/__init__.py +30 -3
  120. scitex/db/__main__.py +75 -0
  121. scitex/db/_check_health.py +381 -0
  122. scitex/db/_delete_duplicates.py +25 -386
  123. scitex/db/_inspect.py +335 -114
  124. scitex/db/_inspect_optimized.py +301 -0
  125. scitex/db/{_PostgreSQL.py → _postgresql/_PostgreSQL.py} +3 -3
  126. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BackupMixin.py +1 -1
  127. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BatchMixin.py +1 -1
  128. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BlobMixin.py +1 -1
  129. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ConnectionMixin.py +1 -1
  130. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_MaintenanceMixin.py +1 -1
  131. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_QueryMixin.py +1 -1
  132. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_SchemaMixin.py +1 -1
  133. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TransactionMixin.py +1 -1
  134. scitex/db/_postgresql/__init__.py +6 -0
  135. scitex/db/_sqlite3/_SQLite3.py +210 -0
  136. scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin.py +581 -0
  137. scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin_v01-need-_hash-col.py +517 -0
  138. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_BatchMixin.py +1 -1
  139. scitex/db/_sqlite3/_SQLite3Mixins/_BlobMixin.py +281 -0
  140. scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin.py +548 -0
  141. scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin_v01-indentation-issues.py +583 -0
  142. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ConnectionMixin.py +29 -13
  143. scitex/db/_sqlite3/_SQLite3Mixins/_GitMixin.py +583 -0
  144. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ImportExportMixin.py +1 -1
  145. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_IndexMixin.py +1 -1
  146. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_MaintenanceMixin.py +2 -1
  147. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_QueryMixin.py +37 -10
  148. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_RowMixin.py +46 -6
  149. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TableMixin.py +56 -10
  150. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TransactionMixin.py +1 -1
  151. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/__init__.py +14 -2
  152. scitex/db/_sqlite3/__init__.py +7 -0
  153. scitex/db/_sqlite3/_delete_duplicates.py +274 -0
  154. scitex/decorators/__init__.py +2 -0
  155. scitex/decorators/_cache_disk.py +13 -5
  156. scitex/decorators/_cache_disk_async.py +49 -0
  157. scitex/decorators/_deprecated.py +175 -10
  158. scitex/decorators/_timeout.py +1 -1
  159. scitex/dev/_analyze_code_flow.py +2 -2
  160. scitex/dict/_DotDict.py +73 -15
  161. scitex/dict/_DotDict_v01-not-handling-recursive-instantiations.py +442 -0
  162. scitex/dict/_DotDict_v02-not-serializing-Path-object.py +446 -0
  163. scitex/dict/__init__.py +2 -0
  164. scitex/dict/_flatten.py +27 -0
  165. scitex/dsp/_crop.py +2 -2
  166. scitex/dsp/_demo_sig.py +2 -2
  167. scitex/dsp/_detect_ripples.py +2 -2
  168. scitex/dsp/_hilbert.py +2 -2
  169. scitex/dsp/_listen.py +6 -6
  170. scitex/dsp/_modulation_index.py +2 -2
  171. scitex/dsp/_pac.py +1 -1
  172. scitex/dsp/_psd.py +2 -2
  173. scitex/dsp/_resample.py +2 -1
  174. scitex/dsp/_time.py +3 -2
  175. scitex/dsp/_wavelet.py +3 -2
  176. scitex/dsp/add_noise.py +2 -2
  177. scitex/dsp/example.py +1 -0
  178. scitex/dsp/filt.py +10 -9
  179. scitex/dsp/template.py +3 -2
  180. scitex/dsp/utils/_differential_bandpass_filters.py +1 -1
  181. scitex/dsp/utils/pac.py +2 -2
  182. scitex/dt/_normalize_timestamp.py +432 -0
  183. scitex/errors.py +572 -0
  184. scitex/gen/_DimHandler.py +2 -2
  185. scitex/gen/__init__.py +37 -7
  186. scitex/gen/_deprecated_close.py +80 -0
  187. scitex/gen/_deprecated_start.py +26 -0
  188. scitex/gen/_detect_environment.py +152 -0
  189. scitex/gen/_detect_notebook_path.py +169 -0
  190. scitex/gen/_embed.py +6 -2
  191. scitex/gen/_get_notebook_path.py +257 -0
  192. scitex/gen/_less.py +1 -1
  193. scitex/gen/_list_packages.py +2 -2
  194. scitex/gen/_norm.py +44 -9
  195. scitex/gen/_norm_cache.py +269 -0
  196. scitex/gen/_src.py +3 -5
  197. scitex/gen/_title_case.py +3 -3
  198. scitex/io/__init__.py +28 -6
  199. scitex/io/_glob.py +13 -7
  200. scitex/io/_load.py +108 -21
  201. scitex/io/_load_cache.py +303 -0
  202. scitex/io/_load_configs.py +40 -15
  203. scitex/io/{_H5Explorer.py → _load_modules/_H5Explorer.py} +80 -17
  204. scitex/io/_load_modules/_ZarrExplorer.py +114 -0
  205. scitex/io/_load_modules/_bibtex.py +207 -0
  206. scitex/io/_load_modules/_hdf5.py +53 -178
  207. scitex/io/_load_modules/_json.py +5 -3
  208. scitex/io/_load_modules/_pdf.py +871 -16
  209. scitex/io/_load_modules/_sqlite3.py +15 -0
  210. scitex/io/_load_modules/_txt.py +41 -12
  211. scitex/io/_load_modules/_yaml.py +4 -3
  212. scitex/io/_load_modules/_zarr.py +126 -0
  213. scitex/io/_save.py +429 -171
  214. scitex/io/_save_modules/__init__.py +6 -0
  215. scitex/io/_save_modules/_bibtex.py +194 -0
  216. scitex/io/_save_modules/_csv.py +8 -4
  217. scitex/io/_save_modules/_excel.py +174 -15
  218. scitex/io/_save_modules/_hdf5.py +251 -226
  219. scitex/io/_save_modules/_image.py +1 -3
  220. scitex/io/_save_modules/_json.py +49 -4
  221. scitex/io/_save_modules/_listed_dfs_as_csv.py +1 -3
  222. scitex/io/_save_modules/_listed_scalars_as_csv.py +1 -3
  223. scitex/io/_save_modules/_tex.py +277 -0
  224. scitex/io/_save_modules/_yaml.py +42 -3
  225. scitex/io/_save_modules/_zarr.py +160 -0
  226. scitex/io/utils/__init__.py +20 -0
  227. scitex/io/utils/h5_to_zarr.py +616 -0
  228. scitex/linalg/_geometric_median.py +6 -2
  229. scitex/{gen/_tee.py → logging/_Tee.py} +43 -84
  230. scitex/logging/__init__.py +122 -0
  231. scitex/logging/_config.py +158 -0
  232. scitex/logging/_context.py +103 -0
  233. scitex/logging/_formatters.py +128 -0
  234. scitex/logging/_handlers.py +64 -0
  235. scitex/logging/_levels.py +35 -0
  236. scitex/logging/_logger.py +163 -0
  237. scitex/logging/_print_capture.py +95 -0
  238. scitex/ml/__init__.py +69 -0
  239. scitex/{ai/genai/anthropic.py → ml/_gen_ai/_Anthropic.py} +13 -19
  240. scitex/{ai/genai/base_genai.py → ml/_gen_ai/_BaseGenAI.py} +5 -5
  241. scitex/{ai/genai/deepseek.py → ml/_gen_ai/_DeepSeek.py} +11 -16
  242. scitex/{ai/genai/google.py → ml/_gen_ai/_Google.py} +7 -15
  243. scitex/{ai/genai/groq.py → ml/_gen_ai/_Groq.py} +1 -8
  244. scitex/{ai/genai/llama.py → ml/_gen_ai/_Llama.py} +3 -16
  245. scitex/{ai/genai/openai.py → ml/_gen_ai/_OpenAI.py} +3 -3
  246. scitex/{ai/genai/params.py → ml/_gen_ai/_PARAMS.py} +51 -65
  247. scitex/{ai/genai/perplexity.py → ml/_gen_ai/_Perplexity.py} +3 -14
  248. scitex/ml/_gen_ai/__init__.py +43 -0
  249. scitex/{ai/genai/calc_cost.py → ml/_gen_ai/_calc_cost.py} +1 -1
  250. scitex/{ai/genai/format_output_func.py → ml/_gen_ai/_format_output_func.py} +4 -4
  251. scitex/{ai/genai/genai_factory.py → ml/_gen_ai/_genai_factory.py} +8 -8
  252. scitex/ml/activation/__init__.py +8 -0
  253. scitex/ml/activation/_define.py +11 -0
  254. scitex/{ai/classifier_server.py → ml/classification/Classifier.py} +5 -5
  255. scitex/ml/classification/CrossValidationExperiment.py +374 -0
  256. scitex/ml/classification/__init__.py +46 -0
  257. scitex/ml/classification/reporters/_BaseClassificationReporter.py +281 -0
  258. scitex/ml/classification/reporters/_ClassificationReporter.py +773 -0
  259. scitex/ml/classification/reporters/_MultiClassificationReporter.py +406 -0
  260. scitex/ml/classification/reporters/_SingleClassificationReporter.py +1834 -0
  261. scitex/ml/classification/reporters/__init__.py +11 -0
  262. scitex/ml/classification/reporters/reporter_utils/_Plotter.py +1028 -0
  263. scitex/ml/classification/reporters/reporter_utils/__init__.py +80 -0
  264. scitex/ml/classification/reporters/reporter_utils/aggregation.py +457 -0
  265. scitex/ml/classification/reporters/reporter_utils/data_models.py +313 -0
  266. scitex/ml/classification/reporters/reporter_utils/reporting.py +1056 -0
  267. scitex/ml/classification/reporters/reporter_utils/storage.py +221 -0
  268. scitex/ml/classification/reporters/reporter_utils/validation.py +395 -0
  269. scitex/ml/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
  270. scitex/ml/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
  271. scitex/ml/classification/timeseries/_TimeSeriesMetadata.py +139 -0
  272. scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
  273. scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
  274. scitex/ml/classification/timeseries/_TimeSeriesStrategy.py +84 -0
  275. scitex/ml/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
  276. scitex/ml/classification/timeseries/__init__.py +39 -0
  277. scitex/ml/classification/timeseries/_normalize_timestamp.py +436 -0
  278. scitex/ml/clustering/__init__.py +11 -0
  279. scitex/ml/clustering/_pca.py +115 -0
  280. scitex/ml/clustering/_umap.py +376 -0
  281. scitex/ml/feature_extraction/__init__.py +56 -0
  282. scitex/ml/feature_extraction/vit.py +149 -0
  283. scitex/ml/feature_selection/__init__.py +30 -0
  284. scitex/ml/feature_selection/feature_selection.py +364 -0
  285. scitex/ml/loss/_L1L2Losses.py +34 -0
  286. scitex/ml/loss/__init__.py +12 -0
  287. scitex/ml/loss/multi_task_loss.py +47 -0
  288. scitex/ml/metrics/__init__.py +56 -0
  289. scitex/ml/metrics/_calc_bacc.py +61 -0
  290. scitex/ml/metrics/_calc_bacc_from_conf_mat.py +38 -0
  291. scitex/ml/metrics/_calc_clf_report.py +78 -0
  292. scitex/ml/metrics/_calc_conf_mat.py +93 -0
  293. scitex/ml/metrics/_calc_feature_importance.py +183 -0
  294. scitex/ml/metrics/_calc_mcc.py +61 -0
  295. scitex/ml/metrics/_calc_pre_rec_auc.py +116 -0
  296. scitex/ml/metrics/_calc_roc_auc.py +110 -0
  297. scitex/ml/metrics/_calc_seizure_prediction_metrics.py +490 -0
  298. scitex/ml/metrics/_calc_silhouette_score.py +503 -0
  299. scitex/ml/metrics/_normalize_labels.py +83 -0
  300. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
  301. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
  302. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
  303. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
  304. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
  305. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
  306. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
  307. scitex/ml/optim/__init__.py +13 -0
  308. scitex/ml/optim/_get_set.py +31 -0
  309. scitex/ml/optim/_optimizers.py +71 -0
  310. scitex/ml/plt/__init__.py +60 -0
  311. scitex/ml/plt/_plot_conf_mat.py +663 -0
  312. scitex/ml/plt/_plot_feature_importance.py +323 -0
  313. scitex/ml/plt/_plot_learning_curve.py +345 -0
  314. scitex/ml/plt/_plot_optuna_study.py +225 -0
  315. scitex/ml/plt/_plot_pre_rec_curve.py +290 -0
  316. scitex/ml/plt/_plot_roc_curve.py +255 -0
  317. scitex/ml/sk/__init__.py +11 -0
  318. scitex/ml/sk/_clf.py +58 -0
  319. scitex/ml/sk/_to_sktime.py +100 -0
  320. scitex/ml/sklearn/__init__.py +26 -0
  321. scitex/ml/sklearn/clf.py +58 -0
  322. scitex/ml/sklearn/to_sktime.py +100 -0
  323. scitex/{ai/training/early_stopping.py → ml/training/_EarlyStopping.py} +1 -2
  324. scitex/{ai → ml/training}/_LearningCurveLogger.py +198 -242
  325. scitex/ml/training/__init__.py +7 -0
  326. scitex/ml/utils/__init__.py +22 -0
  327. scitex/ml/utils/_check_params.py +50 -0
  328. scitex/ml/utils/_default_dataset.py +46 -0
  329. scitex/ml/utils/_format_samples_for_sktime.py +26 -0
  330. scitex/ml/utils/_label_encoder.py +134 -0
  331. scitex/ml/utils/_merge_labels.py +22 -0
  332. scitex/ml/utils/_sliding_window_data_augmentation.py +11 -0
  333. scitex/ml/utils/_under_sample.py +51 -0
  334. scitex/ml/utils/_verify_n_gpus.py +16 -0
  335. scitex/ml/utils/grid_search.py +148 -0
  336. scitex/nn/_BNet.py +15 -9
  337. scitex/nn/_Filters.py +2 -2
  338. scitex/nn/_ModulationIndex.py +2 -2
  339. scitex/nn/_PAC.py +1 -1
  340. scitex/nn/_Spectrogram.py +12 -3
  341. scitex/nn/__init__.py +9 -10
  342. scitex/path/__init__.py +18 -0
  343. scitex/path/_clean.py +4 -0
  344. scitex/path/_find.py +9 -4
  345. scitex/path/_symlink.py +348 -0
  346. scitex/path/_version.py +4 -3
  347. scitex/pd/__init__.py +2 -0
  348. scitex/pd/_get_unique.py +99 -0
  349. scitex/plt/__init__.py +114 -5
  350. scitex/plt/_subplots/_AxesWrapper.py +1 -3
  351. scitex/plt/_subplots/_AxisWrapper.py +7 -3
  352. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +47 -13
  353. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +160 -2
  354. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +26 -4
  355. scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +322 -0
  356. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +1 -0
  357. scitex/plt/_subplots/_FigWrapper.py +62 -6
  358. scitex/plt/_subplots/_export_as_csv.py +43 -27
  359. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +5 -4
  360. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +81 -0
  361. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +1 -3
  362. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +20 -5
  363. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +1 -3
  364. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +1 -3
  365. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +35 -18
  366. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +1 -3
  367. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +1 -3
  368. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +1 -3
  369. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +1 -3
  370. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +1 -3
  371. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +1 -3
  372. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +15 -3
  373. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +1 -3
  374. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +1 -3
  375. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +1 -3
  376. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +1 -3
  377. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +1 -3
  378. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +1 -3
  379. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +1 -3
  380. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +1 -3
  381. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +1 -3
  382. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +1 -3
  383. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +1 -3
  384. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +1 -3
  385. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +1 -3
  386. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +1 -3
  387. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +35 -0
  388. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +1 -3
  389. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +1 -3
  390. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +1 -3
  391. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +6 -4
  392. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +1 -3
  393. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +1 -3
  394. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +1 -3
  395. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +1 -3
  396. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +1 -3
  397. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +1 -3
  398. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +1 -3
  399. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +1 -3
  400. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +1 -3
  401. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +1 -3
  402. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +1 -3
  403. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +1 -3
  404. scitex/plt/_subplots/_export_as_csv_formatters/_format_text.py +60 -0
  405. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +1 -3
  406. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +1 -3
  407. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +1 -3
  408. scitex/plt/_subplots/_export_as_csv_formatters.py +56 -59
  409. scitex/plt/ax/_style/_hide_spines.py +1 -3
  410. scitex/plt/ax/_style/_rotate_labels.py +180 -76
  411. scitex/plt/ax/_style/_rotate_labels_v01.py +248 -0
  412. scitex/plt/ax/_style/_set_meta.py +11 -4
  413. scitex/plt/ax/_style/_set_supxyt.py +3 -3
  414. scitex/plt/ax/_style/_set_xyt.py +3 -3
  415. scitex/plt/ax/_style/_share_axes.py +2 -2
  416. scitex/plt/color/__init__.py +4 -4
  417. scitex/plt/color/{_get_colors_from_cmap.py → _get_colors_from_conf_matap.py} +7 -7
  418. scitex/plt/utils/_configure_mpl.py +99 -86
  419. scitex/plt/utils/_histogram_utils.py +1 -3
  420. scitex/plt/utils/_is_valid_axis.py +1 -3
  421. scitex/plt/utils/_scitex_config.py +1 -0
  422. scitex/repro/__init__.py +75 -0
  423. scitex/{reproduce → repro}/_gen_ID.py +1 -1
  424. scitex/{reproduce → repro}/_gen_timestamp.py +1 -1
  425. scitex/repro_rng/_RandomStateManager.py +590 -0
  426. scitex/repro_rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
  427. scitex/repro_rng/__init__.py +39 -0
  428. scitex/reproduce/__init__.py +25 -13
  429. scitex/reproduce/_hash_array.py +22 -0
  430. scitex/resource/_get_processor_usages.py +4 -4
  431. scitex/resource/_get_specs.py +2 -2
  432. scitex/resource/_log_processor_usages.py +2 -2
  433. scitex/rng/_RandomStateManager.py +590 -0
  434. scitex/rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
  435. scitex/rng/__init__.py +39 -0
  436. scitex/scholar/__init__.py +309 -19
  437. scitex/scholar/__main__.py +319 -0
  438. scitex/scholar/auth/ScholarAuthManager.py +308 -0
  439. scitex/scholar/auth/__init__.py +12 -0
  440. scitex/scholar/auth/core/AuthenticationGateway.py +473 -0
  441. scitex/scholar/auth/core/BrowserAuthenticator.py +386 -0
  442. scitex/scholar/auth/core/StrategyResolver.py +309 -0
  443. scitex/scholar/auth/core/__init__.py +16 -0
  444. scitex/scholar/auth/gateway/_OpenURLLinkFinder.py +120 -0
  445. scitex/scholar/auth/gateway/_OpenURLResolver.py +209 -0
  446. scitex/scholar/auth/gateway/__init__.py +38 -0
  447. scitex/scholar/auth/gateway/_resolve_functions.py +101 -0
  448. scitex/scholar/auth/providers/BaseAuthenticator.py +166 -0
  449. scitex/scholar/auth/providers/EZProxyAuthenticator.py +484 -0
  450. scitex/scholar/auth/providers/OpenAthensAuthenticator.py +619 -0
  451. scitex/scholar/auth/providers/ShibbolethAuthenticator.py +686 -0
  452. scitex/scholar/auth/providers/__init__.py +18 -0
  453. scitex/scholar/auth/session/AuthCacheManager.py +189 -0
  454. scitex/scholar/auth/session/SessionManager.py +159 -0
  455. scitex/scholar/auth/session/__init__.py +11 -0
  456. scitex/scholar/auth/sso/BaseSSOAutomator.py +373 -0
  457. scitex/scholar/auth/sso/OpenAthensSSOAutomator.py +378 -0
  458. scitex/scholar/auth/sso/SSOAutomator.py +180 -0
  459. scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +380 -0
  460. scitex/scholar/auth/sso/__init__.py +15 -0
  461. scitex/scholar/browser/ScholarBrowserManager.py +705 -0
  462. scitex/scholar/browser/__init__.py +38 -0
  463. scitex/scholar/browser/utils/__init__.py +13 -0
  464. scitex/scholar/browser/utils/click_and_wait.py +205 -0
  465. scitex/scholar/browser/utils/close_unwanted_pages.py +140 -0
  466. scitex/scholar/browser/utils/wait_redirects.py +732 -0
  467. scitex/scholar/config/PublisherRules.py +132 -0
  468. scitex/scholar/config/ScholarConfig.py +126 -0
  469. scitex/scholar/config/__init__.py +17 -0
  470. scitex/scholar/core/Paper.py +627 -0
  471. scitex/scholar/core/Papers.py +722 -0
  472. scitex/scholar/core/Scholar.py +1975 -0
  473. scitex/scholar/core/__init__.py +9 -0
  474. scitex/scholar/impact_factor/ImpactFactorEngine.py +204 -0
  475. scitex/scholar/impact_factor/__init__.py +20 -0
  476. scitex/scholar/impact_factor/estimation/ImpactFactorEstimationEngine.py +0 -0
  477. scitex/scholar/impact_factor/estimation/__init__.py +40 -0
  478. scitex/scholar/impact_factor/estimation/build_database.py +0 -0
  479. scitex/scholar/impact_factor/estimation/core/__init__.py +28 -0
  480. scitex/scholar/impact_factor/estimation/core/cache_manager.py +523 -0
  481. scitex/scholar/impact_factor/estimation/core/calculator.py +355 -0
  482. scitex/scholar/impact_factor/estimation/core/journal_matcher.py +428 -0
  483. scitex/scholar/integration/__init__.py +59 -0
  484. scitex/scholar/integration/base.py +502 -0
  485. scitex/scholar/integration/mendeley/__init__.py +22 -0
  486. scitex/scholar/integration/mendeley/exporter.py +166 -0
  487. scitex/scholar/integration/mendeley/importer.py +236 -0
  488. scitex/scholar/integration/mendeley/linker.py +79 -0
  489. scitex/scholar/integration/mendeley/mapper.py +212 -0
  490. scitex/scholar/integration/zotero/__init__.py +27 -0
  491. scitex/scholar/integration/zotero/__main__.py +264 -0
  492. scitex/scholar/integration/zotero/exporter.py +351 -0
  493. scitex/scholar/integration/zotero/importer.py +372 -0
  494. scitex/scholar/integration/zotero/linker.py +415 -0
  495. scitex/scholar/integration/zotero/mapper.py +286 -0
  496. scitex/scholar/metadata_engines/ScholarEngine.py +588 -0
  497. scitex/scholar/metadata_engines/__init__.py +21 -0
  498. scitex/scholar/metadata_engines/individual/ArXivEngine.py +397 -0
  499. scitex/scholar/metadata_engines/individual/CrossRefEngine.py +274 -0
  500. scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py +263 -0
  501. scitex/scholar/metadata_engines/individual/OpenAlexEngine.py +350 -0
  502. scitex/scholar/metadata_engines/individual/PubMedEngine.py +329 -0
  503. scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py +438 -0
  504. scitex/scholar/metadata_engines/individual/URLDOIEngine.py +410 -0
  505. scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py +487 -0
  506. scitex/scholar/metadata_engines/individual/__init__.py +7 -0
  507. scitex/scholar/metadata_engines/utils/_PubMedConverter.py +469 -0
  508. scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +283 -0
  509. scitex/scholar/metadata_engines/utils/__init__.py +30 -0
  510. scitex/scholar/metadata_engines/utils/_metadata2bibtex.py +103 -0
  511. scitex/scholar/metadata_engines/utils/_standardize_metadata.py +376 -0
  512. scitex/scholar/pdf_download/ScholarPDFDownloader.py +579 -0
  513. scitex/scholar/pdf_download/__init__.py +5 -0
  514. scitex/scholar/pdf_download/strategies/__init__.py +38 -0
  515. scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +376 -0
  516. scitex/scholar/pdf_download/strategies/direct_download.py +131 -0
  517. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +167 -0
  518. scitex/scholar/pdf_download/strategies/manual_download_utils.py +996 -0
  519. scitex/scholar/pdf_download/strategies/response_body.py +207 -0
  520. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +364 -0
  521. scitex/scholar/pipelines/ScholarPipelineParallel.py +478 -0
  522. scitex/scholar/pipelines/ScholarPipelineSingle.py +767 -0
  523. scitex/scholar/pipelines/__init__.py +49 -0
  524. scitex/scholar/storage/BibTeXHandler.py +1018 -0
  525. scitex/scholar/storage/PaperIO.py +468 -0
  526. scitex/scholar/storage/ScholarLibrary.py +182 -0
  527. scitex/scholar/storage/_DeduplicationManager.py +548 -0
  528. scitex/scholar/storage/_LibraryCacheManager.py +724 -0
  529. scitex/scholar/storage/_LibraryManager.py +1835 -0
  530. scitex/scholar/storage/__init__.py +28 -0
  531. scitex/scholar/url_finder/ScholarURLFinder.py +379 -0
  532. scitex/scholar/url_finder/__init__.py +7 -0
  533. scitex/scholar/url_finder/strategies/__init__.py +33 -0
  534. scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +261 -0
  535. scitex/scholar/url_finder/strategies/find_pdf_urls_by_dropdown.py +67 -0
  536. scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +204 -0
  537. scitex/scholar/url_finder/strategies/find_pdf_urls_by_navigation.py +256 -0
  538. scitex/scholar/url_finder/strategies/find_pdf_urls_by_publisher_patterns.py +165 -0
  539. scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +163 -0
  540. scitex/scholar/url_finder/strategies/find_supplementary_urls_by_href.py +70 -0
  541. scitex/scholar/utils/__init__.py +22 -0
  542. scitex/scholar/utils/bibtex/__init__.py +9 -0
  543. scitex/scholar/utils/bibtex/_parse_bibtex.py +71 -0
  544. scitex/scholar/utils/cleanup/__init__.py +8 -0
  545. scitex/scholar/utils/cleanup/_cleanup_scholar_processes.py +96 -0
  546. scitex/scholar/utils/cleanup/cleanup_old_extractions.py +117 -0
  547. scitex/scholar/utils/text/_TextNormalizer.py +407 -0
  548. scitex/scholar/utils/text/__init__.py +9 -0
  549. scitex/scholar/zotero/__init__.py +38 -0
  550. scitex/session/__init__.py +51 -0
  551. scitex/session/_lifecycle.py +736 -0
  552. scitex/session/_manager.py +102 -0
  553. scitex/session/template.py +122 -0
  554. scitex/stats/__init__.py +30 -26
  555. scitex/stats/correct/__init__.py +21 -0
  556. scitex/stats/correct/_correct_bonferroni.py +551 -0
  557. scitex/stats/correct/_correct_fdr.py +634 -0
  558. scitex/stats/correct/_correct_holm.py +548 -0
  559. scitex/stats/correct/_correct_sidak.py +499 -0
  560. scitex/stats/descriptive/__init__.py +85 -0
  561. scitex/stats/descriptive/_circular.py +540 -0
  562. scitex/stats/descriptive/_describe.py +219 -0
  563. scitex/stats/descriptive/_nan.py +518 -0
  564. scitex/stats/descriptive/_real.py +189 -0
  565. scitex/stats/effect_sizes/__init__.py +41 -0
  566. scitex/stats/effect_sizes/_cliffs_delta.py +325 -0
  567. scitex/stats/effect_sizes/_cohens_d.py +342 -0
  568. scitex/stats/effect_sizes/_epsilon_squared.py +315 -0
  569. scitex/stats/effect_sizes/_eta_squared.py +302 -0
  570. scitex/stats/effect_sizes/_prob_superiority.py +296 -0
  571. scitex/stats/posthoc/__init__.py +19 -0
  572. scitex/stats/posthoc/_dunnett.py +463 -0
  573. scitex/stats/posthoc/_games_howell.py +383 -0
  574. scitex/stats/posthoc/_tukey_hsd.py +367 -0
  575. scitex/stats/power/__init__.py +19 -0
  576. scitex/stats/power/_power.py +433 -0
  577. scitex/stats/template.py +119 -0
  578. scitex/stats/utils/__init__.py +62 -0
  579. scitex/stats/utils/_effect_size.py +985 -0
  580. scitex/stats/utils/_formatters.py +270 -0
  581. scitex/stats/utils/_normalizers.py +927 -0
  582. scitex/stats/utils/_power.py +433 -0
  583. scitex/stats_v01/_EffectSizeCalculator.py +488 -0
  584. scitex/stats_v01/_StatisticalValidator.py +411 -0
  585. scitex/stats_v01/__init__.py +60 -0
  586. scitex/stats_v01/_additional_tests.py +415 -0
  587. scitex/{stats → stats_v01}/_p2stars.py +19 -5
  588. scitex/stats_v01/_two_sample_tests.py +141 -0
  589. scitex/stats_v01/desc/__init__.py +83 -0
  590. scitex/stats_v01/desc/_circular.py +540 -0
  591. scitex/stats_v01/desc/_describe.py +219 -0
  592. scitex/stats_v01/desc/_nan.py +518 -0
  593. scitex/{stats/desc/_nan.py → stats_v01/desc/_nan_v01-20250920_145731.py} +23 -12
  594. scitex/stats_v01/desc/_real.py +189 -0
  595. scitex/stats_v01/tests/__corr_test_optimized.py +221 -0
  596. scitex/stats_v01/tests/_corr_test_optimized.py +179 -0
  597. scitex/str/__init__.py +1 -3
  598. scitex/str/_clean_path.py +6 -2
  599. scitex/str/_latex_fallback.py +267 -160
  600. scitex/str/_parse.py +44 -36
  601. scitex/str/_printc.py +1 -3
  602. scitex/template/__init__.py +87 -0
  603. scitex/template/_create_project.py +267 -0
  604. scitex/template/create_pip_project.py +80 -0
  605. scitex/template/create_research.py +80 -0
  606. scitex/template/create_singularity.py +80 -0
  607. scitex/units.py +291 -0
  608. scitex/utils/_compress_hdf5.py +14 -3
  609. scitex/utils/_email.py +21 -2
  610. scitex/utils/_grid.py +6 -4
  611. scitex/utils/_notify.py +13 -10
  612. scitex/utils/_verify_scitex_format.py +589 -0
  613. scitex/utils/_verify_scitex_format_v01.py +370 -0
  614. scitex/utils/template.py +122 -0
  615. scitex/web/_search_pubmed.py +62 -16
  616. scitex-2.1.0.dist-info/LICENSE +21 -0
  617. scitex-2.1.0.dist-info/METADATA +677 -0
  618. scitex-2.1.0.dist-info/RECORD +919 -0
  619. {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/WHEEL +1 -1
  620. scitex-2.1.0.dist-info/entry_points.txt +3 -0
  621. scitex/ai/__Classifiers.py +0 -101
  622. scitex/ai/classification/classification_reporter.py +0 -1137
  623. scitex/ai/classification/classifiers.py +0 -101
  624. scitex/ai/classification_reporter.py +0 -1161
  625. scitex/ai/genai/__init__.py +0 -277
  626. scitex/ai/genai/anthropic_provider.py +0 -320
  627. scitex/ai/genai/anthropic_refactored.py +0 -109
  628. scitex/ai/genai/auth_manager.py +0 -200
  629. scitex/ai/genai/base_provider.py +0 -291
  630. scitex/ai/genai/chat_history.py +0 -307
  631. scitex/ai/genai/cost_tracker.py +0 -276
  632. scitex/ai/genai/deepseek_provider.py +0 -251
  633. scitex/ai/genai/google_provider.py +0 -228
  634. scitex/ai/genai/groq_provider.py +0 -248
  635. scitex/ai/genai/image_processor.py +0 -250
  636. scitex/ai/genai/llama_provider.py +0 -214
  637. scitex/ai/genai/mock_provider.py +0 -127
  638. scitex/ai/genai/model_registry.py +0 -304
  639. scitex/ai/genai/openai_provider.py +0 -293
  640. scitex/ai/genai/perplexity_provider.py +0 -205
  641. scitex/ai/genai/provider_base.py +0 -302
  642. scitex/ai/genai/provider_factory.py +0 -370
  643. scitex/ai/genai/response_handler.py +0 -235
  644. scitex/ai/layer/_Pass.py +0 -21
  645. scitex/ai/layer/__init__.py +0 -10
  646. scitex/ai/layer/_switch.py +0 -8
  647. scitex/ai/metrics/_bACC.py +0 -51
  648. scitex/ai/plt/_learning_curve.py +0 -194
  649. scitex/ai/plt/_optuna_study.py +0 -111
  650. scitex/ai/plt/aucs/__init__.py +0 -2
  651. scitex/ai/plt/aucs/example.py +0 -60
  652. scitex/ai/plt/aucs/pre_rec_auc.py +0 -223
  653. scitex/ai/plt/aucs/roc_auc.py +0 -246
  654. scitex/ai/sampling/undersample.py +0 -29
  655. scitex/db/_SQLite3.py +0 -2136
  656. scitex/db/_SQLite3Mixins/_BlobMixin.py +0 -229
  657. scitex/gen/_close.py +0 -222
  658. scitex/gen/_start.py +0 -451
  659. scitex/general/__init__.py +0 -5
  660. scitex/io/_load_modules/_db.py +0 -24
  661. scitex/life/__init__.py +0 -10
  662. scitex/life/_monitor_rain.py +0 -49
  663. scitex/reproduce/_fix_seeds.py +0 -45
  664. scitex/res/__init__.py +0 -5
  665. scitex/scholar/_local_search.py +0 -454
  666. scitex/scholar/_paper.py +0 -244
  667. scitex/scholar/_pdf_downloader.py +0 -325
  668. scitex/scholar/_search.py +0 -393
  669. scitex/scholar/_vector_search.py +0 -370
  670. scitex/scholar/_web_sources.py +0 -457
  671. scitex/stats/desc/__init__.py +0 -40
  672. scitex-2.0.0.dist-info/METADATA +0 -307
  673. scitex-2.0.0.dist-info/RECORD +0 -572
  674. scitex-2.0.0.dist-info/licenses/LICENSE +0 -7
  675. /scitex/ai/{act → activation}/__init__.py +0 -0
  676. /scitex/ai/{act → activation}/_define.py +0 -0
  677. /scitex/ai/{early_stopping.py → training/_EarlyStopping.py} +0 -0
  678. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ImportExportMixin.py +0 -0
  679. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_IndexMixin.py +0 -0
  680. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_RowMixin.py +0 -0
  681. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TableMixin.py +0 -0
  682. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/__init__.py +0 -0
  683. /scitex/{stats → stats_v01}/_calc_partial_corr.py +0 -0
  684. /scitex/{stats → stats_v01}/_corr_test_multi.py +0 -0
  685. /scitex/{stats → stats_v01}/_corr_test_wrapper.py +0 -0
  686. /scitex/{stats → stats_v01}/_describe_wrapper.py +0 -0
  687. /scitex/{stats → stats_v01}/_multiple_corrections.py +0 -0
  688. /scitex/{stats → stats_v01}/_nan_stats.py +0 -0
  689. /scitex/{stats → stats_v01}/_p2stars_wrapper.py +0 -0
  690. /scitex/{stats → stats_v01}/_statistical_tests.py +0 -0
  691. /scitex/{stats/desc/_describe.py → stats_v01/desc/_describe_v01-20250920_145731.py} +0 -0
  692. /scitex/{stats/desc/_real.py → stats_v01/desc/_real_v01-20250920_145731.py} +0 -0
  693. /scitex/{stats → stats_v01}/multiple/__init__.py +0 -0
  694. /scitex/{stats → stats_v01}/multiple/_bonferroni_correction.py +0 -0
  695. /scitex/{stats → stats_v01}/multiple/_fdr_correction.py +0 -0
  696. /scitex/{stats → stats_v01}/multiple/_multicompair.py +0 -0
  697. /scitex/{stats → stats_v01}/tests/__corr_test.py +0 -0
  698. /scitex/{stats → stats_v01}/tests/__corr_test_multi.py +0 -0
  699. /scitex/{stats → stats_v01}/tests/__corr_test_single.py +0 -0
  700. /scitex/{stats → stats_v01}/tests/__init__.py +0 -0
  701. /scitex/{stats → stats_v01}/tests/_brunner_munzel_test.py +0 -0
  702. /scitex/{stats → stats_v01}/tests/_nocorrelation_test.py +0 -0
  703. /scitex/{stats → stats_v01}/tests/_smirnov_grubbs.py +0 -0
  704. {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/top_level.txt +0 -0
@@ -1,1161 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Timestamp: "2025-02-15 01:38:28 (ywatanabe)"
4
- # File: ./src/scitex/ai/ClassificationReporter.py
5
-
6
- THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/ClassificationReporter.py"
7
-
8
- import os as _os
9
- import random as _random
10
- import sys as _sys
11
- from collections import defaultdict as _defaultdict
12
- from glob import glob as _glob
13
- from pprint import pprint as _pprint
14
-
15
- import matplotlib as _matplotlib
16
- import matplotlib.pyplot as _plt
17
- import scitex as _scitex
18
- import numpy as _np
19
- import pandas as _pd
20
- import torch as _torch
21
- from sklearn.metrics import (
22
- balanced_accuracy_score as _balanced_accuracy_score,
23
- classification_report as _classification_report,
24
- confusion_matrix as _confusion_matrix,
25
- matthews_corrcoef as _matthews_corrcoef,
26
- )
27
-
28
- from ..reproduce import fix_seeds as _fix_seeds
29
-
30
-
31
- class MultiClassificationReporter(object):
32
- def __init__(self, sdir, tgts=None):
33
- if tgts is None:
34
- sdirs = [""]
35
- else:
36
- sdirs = [_os.path.join(sdir, tgt, "/") for tgt in tgts]
37
- sdirs = [sdir + tgt + "/" for tgt in tgts]
38
-
39
- self.tgt2id = {tgt: i_tgt for i_tgt, tgt in enumerate(tgts)}
40
- self.reporters = [ClassificationReporter(sdir) for sdir in sdirs]
41
-
42
- def add(self, obj_name, obj, tgt=None):
43
- i_tgt = self.tgt2id[tgt]
44
- self.reporters[i_tgt].add(obj_name, obj)
45
-
46
- def calc_metrics(
47
- self,
48
- true_class,
49
- pred_class,
50
- pred_proba,
51
- labels=None,
52
- i_fold=None,
53
- show=True,
54
- auc_plt_config=dict(
55
- figsize=(7, 7),
56
- labelsize=8,
57
- fontsize=7,
58
- legendfontsize=6,
59
- tick_size=0.8,
60
- tick_width=0.2,
61
- ),
62
- tgt=None,
63
- ):
64
- i_tgt = self.tgt2id[tgt]
65
- self.reporters[i_tgt].calc_metrics(
66
- true_class,
67
- pred_class,
68
- pred_proba,
69
- labels=labels,
70
- i_fold=i_fold,
71
- show=show,
72
- auc_plt_config=auc_plt_config,
73
- )
74
-
75
- def summarize(
76
- self,
77
- n_round=3,
78
- show=False,
79
- tgt=None,
80
- ):
81
- i_tgt = self.tgt2id[tgt]
82
- self.reporters[i_tgt].summarize(
83
- n_round=n_round,
84
- show=show,
85
- )
86
-
87
- def save(
88
- self,
89
- files_to_reproduce=None,
90
- meta_dict=None,
91
- tgt=None,
92
- ):
93
- i_tgt = self.tgt2id[tgt]
94
- self.reporters[i_tgt].save(
95
- files_to_reproduce=files_to_reproduce,
96
- meta_dict=meta_dict,
97
- )
98
-
99
- def plot_and_save_conf_mats(
100
- self,
101
- plt,
102
- extend_ratio=1.0,
103
- colorbar=True,
104
- confmat_plt_config=None,
105
- sci_notation_kwargs=None,
106
- tgt=None,
107
- ):
108
- i_tgt = self.tgt2id[tgt]
109
- self.reporters[i_tgt].plot_and_save_conf_mats(
110
- plt,
111
- extend_ratio=extend_ratio,
112
- colorbar=colorbar,
113
- confmat_plt_config=confmat_plt_config,
114
- sci_notation_kwargs=sci_notation_kwargs,
115
- )
116
-
117
-
118
- class ClassificationReporter(object):
119
- """Saves the following metrics under sdir.
120
- - Balanced Accuracy
121
- - MCC
122
- - Confusion Matrix
123
- - Classification Report
124
- - ROC AUC score / curve
125
- - PRE-REC AUC score / curve
126
-
127
- Example is described in this file.
128
- """
129
-
130
- def __init__(self, sdir):
131
- self.sdir = sdir
132
- self.folds_dict = _defaultdict(list)
133
- _fix_seeds(os=_os, random=_random, np=_np, torch=_torch, verbose=False)
134
-
135
- def add(
136
- self,
137
- obj_name,
138
- obj,
139
- ):
140
- """
141
- ## fig
142
- fig, ax = plt.subplots()
143
- ax.plot(np.random.rand(10))
144
- reporter.add("manu_figs", fig)
145
-
146
- ## DataFrame
147
- df = pd.DataFrame(np.random.rand(5, 3))
148
- reporter.add("manu_dfs", df)
149
-
150
- ## scalar
151
- scalar = random.random()
152
- reporter.add("manu_scalers", scalar)
153
- """
154
- assert isinstance(obj_name, str)
155
- self.folds_dict[obj_name].append(obj)
156
-
157
- @staticmethod
158
- def calc_bACC(true_class, pred_class, i_fold, show=False):
159
- """Balanced ACC"""
160
- balanced_acc = _balanced_accuracy_score(true_class, pred_class)
161
- if show:
162
- print(f"\nBalanced ACC in fold#{i_fold} was {balanced_acc:.3f}\n")
163
- return balanced_acc
164
-
165
- @staticmethod
166
- def calc_balanced_accuracy(true_class, pred_class, i_fold, show=False):
167
- """Balanced accuracy (snake_case alias for calc_bACC)"""
168
- return ClassificationReporter.calc_bACC(true_class, pred_class, i_fold, show)
169
-
170
- @staticmethod
171
- def calc_mcc(true_class, pred_class, i_fold, show=False):
172
- """MCC"""
173
- mcc = float(_matthews_corrcoef(true_class, pred_class))
174
- if show:
175
- print(f"\nMCC in fold#{i_fold} was {mcc:.3f}\n")
176
- return mcc
177
-
178
- @staticmethod
179
- def calc_conf_mat(true_class, pred_class, labels, i_fold, show=False):
180
- """
181
- Confusion Matrix
182
- This method assumes unique classes of true_class and pred_class are the same.
183
- """
184
- conf_mat = _pd.DataFrame(
185
- data=_confusion_matrix(
186
- true_class, pred_class, labels=_np.arange(len(labels))
187
- ),
188
- columns=labels,
189
- ).set_index(_pd.Series(list(labels)))
190
-
191
- if show:
192
- print(f"\nConfusion Matrix in fold#{i_fold}: \n")
193
- _pprint(conf_mat)
194
- print()
195
-
196
- return conf_mat
197
-
198
- @staticmethod
199
- def calc_clf_report(
200
- true_class, pred_class, labels, balanced_acc, i_fold, show=False
201
- ):
202
- """Classification Report"""
203
- clf_report = _pd.DataFrame(
204
- _classification_report(
205
- true_class,
206
- pred_class,
207
- labels=_np.arange(len(labels)),
208
- target_names=labels,
209
- output_dict=True,
210
- )
211
- )
212
-
213
- clf_report["accuracy"] = balanced_acc
214
- clf_report = _pd.concat(
215
- [
216
- clf_report[labels],
217
- clf_report[["accuracy", "macro avg", "weighted avg"]],
218
- ],
219
- axis=1,
220
- )
221
- clf_report = clf_report.rename(columns={"accuracy": "balanced accuracy"})
222
- clf_report = clf_report.round(3)
223
- clf_report["index"] = clf_report.index
224
- clf_report.loc["support", "index"] = "sample size"
225
- clf_report.set_index("index", drop=True, inplace=True)
226
- clf_report.index.name = None
227
- if show:
228
- print(f"\nClassification Report for fold#{i_fold}:\n")
229
- _pprint(clf_report)
230
- print()
231
- return clf_report
232
-
233
- def calc_AUCs(
234
- self,
235
- true_class,
236
- pred_proba,
237
- labels,
238
- i_fold,
239
- show=True,
240
- auc_plt_config=dict(
241
- figsize=(7, 7),
242
- labelsize=8,
243
- fontsize=7,
244
- legendfontsize=6,
245
- tick_size=0.8,
246
- tick_width=0.2,
247
- ),
248
- ):
249
- """ROC AUC and PRE-REC AUC."""
250
- n_classes = len(labels)
251
- assert len(_np.unique(true_class)) == n_classes
252
- if n_classes == 2:
253
- roc_auc = self._calc_AUCs_binary(
254
- true_class,
255
- pred_proba,
256
- i_fold,
257
- show=show,
258
- auc_plt_config=auc_plt_config,
259
- )
260
- else:
261
- roc_auc = self._calc_AUCs_multiple(
262
- true_class,
263
- pred_proba,
264
- labels,
265
- i_fold,
266
- show=show,
267
- auc_plt_config=auc_plt_config,
268
- )
269
- return roc_auc
270
-
271
- def calc_aucs(self, true_class, pred_proba, labels, i_fold, show=True, auc_plt_config=None):
272
- """Calculate AUCs (snake_case alias for calc_AUCs)"""
273
- if auc_plt_config is None:
274
- auc_plt_config = dict(
275
- figsize=(7, 7),
276
- labelsize=8,
277
- fontsize=7,
278
- legendfontsize=6,
279
- tick_size=0.8,
280
- tick_width=0.2,
281
- )
282
- return self.calc_AUCs(true_class, pred_proba, labels, i_fold, show, auc_plt_config)
283
-
284
- def _calc_AUCs_binary(
285
- self,
286
- true_class,
287
- pred_proba,
288
- i_fold,
289
- show=False,
290
- auc_plt_config=dict(
291
- figsize=(7, 7),
292
- labelsize=8,
293
- fontsize=7,
294
- legendfontsize=6,
295
- tick_size=0.8,
296
- tick_width=0.2,
297
- ),
298
- ):
299
- """Calculates metrics for binary classification."""
300
- from sklearn.metrics import (
301
- PrecisionRecallDisplay,
302
- RocCurveDisplay,
303
- auc,
304
- precision_recall_curve,
305
- roc_curve,
306
- )
307
-
308
- unique_classes = sorted(list(_np.unique(true_class)))
309
- n_classes = len(unique_classes)
310
- assert n_classes == 2, "This method is only for binary classification"
311
-
312
- # ROC curve
313
- fpr, tpr, _ = roc_curve(true_class, pred_proba)
314
- roc_auc = auc(fpr, tpr)
315
-
316
- fig_size = auc_plt_config["figsize"]
317
- fontsize = auc_plt_config["fontsize"]
318
- labelsize = auc_plt_config["labelsize"]
319
- legendfontsize = auc_plt_config["legendfontsize"]
320
- tick_size = auc_plt_config["tick_size"]
321
- tick_width = auc_plt_config["tick_width"]
322
-
323
- fig_roc, ax_roc = _plt.subplots(figsize=fig_size)
324
- RocCurveDisplay(
325
- fpr=fpr,
326
- tpr=tpr,
327
- roc_auc=roc_auc,
328
- ).plot(ax=ax_roc)
329
- ax_roc.plot([0, 1], [0, 1], "k:")
330
- ax_roc.set_xlabel("False Positive Rate", fontsize=labelsize)
331
- ax_roc.set_ylabel("True Positive Rate", fontsize=labelsize)
332
- ax_roc.set_title("ROC Curve", fontsize=fontsize)
333
- ax_roc.legend(fontsize=legendfontsize)
334
- ax_roc.tick_params(
335
- axis="both",
336
- which="major",
337
- labelsize=tick_size,
338
- width=tick_width,
339
- )
340
- self.folds_dict["ROC_fig"].append(fig_roc)
341
- if show:
342
- print(f"\nROC AUC in fold#{i_fold} is {roc_auc:.3f}\n")
343
-
344
- # PRE-REC curve
345
- fig_prerec, ax_prerec = _plt.subplots(figsize=fig_size)
346
- PrecisionRecallDisplay.from_predictions(
347
- true_class,
348
- pred_proba,
349
- ax=ax_prerec,
350
- )
351
- ax_prerec.set_xlabel("Recall", fontsize=labelsize)
352
- ax_prerec.set_ylabel("Precision", fontsize=labelsize)
353
- ax_prerec.set_title("Precision-Recall Curve", fontsize=fontsize)
354
- ax_prerec.legend(fontsize=legendfontsize)
355
- ax_prerec.tick_params(
356
- axis="both",
357
- which="major",
358
- labelsize=tick_size,
359
- width=tick_width,
360
- )
361
- self.folds_dict["PRE_REC_fig"].append(fig_prerec)
362
-
363
- return roc_auc
364
-
365
- def _calc_aucs_binary(self, true_class, pred_proba, i_fold, show=False, auc_plt_config=None):
366
- """Calculates metrics for binary classification (snake_case alias)."""
367
- if auc_plt_config is None:
368
- auc_plt_config = dict(
369
- figsize=(7, 7),
370
- labelsize=8,
371
- fontsize=7,
372
- legendfontsize=6,
373
- tick_size=0.8,
374
- tick_width=0.2,
375
- )
376
- return self._calc_AUCs_binary(true_class, pred_proba, i_fold, show, auc_plt_config)
377
-
378
-
379
- # #!/usr/bin/env python3
380
- # # -*- coding: utf-8 -*-
381
- # # Time-stamp: "2024-11-20 00:15:08 (ywatanabe)"
382
- # # File: ./scitex_repo/src/scitex/ai/ClassificationReporter.py
383
-
384
- # THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/ClassificationReporter.py"
385
-
386
- # #!/usr/bin/env python3
387
- # # -*- coding: utf-8 -*-
388
- # # Time-stamp: "2024-11-13 12:54:17 (ywatanabe)"
389
- # # File: ./scitex_repo/src/scitex/ai/ClassificationReporter.py
390
-
391
- # import os
392
- # import random
393
- # import sys
394
- # from collections import defaultdict as _defaultdict
395
- # from glob import glob as _glob
396
- # from pprint import pprint as _pprint
397
-
398
- # import matplotlib
399
- # import matplotlib.pyplot as plt
400
- # import scitex
401
- # import numpy as np
402
- # import pandas as pd
403
- # import torch
404
- # from sklearn.metrics import (
405
- # balanced_accuracy_score,
406
- # classification_report,
407
- # confusion_matrix,
408
- # matthews_corrcoef,
409
- # )
410
-
411
- # from ..reproduce import fix_seeds
412
-
413
-
414
- # class MultiClassificationReporter(object):
415
- # def __init__(self, sdir, tgts=None):
416
- # if tgts is None:
417
- # sdirs = [""]
418
- # else:
419
- # sdirs = [os.path.join(sdir, tgt, "/") for tgt in tgts]
420
- # sdirs = [sdir + tgt + "/" for tgt in tgts]
421
-
422
- # self.tgt2id = {tgt: i_tgt for i_tgt, tgt in enumerate(tgts)}
423
- # self.reporters = [ClassificationReporter(sdir) for sdir in sdirs]
424
-
425
- # def add(self, obj_name, obj, tgt=None):
426
- # i_tgt = self.tgt2id[tgt]
427
- # self.reporters[i_tgt].add(obj_name, obj)
428
-
429
- # def calc_metrics(
430
- # self,
431
- # true_class,
432
- # pred_class,
433
- # pred_proba,
434
- # labels=None,
435
- # i_fold=None,
436
- # show=True,
437
- # auc_plt_config=dict(
438
- # figsize=(7, 7),
439
- # labelsize=8,
440
- # fontsize=7,
441
- # legendfontsize=6,
442
- # tick_size=0.8,
443
- # tick_width=0.2,
444
- # ),
445
- # tgt=None,
446
- # ):
447
- # i_tgt = self.tgt2id[tgt]
448
- # self.reporters[i_tgt].calc_metrics(
449
- # true_class,
450
- # pred_class,
451
- # pred_proba,
452
- # labels=labels,
453
- # i_fold=i_fold,
454
- # show=show,
455
- # auc_plt_config=auc_plt_config,
456
- # )
457
-
458
- # def summarize(
459
- # self,
460
- # n_round=3,
461
- # show=False,
462
- # tgt=None,
463
- # ):
464
- # i_tgt = self.tgt2id[tgt]
465
- # self.reporters[i_tgt].summarize(
466
- # n_round=n_round,
467
- # show=show,
468
- # )
469
-
470
- # def save(
471
- # self,
472
- # files_to_reproduce=None,
473
- # meta_dict=None,
474
- # tgt=None,
475
- # ):
476
- # i_tgt = self.tgt2id[tgt]
477
- # self.reporters[i_tgt].save(
478
- # files_to_reproduce=files_to_reproduce,
479
- # meta_dict=meta_dict,
480
- # )
481
-
482
- # def plot_and_save_conf_mats(
483
- # self,
484
- # plt,
485
- # extend_ratio=1.0,
486
- # colorbar=True,
487
- # confmat_plt_config=None,
488
- # sci_notation_kwargs=None,
489
- # tgt=None,
490
- # ):
491
- # i_tgt = self.tgt2id[tgt]
492
- # self.reporters[i_tgt].plot_and_save_conf_mats(
493
- # plt,
494
- # extend_ratio=extend_ratio,
495
- # colorbar=colorbar,
496
- # confmat_plt_config=confmat_plt_config,
497
- # sci_notation_kwargs=sci_notation_kwargs,
498
- # )
499
-
500
-
501
- # class ClassificationReporter(object):
502
- # """Saves the following metrics under sdir.
503
- # - Balanced Accuracy
504
- # - MCC
505
- # - Confusion Matrix
506
- # - Classification Report
507
- # - ROC AUC score / curve
508
- # - PRE-REC AUC score / curve
509
-
510
- # Example is described in this file.
511
- # """
512
-
513
- # def __init__(self, sdir):
514
- # self.sdir = sdir
515
- # self.folds_dict = _defaultdict(list)
516
- # fix_seeds(os=os, random=random, np=np, torch=torch, show=False)
517
-
518
- # def add(
519
- # self,
520
- # obj_name,
521
- # obj,
522
- # ):
523
- # """
524
- # ## fig
525
- # fig, ax = plt.subplots()
526
- # ax.plot(np.random.rand(10))
527
- # reporter.add("manu_figs", fig)
528
-
529
- # ## DataFrame
530
- # df = pd.DataFrame(np.random.rand(5, 3))
531
- # reporter.add("manu_dfs", df)
532
-
533
- # ## scalar
534
- # scalar = random.random()
535
- # reporter.add("manu_scalers", scalar)
536
- # """
537
- # assert isinstance(obj_name, str)
538
- # self.folds_dict[obj_name].append(obj)
539
-
540
- # @staticmethod
541
- # def calc_bACC(true_class, pred_class, i_fold, show=False):
542
- # """Balanced ACC"""
543
- # balanced_acc = balanced_accuracy_score(true_class, pred_class)
544
- # if show:
545
- # print(f"\nBalanced ACC in fold#{i_fold} was {balanced_acc:.3f}\n")
546
- # return balanced_acc
547
-
548
- # @staticmethod
549
- # def calc_mcc(true_class, pred_class, i_fold, show=False):
550
- # """MCC"""
551
- # mcc = float(matthews_corrcoef(true_class, pred_class))
552
- # if show:
553
- # print(f"\nMCC in fold#{i_fold} was {mcc:.3f}\n")
554
- # return mcc
555
-
556
- # @staticmethod
557
- # def calc_conf_mat(true_class, pred_class, labels, i_fold, show=False):
558
- # """
559
- # Confusion Matrix
560
- # This method assumes unique classes of true_class and pred_class are the same.
561
- # """
562
- # # conf_mat = pd.DataFrame(
563
- # # data=confusion_matrix(true_class, pred_class),
564
- # # columns=pred_labels,
565
- # # index=true_labels,
566
- # # )
567
-
568
- # conf_mat = pd.DataFrame(
569
- # data=confusion_matrix(
570
- # true_class, pred_class, labels=np.arange(len(labels))
571
- # ),
572
- # columns=labels,
573
- # ).set_index(pd.Series(list(labels)))
574
-
575
- # if show:
576
- # print(f"\nConfusion Matrix in fold#{i_fold}: \n")
577
- # _pprint(conf_mat)
578
- # print()
579
-
580
- # return conf_mat
581
-
582
- # @staticmethod
583
- # def calc_clf_report(
584
- # true_class, pred_class, labels, balanced_acc, i_fold, show=False
585
- # ):
586
- # """Classification Report"""
587
- # clf_report = pd.DataFrame(
588
- # classification_report(
589
- # true_class,
590
- # pred_class,
591
- # labels=np.arange(len(labels)),
592
- # target_names=labels,
593
- # output_dict=True,
594
- # )
595
- # )
596
-
597
- # # ACC to bACC
598
- # clf_report["accuracy"] = balanced_acc
599
- # clf_report = pd.concat(
600
- # [
601
- # clf_report[labels],
602
- # clf_report[["accuracy", "macro avg", "weighted avg"]],
603
- # ],
604
- # axis=1,
605
- # )
606
- # clf_report = clf_report.rename(
607
- # columns={"accuracy": "balanced accuracy"}
608
- # )
609
- # clf_report = clf_report.round(3)
610
- # # Renames 'support' to 'sample size'
611
- # clf_report["index"] = clf_report.index
612
- # clf_report.loc["support", "index"] = "sample size"
613
- # clf_report.set_index("index", drop=True, inplace=True)
614
- # clf_report.index.name = None
615
- # if show:
616
- # print(f"\nClassification Report for fold#{i_fold}:\n")
617
- # _pprint(clf_report)
618
- # print()
619
- # return clf_report
620
-
621
- # @staticmethod
622
- # def calc_and_plot_roc_curve(
623
- # true_class, pred_proba, labels, sdir_for_csv=None
624
- # ):
625
- # # ROC-AUC
626
- # fig_roc, metrics_roc_auc_dict = scitex.ml.plt.roc_auc(
627
- # plt,
628
- # true_class,
629
- # pred_proba,
630
- # labels,
631
- # sdir_for_csv=sdir_for_csv,
632
- # )
633
- # plt.close()
634
- # return fig_roc, metrics_roc_auc_dict
635
-
636
- # @staticmethod
637
- # def calc_and_plot_pre_rec_curve(true_class, pred_proba, labels):
638
- # # PRE-REC AUC
639
- # fig_pre_rec, metrics_pre_rec_auc_dict = scitex.ml.plt.pre_rec_auc(
640
- # plt, true_class, pred_proba, labels
641
- # )
642
- # plt.close()
643
- # return fig_pre_rec, metrics_pre_rec_auc_dict
644
-
645
- # def calc_metrics(
646
- # self,
647
- # true_class,
648
- # pred_class,
649
- # pred_proba,
650
- # labels=None,
651
- # i_fold=None,
652
- # show=True,
653
- # auc_plt_config=dict(
654
- # figsize=(7, 7),
655
- # labelsize=8,
656
- # fontsize=7,
657
- # legendfontsize=6,
658
- # tick_size=0.8,
659
- # tick_width=0.2,
660
- # ),
661
- # ):
662
- # """
663
- # Calculates ACC, Confusion Matrix, Classification Report, and ROC-AUC score on a fold.
664
- # Metrics and curves will be kept in self.folds_dict.
665
- # """
666
-
667
- # ## Preparation
668
- # # for convenience
669
- # true_class = scitex.gen.torch_to_arr(true_class).astype(int).reshape(-1)
670
- # pred_class = (
671
- # scitex.gen.torch_to_arr(pred_class).astype(np.float64).reshape(-1)
672
- # )
673
- # pred_proba = scitex.gen.torch_to_arr(pred_proba).astype(np.float64)
674
-
675
- # # for curves
676
- # scitex.plt.configure_mpl(
677
- # plt,
678
- # **auc_plt_config,
679
- # )
680
-
681
- # ## Calc metrics
682
- # # Balanced ACC
683
- # bacc = self.calc_bACC(true_class, pred_class, i_fold, show=show)
684
- # self.folds_dict["balanced_acc"].append(bacc)
685
-
686
- # # MCC
687
- # self.folds_dict["mcc"].append(
688
- # self.calc_mcc(true_class, pred_class, i_fold, show=show)
689
- # )
690
-
691
- # # Confusion Matrix
692
- # self.folds_dict["conf_mat/conf_mat"].append(
693
- # self.calc_conf_mat(
694
- # true_class,
695
- # pred_class,
696
- # labels,
697
- # i_fold,
698
- # show=show,
699
- # )
700
- # )
701
-
702
- # # Classification Report
703
- # self.folds_dict["clf_report"].append(
704
- # self.calc_clf_report(
705
- # true_class, pred_class, labels, bacc, i_fold, show=show
706
- # )
707
- # )
708
-
709
- # ## Curves
710
- # # ROC curve
711
- # self.sdir_for_roc_csv = f"{self.sdir}roc/csv/"
712
- # fig_roc, metrics_roc_auc_dict = self.calc_and_plot_roc_curve(
713
- # true_class,
714
- # pred_proba,
715
- # labels,
716
- # sdir_for_csv=self.sdir_for_roc_csv + f"fold#{i_fold}/",
717
- # )
718
- # self.folds_dict["roc/micro"].append(
719
- # metrics_roc_auc_dict["roc_auc"]["micro"]
720
- # )
721
- # self.folds_dict["roc/macro"].append(
722
- # metrics_roc_auc_dict["roc_auc"]["macro"]
723
- # )
724
- # self.folds_dict["roc/figs"].append(fig_roc)
725
-
726
- # # PRE-REC curve
727
- # fig_pre_rec, metrics_pre_rec_auc_dict = (
728
- # self.calc_and_plot_pre_rec_curve(true_class, pred_proba, labels)
729
- # )
730
- # self.folds_dict["pre_rec/micro"].append(
731
- # metrics_pre_rec_auc_dict["pre_rec_auc"]["micro"]
732
- # )
733
- # self.folds_dict["pre_rec/macro"].append(
734
- # metrics_pre_rec_auc_dict["pre_rec_auc"]["macro"]
735
- # )
736
- # self.folds_dict["pre_rec/figs"].append(fig_pre_rec)
737
-
738
- # @staticmethod
739
- # def _mk_cv_index(n_folds):
740
- # return [
741
- # f"{n_folds}-folds_CV_mean",
742
- # f"{n_folds}-fold_CV_std",
743
- # ] + [f"fold#{i_fold}" for i_fold in range(n_folds)]
744
-
745
- # def summarize_roc(
746
- # self,
747
- # ):
748
-
749
- # folds_dirs = _glob(self.sdir_for_roc_csv + "fold#*")
750
- # n_folds = len(folds_dirs)
751
-
752
- # # get class names
753
- # _csv_files = _glob(os.path.join(folds_dirs[0], "*"))
754
- # classes_str = [
755
- # csv_file.split("/")[-1].split(".csv")[0] for csv_file in _csv_files
756
- # ]
757
-
758
- # # dfs_classes = []
759
- # # take mean and std by each class
760
- # for cls_str in classes_str:
761
-
762
- # fpaths_cls = [
763
- # os.path.join(fold_dir, f"{cls_str}.csv")
764
- # for fold_dir in folds_dirs
765
- # ]
766
-
767
- # ys = []
768
- # roc_aucs = []
769
- # for fpath_cls in fpaths_cls:
770
- # loaded_df = scitex.io.load(fpath_cls)
771
- # ys.append(loaded_df["y"])
772
- # roc_aucs.append(loaded_df["roc_auc"])
773
- # ys = pd.concat(ys, axis=1)
774
- # roc_aucs = pd.concat(roc_aucs, axis=1)
775
-
776
- # df_cls = loaded_df[["x"]].copy()
777
- # df_cls["y_mean"] = ys.mean(axis=1)
778
- # df_cls["y_std"] = ys.std(axis=1)
779
- # df_cls["roc_auc_mean"] = roc_aucs.mean(axis=1)
780
- # df_cls["roc_auc_std"] = roc_aucs.std(axis=1)
781
-
782
- # spath_cls = os.path.join(
783
- # self.sdir_for_roc_csv, f"k-fold_mean_std/{cls_str}.csv"
784
- # )
785
- # scitex.io.save(df_cls, spath_cls)
786
- # # dfs_classes.append(df_cls)
787
-
788
- # def summarize(
789
- # self,
790
- # n_round=3,
791
- # show=False,
792
- # ):
793
- # """
794
- # 1) Take mean and std of scalars/pd.Dataframes for folds.
795
- # 2) Replace self.folds_dict with the summarized DataFrames.
796
- # """
797
- # self.summarize_roc()
798
-
799
- # _n_folds_all = [
800
- # len(self.folds_dict[k]) for k in self.folds_dict.keys()
801
- # ] # sometimes includes 0 because AUC curves are not always defined.
802
- # self.n_folds_intended = max(_n_folds_all)
803
-
804
- # for i_k, k in enumerate(self.folds_dict.keys()):
805
- # n_folds = _n_folds_all[i_k]
806
-
807
- # if n_folds != 0:
808
- # ## listed scalars
809
- # if is_listed_X(self.folds_dict[k], [float, int]):
810
- # mm = np.mean(self.folds_dict[k])
811
- # ss = np.std(self.folds_dict[k], ddof=1)
812
- # sr = pd.DataFrame(
813
- # data=[mm, ss] + self.folds_dict[k],
814
- # index=self._mk_cv_index(n_folds),
815
- # columns=[k],
816
- # )
817
- # self.folds_dict[k] = sr.round(n_round)
818
-
819
- # ## listed pd.DataFrames
820
- # elif is_listed_X(self.folds_dict[k], pd.DataFrame):
821
- # zero_df_for_mm = 0 * self.folds_dict[k][0].copy()
822
- # zero_df_for_ss = 0 * self.folds_dict[k][0].copy()
823
-
824
- # mm = (
825
- # zero_df_for_mm
826
- # + np.stack(self.folds_dict[k]).mean(axis=0)
827
- # ).round(n_round)
828
-
829
- # ss = (
830
- # zero_df_for_ss
831
- # + np.stack(self.folds_dict[k]).std(axis=0, ddof=1)
832
- # ).round(n_round)
833
-
834
- # self.folds_dict[k] = [mm, ss] + [
835
- # df_fold.round(n_round)
836
- # for df_fold in self.folds_dict[k]
837
- # ]
838
-
839
- # if show:
840
- # print(
841
- # "\n----------------------------------------\n"
842
- # f"\n{k}\n"
843
- # f"\n{n_folds}-fold-CV mean:\n"
844
- # )
845
- # _pprint(self.folds_dict[k][0])
846
- # print(f"\n\n{n_folds}-fold-CV std.:\n")
847
- # _pprint(self.folds_dict[k][1])
848
- # print("\n\n----------------------------------------\n")
849
-
850
- # ## listed figures
851
- # elif is_listed_X(self.folds_dict[k], matplotlib.figure.Figure):
852
- # pass
853
-
854
- # else:
855
- # print(f"{k} was not summarized")
856
- # print(type(self.folds_dict[k][0]))
857
-
858
- # def save(
859
- # self,
860
- # files_to_reproduce=None,
861
- # meta_dict=None,
862
- # ):
863
- # """
864
- # 1) Saves the content of self.folds_dict.
865
- # 2) Plots the colormap of confusion matrices and saves them.
866
- # 3) Saves passed meta_dict under self.sdir
867
-
868
- # Example:
869
- # meta_df_1 = pd.DataFrame(data=np.random.rand(3,3))
870
- # meta_dict_1 = {"a": 0}
871
- # meta_dict_2 = {"b": 0}
872
- # meta_dict = {"meta_1.csv": meta_df_1,
873
- # "meta_1.yaml": meta_dict_1,
874
- # "meta_2.yaml": meta_dict_1,
875
- # }
876
-
877
- # """
878
- # if meta_dict is not None:
879
- # for k, v in meta_dict.items():
880
- # scitex.io.save(v, self.sdir + k)
881
-
882
- # for k in self.folds_dict.keys():
883
-
884
- # ## pd.Series / pd.DataFrame
885
- # if isinstance(self.folds_dict[k], pd.Series) or isinstance(
886
- # self.folds_dict[k], pd.DataFrame
887
- # ):
888
- # scitex.io.save(self.folds_dict[k], self.sdir + f"{k}.csv")
889
-
890
- # ## listed pd.DataFrame
891
- # elif is_listed_X(self.folds_dict[k], pd.DataFrame):
892
- # scitex.io.save(
893
- # self.folds_dict[k],
894
- # self.sdir + f"{k}.csv",
895
- # # indi_suffix=self.cv_index,
896
- # indi_suffix=self._mk_cv_index(len(self.folds_dict[k])),
897
- # )
898
-
899
- # ## listed figures
900
- # elif is_listed_X(self.folds_dict[k], matplotlib.figure.Figure):
901
- # for i_fold, fig in enumerate(self.folds_dict[k]):
902
- # scitex.io.save(
903
- # self.folds_dict[k][i_fold],
904
- # self.sdir + f"{k}/fold#{i_fold}.png",
905
- # )
906
-
907
- # else:
908
- # print(f"{k} was not saved")
909
- # print(type(self.folds_dict[k]))
910
-
911
- # if files_to_reproduce is not None:
912
- # if isinstance(files_to_reproduce, list):
913
- # files_to_reproduce = [files_to_reproduce]
914
- # for f in files_to_reproduce:
915
- # scitex.io.save(f, self.sdir)
916
-
917
- # def plot_and_save_conf_mats(
918
- # self,
919
- # plt,
920
- # extend_ratio=1.0,
921
- # colorbar=True,
922
- # confmat_plt_config=None,
923
- # sci_notation_kwargs=None,
924
- # ):
925
- # def _inner_plot_conf_mat(
926
- # plt,
927
- # cm_df,
928
- # title,
929
- # extend_ratio=1.0,
930
- # colorbar=True,
931
- # sci_notation_kwargs=None,
932
- # ):
933
- # labels = list(cm_df.columns)
934
- # fig_conf_mat = scitex.ml.plt.confusion_matrix(
935
- # plt,
936
- # cm_df.T,
937
- # labels=labels,
938
- # title=title,
939
- # x_extend_ratio=extend_ratio,
940
- # y_extend_ratio=extend_ratio,
941
- # colorbar=colorbar,
942
- # )
943
-
944
- # if sci_notation_kwargs is not None:
945
- # fig_conf_mat.axes[-1] = scitex.plt.ax_scientific_notation(
946
- # fig_conf_mat.axes[-1], **sci_notation_kwargs
947
- # )
948
- # return fig_conf_mat
949
-
950
- # ## Configures mpl
951
- # scitex.plt.configure_mpl(
952
- # plt,
953
- # **confmat_plt_config,
954
- # )
955
-
956
- # ########################################
957
- # ## Prepares confmats dfs
958
- # ########################################
959
- # ## Drops mean and std for the folds
960
- # try:
961
- # conf_mats = self.folds_dict["conf_mat/conf_mat"][
962
- # -self.n_folds_intended :
963
- # ]
964
-
965
- # except Exception as e:
966
- # print(e)
967
- # conf_mats = self.folds_dict["conf_mat/conf_mat"]
968
-
969
- # ## Prepaires conf_mat_overall_sum
970
- # conf_mat_zero = 0 * conf_mats[0].copy() # get the table format
971
- # conf_mat_overall_sum = conf_mat_zero + np.stack(conf_mats).sum(axis=0)
972
-
973
- # ########################################
974
- # ## Plots & Saves
975
- # ########################################
976
- # # each fold's conf
977
- # for i_fold, cm in enumerate(conf_mats):
978
- # title = f"Test fold#{i_fold}"
979
- # fig_conf_mat_fold = _inner_plot_conf_mat(
980
- # plt,
981
- # cm,
982
- # title,
983
- # extend_ratio=extend_ratio,
984
- # colorbar=colorbar,
985
- # sci_notation_kwargs=sci_notation_kwargs,
986
- # )
987
- # scitex.io.save(
988
- # fig_conf_mat_fold,
989
- # self.sdir + f"conf_mat/figs/fold#{i_fold}.png",
990
- # )
991
- # plt.close()
992
-
993
- # ## overall_sum conf_mat
994
- # title = f"{self.n_folds_intended}-CV overall sum"
995
- # fig_conf_mat_overall_sum = _inner_plot_conf_mat(
996
- # plt,
997
- # conf_mat_overall_sum,
998
- # title,
999
- # extend_ratio=extend_ratio,
1000
- # colorbar=colorbar,
1001
- # sci_notation_kwargs=sci_notation_kwargs,
1002
- # )
1003
- # scitex.io.save(
1004
- # fig_conf_mat_overall_sum,
1005
- # self.sdir
1006
- # + f"conf_mat/figs/{self.n_folds_intended}-fold_cv_overall-sum.png",
1007
- # )
1008
- # plt.close()
1009
-
1010
-
1011
- # if __name__ == "__main__":
1012
- # import random
1013
- # import sys
1014
-
1015
- # import scitex
1016
- # import numpy as np
1017
- # from catboost import CatBoostClassifier, Pool
1018
- # from sklearn.datasets import load_digits
1019
- # from sklearn.model_selection import StratifiedKFold
1020
-
1021
- # ################################################################################
1022
- # ## Sets tee
1023
- # ################################################################################
1024
- # sdir = scitex.io.mk_spath(
1025
- # "./tmp/sdir-ClassificationReporter/"
1026
- # ) # "/tmp/sdir/"
1027
- # sys.stdout, sys.stderr = scitex.gen.tee(sys, sdir)
1028
-
1029
- # ################################################################################
1030
- # ## Fixes seeds
1031
- # ################################################################################
1032
- # fix_seeds(np=np)
1033
-
1034
- # ## Loads
1035
- # mnist = load_digits()
1036
- # X, T = mnist.data, mnist.target
1037
- # labels = mnist.target_names.astype(str)
1038
-
1039
- # ## Main
1040
- # skf = StratifiedKFold(n_splits=5, shuffle=True)
1041
- # # reporter = ClassificationReporter(sdir)
1042
- # mreporter = MultiClassificationReporter(sdir, tgts=["Test1", "Test2"])
1043
- # for i_fold, (indi_tra, indi_tes) in enumerate(skf.split(X, T)):
1044
- # X_tra, T_tra = X[indi_tra], T[indi_tra]
1045
- # X_tes, T_tes = X[indi_tes], T[indi_tes]
1046
-
1047
- # clf = CatBoostClassifier(verbose=False)
1048
-
1049
- # clf.fit(X_tra, T_tra, verbose=False)
1050
-
1051
- # ## Prediction
1052
- # pred_proba_tes = clf.predict_proba(X_tes)
1053
- # pred_cls_tes = np.argmax(pred_proba_tes, axis=1)
1054
-
1055
- # pred_cls_tes[pred_cls_tes == 9] = 8 # overide 9 as 8 # fixme
1056
-
1057
- # ##############################
1058
- # ## Manually adds objects to reporter to save
1059
- # ##############################
1060
- # ## Figure
1061
- # fig, ax = plt.subplots()
1062
- # ax.plot(np.arange(10))
1063
- # # reporter.add("manu_figs", fig)
1064
- # mreporter.add("manu_figs", fig, tgt="Test1")
1065
- # mreporter.add("manu_figs", fig, tgt="Test2")
1066
-
1067
- # ## DataFrame
1068
- # df = pd.DataFrame(np.random.rand(5, 3))
1069
- # # reporter.add("manu_dfs", df)
1070
- # mreporter.add("manu_dfs", df, tgt="Test1")
1071
- # mreporter.add("manu_dfs", df, tgt="Test2")
1072
-
1073
- # ## Scalar
1074
- # scalar = random.random()
1075
- # # reporter.add(
1076
- # # "manu_scalars",
1077
- # # scalar,
1078
- # # )
1079
- # mreporter.add("manu_scalars", scalar, tgt="Test1")
1080
- # mreporter.add("manu_scalars", scalar, tgt="Test2")
1081
-
1082
- # ########################################
1083
- # ## Metrics
1084
- # ########################################
1085
- # mreporter.calc_metrics(
1086
- # T_tes,
1087
- # pred_cls_tes,
1088
- # pred_proba_tes,
1089
- # labels=labels,
1090
- # i_fold=i_fold,
1091
- # tgt="Test1",
1092
- # )
1093
- # mreporter.calc_metrics(
1094
- # T_tes,
1095
- # pred_cls_tes,
1096
- # pred_proba_tes,
1097
- # labels=labels,
1098
- # i_fold=i_fold,
1099
- # tgt="Test2",
1100
- # )
1101
-
1102
- # # reporter.summarize(show=True)
1103
- # mreporter.summarize(show=True, tgt="Test1")
1104
- # mreporter.summarize(show=True, tgt="Test2")
1105
-
1106
- # fake_fpaths = ["fake_file_1.txt", "fake_file_2.txt"]
1107
- # for ff in fake_fpaths:
1108
- # scitex.io.touch(ff)
1109
-
1110
- # files_to_reproduce = [
1111
- # scitex.gen.get_this_fpath(when_ipython="/dev/null"),
1112
- # *fake_fpaths,
1113
- # ]
1114
- # # reporter.save(files_to_reproduce=files_to_reproduce)
1115
- # mreporter.save(files_to_reproduce=files_to_reproduce, tgt="Test1")
1116
- # mreporter.save(files_to_reproduce=files_to_reproduce, tgt="Test2")
1117
-
1118
- # confmat_plt_config = dict(
1119
- # figsize=(8, 8),
1120
- # # labelsize=8,
1121
- # # fontsize=6,
1122
- # # legendfontsize=6,
1123
- # figscale=2,
1124
- # tick_size=0.8,
1125
- # tick_width=0.2,
1126
- # )
1127
-
1128
- # sci_notation_kwargs = dict(
1129
- # order=1,
1130
- # fformat="%1.0d",
1131
- # scilimits=(-3, 3),
1132
- # x=False,
1133
- # y=True,
1134
- # ) # "%3.1f"
1135
-
1136
- # # sci_notation_kwargs = None
1137
- # # reporter.plot_and_save_conf_mats(
1138
- # # plt,
1139
- # # extend_ratio=1.0,
1140
- # # confmat_plt_config=confmat_plt_config,
1141
- # # sci_notation_kwargs=sci_notation_kwargs,
1142
- # # )
1143
-
1144
- # mreporter.plot_and_save_conf_mats(
1145
- # plt,
1146
- # extend_ratio=1.0,
1147
- # confmat_plt_config=confmat_plt_config,
1148
- # sci_notation_kwargs=sci_notation_kwargs,
1149
- # tgt="Test1",
1150
- # )
1151
- # mreporter.plot_and_save_conf_mats(
1152
- # plt,
1153
- # extend_ratio=1.0,
1154
- # confmat_plt_config=confmat_plt_config,
1155
- # sci_notation_kwargs=sci_notation_kwargs,
1156
- # tgt="Test2",
1157
- # )
1158
-
1159
- # python -m scitex.ai.ClassificationReporter
1160
-
1161
- # EOF