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,1137 +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
- # Lazy import to avoid circular dependency
29
- def _get_fix_seeds():
30
- import scitex
31
- return scitex.reproduce.fix_seeds
32
-
33
- _fix_seeds = None # Will be loaded when needed
34
-
35
-
36
- class MultiClassificationReporter(object):
37
- def __init__(self, sdir, tgts=None):
38
- if tgts is None:
39
- sdirs = [""]
40
- else:
41
- sdirs = [_os.path.join(sdir, tgt, "/") for tgt in tgts]
42
- sdirs = [sdir + tgt + "/" for tgt in tgts]
43
-
44
- self.tgt2id = {tgt: i_tgt for i_tgt, tgt in enumerate(tgts)}
45
- self.reporters = [ClassificationReporter(sdir) for sdir in sdirs]
46
-
47
- def add(self, obj_name, obj, tgt=None):
48
- i_tgt = self.tgt2id[tgt]
49
- self.reporters[i_tgt].add(obj_name, obj)
50
-
51
- def calc_metrics(
52
- self,
53
- true_class,
54
- pred_class,
55
- pred_proba,
56
- labels=None,
57
- i_fold=None,
58
- show=True,
59
- auc_plt_config=dict(
60
- figsize=(7, 7),
61
- labelsize=8,
62
- fontsize=7,
63
- legendfontsize=6,
64
- tick_size=0.8,
65
- tick_width=0.2,
66
- ),
67
- tgt=None,
68
- ):
69
- i_tgt = self.tgt2id[tgt]
70
- self.reporters[i_tgt].calc_metrics(
71
- true_class,
72
- pred_class,
73
- pred_proba,
74
- labels=labels,
75
- i_fold=i_fold,
76
- show=show,
77
- auc_plt_config=auc_plt_config,
78
- )
79
-
80
- def summarize(
81
- self,
82
- n_round=3,
83
- show=False,
84
- tgt=None,
85
- ):
86
- i_tgt = self.tgt2id[tgt]
87
- self.reporters[i_tgt].summarize(
88
- n_round=n_round,
89
- show=show,
90
- )
91
-
92
- def save(
93
- self,
94
- files_to_reproduce=None,
95
- meta_dict=None,
96
- tgt=None,
97
- ):
98
- i_tgt = self.tgt2id[tgt]
99
- self.reporters[i_tgt].save(
100
- files_to_reproduce=files_to_reproduce,
101
- meta_dict=meta_dict,
102
- )
103
-
104
- def plot_and_save_conf_mats(
105
- self,
106
- plt,
107
- extend_ratio=1.0,
108
- colorbar=True,
109
- confmat_plt_config=None,
110
- sci_notation_kwargs=None,
111
- tgt=None,
112
- ):
113
- i_tgt = self.tgt2id[tgt]
114
- self.reporters[i_tgt].plot_and_save_conf_mats(
115
- plt,
116
- extend_ratio=extend_ratio,
117
- colorbar=colorbar,
118
- confmat_plt_config=confmat_plt_config,
119
- sci_notation_kwargs=sci_notation_kwargs,
120
- )
121
-
122
-
123
- class ClassificationReporter(object):
124
- """Saves the following metrics under sdir.
125
- - Balanced Accuracy
126
- - MCC
127
- - Confusion Matrix
128
- - Classification Report
129
- - ROC AUC score / curve
130
- - PRE-REC AUC score / curve
131
-
132
- Example is described in this file.
133
- """
134
-
135
- def __init__(self, sdir):
136
- self.sdir = sdir
137
- self.folds_dict = _defaultdict(list)
138
- # Use lazy-loaded fix_seeds
139
- fix_seeds_func = _fix_seeds or _get_fix_seeds()
140
- fix_seeds_func(os=_os, random=_random, np=_np, torch=_torch, verbose=False)
141
-
142
- def add(
143
- self,
144
- obj_name,
145
- obj,
146
- ):
147
- """
148
- ## fig
149
- fig, ax = plt.subplots()
150
- ax.plot(np.random.rand(10))
151
- reporter.add("manu_figs", fig)
152
-
153
- ## DataFrame
154
- df = pd.DataFrame(np.random.rand(5, 3))
155
- reporter.add("manu_dfs", df)
156
-
157
- ## scalar
158
- scalar = random.random()
159
- reporter.add("manu_scalers", scalar)
160
- """
161
- assert isinstance(obj_name, str)
162
- self.folds_dict[obj_name].append(obj)
163
-
164
- @staticmethod
165
- def calc_bACC(true_class, pred_class, i_fold, show=False):
166
- """Balanced ACC"""
167
- balanced_acc = _balanced_accuracy_score(true_class, pred_class)
168
- if show:
169
- print(f"\nBalanced ACC in fold#{i_fold} was {balanced_acc:.3f}\n")
170
- return balanced_acc
171
-
172
- @staticmethod
173
- def calc_mcc(true_class, pred_class, i_fold, show=False):
174
- """MCC"""
175
- mcc = float(_matthews_corrcoef(true_class, pred_class))
176
- if show:
177
- print(f"\nMCC in fold#{i_fold} was {mcc:.3f}\n")
178
- return mcc
179
-
180
- @staticmethod
181
- def calc_conf_mat(true_class, pred_class, labels, i_fold, show=False):
182
- """
183
- Confusion Matrix
184
- This method assumes unique classes of true_class and pred_class are the same.
185
- """
186
- conf_mat = _pd.DataFrame(
187
- data=_confusion_matrix(
188
- true_class, pred_class, labels=_np.arange(len(labels))
189
- ),
190
- columns=labels,
191
- ).set_index(_pd.Series(list(labels)))
192
-
193
- if show:
194
- print(f"\nConfusion Matrix in fold#{i_fold}: \n")
195
- _pprint(conf_mat)
196
- print()
197
-
198
- return conf_mat
199
-
200
- @staticmethod
201
- def calc_clf_report(
202
- true_class, pred_class, labels, balanced_acc, i_fold, show=False
203
- ):
204
- """Classification Report"""
205
- clf_report = _pd.DataFrame(
206
- _classification_report(
207
- true_class,
208
- pred_class,
209
- labels=_np.arange(len(labels)),
210
- target_names=labels,
211
- output_dict=True,
212
- )
213
- )
214
-
215
- clf_report["accuracy"] = balanced_acc
216
- clf_report = _pd.concat(
217
- [
218
- clf_report[labels],
219
- clf_report[["accuracy", "macro avg", "weighted avg"]],
220
- ],
221
- axis=1,
222
- )
223
- clf_report = clf_report.rename(columns={"accuracy": "balanced accuracy"})
224
- clf_report = clf_report.round(3)
225
- clf_report["index"] = clf_report.index
226
- clf_report.loc["support", "index"] = "sample size"
227
- clf_report.set_index("index", drop=True, inplace=True)
228
- clf_report.index.name = None
229
- if show:
230
- print(f"\nClassification Report for fold#{i_fold}:\n")
231
- _pprint(clf_report)
232
- print()
233
- return clf_report
234
-
235
- def calc_AUCs(
236
- self,
237
- true_class,
238
- pred_proba,
239
- labels,
240
- i_fold,
241
- show=True,
242
- auc_plt_config=dict(
243
- figsize=(7, 7),
244
- labelsize=8,
245
- fontsize=7,
246
- legendfontsize=6,
247
- tick_size=0.8,
248
- tick_width=0.2,
249
- ),
250
- ):
251
- """ROC AUC and PRE-REC AUC."""
252
- n_classes = len(labels)
253
- assert len(_np.unique(true_class)) == n_classes
254
- if n_classes == 2:
255
- roc_auc = self._calc_AUCs_binary(
256
- true_class,
257
- pred_proba,
258
- i_fold,
259
- show=show,
260
- auc_plt_config=auc_plt_config,
261
- )
262
- else:
263
- roc_auc = self._calc_AUCs_multiple(
264
- true_class,
265
- pred_proba,
266
- labels,
267
- i_fold,
268
- show=show,
269
- auc_plt_config=auc_plt_config,
270
- )
271
- return roc_auc
272
-
273
- def _calc_AUCs_binary(
274
- self,
275
- true_class,
276
- pred_proba,
277
- i_fold,
278
- show=False,
279
- auc_plt_config=dict(
280
- figsize=(7, 7),
281
- labelsize=8,
282
- fontsize=7,
283
- legendfontsize=6,
284
- tick_size=0.8,
285
- tick_width=0.2,
286
- ),
287
- ):
288
- """Calculates metrics for binary classification."""
289
- from sklearn.metrics import (
290
- PrecisionRecallDisplay,
291
- RocCurveDisplay,
292
- auc,
293
- precision_recall_curve,
294
- roc_curve,
295
- )
296
-
297
- unique_classes = sorted(list(_np.unique(true_class)))
298
- n_classes = len(unique_classes)
299
- assert n_classes == 2, "This method is only for binary classification"
300
-
301
- # ROC curve
302
- fpr, tpr, _ = roc_curve(true_class, pred_proba)
303
- roc_auc = auc(fpr, tpr)
304
-
305
- fig_size = auc_plt_config["figsize"]
306
- fontsize = auc_plt_config["fontsize"]
307
- labelsize = auc_plt_config["labelsize"]
308
- legendfontsize = auc_plt_config["legendfontsize"]
309
- tick_size = auc_plt_config["tick_size"]
310
- tick_width = auc_plt_config["tick_width"]
311
-
312
- fig_roc, ax_roc = _plt.subplots(figsize=fig_size)
313
- RocCurveDisplay(
314
- fpr=fpr,
315
- tpr=tpr,
316
- roc_auc=roc_auc,
317
- ).plot(ax=ax_roc)
318
- ax_roc.plot([0, 1], [0, 1], "k:")
319
- ax_roc.set_xlabel("False Positive Rate", fontsize=labelsize)
320
- ax_roc.set_ylabel("True Positive Rate", fontsize=labelsize)
321
- ax_roc.set_title("ROC Curve", fontsize=fontsize)
322
- ax_roc.legend(fontsize=legendfontsize)
323
- ax_roc.tick_params(
324
- axis="both",
325
- which="major",
326
- labelsize=tick_size,
327
- width=tick_width,
328
- )
329
- self.folds_dict["ROC_fig"].append(fig_roc)
330
- if show:
331
- print(f"\nROC AUC in fold#{i_fold} is {roc_auc:.3f}\n")
332
-
333
- # PRE-REC curve
334
- fig_prerec, ax_prerec = _plt.subplots(figsize=fig_size)
335
- PrecisionRecallDisplay.from_predictions(
336
- true_class,
337
- pred_proba,
338
- ax=ax_prerec,
339
- )
340
- ax_prerec.set_xlabel("Recall", fontsize=labelsize)
341
- ax_prerec.set_ylabel("Precision", fontsize=labelsize)
342
- ax_prerec.set_title("Precision-Recall Curve", fontsize=fontsize)
343
- ax_prerec.legend(fontsize=legendfontsize)
344
- ax_prerec.tick_params(
345
- axis="both",
346
- which="major",
347
- labelsize=tick_size,
348
- width=tick_width,
349
- )
350
- self.folds_dict["PRE_REC_fig"].append(fig_prerec)
351
-
352
- return roc_auc
353
-
354
-
355
- # #!/usr/bin/env python3
356
- # # -*- coding: utf-8 -*-
357
- # # Time-stamp: "2024-11-20 00:15:08 (ywatanabe)"
358
- # # File: ./scitex_repo/src/scitex/ai/ClassificationReporter.py
359
-
360
- # THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/ClassificationReporter.py"
361
-
362
- # #!/usr/bin/env python3
363
- # # -*- coding: utf-8 -*-
364
- # # Time-stamp: "2024-11-13 12:54:17 (ywatanabe)"
365
- # # File: ./scitex_repo/src/scitex/ai/ClassificationReporter.py
366
-
367
- # import os
368
- # import random
369
- # import sys
370
- # from collections import defaultdict as _defaultdict
371
- # from glob import glob as _glob
372
- # from pprint import pprint as _pprint
373
-
374
- # import matplotlib
375
- # import matplotlib.pyplot as plt
376
- # import scitex
377
- # import numpy as np
378
- # import pandas as pd
379
- # import torch
380
- # from sklearn.metrics import (
381
- # balanced_accuracy_score,
382
- # classification_report,
383
- # confusion_matrix,
384
- # matthews_corrcoef,
385
- # )
386
-
387
- # from ..reproduce import fix_seeds
388
-
389
-
390
- # class MultiClassificationReporter(object):
391
- # def __init__(self, sdir, tgts=None):
392
- # if tgts is None:
393
- # sdirs = [""]
394
- # else:
395
- # sdirs = [os.path.join(sdir, tgt, "/") for tgt in tgts]
396
- # sdirs = [sdir + tgt + "/" for tgt in tgts]
397
-
398
- # self.tgt2id = {tgt: i_tgt for i_tgt, tgt in enumerate(tgts)}
399
- # self.reporters = [ClassificationReporter(sdir) for sdir in sdirs]
400
-
401
- # def add(self, obj_name, obj, tgt=None):
402
- # i_tgt = self.tgt2id[tgt]
403
- # self.reporters[i_tgt].add(obj_name, obj)
404
-
405
- # def calc_metrics(
406
- # self,
407
- # true_class,
408
- # pred_class,
409
- # pred_proba,
410
- # labels=None,
411
- # i_fold=None,
412
- # show=True,
413
- # auc_plt_config=dict(
414
- # figsize=(7, 7),
415
- # labelsize=8,
416
- # fontsize=7,
417
- # legendfontsize=6,
418
- # tick_size=0.8,
419
- # tick_width=0.2,
420
- # ),
421
- # tgt=None,
422
- # ):
423
- # i_tgt = self.tgt2id[tgt]
424
- # self.reporters[i_tgt].calc_metrics(
425
- # true_class,
426
- # pred_class,
427
- # pred_proba,
428
- # labels=labels,
429
- # i_fold=i_fold,
430
- # show=show,
431
- # auc_plt_config=auc_plt_config,
432
- # )
433
-
434
- # def summarize(
435
- # self,
436
- # n_round=3,
437
- # show=False,
438
- # tgt=None,
439
- # ):
440
- # i_tgt = self.tgt2id[tgt]
441
- # self.reporters[i_tgt].summarize(
442
- # n_round=n_round,
443
- # show=show,
444
- # )
445
-
446
- # def save(
447
- # self,
448
- # files_to_reproduce=None,
449
- # meta_dict=None,
450
- # tgt=None,
451
- # ):
452
- # i_tgt = self.tgt2id[tgt]
453
- # self.reporters[i_tgt].save(
454
- # files_to_reproduce=files_to_reproduce,
455
- # meta_dict=meta_dict,
456
- # )
457
-
458
- # def plot_and_save_conf_mats(
459
- # self,
460
- # plt,
461
- # extend_ratio=1.0,
462
- # colorbar=True,
463
- # confmat_plt_config=None,
464
- # sci_notation_kwargs=None,
465
- # tgt=None,
466
- # ):
467
- # i_tgt = self.tgt2id[tgt]
468
- # self.reporters[i_tgt].plot_and_save_conf_mats(
469
- # plt,
470
- # extend_ratio=extend_ratio,
471
- # colorbar=colorbar,
472
- # confmat_plt_config=confmat_plt_config,
473
- # sci_notation_kwargs=sci_notation_kwargs,
474
- # )
475
-
476
-
477
- # class ClassificationReporter(object):
478
- # """Saves the following metrics under sdir.
479
- # - Balanced Accuracy
480
- # - MCC
481
- # - Confusion Matrix
482
- # - Classification Report
483
- # - ROC AUC score / curve
484
- # - PRE-REC AUC score / curve
485
-
486
- # Example is described in this file.
487
- # """
488
-
489
- # def __init__(self, sdir):
490
- # self.sdir = sdir
491
- # self.folds_dict = _defaultdict(list)
492
- # fix_seeds(os=os, random=random, np=np, torch=torch, show=False)
493
-
494
- # def add(
495
- # self,
496
- # obj_name,
497
- # obj,
498
- # ):
499
- # """
500
- # ## fig
501
- # fig, ax = plt.subplots()
502
- # ax.plot(np.random.rand(10))
503
- # reporter.add("manu_figs", fig)
504
-
505
- # ## DataFrame
506
- # df = pd.DataFrame(np.random.rand(5, 3))
507
- # reporter.add("manu_dfs", df)
508
-
509
- # ## scalar
510
- # scalar = random.random()
511
- # reporter.add("manu_scalers", scalar)
512
- # """
513
- # assert isinstance(obj_name, str)
514
- # self.folds_dict[obj_name].append(obj)
515
-
516
- # @staticmethod
517
- # def calc_bACC(true_class, pred_class, i_fold, show=False):
518
- # """Balanced ACC"""
519
- # balanced_acc = balanced_accuracy_score(true_class, pred_class)
520
- # if show:
521
- # print(f"\nBalanced ACC in fold#{i_fold} was {balanced_acc:.3f}\n")
522
- # return balanced_acc
523
-
524
- # @staticmethod
525
- # def calc_mcc(true_class, pred_class, i_fold, show=False):
526
- # """MCC"""
527
- # mcc = float(matthews_corrcoef(true_class, pred_class))
528
- # if show:
529
- # print(f"\nMCC in fold#{i_fold} was {mcc:.3f}\n")
530
- # return mcc
531
-
532
- # @staticmethod
533
- # def calc_conf_mat(true_class, pred_class, labels, i_fold, show=False):
534
- # """
535
- # Confusion Matrix
536
- # This method assumes unique classes of true_class and pred_class are the same.
537
- # """
538
- # # conf_mat = pd.DataFrame(
539
- # # data=confusion_matrix(true_class, pred_class),
540
- # # columns=pred_labels,
541
- # # index=true_labels,
542
- # # )
543
-
544
- # conf_mat = pd.DataFrame(
545
- # data=confusion_matrix(
546
- # true_class, pred_class, labels=np.arange(len(labels))
547
- # ),
548
- # columns=labels,
549
- # ).set_index(pd.Series(list(labels)))
550
-
551
- # if show:
552
- # print(f"\nConfusion Matrix in fold#{i_fold}: \n")
553
- # _pprint(conf_mat)
554
- # print()
555
-
556
- # return conf_mat
557
-
558
- # @staticmethod
559
- # def calc_clf_report(
560
- # true_class, pred_class, labels, balanced_acc, i_fold, show=False
561
- # ):
562
- # """Classification Report"""
563
- # clf_report = pd.DataFrame(
564
- # classification_report(
565
- # true_class,
566
- # pred_class,
567
- # labels=np.arange(len(labels)),
568
- # target_names=labels,
569
- # output_dict=True,
570
- # )
571
- # )
572
-
573
- # # ACC to bACC
574
- # clf_report["accuracy"] = balanced_acc
575
- # clf_report = pd.concat(
576
- # [
577
- # clf_report[labels],
578
- # clf_report[["accuracy", "macro avg", "weighted avg"]],
579
- # ],
580
- # axis=1,
581
- # )
582
- # clf_report = clf_report.rename(
583
- # columns={"accuracy": "balanced accuracy"}
584
- # )
585
- # clf_report = clf_report.round(3)
586
- # # Renames 'support' to 'sample size'
587
- # clf_report["index"] = clf_report.index
588
- # clf_report.loc["support", "index"] = "sample size"
589
- # clf_report.set_index("index", drop=True, inplace=True)
590
- # clf_report.index.name = None
591
- # if show:
592
- # print(f"\nClassification Report for fold#{i_fold}:\n")
593
- # _pprint(clf_report)
594
- # print()
595
- # return clf_report
596
-
597
- # @staticmethod
598
- # def calc_and_plot_roc_curve(
599
- # true_class, pred_proba, labels, sdir_for_csv=None
600
- # ):
601
- # # ROC-AUC
602
- # fig_roc, metrics_roc_auc_dict = scitex.ml.plt.roc_auc(
603
- # plt,
604
- # true_class,
605
- # pred_proba,
606
- # labels,
607
- # sdir_for_csv=sdir_for_csv,
608
- # )
609
- # plt.close()
610
- # return fig_roc, metrics_roc_auc_dict
611
-
612
- # @staticmethod
613
- # def calc_and_plot_pre_rec_curve(true_class, pred_proba, labels):
614
- # # PRE-REC AUC
615
- # fig_pre_rec, metrics_pre_rec_auc_dict = scitex.ml.plt.pre_rec_auc(
616
- # plt, true_class, pred_proba, labels
617
- # )
618
- # plt.close()
619
- # return fig_pre_rec, metrics_pre_rec_auc_dict
620
-
621
- # def calc_metrics(
622
- # self,
623
- # true_class,
624
- # pred_class,
625
- # pred_proba,
626
- # labels=None,
627
- # i_fold=None,
628
- # show=True,
629
- # auc_plt_config=dict(
630
- # figsize=(7, 7),
631
- # labelsize=8,
632
- # fontsize=7,
633
- # legendfontsize=6,
634
- # tick_size=0.8,
635
- # tick_width=0.2,
636
- # ),
637
- # ):
638
- # """
639
- # Calculates ACC, Confusion Matrix, Classification Report, and ROC-AUC score on a fold.
640
- # Metrics and curves will be kept in self.folds_dict.
641
- # """
642
-
643
- # ## Preparation
644
- # # for convenience
645
- # true_class = scitex.gen.torch_to_arr(true_class).astype(int).reshape(-1)
646
- # pred_class = (
647
- # scitex.gen.torch_to_arr(pred_class).astype(np.float64).reshape(-1)
648
- # )
649
- # pred_proba = scitex.gen.torch_to_arr(pred_proba).astype(np.float64)
650
-
651
- # # for curves
652
- # scitex.plt.configure_mpl(
653
- # plt,
654
- # **auc_plt_config,
655
- # )
656
-
657
- # ## Calc metrics
658
- # # Balanced ACC
659
- # bacc = self.calc_bACC(true_class, pred_class, i_fold, show=show)
660
- # self.folds_dict["balanced_acc"].append(bacc)
661
-
662
- # # MCC
663
- # self.folds_dict["mcc"].append(
664
- # self.calc_mcc(true_class, pred_class, i_fold, show=show)
665
- # )
666
-
667
- # # Confusion Matrix
668
- # self.folds_dict["conf_mat/conf_mat"].append(
669
- # self.calc_conf_mat(
670
- # true_class,
671
- # pred_class,
672
- # labels,
673
- # i_fold,
674
- # show=show,
675
- # )
676
- # )
677
-
678
- # # Classification Report
679
- # self.folds_dict["clf_report"].append(
680
- # self.calc_clf_report(
681
- # true_class, pred_class, labels, bacc, i_fold, show=show
682
- # )
683
- # )
684
-
685
- # ## Curves
686
- # # ROC curve
687
- # self.sdir_for_roc_csv = f"{self.sdir}roc/csv/"
688
- # fig_roc, metrics_roc_auc_dict = self.calc_and_plot_roc_curve(
689
- # true_class,
690
- # pred_proba,
691
- # labels,
692
- # sdir_for_csv=self.sdir_for_roc_csv + f"fold#{i_fold}/",
693
- # )
694
- # self.folds_dict["roc/micro"].append(
695
- # metrics_roc_auc_dict["roc_auc"]["micro"]
696
- # )
697
- # self.folds_dict["roc/macro"].append(
698
- # metrics_roc_auc_dict["roc_auc"]["macro"]
699
- # )
700
- # self.folds_dict["roc/figs"].append(fig_roc)
701
-
702
- # # PRE-REC curve
703
- # fig_pre_rec, metrics_pre_rec_auc_dict = (
704
- # self.calc_and_plot_pre_rec_curve(true_class, pred_proba, labels)
705
- # )
706
- # self.folds_dict["pre_rec/micro"].append(
707
- # metrics_pre_rec_auc_dict["pre_rec_auc"]["micro"]
708
- # )
709
- # self.folds_dict["pre_rec/macro"].append(
710
- # metrics_pre_rec_auc_dict["pre_rec_auc"]["macro"]
711
- # )
712
- # self.folds_dict["pre_rec/figs"].append(fig_pre_rec)
713
-
714
- # @staticmethod
715
- # def _mk_cv_index(n_folds):
716
- # return [
717
- # f"{n_folds}-folds_CV_mean",
718
- # f"{n_folds}-fold_CV_std",
719
- # ] + [f"fold#{i_fold}" for i_fold in range(n_folds)]
720
-
721
- # def summarize_roc(
722
- # self,
723
- # ):
724
-
725
- # folds_dirs = _glob(self.sdir_for_roc_csv + "fold#*")
726
- # n_folds = len(folds_dirs)
727
-
728
- # # get class names
729
- # _csv_files = _glob(os.path.join(folds_dirs[0], "*"))
730
- # classes_str = [
731
- # csv_file.split("/")[-1].split(".csv")[0] for csv_file in _csv_files
732
- # ]
733
-
734
- # # dfs_classes = []
735
- # # take mean and std by each class
736
- # for cls_str in classes_str:
737
-
738
- # fpaths_cls = [
739
- # os.path.join(fold_dir, f"{cls_str}.csv")
740
- # for fold_dir in folds_dirs
741
- # ]
742
-
743
- # ys = []
744
- # roc_aucs = []
745
- # for fpath_cls in fpaths_cls:
746
- # loaded_df = scitex.io.load(fpath_cls)
747
- # ys.append(loaded_df["y"])
748
- # roc_aucs.append(loaded_df["roc_auc"])
749
- # ys = pd.concat(ys, axis=1)
750
- # roc_aucs = pd.concat(roc_aucs, axis=1)
751
-
752
- # df_cls = loaded_df[["x"]].copy()
753
- # df_cls["y_mean"] = ys.mean(axis=1)
754
- # df_cls["y_std"] = ys.std(axis=1)
755
- # df_cls["roc_auc_mean"] = roc_aucs.mean(axis=1)
756
- # df_cls["roc_auc_std"] = roc_aucs.std(axis=1)
757
-
758
- # spath_cls = os.path.join(
759
- # self.sdir_for_roc_csv, f"k-fold_mean_std/{cls_str}.csv"
760
- # )
761
- # scitex.io.save(df_cls, spath_cls)
762
- # # dfs_classes.append(df_cls)
763
-
764
- # def summarize(
765
- # self,
766
- # n_round=3,
767
- # show=False,
768
- # ):
769
- # """
770
- # 1) Take mean and std of scalars/pd.Dataframes for folds.
771
- # 2) Replace self.folds_dict with the summarized DataFrames.
772
- # """
773
- # self.summarize_roc()
774
-
775
- # _n_folds_all = [
776
- # len(self.folds_dict[k]) for k in self.folds_dict.keys()
777
- # ] # sometimes includes 0 because AUC curves are not always defined.
778
- # self.n_folds_intended = max(_n_folds_all)
779
-
780
- # for i_k, k in enumerate(self.folds_dict.keys()):
781
- # n_folds = _n_folds_all[i_k]
782
-
783
- # if n_folds != 0:
784
- # ## listed scalars
785
- # if is_listed_X(self.folds_dict[k], [float, int]):
786
- # mm = np.mean(self.folds_dict[k])
787
- # ss = np.std(self.folds_dict[k], ddof=1)
788
- # sr = pd.DataFrame(
789
- # data=[mm, ss] + self.folds_dict[k],
790
- # index=self._mk_cv_index(n_folds),
791
- # columns=[k],
792
- # )
793
- # self.folds_dict[k] = sr.round(n_round)
794
-
795
- # ## listed pd.DataFrames
796
- # elif is_listed_X(self.folds_dict[k], pd.DataFrame):
797
- # zero_df_for_mm = 0 * self.folds_dict[k][0].copy()
798
- # zero_df_for_ss = 0 * self.folds_dict[k][0].copy()
799
-
800
- # mm = (
801
- # zero_df_for_mm
802
- # + np.stack(self.folds_dict[k]).mean(axis=0)
803
- # ).round(n_round)
804
-
805
- # ss = (
806
- # zero_df_for_ss
807
- # + np.stack(self.folds_dict[k]).std(axis=0, ddof=1)
808
- # ).round(n_round)
809
-
810
- # self.folds_dict[k] = [mm, ss] + [
811
- # df_fold.round(n_round)
812
- # for df_fold in self.folds_dict[k]
813
- # ]
814
-
815
- # if show:
816
- # print(
817
- # "\n----------------------------------------\n"
818
- # f"\n{k}\n"
819
- # f"\n{n_folds}-fold-CV mean:\n"
820
- # )
821
- # _pprint(self.folds_dict[k][0])
822
- # print(f"\n\n{n_folds}-fold-CV std.:\n")
823
- # _pprint(self.folds_dict[k][1])
824
- # print("\n\n----------------------------------------\n")
825
-
826
- # ## listed figures
827
- # elif is_listed_X(self.folds_dict[k], matplotlib.figure.Figure):
828
- # pass
829
-
830
- # else:
831
- # print(f"{k} was not summarized")
832
- # print(type(self.folds_dict[k][0]))
833
-
834
- # def save(
835
- # self,
836
- # files_to_reproduce=None,
837
- # meta_dict=None,
838
- # ):
839
- # """
840
- # 1) Saves the content of self.folds_dict.
841
- # 2) Plots the colormap of confusion matrices and saves them.
842
- # 3) Saves passed meta_dict under self.sdir
843
-
844
- # Example:
845
- # meta_df_1 = pd.DataFrame(data=np.random.rand(3,3))
846
- # meta_dict_1 = {"a": 0}
847
- # meta_dict_2 = {"b": 0}
848
- # meta_dict = {"meta_1.csv": meta_df_1,
849
- # "meta_1.yaml": meta_dict_1,
850
- # "meta_2.yaml": meta_dict_1,
851
- # }
852
-
853
- # """
854
- # if meta_dict is not None:
855
- # for k, v in meta_dict.items():
856
- # scitex.io.save(v, self.sdir + k)
857
-
858
- # for k in self.folds_dict.keys():
859
-
860
- # ## pd.Series / pd.DataFrame
861
- # if isinstance(self.folds_dict[k], pd.Series) or isinstance(
862
- # self.folds_dict[k], pd.DataFrame
863
- # ):
864
- # scitex.io.save(self.folds_dict[k], self.sdir + f"{k}.csv")
865
-
866
- # ## listed pd.DataFrame
867
- # elif is_listed_X(self.folds_dict[k], pd.DataFrame):
868
- # scitex.io.save(
869
- # self.folds_dict[k],
870
- # self.sdir + f"{k}.csv",
871
- # # indi_suffix=self.cv_index,
872
- # indi_suffix=self._mk_cv_index(len(self.folds_dict[k])),
873
- # )
874
-
875
- # ## listed figures
876
- # elif is_listed_X(self.folds_dict[k], matplotlib.figure.Figure):
877
- # for i_fold, fig in enumerate(self.folds_dict[k]):
878
- # scitex.io.save(
879
- # self.folds_dict[k][i_fold],
880
- # self.sdir + f"{k}/fold#{i_fold}.png",
881
- # )
882
-
883
- # else:
884
- # print(f"{k} was not saved")
885
- # print(type(self.folds_dict[k]))
886
-
887
- # if files_to_reproduce is not None:
888
- # if isinstance(files_to_reproduce, list):
889
- # files_to_reproduce = [files_to_reproduce]
890
- # for f in files_to_reproduce:
891
- # scitex.io.save(f, self.sdir)
892
-
893
- # def plot_and_save_conf_mats(
894
- # self,
895
- # plt,
896
- # extend_ratio=1.0,
897
- # colorbar=True,
898
- # confmat_plt_config=None,
899
- # sci_notation_kwargs=None,
900
- # ):
901
- # def _inner_plot_conf_mat(
902
- # plt,
903
- # cm_df,
904
- # title,
905
- # extend_ratio=1.0,
906
- # colorbar=True,
907
- # sci_notation_kwargs=None,
908
- # ):
909
- # labels = list(cm_df.columns)
910
- # fig_conf_mat = scitex.ml.plt.confusion_matrix(
911
- # plt,
912
- # cm_df.T,
913
- # labels=labels,
914
- # title=title,
915
- # x_extend_ratio=extend_ratio,
916
- # y_extend_ratio=extend_ratio,
917
- # colorbar=colorbar,
918
- # )
919
-
920
- # if sci_notation_kwargs is not None:
921
- # fig_conf_mat.axes[-1] = scitex.plt.ax_scientific_notation(
922
- # fig_conf_mat.axes[-1], **sci_notation_kwargs
923
- # )
924
- # return fig_conf_mat
925
-
926
- # ## Configures mpl
927
- # scitex.plt.configure_mpl(
928
- # plt,
929
- # **confmat_plt_config,
930
- # )
931
-
932
- # ########################################
933
- # ## Prepares confmats dfs
934
- # ########################################
935
- # ## Drops mean and std for the folds
936
- # try:
937
- # conf_mats = self.folds_dict["conf_mat/conf_mat"][
938
- # -self.n_folds_intended :
939
- # ]
940
-
941
- # except Exception as e:
942
- # print(e)
943
- # conf_mats = self.folds_dict["conf_mat/conf_mat"]
944
-
945
- # ## Prepaires conf_mat_overall_sum
946
- # conf_mat_zero = 0 * conf_mats[0].copy() # get the table format
947
- # conf_mat_overall_sum = conf_mat_zero + np.stack(conf_mats).sum(axis=0)
948
-
949
- # ########################################
950
- # ## Plots & Saves
951
- # ########################################
952
- # # each fold's conf
953
- # for i_fold, cm in enumerate(conf_mats):
954
- # title = f"Test fold#{i_fold}"
955
- # fig_conf_mat_fold = _inner_plot_conf_mat(
956
- # plt,
957
- # cm,
958
- # title,
959
- # extend_ratio=extend_ratio,
960
- # colorbar=colorbar,
961
- # sci_notation_kwargs=sci_notation_kwargs,
962
- # )
963
- # scitex.io.save(
964
- # fig_conf_mat_fold,
965
- # self.sdir + f"conf_mat/figs/fold#{i_fold}.png",
966
- # )
967
- # plt.close()
968
-
969
- # ## overall_sum conf_mat
970
- # title = f"{self.n_folds_intended}-CV overall sum"
971
- # fig_conf_mat_overall_sum = _inner_plot_conf_mat(
972
- # plt,
973
- # conf_mat_overall_sum,
974
- # title,
975
- # extend_ratio=extend_ratio,
976
- # colorbar=colorbar,
977
- # sci_notation_kwargs=sci_notation_kwargs,
978
- # )
979
- # scitex.io.save(
980
- # fig_conf_mat_overall_sum,
981
- # self.sdir
982
- # + f"conf_mat/figs/{self.n_folds_intended}-fold_cv_overall-sum.png",
983
- # )
984
- # plt.close()
985
-
986
-
987
- # if __name__ == "__main__":
988
- # import random
989
- # import sys
990
-
991
- # import scitex
992
- # import numpy as np
993
- # from catboost import CatBoostClassifier, Pool
994
- # from sklearn.datasets import load_digits
995
- # from sklearn.model_selection import StratifiedKFold
996
-
997
- # ################################################################################
998
- # ## Sets tee
999
- # ################################################################################
1000
- # sdir = scitex.io.mk_spath(
1001
- # "./tmp/sdir-ClassificationReporter/"
1002
- # ) # "/tmp/sdir/"
1003
- # sys.stdout, sys.stderr = scitex.gen.tee(sys, sdir)
1004
-
1005
- # ################################################################################
1006
- # ## Fixes seeds
1007
- # ################################################################################
1008
- # fix_seeds(np=np)
1009
-
1010
- # ## Loads
1011
- # mnist = load_digits()
1012
- # X, T = mnist.data, mnist.target
1013
- # labels = mnist.target_names.astype(str)
1014
-
1015
- # ## Main
1016
- # skf = StratifiedKFold(n_splits=5, shuffle=True)
1017
- # # reporter = ClassificationReporter(sdir)
1018
- # mreporter = MultiClassificationReporter(sdir, tgts=["Test1", "Test2"])
1019
- # for i_fold, (indi_tra, indi_tes) in enumerate(skf.split(X, T)):
1020
- # X_tra, T_tra = X[indi_tra], T[indi_tra]
1021
- # X_tes, T_tes = X[indi_tes], T[indi_tes]
1022
-
1023
- # clf = CatBoostClassifier(verbose=False)
1024
-
1025
- # clf.fit(X_tra, T_tra, verbose=False)
1026
-
1027
- # ## Prediction
1028
- # pred_proba_tes = clf.predict_proba(X_tes)
1029
- # pred_cls_tes = np.argmax(pred_proba_tes, axis=1)
1030
-
1031
- # pred_cls_tes[pred_cls_tes == 9] = 8 # overide 9 as 8 # fixme
1032
-
1033
- # ##############################
1034
- # ## Manually adds objects to reporter to save
1035
- # ##############################
1036
- # ## Figure
1037
- # fig, ax = plt.subplots()
1038
- # ax.plot(np.arange(10))
1039
- # # reporter.add("manu_figs", fig)
1040
- # mreporter.add("manu_figs", fig, tgt="Test1")
1041
- # mreporter.add("manu_figs", fig, tgt="Test2")
1042
-
1043
- # ## DataFrame
1044
- # df = pd.DataFrame(np.random.rand(5, 3))
1045
- # # reporter.add("manu_dfs", df)
1046
- # mreporter.add("manu_dfs", df, tgt="Test1")
1047
- # mreporter.add("manu_dfs", df, tgt="Test2")
1048
-
1049
- # ## Scalar
1050
- # scalar = random.random()
1051
- # # reporter.add(
1052
- # # "manu_scalars",
1053
- # # scalar,
1054
- # # )
1055
- # mreporter.add("manu_scalars", scalar, tgt="Test1")
1056
- # mreporter.add("manu_scalars", scalar, tgt="Test2")
1057
-
1058
- # ########################################
1059
- # ## Metrics
1060
- # ########################################
1061
- # mreporter.calc_metrics(
1062
- # T_tes,
1063
- # pred_cls_tes,
1064
- # pred_proba_tes,
1065
- # labels=labels,
1066
- # i_fold=i_fold,
1067
- # tgt="Test1",
1068
- # )
1069
- # mreporter.calc_metrics(
1070
- # T_tes,
1071
- # pred_cls_tes,
1072
- # pred_proba_tes,
1073
- # labels=labels,
1074
- # i_fold=i_fold,
1075
- # tgt="Test2",
1076
- # )
1077
-
1078
- # # reporter.summarize(show=True)
1079
- # mreporter.summarize(show=True, tgt="Test1")
1080
- # mreporter.summarize(show=True, tgt="Test2")
1081
-
1082
- # fake_fpaths = ["fake_file_1.txt", "fake_file_2.txt"]
1083
- # for ff in fake_fpaths:
1084
- # scitex.io.touch(ff)
1085
-
1086
- # files_to_reproduce = [
1087
- # scitex.gen.get_this_fpath(when_ipython="/dev/null"),
1088
- # *fake_fpaths,
1089
- # ]
1090
- # # reporter.save(files_to_reproduce=files_to_reproduce)
1091
- # mreporter.save(files_to_reproduce=files_to_reproduce, tgt="Test1")
1092
- # mreporter.save(files_to_reproduce=files_to_reproduce, tgt="Test2")
1093
-
1094
- # confmat_plt_config = dict(
1095
- # figsize=(8, 8),
1096
- # # labelsize=8,
1097
- # # fontsize=6,
1098
- # # legendfontsize=6,
1099
- # figscale=2,
1100
- # tick_size=0.8,
1101
- # tick_width=0.2,
1102
- # )
1103
-
1104
- # sci_notation_kwargs = dict(
1105
- # order=1,
1106
- # fformat="%1.0d",
1107
- # scilimits=(-3, 3),
1108
- # x=False,
1109
- # y=True,
1110
- # ) # "%3.1f"
1111
-
1112
- # # sci_notation_kwargs = None
1113
- # # reporter.plot_and_save_conf_mats(
1114
- # # plt,
1115
- # # extend_ratio=1.0,
1116
- # # confmat_plt_config=confmat_plt_config,
1117
- # # sci_notation_kwargs=sci_notation_kwargs,
1118
- # # )
1119
-
1120
- # mreporter.plot_and_save_conf_mats(
1121
- # plt,
1122
- # extend_ratio=1.0,
1123
- # confmat_plt_config=confmat_plt_config,
1124
- # sci_notation_kwargs=sci_notation_kwargs,
1125
- # tgt="Test1",
1126
- # )
1127
- # mreporter.plot_and_save_conf_mats(
1128
- # plt,
1129
- # extend_ratio=1.0,
1130
- # confmat_plt_config=confmat_plt_config,
1131
- # sci_notation_kwargs=sci_notation_kwargs,
1132
- # tgt="Test2",
1133
- # )
1134
-
1135
- # python -m scitex.ai.ClassificationReporter
1136
-
1137
- # EOF