scitex 2.0.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 (572) hide show
  1. scitex/__init__.py +73 -0
  2. scitex/__main__.py +89 -0
  3. scitex/__version__.py +14 -0
  4. scitex/_sh.py +59 -0
  5. scitex/ai/_LearningCurveLogger.py +583 -0
  6. scitex/ai/__Classifiers.py +101 -0
  7. scitex/ai/__init__.py +55 -0
  8. scitex/ai/_gen_ai/_Anthropic.py +173 -0
  9. scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
  10. scitex/ai/_gen_ai/_DeepSeek.py +175 -0
  11. scitex/ai/_gen_ai/_Google.py +161 -0
  12. scitex/ai/_gen_ai/_Groq.py +97 -0
  13. scitex/ai/_gen_ai/_Llama.py +142 -0
  14. scitex/ai/_gen_ai/_OpenAI.py +230 -0
  15. scitex/ai/_gen_ai/_PARAMS.py +565 -0
  16. scitex/ai/_gen_ai/_Perplexity.py +191 -0
  17. scitex/ai/_gen_ai/__init__.py +32 -0
  18. scitex/ai/_gen_ai/_calc_cost.py +78 -0
  19. scitex/ai/_gen_ai/_format_output_func.py +183 -0
  20. scitex/ai/_gen_ai/_genai_factory.py +71 -0
  21. scitex/ai/act/__init__.py +8 -0
  22. scitex/ai/act/_define.py +11 -0
  23. scitex/ai/classification/__init__.py +7 -0
  24. scitex/ai/classification/classification_reporter.py +1137 -0
  25. scitex/ai/classification/classifier_server.py +131 -0
  26. scitex/ai/classification/classifiers.py +101 -0
  27. scitex/ai/classification_reporter.py +1161 -0
  28. scitex/ai/classifier_server.py +131 -0
  29. scitex/ai/clustering/__init__.py +11 -0
  30. scitex/ai/clustering/_pca.py +115 -0
  31. scitex/ai/clustering/_umap.py +376 -0
  32. scitex/ai/early_stopping.py +149 -0
  33. scitex/ai/feature_extraction/__init__.py +56 -0
  34. scitex/ai/feature_extraction/vit.py +148 -0
  35. scitex/ai/genai/__init__.py +277 -0
  36. scitex/ai/genai/anthropic.py +177 -0
  37. scitex/ai/genai/anthropic_provider.py +320 -0
  38. scitex/ai/genai/anthropic_refactored.py +109 -0
  39. scitex/ai/genai/auth_manager.py +200 -0
  40. scitex/ai/genai/base_genai.py +336 -0
  41. scitex/ai/genai/base_provider.py +291 -0
  42. scitex/ai/genai/calc_cost.py +78 -0
  43. scitex/ai/genai/chat_history.py +307 -0
  44. scitex/ai/genai/cost_tracker.py +276 -0
  45. scitex/ai/genai/deepseek.py +188 -0
  46. scitex/ai/genai/deepseek_provider.py +251 -0
  47. scitex/ai/genai/format_output_func.py +183 -0
  48. scitex/ai/genai/genai_factory.py +71 -0
  49. scitex/ai/genai/google.py +169 -0
  50. scitex/ai/genai/google_provider.py +228 -0
  51. scitex/ai/genai/groq.py +104 -0
  52. scitex/ai/genai/groq_provider.py +248 -0
  53. scitex/ai/genai/image_processor.py +250 -0
  54. scitex/ai/genai/llama.py +155 -0
  55. scitex/ai/genai/llama_provider.py +214 -0
  56. scitex/ai/genai/mock_provider.py +127 -0
  57. scitex/ai/genai/model_registry.py +304 -0
  58. scitex/ai/genai/openai.py +230 -0
  59. scitex/ai/genai/openai_provider.py +293 -0
  60. scitex/ai/genai/params.py +565 -0
  61. scitex/ai/genai/perplexity.py +202 -0
  62. scitex/ai/genai/perplexity_provider.py +205 -0
  63. scitex/ai/genai/provider_base.py +302 -0
  64. scitex/ai/genai/provider_factory.py +370 -0
  65. scitex/ai/genai/response_handler.py +235 -0
  66. scitex/ai/layer/_Pass.py +21 -0
  67. scitex/ai/layer/__init__.py +10 -0
  68. scitex/ai/layer/_switch.py +8 -0
  69. scitex/ai/loss/_L1L2Losses.py +34 -0
  70. scitex/ai/loss/__init__.py +12 -0
  71. scitex/ai/loss/multi_task_loss.py +47 -0
  72. scitex/ai/metrics/__init__.py +9 -0
  73. scitex/ai/metrics/_bACC.py +51 -0
  74. scitex/ai/metrics/silhoute_score_block.py +496 -0
  75. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
  76. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
  77. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
  78. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
  79. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
  80. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
  81. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
  82. scitex/ai/optim/__init__.py +13 -0
  83. scitex/ai/optim/_get_set.py +31 -0
  84. scitex/ai/optim/_optimizers.py +71 -0
  85. scitex/ai/plt/__init__.py +21 -0
  86. scitex/ai/plt/_conf_mat.py +592 -0
  87. scitex/ai/plt/_learning_curve.py +194 -0
  88. scitex/ai/plt/_optuna_study.py +111 -0
  89. scitex/ai/plt/aucs/__init__.py +2 -0
  90. scitex/ai/plt/aucs/example.py +60 -0
  91. scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
  92. scitex/ai/plt/aucs/roc_auc.py +246 -0
  93. scitex/ai/sampling/undersample.py +29 -0
  94. scitex/ai/sk/__init__.py +11 -0
  95. scitex/ai/sk/_clf.py +58 -0
  96. scitex/ai/sk/_to_sktime.py +100 -0
  97. scitex/ai/sklearn/__init__.py +26 -0
  98. scitex/ai/sklearn/clf.py +58 -0
  99. scitex/ai/sklearn/to_sktime.py +100 -0
  100. scitex/ai/training/__init__.py +7 -0
  101. scitex/ai/training/early_stopping.py +150 -0
  102. scitex/ai/training/learning_curve_logger.py +555 -0
  103. scitex/ai/utils/__init__.py +22 -0
  104. scitex/ai/utils/_check_params.py +50 -0
  105. scitex/ai/utils/_default_dataset.py +46 -0
  106. scitex/ai/utils/_format_samples_for_sktime.py +26 -0
  107. scitex/ai/utils/_label_encoder.py +134 -0
  108. scitex/ai/utils/_merge_labels.py +22 -0
  109. scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
  110. scitex/ai/utils/_under_sample.py +51 -0
  111. scitex/ai/utils/_verify_n_gpus.py +16 -0
  112. scitex/ai/utils/grid_search.py +148 -0
  113. scitex/context/__init__.py +9 -0
  114. scitex/context/_suppress_output.py +38 -0
  115. scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
  116. scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
  117. scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
  118. scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
  119. scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
  120. scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
  121. scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
  122. scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
  123. scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
  124. scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
  125. scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
  126. scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
  127. scitex/db/_BaseMixins/__init__.py +30 -0
  128. scitex/db/_PostgreSQL.py +126 -0
  129. scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
  130. scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
  131. scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
  132. scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
  133. scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
  134. scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
  135. scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
  136. scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
  137. scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
  138. scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
  139. scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
  140. scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
  141. scitex/db/_PostgreSQLMixins/__init__.py +34 -0
  142. scitex/db/_SQLite3.py +2136 -0
  143. scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
  144. scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
  145. scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
  146. scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
  147. scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
  148. scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
  149. scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
  150. scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
  151. scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
  152. scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
  153. scitex/db/_SQLite3Mixins/__init__.py +30 -0
  154. scitex/db/__init__.py +14 -0
  155. scitex/db/_delete_duplicates.py +397 -0
  156. scitex/db/_inspect.py +163 -0
  157. scitex/decorators/__init__.py +54 -0
  158. scitex/decorators/_auto_order.py +172 -0
  159. scitex/decorators/_batch_fn.py +127 -0
  160. scitex/decorators/_cache_disk.py +32 -0
  161. scitex/decorators/_cache_mem.py +12 -0
  162. scitex/decorators/_combined.py +98 -0
  163. scitex/decorators/_converters.py +282 -0
  164. scitex/decorators/_deprecated.py +26 -0
  165. scitex/decorators/_not_implemented.py +30 -0
  166. scitex/decorators/_numpy_fn.py +86 -0
  167. scitex/decorators/_pandas_fn.py +121 -0
  168. scitex/decorators/_preserve_doc.py +19 -0
  169. scitex/decorators/_signal_fn.py +95 -0
  170. scitex/decorators/_timeout.py +55 -0
  171. scitex/decorators/_torch_fn.py +136 -0
  172. scitex/decorators/_wrap.py +39 -0
  173. scitex/decorators/_xarray_fn.py +88 -0
  174. scitex/dev/__init__.py +15 -0
  175. scitex/dev/_analyze_code_flow.py +284 -0
  176. scitex/dev/_reload.py +59 -0
  177. scitex/dict/_DotDict.py +442 -0
  178. scitex/dict/__init__.py +18 -0
  179. scitex/dict/_listed_dict.py +42 -0
  180. scitex/dict/_pop_keys.py +36 -0
  181. scitex/dict/_replace.py +13 -0
  182. scitex/dict/_safe_merge.py +62 -0
  183. scitex/dict/_to_str.py +32 -0
  184. scitex/dsp/__init__.py +72 -0
  185. scitex/dsp/_crop.py +122 -0
  186. scitex/dsp/_demo_sig.py +331 -0
  187. scitex/dsp/_detect_ripples.py +212 -0
  188. scitex/dsp/_ensure_3d.py +18 -0
  189. scitex/dsp/_hilbert.py +78 -0
  190. scitex/dsp/_listen.py +702 -0
  191. scitex/dsp/_misc.py +30 -0
  192. scitex/dsp/_mne.py +32 -0
  193. scitex/dsp/_modulation_index.py +79 -0
  194. scitex/dsp/_pac.py +319 -0
  195. scitex/dsp/_psd.py +102 -0
  196. scitex/dsp/_resample.py +65 -0
  197. scitex/dsp/_time.py +36 -0
  198. scitex/dsp/_transform.py +68 -0
  199. scitex/dsp/_wavelet.py +212 -0
  200. scitex/dsp/add_noise.py +111 -0
  201. scitex/dsp/example.py +253 -0
  202. scitex/dsp/filt.py +155 -0
  203. scitex/dsp/norm.py +18 -0
  204. scitex/dsp/params.py +51 -0
  205. scitex/dsp/reference.py +43 -0
  206. scitex/dsp/template.py +25 -0
  207. scitex/dsp/utils/__init__.py +15 -0
  208. scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
  209. scitex/dsp/utils/_ensure_3d.py +18 -0
  210. scitex/dsp/utils/_ensure_even_len.py +10 -0
  211. scitex/dsp/utils/_zero_pad.py +48 -0
  212. scitex/dsp/utils/filter.py +408 -0
  213. scitex/dsp/utils/pac.py +177 -0
  214. scitex/dt/__init__.py +8 -0
  215. scitex/dt/_linspace.py +130 -0
  216. scitex/etc/__init__.py +15 -0
  217. scitex/etc/wait_key.py +34 -0
  218. scitex/gen/_DimHandler.py +196 -0
  219. scitex/gen/_TimeStamper.py +244 -0
  220. scitex/gen/__init__.py +95 -0
  221. scitex/gen/_alternate_kwarg.py +13 -0
  222. scitex/gen/_cache.py +11 -0
  223. scitex/gen/_check_host.py +34 -0
  224. scitex/gen/_ci.py +12 -0
  225. scitex/gen/_close.py +222 -0
  226. scitex/gen/_embed.py +78 -0
  227. scitex/gen/_inspect_module.py +257 -0
  228. scitex/gen/_is_ipython.py +12 -0
  229. scitex/gen/_less.py +48 -0
  230. scitex/gen/_list_packages.py +139 -0
  231. scitex/gen/_mat2py.py +88 -0
  232. scitex/gen/_norm.py +170 -0
  233. scitex/gen/_paste.py +18 -0
  234. scitex/gen/_print_config.py +84 -0
  235. scitex/gen/_shell.py +48 -0
  236. scitex/gen/_src.py +111 -0
  237. scitex/gen/_start.py +451 -0
  238. scitex/gen/_symlink.py +55 -0
  239. scitex/gen/_symlog.py +27 -0
  240. scitex/gen/_tee.py +238 -0
  241. scitex/gen/_title2path.py +60 -0
  242. scitex/gen/_title_case.py +88 -0
  243. scitex/gen/_to_even.py +84 -0
  244. scitex/gen/_to_odd.py +34 -0
  245. scitex/gen/_to_rank.py +39 -0
  246. scitex/gen/_transpose.py +37 -0
  247. scitex/gen/_type.py +78 -0
  248. scitex/gen/_var_info.py +73 -0
  249. scitex/gen/_wrap.py +17 -0
  250. scitex/gen/_xml2dict.py +76 -0
  251. scitex/gen/misc.py +730 -0
  252. scitex/gen/path.py +0 -0
  253. scitex/general/__init__.py +5 -0
  254. scitex/gists/_SigMacro_processFigure_S.py +128 -0
  255. scitex/gists/_SigMacro_toBlue.py +172 -0
  256. scitex/gists/__init__.py +12 -0
  257. scitex/io/_H5Explorer.py +292 -0
  258. scitex/io/__init__.py +82 -0
  259. scitex/io/_cache.py +101 -0
  260. scitex/io/_flush.py +24 -0
  261. scitex/io/_glob.py +103 -0
  262. scitex/io/_json2md.py +113 -0
  263. scitex/io/_load.py +168 -0
  264. scitex/io/_load_configs.py +146 -0
  265. scitex/io/_load_modules/__init__.py +38 -0
  266. scitex/io/_load_modules/_catboost.py +66 -0
  267. scitex/io/_load_modules/_con.py +20 -0
  268. scitex/io/_load_modules/_db.py +24 -0
  269. scitex/io/_load_modules/_docx.py +42 -0
  270. scitex/io/_load_modules/_eeg.py +110 -0
  271. scitex/io/_load_modules/_hdf5.py +196 -0
  272. scitex/io/_load_modules/_image.py +19 -0
  273. scitex/io/_load_modules/_joblib.py +19 -0
  274. scitex/io/_load_modules/_json.py +18 -0
  275. scitex/io/_load_modules/_markdown.py +103 -0
  276. scitex/io/_load_modules/_matlab.py +37 -0
  277. scitex/io/_load_modules/_numpy.py +39 -0
  278. scitex/io/_load_modules/_optuna.py +155 -0
  279. scitex/io/_load_modules/_pandas.py +69 -0
  280. scitex/io/_load_modules/_pdf.py +31 -0
  281. scitex/io/_load_modules/_pickle.py +24 -0
  282. scitex/io/_load_modules/_torch.py +16 -0
  283. scitex/io/_load_modules/_txt.py +126 -0
  284. scitex/io/_load_modules/_xml.py +49 -0
  285. scitex/io/_load_modules/_yaml.py +23 -0
  286. scitex/io/_mv_to_tmp.py +19 -0
  287. scitex/io/_path.py +286 -0
  288. scitex/io/_reload.py +78 -0
  289. scitex/io/_save.py +539 -0
  290. scitex/io/_save_modules/__init__.py +66 -0
  291. scitex/io/_save_modules/_catboost.py +22 -0
  292. scitex/io/_save_modules/_csv.py +89 -0
  293. scitex/io/_save_modules/_excel.py +49 -0
  294. scitex/io/_save_modules/_hdf5.py +249 -0
  295. scitex/io/_save_modules/_html.py +48 -0
  296. scitex/io/_save_modules/_image.py +140 -0
  297. scitex/io/_save_modules/_joblib.py +25 -0
  298. scitex/io/_save_modules/_json.py +25 -0
  299. scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
  300. scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
  301. scitex/io/_save_modules/_matlab.py +24 -0
  302. scitex/io/_save_modules/_mp4.py +29 -0
  303. scitex/io/_save_modules/_numpy.py +57 -0
  304. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
  305. scitex/io/_save_modules/_pickle.py +45 -0
  306. scitex/io/_save_modules/_plotly.py +27 -0
  307. scitex/io/_save_modules/_text.py +23 -0
  308. scitex/io/_save_modules/_torch.py +26 -0
  309. scitex/io/_save_modules/_yaml.py +29 -0
  310. scitex/life/__init__.py +10 -0
  311. scitex/life/_monitor_rain.py +49 -0
  312. scitex/linalg/__init__.py +17 -0
  313. scitex/linalg/_distance.py +63 -0
  314. scitex/linalg/_geometric_median.py +64 -0
  315. scitex/linalg/_misc.py +73 -0
  316. scitex/nn/_AxiswiseDropout.py +27 -0
  317. scitex/nn/_BNet.py +126 -0
  318. scitex/nn/_BNet_Res.py +164 -0
  319. scitex/nn/_ChannelGainChanger.py +44 -0
  320. scitex/nn/_DropoutChannels.py +50 -0
  321. scitex/nn/_Filters.py +489 -0
  322. scitex/nn/_FreqGainChanger.py +110 -0
  323. scitex/nn/_GaussianFilter.py +48 -0
  324. scitex/nn/_Hilbert.py +111 -0
  325. scitex/nn/_MNet_1000.py +157 -0
  326. scitex/nn/_ModulationIndex.py +221 -0
  327. scitex/nn/_PAC.py +414 -0
  328. scitex/nn/_PSD.py +40 -0
  329. scitex/nn/_ResNet1D.py +120 -0
  330. scitex/nn/_SpatialAttention.py +25 -0
  331. scitex/nn/_Spectrogram.py +161 -0
  332. scitex/nn/_SwapChannels.py +50 -0
  333. scitex/nn/_TransposeLayer.py +19 -0
  334. scitex/nn/_Wavelet.py +183 -0
  335. scitex/nn/__init__.py +63 -0
  336. scitex/os/__init__.py +8 -0
  337. scitex/os/_mv.py +50 -0
  338. scitex/parallel/__init__.py +8 -0
  339. scitex/parallel/_run.py +151 -0
  340. scitex/path/__init__.py +33 -0
  341. scitex/path/_clean.py +52 -0
  342. scitex/path/_find.py +108 -0
  343. scitex/path/_get_module_path.py +51 -0
  344. scitex/path/_get_spath.py +35 -0
  345. scitex/path/_getsize.py +18 -0
  346. scitex/path/_increment_version.py +87 -0
  347. scitex/path/_mk_spath.py +51 -0
  348. scitex/path/_path.py +19 -0
  349. scitex/path/_split.py +23 -0
  350. scitex/path/_this_path.py +19 -0
  351. scitex/path/_version.py +101 -0
  352. scitex/pd/__init__.py +41 -0
  353. scitex/pd/_find_indi.py +126 -0
  354. scitex/pd/_find_pval.py +113 -0
  355. scitex/pd/_force_df.py +154 -0
  356. scitex/pd/_from_xyz.py +71 -0
  357. scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
  358. scitex/pd/_melt_cols.py +81 -0
  359. scitex/pd/_merge_columns.py +221 -0
  360. scitex/pd/_mv.py +63 -0
  361. scitex/pd/_replace.py +62 -0
  362. scitex/pd/_round.py +93 -0
  363. scitex/pd/_slice.py +63 -0
  364. scitex/pd/_sort.py +91 -0
  365. scitex/pd/_to_numeric.py +53 -0
  366. scitex/pd/_to_xy.py +59 -0
  367. scitex/pd/_to_xyz.py +110 -0
  368. scitex/plt/__init__.py +36 -0
  369. scitex/plt/_subplots/_AxesWrapper.py +182 -0
  370. scitex/plt/_subplots/_AxisWrapper.py +249 -0
  371. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
  372. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
  373. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
  374. scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
  375. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
  376. scitex/plt/_subplots/_FigWrapper.py +226 -0
  377. scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
  378. scitex/plt/_subplots/__init__.py +111 -0
  379. scitex/plt/_subplots/_export_as_csv.py +232 -0
  380. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
  381. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
  382. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
  383. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
  384. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
  385. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
  386. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
  387. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
  388. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
  389. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
  390. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
  391. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
  392. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
  393. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
  394. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
  395. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
  396. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
  397. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
  398. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
  399. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
  400. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
  401. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
  402. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
  403. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
  404. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
  405. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
  406. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
  407. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
  408. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
  409. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
  410. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
  411. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
  412. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
  413. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
  414. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
  415. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
  416. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
  417. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
  418. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
  419. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
  420. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
  421. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
  422. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
  423. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
  424. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
  425. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
  426. scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
  427. scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
  428. scitex/plt/_tpl.py +28 -0
  429. scitex/plt/ax/__init__.py +114 -0
  430. scitex/plt/ax/_plot/__init__.py +53 -0
  431. scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
  432. scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
  433. scitex/plt/ax/_plot/_plot_cube.py +57 -0
  434. scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
  435. scitex/plt/ax/_plot/_plot_fillv.py +55 -0
  436. scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
  437. scitex/plt/ax/_plot/_plot_image.py +94 -0
  438. scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
  439. scitex/plt/ax/_plot/_plot_raster.py +172 -0
  440. scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
  441. scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
  442. scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
  443. scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
  444. scitex/plt/ax/_plot/_plot_violin.py +343 -0
  445. scitex/plt/ax/_style/__init__.py +38 -0
  446. scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
  447. scitex/plt/ax/_style/_add_panel.py +92 -0
  448. scitex/plt/ax/_style/_extend.py +64 -0
  449. scitex/plt/ax/_style/_force_aspect.py +37 -0
  450. scitex/plt/ax/_style/_format_label.py +23 -0
  451. scitex/plt/ax/_style/_hide_spines.py +84 -0
  452. scitex/plt/ax/_style/_map_ticks.py +182 -0
  453. scitex/plt/ax/_style/_rotate_labels.py +215 -0
  454. scitex/plt/ax/_style/_sci_note.py +279 -0
  455. scitex/plt/ax/_style/_set_log_scale.py +299 -0
  456. scitex/plt/ax/_style/_set_meta.py +261 -0
  457. scitex/plt/ax/_style/_set_n_ticks.py +37 -0
  458. scitex/plt/ax/_style/_set_size.py +16 -0
  459. scitex/plt/ax/_style/_set_supxyt.py +116 -0
  460. scitex/plt/ax/_style/_set_ticks.py +276 -0
  461. scitex/plt/ax/_style/_set_xyt.py +121 -0
  462. scitex/plt/ax/_style/_share_axes.py +264 -0
  463. scitex/plt/ax/_style/_shift.py +139 -0
  464. scitex/plt/ax/_style/_show_spines.py +333 -0
  465. scitex/plt/color/_PARAMS.py +70 -0
  466. scitex/plt/color/__init__.py +52 -0
  467. scitex/plt/color/_add_hue_col.py +41 -0
  468. scitex/plt/color/_colors.py +205 -0
  469. scitex/plt/color/_get_colors_from_cmap.py +134 -0
  470. scitex/plt/color/_interpolate.py +29 -0
  471. scitex/plt/color/_vizualize_colors.py +54 -0
  472. scitex/plt/utils/__init__.py +44 -0
  473. scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
  474. scitex/plt/utils/_calc_nice_ticks.py +101 -0
  475. scitex/plt/utils/_close.py +68 -0
  476. scitex/plt/utils/_colorbar.py +96 -0
  477. scitex/plt/utils/_configure_mpl.py +295 -0
  478. scitex/plt/utils/_histogram_utils.py +132 -0
  479. scitex/plt/utils/_im2grid.py +70 -0
  480. scitex/plt/utils/_is_valid_axis.py +78 -0
  481. scitex/plt/utils/_mk_colorbar.py +65 -0
  482. scitex/plt/utils/_mk_patches.py +26 -0
  483. scitex/plt/utils/_scientific_captions.py +638 -0
  484. scitex/plt/utils/_scitex_config.py +223 -0
  485. scitex/reproduce/__init__.py +14 -0
  486. scitex/reproduce/_fix_seeds.py +45 -0
  487. scitex/reproduce/_gen_ID.py +55 -0
  488. scitex/reproduce/_gen_timestamp.py +35 -0
  489. scitex/res/__init__.py +5 -0
  490. scitex/resource/__init__.py +13 -0
  491. scitex/resource/_get_processor_usages.py +281 -0
  492. scitex/resource/_get_specs.py +280 -0
  493. scitex/resource/_log_processor_usages.py +190 -0
  494. scitex/resource/_utils/__init__.py +31 -0
  495. scitex/resource/_utils/_get_env_info.py +481 -0
  496. scitex/resource/limit_ram.py +33 -0
  497. scitex/scholar/__init__.py +24 -0
  498. scitex/scholar/_local_search.py +454 -0
  499. scitex/scholar/_paper.py +244 -0
  500. scitex/scholar/_pdf_downloader.py +325 -0
  501. scitex/scholar/_search.py +393 -0
  502. scitex/scholar/_vector_search.py +370 -0
  503. scitex/scholar/_web_sources.py +457 -0
  504. scitex/stats/__init__.py +31 -0
  505. scitex/stats/_calc_partial_corr.py +17 -0
  506. scitex/stats/_corr_test_multi.py +94 -0
  507. scitex/stats/_corr_test_wrapper.py +115 -0
  508. scitex/stats/_describe_wrapper.py +90 -0
  509. scitex/stats/_multiple_corrections.py +63 -0
  510. scitex/stats/_nan_stats.py +93 -0
  511. scitex/stats/_p2stars.py +116 -0
  512. scitex/stats/_p2stars_wrapper.py +56 -0
  513. scitex/stats/_statistical_tests.py +73 -0
  514. scitex/stats/desc/__init__.py +40 -0
  515. scitex/stats/desc/_describe.py +189 -0
  516. scitex/stats/desc/_nan.py +289 -0
  517. scitex/stats/desc/_real.py +94 -0
  518. scitex/stats/multiple/__init__.py +14 -0
  519. scitex/stats/multiple/_bonferroni_correction.py +72 -0
  520. scitex/stats/multiple/_fdr_correction.py +400 -0
  521. scitex/stats/multiple/_multicompair.py +28 -0
  522. scitex/stats/tests/__corr_test.py +277 -0
  523. scitex/stats/tests/__corr_test_multi.py +343 -0
  524. scitex/stats/tests/__corr_test_single.py +277 -0
  525. scitex/stats/tests/__init__.py +22 -0
  526. scitex/stats/tests/_brunner_munzel_test.py +192 -0
  527. scitex/stats/tests/_nocorrelation_test.py +28 -0
  528. scitex/stats/tests/_smirnov_grubbs.py +98 -0
  529. scitex/str/__init__.py +113 -0
  530. scitex/str/_clean_path.py +75 -0
  531. scitex/str/_color_text.py +52 -0
  532. scitex/str/_decapitalize.py +58 -0
  533. scitex/str/_factor_out_digits.py +281 -0
  534. scitex/str/_format_plot_text.py +498 -0
  535. scitex/str/_grep.py +48 -0
  536. scitex/str/_latex.py +155 -0
  537. scitex/str/_latex_fallback.py +471 -0
  538. scitex/str/_mask_api.py +39 -0
  539. scitex/str/_mask_api_key.py +8 -0
  540. scitex/str/_parse.py +158 -0
  541. scitex/str/_print_block.py +47 -0
  542. scitex/str/_print_debug.py +68 -0
  543. scitex/str/_printc.py +62 -0
  544. scitex/str/_readable_bytes.py +38 -0
  545. scitex/str/_remove_ansi.py +23 -0
  546. scitex/str/_replace.py +134 -0
  547. scitex/str/_search.py +125 -0
  548. scitex/str/_squeeze_space.py +36 -0
  549. scitex/tex/__init__.py +10 -0
  550. scitex/tex/_preview.py +103 -0
  551. scitex/tex/_to_vec.py +116 -0
  552. scitex/torch/__init__.py +18 -0
  553. scitex/torch/_apply_to.py +34 -0
  554. scitex/torch/_nan_funcs.py +77 -0
  555. scitex/types/_ArrayLike.py +44 -0
  556. scitex/types/_ColorLike.py +21 -0
  557. scitex/types/__init__.py +14 -0
  558. scitex/types/_is_listed_X.py +70 -0
  559. scitex/utils/__init__.py +22 -0
  560. scitex/utils/_compress_hdf5.py +116 -0
  561. scitex/utils/_email.py +120 -0
  562. scitex/utils/_grid.py +148 -0
  563. scitex/utils/_notify.py +247 -0
  564. scitex/utils/_search.py +121 -0
  565. scitex/web/__init__.py +38 -0
  566. scitex/web/_search_pubmed.py +438 -0
  567. scitex/web/_summarize_url.py +158 -0
  568. scitex-2.0.0.dist-info/METADATA +307 -0
  569. scitex-2.0.0.dist-info/RECORD +572 -0
  570. scitex-2.0.0.dist-info/WHEEL +6 -0
  571. scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
  572. scitex-2.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,368 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 16:26:18 (ywatanabe)"
4
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from functools import wraps
13
+
14
+ import scitex
15
+ import numpy as np
16
+ import pandas as pd
17
+ import seaborn as sns
18
+
19
+ from ....plt import ax as ax_module
20
+
21
+
22
+ def sns_copy_doc(func):
23
+ @wraps(func)
24
+ def wrapper(self, *args, **kwargs):
25
+ return func(self, *args, **kwargs)
26
+
27
+ wrapper.__doc__ = getattr(sns, func.__name__.split("sns_")[-1]).__doc__
28
+ return wrapper
29
+
30
+
31
+ class SeabornMixin:
32
+
33
+ def _sns_base(
34
+ self, method_name, *args, track=True, track_obj=None, id=None, **kwargs
35
+ ):
36
+ sns_method_name = method_name.split("sns_")[-1]
37
+
38
+ with self._no_tracking():
39
+ sns_plot_fn = getattr(sns, sns_method_name)
40
+
41
+ if kwargs.get("hue_colors"):
42
+ kwargs = scitex.gen.alternate_kwarg(
43
+ kwargs, primary_key="palette", alternate_key="hue_colors"
44
+ )
45
+
46
+ self._axis_mpl = sns_plot_fn(ax=self._axis_mpl, *args, **kwargs)
47
+
48
+ # Track the plot if required
49
+ track_obj = track_obj if track_obj is not None else args
50
+ # Create a tracked_dict with appropriate structure
51
+ tracked_dict = {
52
+ 'data': track_obj, # Use 'data' key for consistency with formatters
53
+ 'args': args # Keep args for backward compatibility
54
+ }
55
+ self._track(track, id, method_name, tracked_dict, kwargs)
56
+
57
+ def _sns_base_xyhue(self, method_name, *args, track=True, id=None, **kwargs):
58
+ """Formats data passed to sns functions with (data=data, x=x, y=y) keyword arguments"""
59
+ df = kwargs.get("data")
60
+ x, y, hue = kwargs.get("x"), kwargs.get("y"), kwargs.get("hue")
61
+
62
+ track_obj = self._sns_prepare_xyhue(df, x, y, hue) if df is not None else None
63
+ self._sns_base(
64
+ method_name,
65
+ *args,
66
+ track=track,
67
+ track_obj=track_obj,
68
+ id=id,
69
+ **kwargs,
70
+ )
71
+
72
+ def _sns_prepare_xyhue(self, data=None, x=None, y=None, hue=None, **kwargs):
73
+ """Returns obj to track"""
74
+ data = data.reset_index()
75
+
76
+ if hue is not None:
77
+ if x is None and y is None:
78
+
79
+ return data
80
+ elif x is None:
81
+
82
+ agg_dict = {}
83
+ for hh in data[hue].unique():
84
+ agg_dict[hh] = data.loc[data[hue] == hh, y]
85
+ df = scitex.pd.force_df(agg_dict)
86
+ return df
87
+
88
+ elif y is None:
89
+
90
+ df = pd.concat(
91
+ [data.loc[data[hue] == hh, x] for hh in data[hue].unique()],
92
+ axis=1,
93
+ )
94
+ return df
95
+ else:
96
+ pivoted_data = data.pivot_table(
97
+ values=y,
98
+ index=data.index,
99
+ columns=[x, hue],
100
+ aggfunc="first",
101
+ )
102
+ pivoted_data.columns = [
103
+ f"{col[0]}-{col[1]}" for col in pivoted_data.columns
104
+ ]
105
+ return pivoted_data
106
+ else:
107
+ if x is None and y is None:
108
+ return data
109
+
110
+ elif x is None:
111
+ return data[[y]]
112
+
113
+ elif y is None:
114
+ return data[[x]]
115
+
116
+ else:
117
+ return data.pivot_table(
118
+ values=y, index=data.index, columns=x, aggfunc="first"
119
+ )
120
+
121
+ @sns_copy_doc
122
+ def sns_barplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
123
+ self._sns_base_xyhue(
124
+ "sns_barplot", data=data, x=x, y=y, track=track, id=id, **kwargs
125
+ )
126
+
127
+ @sns_copy_doc
128
+ def sns_boxplot(
129
+ self,
130
+ data=None,
131
+ x=None,
132
+ y=None,
133
+ strip=False,
134
+ track=True,
135
+ id=None,
136
+ **kwargs,
137
+ ):
138
+ self._sns_base_xyhue(
139
+ "sns_boxplot", data=data, x=x, y=y, track=track, id=id, **kwargs
140
+ )
141
+ if strip:
142
+ strip_kwargs = kwargs.copy()
143
+ strip_kwargs.pop("notch", None) # Remove boxplot-specific kwargs
144
+ strip_kwargs.pop("whis", None)
145
+ self.sns_stripplot(
146
+ data=data,
147
+ x=x,
148
+ y=y,
149
+ track=False,
150
+ id=f"{id}_strip",
151
+ **strip_kwargs,
152
+ )
153
+
154
+ @sns_copy_doc
155
+ def sns_heatmap(self, *args, xyz=False, track=True, id=None, **kwargs):
156
+ method_name = "sns_heatmap"
157
+ df = args[0]
158
+ if xyz:
159
+ df = scitex.pd.to_xyz(df)
160
+ self._sns_base(method_name, *args, track=track, track_obj=df, id=id, **kwargs)
161
+
162
+ @sns_copy_doc
163
+ def sns_histplot(
164
+ self, data=None, x=None, y=None, bins=10, align_bins=True, track=True, id=None, **kwargs
165
+ ):
166
+ """
167
+ Plot a histogram using seaborn with bin alignment support.
168
+
169
+ This method enhances the seaborn histplot with the ability to align
170
+ bins across multiple histograms on the same axis and export bin data.
171
+
172
+ Args:
173
+ data: Input data (DataFrame, array, or series)
174
+ x: Column name for x-axis data
175
+ y: Column name for y-axis data
176
+ bins: Bin specification (count or edges)
177
+ align_bins: Whether to align bins with other histograms on this axis
178
+ track: Whether to track this operation
179
+ id: Identifier for tracking
180
+ **kwargs: Additional keywords passed to seaborn histplot
181
+ """
182
+ # Method Name for downstream csv exporting
183
+ method_name = "sns_histplot"
184
+
185
+ # Get the data to plot for bin alignment
186
+ plot_data = None
187
+ if data is not None and x is not None:
188
+ plot_data = data[x].values if hasattr(data, 'columns') and x in data.columns else None
189
+
190
+ # Get axis and histogram IDs for bin alignment
191
+ axis_id = str(hash(self._axis_mpl))
192
+ hist_id = id if id is not None else str(self.id)
193
+
194
+ # Calculate range from data if needed
195
+ range_value = kwargs.get('binrange', None)
196
+
197
+ # Align bins if requested and data is available
198
+ if align_bins and plot_data is not None:
199
+ from ....plt.utils import histogram_bin_manager
200
+ bins_val, range_val = histogram_bin_manager.register_histogram(
201
+ axis_id, hist_id, plot_data, bins, range_value
202
+ )
203
+
204
+ # Update bins in kwargs
205
+ kwargs['bins'] = bins_val
206
+
207
+ # Update range in kwargs if it was provided
208
+ if range_value is not None:
209
+ kwargs['binrange'] = range_val
210
+
211
+ # Plotting with seaborn
212
+ with self._no_tracking():
213
+ # Execute the seaborn histplot function
214
+ # Don't pass bins as a separate parameter since it may already be in kwargs
215
+ sns_plot = sns.histplot(data=data, x=x, y=y, ax=self._axis_mpl, **kwargs)
216
+
217
+ # Extract bin information from the plotted artists
218
+ hist_result = None
219
+ if hasattr(sns_plot, 'patches') and sns_plot.patches:
220
+ # Get bin information from the plot patches
221
+ patches = sns_plot.patches
222
+ if patches:
223
+ counts = np.array([p.get_height() for p in patches])
224
+ # Extract bin edges from patch positions
225
+ bin_edges = []
226
+ for p in patches:
227
+ bin_edges.append(p.get_x())
228
+ # Add the rightmost edge
229
+ if patches:
230
+ bin_edges.append(patches[-1].get_x() + patches[-1].get_width())
231
+
232
+ hist_result = (counts, np.array(bin_edges))
233
+
234
+ # Create a track object for the formatter
235
+ track_obj = self._sns_prepare_xyhue(data, x, y, kwargs.get("hue"))
236
+
237
+ # Enhanced tracked dict with histogram result
238
+ tracked_dict = {
239
+ 'data': track_obj,
240
+ 'args': (data, x, y),
241
+ 'hist_result': hist_result
242
+ }
243
+
244
+ # Track the operation
245
+ self._track(track, id, method_name, tracked_dict, kwargs)
246
+
247
+ return sns_plot
248
+
249
+ @sns_copy_doc
250
+ def sns_kdeplot(
251
+ self,
252
+ data=None,
253
+ x=None,
254
+ y=None,
255
+ xlim=None,
256
+ ylim=None,
257
+ track=True,
258
+ id=None,
259
+ **kwargs,
260
+ ):
261
+ if kwargs.get("hue"):
262
+ hues = data[kwargs["hue"]]
263
+
264
+ if x is not None:
265
+ lim = xlim
266
+ for hue in np.unique(hues):
267
+ _data = data.loc[hues == hue, x]
268
+ self.plot_kde(_data, xlim=lim, label=hue, id=hue, **kwargs)
269
+
270
+ if y is not None:
271
+ lim = ylim
272
+ for hue in np.unique(hues):
273
+ _data = data.loc[hues == hue, y]
274
+ self.plot_kde(_data, xlim=lim, label=hue, id=hue, **kwargs)
275
+
276
+ else:
277
+ if x is not None:
278
+ _data, lim = data[x], xlim
279
+ if y is not None:
280
+ _data, lim = data[y], ylim
281
+ self.plot_kde(_data, xlim=lim, **kwargs)
282
+
283
+ @sns_copy_doc
284
+ def sns_pairplot(self, *args, track=True, id=None, **kwargs):
285
+ self._sns_base("sns_pairplot", *args, track=track, id=id, **kwargs)
286
+
287
+ @sns_copy_doc
288
+ def sns_scatterplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
289
+ self._sns_base_xyhue(
290
+ "sns_scatterplot",
291
+ data=data,
292
+ x=x,
293
+ y=y,
294
+ track=track,
295
+ id=id,
296
+ **kwargs,
297
+ )
298
+
299
+ @sns_copy_doc
300
+ def sns_lineplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
301
+ self._sns_base_xyhue(
302
+ "sns_lineplot",
303
+ data=data,
304
+ x=x,
305
+ y=y,
306
+ track=track,
307
+ id=id,
308
+ **kwargs,
309
+ )
310
+
311
+ @sns_copy_doc
312
+ def sns_swarmplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
313
+ self._sns_base_xyhue(
314
+ "sns_swarmplot", data=data, x=x, y=y, track=track, id=id, **kwargs
315
+ )
316
+
317
+ @sns_copy_doc
318
+ def sns_stripplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
319
+ self._sns_base_xyhue(
320
+ "sns_stripplot", data=data, x=x, y=y, track=track, id=id, **kwargs
321
+ )
322
+
323
+ # @sns_copy_doc
324
+ # def sns_violinplot(
325
+ # self, data=None, x=None, y=None, track=True, id=None, **kwargs
326
+ # ):
327
+ # self._sns_base_xyhue(
328
+ # "sns_violinplot", data=data, x=x, y=y, track=track, id=id, **kwargs
329
+ # )
330
+
331
+ @sns_copy_doc
332
+ def sns_violinplot(
333
+ self,
334
+ data=None,
335
+ x=None,
336
+ y=None,
337
+ track=True,
338
+ id=None,
339
+ half=False,
340
+ **kwargs,
341
+ ):
342
+ if half:
343
+ with self._no_tracking():
344
+ self._axis_mpl = ax_module.plot_half_violin(
345
+ self._axis_mpl, data=data, x=x, y=y, **kwargs
346
+ )
347
+ else:
348
+ self._sns_base_xyhue(
349
+ "sns_violinplot",
350
+ data=data,
351
+ x=x,
352
+ y=y,
353
+ track=track,
354
+ id=id,
355
+ **kwargs,
356
+ )
357
+
358
+ # Tracking
359
+ track_obj = self._sns_prepare_xyhue(data, x, y, kwargs.get("hue"))
360
+ self._track(track, id, "sns_violinplot", track_obj, kwargs)
361
+
362
+ return self._axis_mpl
363
+
364
+ @sns_copy_doc
365
+ def sns_jointplot(self, *args, track=True, id=None, **kwargs):
366
+ self._sns_base("sns_jointplot", *args, track=track, id=id, **kwargs)
367
+
368
+ # EOF
@@ -0,0 +1,185 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 18:40:59 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ """
13
+ Functionality:
14
+ * Handles tracking and history management for matplotlib plot operations
15
+ Input:
16
+ * Plot method calls, their arguments, and tracking configuration
17
+ Output:
18
+ * Tracked plotting history and DataFrame export for analysis
19
+ Prerequisites:
20
+ * pandas, matplotlib
21
+ """
22
+
23
+ from contextlib import contextmanager
24
+
25
+ import pandas as pd
26
+
27
+ from .._export_as_csv import export_as_csv as _export_as_csv
28
+
29
+
30
+ class TrackingMixin:
31
+ """Mixin class for tracking matplotlib plotting operations.
32
+
33
+ Example
34
+ -------
35
+ >>> fig, ax = plt.subplots()
36
+ >>> ax.track = True
37
+ >>> ax.id = 0
38
+ >>> ax._ax_history = OrderedDict()
39
+ >>> ax.plot([1, 2, 3], [4, 5, 6], id="plot1")
40
+ >>> print(ax.history)
41
+ {'plot1': ('plot1', 'plot', {'plot_df': DataFrame, ...}, {})}
42
+ """
43
+
44
+ def _track(self, track, id, method_name, tracked_dict, kwargs=None):
45
+ """Track plotting operation with auto-generated IDs.
46
+
47
+ Args:
48
+ track: Whether to track this operation
49
+ id: Identifier for the plot (can be None)
50
+ method_name: Name of the plotting method
51
+ tracked_dict: Dictionary of tracked data
52
+ kwargs: Original keyword arguments
53
+ """
54
+ # Extract id from kwargs and remove it before passing to matplotlib
55
+ if kwargs is not None and hasattr(kwargs, "get") and "id" in kwargs:
56
+ id = kwargs.pop("id")
57
+
58
+ # Default kwargs to empty dict if None
59
+ if kwargs is None:
60
+ kwargs = {}
61
+
62
+ if track is None:
63
+ track = self.track
64
+
65
+ if track:
66
+ # If no ID was provided, generate one using method_name + counter
67
+ if id is None:
68
+ # Initialize method counters if not exist
69
+ if not hasattr(self, '_method_counters'):
70
+ self._method_counters = {}
71
+
72
+ # Get current counter value for this method and increment it
73
+ counter = self._method_counters.get(method_name, 0)
74
+ self._method_counters[method_name] = counter + 1
75
+
76
+ # Format ID as method_name_counter (e.g., bar_1, plot_3)
77
+ id = f"{method_name}_{counter}"
78
+
79
+ # For backward compatibility
80
+ self.id += 1
81
+
82
+ # Store the tracking record
83
+ self._ax_history[id] = (id, method_name, tracked_dict, kwargs)
84
+
85
+ @contextmanager
86
+ def _no_tracking(self):
87
+ """Context manager to temporarily disable tracking."""
88
+ original_track = self.track
89
+ self.track = False
90
+ try:
91
+ yield
92
+ finally:
93
+ self.track = original_track
94
+
95
+ @property
96
+ def history(self):
97
+ return {k: self._ax_history[k] for k in self._ax_history}
98
+
99
+ @property
100
+ def flat(self):
101
+ if isinstance(self._axis_mpl, list):
102
+ return self._axis_mpl
103
+ else:
104
+ return [self._axis_mpl]
105
+
106
+ def reset_history(self):
107
+ self._ax_history = {}
108
+
109
+ def export_as_csv(self):
110
+ """
111
+ Export tracked plotting data to a DataFrame.
112
+ """
113
+ df = _export_as_csv(self.history)
114
+
115
+ return df if df is not None else pd.DataFrame()
116
+
117
+ def export_as_csv_for_sigmaplot(self, include_visual_params=True):
118
+ """
119
+ Export tracked plotting data to a DataFrame in SigmaPlot format.
120
+
121
+ Parameters
122
+ ----------
123
+ include_visual_params : bool, optional
124
+ Whether to include visual parameters (xlabel, ylabel, scales, etc.)
125
+ at the top of the CSV. Default is True.
126
+
127
+ Returns
128
+ -------
129
+ pandas.DataFrame
130
+ DataFrame containing the plotted data formatted for SigmaPlot.
131
+
132
+ Examples
133
+ --------
134
+ >>> fig, ax = scitex.plt.subplots()
135
+ >>> ax.plot([1, 2, 3], [4, 5, 6])
136
+ >>> ax.scatter([1, 2, 3], [7, 8, 9])
137
+ >>> df = ax.export_as_csv_for_sigmaplot()
138
+ >>> df.to_csv('for_sigmaplot.csv', index=False)
139
+ """
140
+ df = _export_as_csv(self.history)
141
+
142
+ return df if df is not None else pd.DataFrame()
143
+
144
+ # def _track(
145
+ # self,
146
+ # track: Optional[bool],
147
+ # plot_id: Optional[str],
148
+ # method_name: str,
149
+ # tracked_dict: Any,
150
+ # kwargs: Dict[str, Any]
151
+ # ) -> None:
152
+ # """Tracks plotting operation if tracking is enabled."""
153
+ # if track is None:
154
+ # track = self.track
155
+ # if track:
156
+ # plot_id = plot_id if plot_id is not None else self.id
157
+ # self.id += 1
158
+ # self._ax_history[plot_id] = (plot_id, method_name, tracked_dict, kwargs)
159
+
160
+ # @contextmanager
161
+ # def _no_tracking(self) -> None:
162
+ # """Temporarily disables tracking within a context."""
163
+ # original_track = self.track
164
+ # self.track = False
165
+ # try:
166
+ # yield
167
+ # finally:
168
+ # self.track = original_track
169
+
170
+ # @property
171
+ # def history(self) -> Dict[str, Tuple]:
172
+ # """Returns the plotting history."""
173
+ # return dict(self._ax_history)
174
+
175
+ # def reset_history(self) -> None:
176
+ # """Clears the plotting history."""
177
+ # self._ax_history = OrderedDict()
178
+
179
+ # def export_as_csv(self) -> pd.DataFrame:
180
+ # """Converts plotting history to a SigmaPlot-compatible DataFrame."""
181
+ # df = _export_as_csv(self.history)
182
+ # return df if df is not None else pd.DataFrame()
183
+
184
+
185
+ # EOF
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-01 08:54:38 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/__init__.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_subplots/_AxisWrapperMixins/__init__.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+ from ._AdjustmentMixin import AdjustmentMixin
12
+ from ._MatplotlibPlotMixin import MatplotlibPlotMixin
13
+ from ._SeabornMixin import SeabornMixin
14
+ from ._TrackingMixin import TrackingMixin
15
+
16
+ # EOF