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
scitex/pd/_to_xy.py ADDED
@@ -0,0 +1,59 @@
1
+ #!/./env/bin/python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-09-03 07:01:31 (ywatanabe)"
4
+ # ./src/scitex/pd/_to_xy.py
5
+
6
+ import scitex
7
+ import numpy as np
8
+ import pandas as pd
9
+
10
+
11
+ def to_xy(data_frame):
12
+ """
13
+ Convert a heatmap DataFrame into x, y, z format.
14
+
15
+ Ensure the index and columns are the same, and if either exists, replace with that.
16
+
17
+ Example
18
+ -------
19
+ data_frame = pd.DataFrame(...) # Your DataFrame here
20
+ out = to_xy(data_frame)
21
+ print(out)
22
+
23
+ Parameters
24
+ ----------
25
+ data_frame : pandas.DataFrame
26
+ The input DataFrame to be converted.
27
+
28
+ Returns
29
+ -------
30
+ pandas.DataFrame
31
+ A DataFrame formatted with columns ['x', 'y', 'z']
32
+ """
33
+ assert data_frame.shape[0] == data_frame.shape[1]
34
+
35
+ if not data_frame.index.equals(data_frame.columns):
36
+
37
+ if (data_frame.index == np.array(range(len(data_frame.index)))).all():
38
+ data_frame.columns = data_frame.index
39
+ elif (data_frame.columns == np.array(range(len(data_frame.columns)))).all():
40
+ data_frame.index = data_frame.columns
41
+ else:
42
+ ValueError
43
+ # else:
44
+ # ValueError "Either of index or columns has to be passed"
45
+
46
+ formatted_data_frames = []
47
+
48
+ for column in data_frame.columns:
49
+ column_data_frame = data_frame[column]
50
+ y_label = column_data_frame.name
51
+ column_data_frame = pd.DataFrame(column_data_frame)
52
+ column_data_frame["x"] = column_data_frame.index
53
+ column_data_frame["y"] = y_label
54
+ column_data_frame = column_data_frame.reset_index().drop(columns=["index"])
55
+ column_data_frame = column_data_frame.rename(columns={y_label: "z"})
56
+ column_data_frame = scitex.pd.mv(column_data_frame, "z", -1)
57
+ formatted_data_frames.append(column_data_frame)
58
+
59
+ return pd.concat(formatted_data_frames, ignore_index=True)
scitex/pd/_to_xyz.py ADDED
@@ -0,0 +1,110 @@
1
+ #!/./env/bin/python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-09-28 11:17:22 (ywatanabe)"
4
+ # ./src/scitex/pd/_to_xyz.py
5
+
6
+ import scitex
7
+ import numpy as np
8
+ import pandas as pd
9
+
10
+
11
+ def to_xyz(data_frame):
12
+ """
13
+ Convert a DataFrame into x, y, z format (long format).
14
+
15
+ Transforms a DataFrame from wide format (matrix/heatmap) to long format
16
+ where each value becomes a row with x (row index), y (column name),
17
+ and z (value) columns.
18
+
19
+ Example
20
+ -------
21
+ data_frame = pd.DataFrame(...) # Your DataFrame here
22
+ out = to_xyz(data_frame)
23
+ print(out)
24
+
25
+ Parameters
26
+ ----------
27
+ data_frame : pandas.DataFrame
28
+ The input DataFrame to be converted.
29
+
30
+ Returns
31
+ -------
32
+ pandas.DataFrame
33
+ A DataFrame formatted with columns ['x', 'y', 'z']
34
+ """
35
+ x_name = data_frame.index.name or "x"
36
+ y_name = data_frame.columns.name or "y"
37
+
38
+ formatted_data_frames = []
39
+
40
+ for column in data_frame.columns:
41
+ column_data_frame = data_frame[column]
42
+ formatted_data = pd.DataFrame(
43
+ {
44
+ x_name: column_data_frame.index,
45
+ y_name: column,
46
+ "z": column_data_frame.values,
47
+ }
48
+ )
49
+ formatted_data_frames.append(formatted_data)
50
+
51
+ result = pd.concat(formatted_data_frames, ignore_index=True)
52
+
53
+ # Ensure column order is x, y, z
54
+ col_order = [x_name, y_name, "z"]
55
+ result = result[col_order]
56
+
57
+ return result
58
+
59
+
60
+ # def to_xyz(data_frame):
61
+ # """
62
+ # Convert a heatmap DataFrame into x, y, z format.
63
+
64
+ # Ensure the index and columns are the same, and if either exists, replace with that.
65
+
66
+ # Example
67
+ # -------
68
+ # data_frame = pd.DataFrame(...) # Your DataFrame here
69
+ # out = to_xy(data_frame)
70
+ # print(out)
71
+
72
+ # Parameters
73
+ # ----------
74
+ # data_frame : pandas.DataFrame
75
+ # The input DataFrame to be converted.
76
+
77
+ # Returns
78
+ # -------
79
+ # pandas.DataFrame
80
+ # A DataFrame formatted with columns ['x', 'y', 'z']
81
+ # """
82
+ # assert data_frame.shape[0] == data_frame.shape[1]
83
+
84
+ # if not data_frame.index.equals(data_frame.columns):
85
+
86
+ # if (data_frame.index == np.array(range(len(data_frame.index)))).all():
87
+ # data_frame.columns = data_frame.index
88
+ # elif (
89
+ # data_frame.columns == np.array(range(len(data_frame.columns)))
90
+ # ).all():
91
+ # data_frame.index = data_frame.columns
92
+ # else:
93
+ # raise ValueError("Either index or columns must be a range of integers")
94
+
95
+ # formatted_data_frames = []
96
+
97
+ # for column in data_frame.columns:
98
+ # column_data_frame = data_frame[column]
99
+ # y_label = column_data_frame.name
100
+ # column_data_frame = pd.DataFrame(column_data_frame)
101
+ # column_data_frame["x"] = column_data_frame.index
102
+ # column_data_frame["y"] = y_label
103
+ # column_data_frame = column_data_frame.reset_index().drop(
104
+ # columns=["index"]
105
+ # )
106
+ # column_data_frame = column_data_frame.rename(columns={y_label: "z"})
107
+ # column_data_frame = scitex.pd.mv(column_data_frame, "z", -1)
108
+ # formatted_data_frames.append(column_data_frame)
109
+
110
+ # return pd.concat(formatted_data_frames, ignore_index=True)
scitex/plt/__init__.py ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-06-13 22:42:39 (ywatanabe)"
4
+ # File: /ssh:sp:/home/ywatanabe/proj/SciTeX-Code/src/scitex/plt/__init__.py
5
+ # ----------------------------------------
6
+ import os
7
+ __FILE__ = (
8
+ "./src/scitex/plt/__init__.py"
9
+ )
10
+ __DIR__ = os.path.dirname(__FILE__)
11
+ # ----------------------------------------
12
+ """Scitex plt module."""
13
+
14
+ from ._tpl import termplot
15
+ from . import color
16
+ from . import utils
17
+
18
+ # Lazy import for subplots to avoid circular dependencies
19
+ _subplots = None
20
+
21
+ def subplots(*args, **kwargs):
22
+ """Lazy-loaded subplots function."""
23
+ global _subplots
24
+ if _subplots is None:
25
+ from ._subplots._SubplotsWrapper import subplots as _subplots_impl
26
+ _subplots = _subplots_impl
27
+ return _subplots(*args, **kwargs)
28
+
29
+ __all__ = [
30
+ "termplot",
31
+ "subplots",
32
+ "utils",
33
+ "color",
34
+ ]
35
+
36
+ # EOF
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-19 15:36:54 (ywatanabe)"
4
+ # File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxesWrapper.py
5
+ # ----------------------------------------
6
+ import os
7
+ __FILE__ = (
8
+ "./src/scitex/plt/_subplots/_AxesWrapper.py"
9
+ )
10
+ __DIR__ = os.path.dirname(__FILE__)
11
+ # ----------------------------------------
12
+
13
+ from functools import wraps
14
+
15
+ import numpy as np
16
+ import pandas as pd
17
+
18
+
19
+ class AxesWrapper:
20
+ def __init__(self, fig_scitex, axes_scitex):
21
+ self._fig_scitex = fig_scitex
22
+ self._axes_scitex = axes_scitex
23
+
24
+ def get_figure(self, root=True):
25
+ """Get the figure, compatible with matplotlib 3.8+"""
26
+ return self._fig_scitex
27
+
28
+ def __dir__(self):
29
+ # Combine attributes from both self and the wrapped matplotlib axes
30
+ attrs = set(dir(self.__class__))
31
+ attrs.update(object.__dir__(self))
32
+
33
+ # Add attributes from the axes objects if available
34
+ if hasattr(self, "_axes_scitex") and self._axes_scitex is not None:
35
+ # Get attributes from the first axis if there are any
36
+ if self._axes_scitex.size > 0:
37
+ first_ax = self._axes_scitex.flat[0]
38
+ attrs.update(dir(first_ax))
39
+
40
+ return sorted(attrs)
41
+
42
+ def __getattr__(self, name):
43
+ # Note that self._axes_scitex is "numpy.ndarray"
44
+ # print(f"Attribute of AxesWrapper: {name}")
45
+ methods = []
46
+ try:
47
+ for axis in self._axes_scitex.flat:
48
+ methods.append(getattr(axis, name))
49
+ except Exception:
50
+ methods = []
51
+
52
+ if methods and all(callable(m) for m in methods):
53
+
54
+ @wraps(methods[0])
55
+ def wrapper(*args, **kwargs):
56
+ return [
57
+ getattr(ax, name)(*args, **kwargs)
58
+ for ax in self._axes_scitex.flat
59
+ ]
60
+
61
+ return wrapper
62
+
63
+ if methods and not callable(methods[0]):
64
+ return methods
65
+
66
+ def dummy(*args, **kwargs):
67
+ return None
68
+
69
+ return dummy
70
+
71
+ # def __getitem__(self, index):
72
+ # subset = self._axes_scitex[index]
73
+ # if isinstance(index, slice):
74
+ # return AxesWrapper(self._fig_scitex, subset)
75
+ # return subset
76
+
77
+ def __getitem__(self, index):
78
+ subset = self._axes_scitex[index]
79
+ if isinstance(subset, np.ndarray):
80
+ return AxesWrapper(self._fig_scitex, subset)
81
+ return subset
82
+
83
+ def __setitem__(self, index, value):
84
+ """Support item assignment for axes[row, col] = new_axis operations."""
85
+ self._axes_scitex[index] = value
86
+
87
+ def __iter__(self):
88
+ return iter(self._axes_scitex)
89
+
90
+ def __len__(self):
91
+ return self._axes_scitex.size
92
+
93
+ def __array__(self):
94
+ """Support conversion to numpy array.
95
+
96
+ This allows using np.array(axes) on an AxesWrapper instance, returning
97
+ a NumPy array with the same shape as the original axes array.
98
+
99
+ Notes:
100
+ - While this enables compatibility with NumPy functions, not all
101
+ operations will work correctly due to the nature of the wrapped
102
+ objects.
103
+ - For flattening operations, use the dedicated `flatten()` method
104
+ instead of `np.array(axes).flatten()`:
105
+
106
+ # RECOMMENDED:
107
+ flat_axes = list(axes.flatten())
108
+
109
+ # AVOID (may cause "invalid __array_struct__" error):
110
+ flat_axes = np.array(axes).flatten()
111
+
112
+ Returns:
113
+ np.ndarray: Array of wrapped axes with the same shape
114
+ """
115
+ import warnings
116
+
117
+ # Show a warning to help users avoid common mistakes
118
+ warnings.warn(
119
+ "Converting AxesWrapper to numpy array. If you're trying to flatten "
120
+ "the axes, use 'list(axes.flatten())' instead of 'np.array(axes).flatten()'.",
121
+ UserWarning,
122
+ stacklevel=2,
123
+ )
124
+
125
+ # Convert the underlying axes to a compatible numpy array representation
126
+ flat_axes = [ax for ax in self._axes_scitex.flat]
127
+ array_compatible = np.empty(len(flat_axes), dtype=object)
128
+ for idx, ax in enumerate(flat_axes):
129
+ array_compatible[idx] = ax
130
+ return array_compatible.reshape(self._axes_scitex.shape)
131
+
132
+ def legend(self, loc="upper left"):
133
+ return [ax.legend(loc=loc) for ax in self._axes_scitex.flat]
134
+
135
+ @property
136
+ def history(self):
137
+ return [ax.history for ax in self._axes_scitex.flat]
138
+
139
+ @property
140
+ def shape(self):
141
+ return self._axes_scitex.shape
142
+
143
+ @property
144
+ def flat(self):
145
+ """Return a flat iterator over all axes.
146
+
147
+ This property provides direct access to the flattened axes array,
148
+ matching numpy array behavior.
149
+
150
+ Returns:
151
+ Iterator over all axes in row-major (C-style) order
152
+ """
153
+ return self._axes_scitex.flat
154
+
155
+ def flatten(self):
156
+ """Return a flattened array of all axes in the AxesWrapper.
157
+
158
+ This method collects all axes from the flat iterator and returns them
159
+ as a NumPy array. This ensures compatibility with code that expects
160
+ a flat collection of axes.
161
+
162
+ Returns:
163
+ np.ndarray: A flattened array containing all axes
164
+
165
+ Example:
166
+ # Preferred way to get a list of all axes:
167
+ axes_list = list(axes.flatten())
168
+
169
+ # Alternatively, if you need a NumPy array:
170
+ axes_array = axes.flatten()
171
+ """
172
+ return np.array([ax for ax in self._axes_scitex.flat])
173
+
174
+ def export_as_csv(self):
175
+ dfs = []
176
+ for ii, ax in enumerate(self._axes_scitex.flat):
177
+ df = ax.export_as_csv()
178
+ df.columns = [f"ax_{ii:02d}_{col}" for col in df.columns]
179
+ dfs.append(df)
180
+ return pd.concat(dfs, axis=1) if dfs else pd.DataFrame()
181
+
182
+ # EOF
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-01 17:11:28 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/_scitex_repo/src/scitex/plt/_subplots/_AxisWrapper.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_subplots/_AxisWrapper.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import warnings
13
+ from functools import wraps
14
+
15
+ import matplotlib
16
+
17
+ from ._AxisWrapperMixins import (
18
+ AdjustmentMixin,
19
+ MatplotlibPlotMixin,
20
+ SeabornMixin,
21
+ TrackingMixin,
22
+ )
23
+
24
+
25
+ class AxisWrapper(MatplotlibPlotMixin, SeabornMixin, AdjustmentMixin, TrackingMixin):
26
+ def __init__(self, fig_scitex, axis_mpl, track):
27
+ """Initialize the AxisWrapper.
28
+
29
+ Args:
30
+ fig_scitex: Parent figure wrapper
31
+ axis_mpl: Matplotlib axis to wrap
32
+ track: Whether to track plotting operations
33
+ """
34
+ self._fig_mpl = fig_scitex._fig_mpl
35
+ # Axis Properties
36
+ # self.axis = axis_mpl
37
+ # self._axis = axis_mpl
38
+ # self._axis_scitex = self
39
+ self._axis_mpl = axis_mpl
40
+
41
+ # Axes Properties
42
+ # self.axes = axis_mpl
43
+ # self._axes = axis_mpl
44
+ self._axes_mpl = axis_mpl
45
+ # self._axes_scitex = self
46
+
47
+ # Tracking properties
48
+ self._ax_history = {}
49
+ self._method_counters = {} # Track method counts for auto-generated IDs
50
+ self.track = track
51
+ self.id = 0
52
+ self._counter_part = matplotlib.axes.Axes
53
+
54
+ def get_figure(self, root=True):
55
+ """Get the figure, compatible with matplotlib 3.8+"""
56
+ return self._fig_mpl
57
+
58
+ def twinx(self):
59
+ """Create a twin y-axis and wrap it with AxisWrapper."""
60
+ twin_ax = self._axes_mpl.twinx()
61
+ # Create a mock figure wrapper for the twin axis
62
+ class MockFigWrapper:
63
+ def __init__(self, fig_mpl):
64
+ self._fig_mpl = fig_mpl
65
+ mock_fig = MockFigWrapper(self._fig_mpl)
66
+ return AxisWrapper(fig_scitex=mock_fig, axis_mpl=twin_ax, track=self.track)
67
+
68
+ def twiny(self):
69
+ """Create a twin x-axis and wrap it with AxisWrapper."""
70
+ twin_ax = self._axes_mpl.twiny()
71
+ # Create a mock figure wrapper for the twin axis
72
+ class MockFigWrapper:
73
+ def __init__(self, fig_mpl):
74
+ self._fig_mpl = fig_mpl
75
+ mock_fig = MockFigWrapper(self._fig_mpl)
76
+ return AxisWrapper(fig_scitex=mock_fig, axis_mpl=twin_ax, track=self.track)
77
+
78
+ def __getattr__(self, name):
79
+ # 0. Check if the attribute is explicitly defined in AxisWrapper or its Mixins
80
+ # This check happens implicitly before __getattr__ is called.
81
+ # If a method like `plot` is defined in BasicPlotMixin, it will be found first.
82
+
83
+ # print(f"Attribute of AxisWrapper: {name}")
84
+
85
+ # 1. Try to get the attribute from the wrapped axes instance
86
+ if hasattr(self._axes_mpl, name):
87
+ orig_attr = getattr(self._axes_mpl, name)
88
+
89
+ if callable(orig_attr):
90
+
91
+ @wraps(orig_attr)
92
+ def wrapper(*args, **kwargs):
93
+ id_value = kwargs.pop("id", None)
94
+ track_override = kwargs.pop("track", None)
95
+
96
+ # Call the original matplotlib method
97
+ result = orig_attr(*args, **kwargs)
98
+
99
+ # Determine if tracking should occur
100
+ should_track = (
101
+ track_override if track_override is not None else self.track
102
+ )
103
+
104
+ # Track the method call if tracking enabled
105
+ # Expanded list of matplotlib plotting methods to track
106
+ tracking_methods = {
107
+ # Basic plots
108
+ 'plot', 'scatter', 'bar', 'barh', 'hist', 'boxplot', 'violinplot',
109
+ # Line plots
110
+ 'fill_between', 'fill_betweenx', 'errorbar', 'step', 'stem',
111
+ # Statistical plots
112
+ 'hist2d', 'hexbin', 'pie',
113
+ # Contour plots
114
+ 'contour', 'contourf', 'tricontour', 'tricontourf',
115
+ # Image plots
116
+ 'imshow', 'matshow', 'spy',
117
+ # Quiver plots
118
+ 'quiver', 'streamplot',
119
+ # 3D-related (if axes3d)
120
+ 'plot3D', 'scatter3D', 'bar3d', 'plot_surface', 'plot_wireframe',
121
+ # Text and annotations (data-containing)
122
+ 'annotate', 'text'
123
+ }
124
+ if should_track and name in tracking_methods:
125
+ # Use the _track method from TrackingMixin
126
+ # If no id provided, it will auto-generate one
127
+ try:
128
+ # Convert args to tracked_dict for consistency with other tracking
129
+ tracked_dict = {"args": args}
130
+ self._track(
131
+ should_track, id_value, name, tracked_dict, kwargs
132
+ )
133
+ except AttributeError:
134
+ warnings.warn(
135
+ f"Tracking setup incomplete for AxisWrapper ({name}).",
136
+ UserWarning,
137
+ stacklevel=2,
138
+ )
139
+ except Exception as e:
140
+ # Silently continue if tracking fails to not break plotting
141
+ pass
142
+ return result # Return the result of the original call
143
+
144
+ return wrapper
145
+ else:
146
+ # If it's a non-callable attribute (property, etc.), return it directly
147
+ return orig_attr
148
+
149
+ # 2. If not found on instance, try the counterpart type (fallback)
150
+ if hasattr(self._counter_part, name):
151
+ counterpart_attr = getattr(self._counter_part, name)
152
+ warnings.warn(
153
+ f"SciTeX Axis_MplWrapper: '{name}' not directly handled. "
154
+ f"Falling back to underlying '{self._counter_part.__name__}' attribute.",
155
+ UserWarning,
156
+ stacklevel=2,
157
+ )
158
+ # If the counterpart attribute is callable (likely a method descriptor)
159
+ if callable(counterpart_attr):
160
+ # Return a new function that calls the counterpart method on self._axes_mpl
161
+ @wraps(counterpart_attr)
162
+ def fallback_method(*args, **kwargs):
163
+ # Note: No id/track handling for fallback methods
164
+ return counterpart_attr(self._axes_mpl, *args, **kwargs)
165
+
166
+ return fallback_method
167
+ else:
168
+ # Non-callable class attribute. Attempt to get from instance again,
169
+ # otherwise return the class attribute/descriptor.
170
+ try:
171
+ return getattr(self._axes_mpl, name)
172
+ except AttributeError:
173
+ return counterpart_attr
174
+
175
+ # 3. If not found anywhere, raise AttributeError
176
+ raise AttributeError(
177
+ f"'{type(self).__name__}' object and its underlying '{self._counter_part.__name__}' "
178
+ f"have no attribute '{name}'"
179
+ )
180
+
181
+ def __dir__(self):
182
+ # Start with attributes from the class and all parent classes (mixins)
183
+ attrs = set()
184
+
185
+ # Get attributes from all parent classes including mixins
186
+ for cls in self.__class__.__mro__:
187
+ attrs.update(cls.__dict__.keys())
188
+
189
+ # Add instance attributes
190
+ attrs.update(self.__dict__.keys())
191
+
192
+ # Safely get matplotlib axes attributes
193
+ try:
194
+ # Get attributes from the wrapped matplotlib axes
195
+ if hasattr(self._axes_mpl, '__class__'):
196
+ # Get class methods from matplotlib.axes.Axes
197
+ for cls in self._axes_mpl.__class__.__mro__:
198
+ attrs.update(name for name in cls.__dict__.keys() if not name.startswith('_'))
199
+
200
+ # Add instance attributes of the matplotlib axes
201
+ if hasattr(self._axes_mpl, '__dict__'):
202
+ attrs.update(name for name in self._axes_mpl.__dict__.keys() if not name.startswith('_'))
203
+
204
+ except Exception:
205
+ # If any error occurs, add common matplotlib methods manually
206
+ attrs.update(['plot', 'scatter', 'bar', 'barh', 'hist', 'boxplot',
207
+ 'set_xlabel', 'set_ylabel', 'set_title', 'legend',
208
+ 'set_xlim', 'set_ylim', 'grid', 'annotate', 'text'])
209
+
210
+ # Remove private attributes
211
+ attrs = {attr for attr in attrs if not attr.startswith('_')}
212
+
213
+ return sorted(attrs)
214
+
215
+ def flatten(self):
216
+ """Return a list containing just this axis.
217
+
218
+ This method makes AxisWrapper compatible with code that calls flatten()
219
+ on an axes collection. It returns a list containing just this single axis
220
+ to maintain consistency with AxesWrapper.flatten().
221
+
222
+ Returns:
223
+ list: A list containing this axis wrapper
224
+
225
+ Example:
226
+ # When working with either AxesWrapper or AxisWrapper, this works:
227
+ axes_list = list(axes.flatten())
228
+ """
229
+ return [self]
230
+
231
+
232
+ """
233
+ import matplotlib.pyplot as plt
234
+ import scitex.plt as mplt
235
+
236
+ fig_scitex, axes = plt.subplots(ncols=2)
237
+ mfig_scitex, maxes = mplt.subplots(ncols=2)
238
+
239
+ print(set(dir(mfig_scitex)) - set(dir(fig_scitex)))
240
+ print(set(dir(maxes)) - set(dir(axes)))
241
+
242
+ is_compatible = np.all([kk in set(dir(msubplots)) for kk in set(dir(counter_part))])
243
+ if is_compatible:
244
+ print(f"{msubplots.__name__} is compatible with {counter_part.__name__}")
245
+ else:
246
+ print(f"{msubplots.__name__} is incompatible with {counter_part.__name__}")
247
+ """
248
+
249
+ # EOF