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,210 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 22:05:10 (ywatanabe)"
4
+ # File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py
5
+ # ----------------------------------------
6
+ import os
7
+ __FILE__ = (
8
+ "./src/scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py"
9
+ )
10
+ __DIR__ = os.path.dirname(__FILE__)
11
+ # ----------------------------------------
12
+
13
+ import unittest
14
+ import numpy as np
15
+ import pandas as pd
16
+
17
+ # Import formatters directly
18
+ from ._format_plot import _format_plot
19
+ from ._format_plot_kde import _format_plot_kde
20
+ from ._format_plot_ecdf import _format_plot_ecdf
21
+ from ._format_plot_heatmap import _format_plot_heatmap
22
+ from ._format_plot_violin import _format_plot_violin
23
+ from ._format_plot_shaded_line import _format_plot_shaded_line
24
+ from ._format_plot_scatter_hist import _format_plot_scatter_hist
25
+
26
+
27
+ class FormattersTest(unittest.TestCase):
28
+ """Test the formatter functions."""
29
+
30
+ def test_format_plot_kde(self):
31
+ """Test _format_plot_kde function."""
32
+ # Test case 1: Normal input
33
+ tracked_dict = {
34
+ 'x': np.linspace(-3, 3, 100),
35
+ 'kde': np.exp(-np.linspace(-3, 3, 100)**2/2),
36
+ 'n': 500
37
+ }
38
+ id = 'test_kde'
39
+ df = _format_plot_kde(id, tracked_dict, {})
40
+
41
+ # Verify columns
42
+ self.assertIn(f"{id}_kde_x", df.columns)
43
+ self.assertIn(f"{id}_kde_density", df.columns)
44
+ self.assertIn(f"{id}_kde_n", df.columns)
45
+
46
+ # Test case 2: Empty tracked_dict
47
+ df = _format_plot_kde(id, {}, {})
48
+ self.assertTrue(df.empty)
49
+
50
+ # Test case 3: Missing 'x' key
51
+ tracked_dict = {'kde': np.exp(-np.linspace(-3, 3, 100)**2/2)}
52
+ df = _format_plot_kde(id, tracked_dict, {})
53
+ self.assertTrue(df.empty)
54
+
55
+ def test_format_plot(self):
56
+ """Test _format_plot function."""
57
+ # Test case 1: Normal input
58
+ tracked_dict = {
59
+ 'plot_df': pd.DataFrame({
60
+ 'x': np.linspace(0, 10, 100),
61
+ 'y': np.sin(np.linspace(0, 10, 100))
62
+ })
63
+ }
64
+ id = 'test_plot'
65
+ df = _format_plot(id, tracked_dict, {})
66
+
67
+ # Verify it returned the DataFrame with added prefix
68
+ self.assertFalse(df.empty)
69
+
70
+ # Test case 2: Empty tracked_dict
71
+ df = _format_plot(id, {}, {})
72
+ self.assertTrue(df.empty)
73
+
74
+ def test_format_plot_ecdf(self):
75
+ """Test _format_plot_ecdf function."""
76
+ # Test case 1: Normal input
77
+ tracked_dict = {
78
+ 'ecdf_df': pd.DataFrame({
79
+ 'x': np.linspace(-3, 3, 100),
80
+ 'ecdf': np.linspace(0, 1, 100)
81
+ })
82
+ }
83
+ id = 'test_ecdf'
84
+ df = _format_plot_ecdf(id, tracked_dict, {})
85
+
86
+ # Verify it returned the DataFrame
87
+ self.assertFalse(df.empty)
88
+
89
+ # Test case 2: Empty tracked_dict
90
+ df = _format_plot_ecdf(id, {}, {})
91
+ self.assertTrue(df.empty)
92
+
93
+ def test_format_plot_heatmap(self):
94
+ """Test _format_plot_heatmap function."""
95
+ # Test case 1: Normal input with labels
96
+ data = np.random.rand(3, 4)
97
+ x_labels = ['A', 'B', 'C']
98
+ y_labels = ['W', 'X', 'Y', 'Z']
99
+
100
+ tracked_dict = {
101
+ 'data': data,
102
+ 'x_labels': x_labels,
103
+ 'y_labels': y_labels
104
+ }
105
+ id = 'test_heatmap'
106
+ df = _format_plot_heatmap(id, tracked_dict, {})
107
+
108
+ # Verify it returned the DataFrame with the expected shape
109
+ self.assertFalse(df.empty)
110
+ self.assertEqual(df.shape[0], 12) # 3 rows * 4 columns = 12 cells
111
+ # We should have 5 columns: row, col, value, row_label, col_label
112
+ self.assertEqual(df.shape[1], 5)
113
+
114
+ # Test case 2: No labels
115
+ tracked_dict = {'data': data}
116
+ df = _format_plot_heatmap(id, tracked_dict, {})
117
+ self.assertFalse(df.empty)
118
+
119
+ # Test case 3: Empty tracked_dict
120
+ df = _format_plot_heatmap(id, {}, {})
121
+ self.assertTrue(df.empty)
122
+
123
+ def test_format_plot_violin(self):
124
+ """Test _format_plot_violin function."""
125
+ # Test case 1: List data
126
+ data = [np.random.normal(0, 1, 100), np.random.normal(2, 1, 100)]
127
+ labels = ['Group A', 'Group B']
128
+
129
+ tracked_dict = {
130
+ 'data': data,
131
+ 'labels': labels
132
+ }
133
+ id = 'test_violin'
134
+ df = _format_plot_violin(id, tracked_dict, {})
135
+
136
+ # Verify it returned the DataFrame
137
+ self.assertFalse(df.empty)
138
+
139
+ # Test case 2: DataFrame data
140
+ data_df = pd.DataFrame({
141
+ 'values': np.concatenate([np.random.normal(0, 1, 100), np.random.normal(2, 1, 100)]),
142
+ 'group': ['A'] * 100 + ['B'] * 100
143
+ })
144
+ tracked_dict = {
145
+ 'data': data_df,
146
+ 'x': 'group',
147
+ 'y': 'values'
148
+ }
149
+ df = _format_plot_violin(id, tracked_dict, {})
150
+ self.assertFalse(df.empty)
151
+
152
+ # Test case 3: Empty tracked_dict
153
+ df = _format_plot_violin(id, {}, {})
154
+ self.assertTrue(df.empty)
155
+
156
+ def test_format_plot_shaded_line(self):
157
+ """Test _format_plot_shaded_line function."""
158
+ # Test case 1: Normal input
159
+ tracked_dict = {
160
+ 'plot_df': pd.DataFrame({
161
+ 'x': np.linspace(0, 10, 100),
162
+ 'y_lower': np.sin(np.linspace(0, 10, 100)) - 0.2,
163
+ 'y_middle': np.sin(np.linspace(0, 10, 100)),
164
+ 'y_upper': np.sin(np.linspace(0, 10, 100)) + 0.2
165
+ })
166
+ }
167
+ id = 'test_shaded'
168
+ df = _format_plot_shaded_line(id, tracked_dict, {})
169
+
170
+ # Verify it returned the DataFrame
171
+ self.assertFalse(df.empty)
172
+
173
+ # Test case 2: Empty tracked_dict
174
+ df = _format_plot_shaded_line(id, {}, {})
175
+ self.assertTrue(df.empty)
176
+
177
+ def test_format_plot_scatter_hist(self):
178
+ """Test _format_plot_scatter_hist function."""
179
+ # Test case 1: Normal input
180
+ tracked_dict = {
181
+ 'x': np.random.normal(0, 1, 100),
182
+ 'y': np.random.normal(0, 1, 100),
183
+ 'hist_x': np.random.rand(10),
184
+ 'hist_y': np.random.rand(10),
185
+ 'bin_edges_x': np.linspace(-3, 3, 11),
186
+ 'bin_edges_y': np.linspace(-3, 3, 11)
187
+ }
188
+ id = 'test_scatter_hist'
189
+ df = _format_plot_scatter_hist(id, tracked_dict, {})
190
+
191
+ # Verify it returned the DataFrame with expected columns
192
+ self.assertFalse(df.empty)
193
+ self.assertTrue(any(col.startswith(f"{id}_scatter_hist_x") for col in df.columns))
194
+ self.assertTrue(any(col.startswith(f"{id}_scatter_hist_y") for col in df.columns))
195
+
196
+ # Test case 2: Missing keys
197
+ tracked_dict = {
198
+ 'x': np.random.normal(0, 1, 100),
199
+ 'y': np.random.normal(0, 1, 100)
200
+ }
201
+ df = _format_plot_scatter_hist(id, tracked_dict, {})
202
+ self.assertFalse(df.empty) # Should still work with just x,y
203
+
204
+ # Test case 3: Empty tracked_dict
205
+ df = _format_plot_scatter_hist(id, {}, {})
206
+ self.assertTrue(df.empty)
207
+
208
+
209
+ if __name__ == '__main__':
210
+ unittest.main()
@@ -0,0 +1,342 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 23:14:10 (ywatanabe)"
4
+ # File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py
5
+ # ----------------------------------------
6
+ import os
7
+ import sys
8
+ import numpy as np
9
+ import pandas as pd
10
+ import matplotlib
11
+ matplotlib.use('Agg') # Non-interactive backend
12
+
13
+ # Add src to path if needed
14
+ src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../../../'))
15
+ if src_path not in sys.path:
16
+ sys.path.insert(0, src_path)
17
+
18
+ import scitex
19
+
20
+ # Create output directory
21
+ OUTPUT_DIR = os.path.join(os.path.dirname(__file__), 'formatter_test_output')
22
+ os.makedirs(OUTPUT_DIR, exist_ok=True)
23
+
24
+ def test_all_formatters():
25
+ """
26
+ Test all formatters by creating actual plots and saving both image and CSV files.
27
+ Each function will create a different type of plot, save it, and verify the CSV export.
28
+ """
29
+ # Test each formatter with a real plot
30
+ test_plot_kde()
31
+ test_plot_image()
32
+ test_plot_shaded_line()
33
+ test_plot_scatter_hist()
34
+ test_plot_violin()
35
+ test_plot_heatmap()
36
+ test_plot_ecdf()
37
+ test_multiple_plots()
38
+
39
+ def test_plot_kde():
40
+ """Test KDE plotting and CSV export."""
41
+ print("Testing plot_kde...")
42
+
43
+ # Create figure
44
+ fig, ax = scitex.plt.subplots()
45
+
46
+ # Generate data
47
+ np.random.seed(42) # For reproducibility
48
+ data = np.concatenate([np.random.normal(0, 1, 500), np.random.normal(5, 1, 300)])
49
+
50
+ # Plot with ID for tracking
51
+ ax.plot_kde(data, label="Bimodal Distribution", id="kde_test")
52
+
53
+ # Style the plot
54
+ ax.set_xyt("Value", "Density", "KDE Test")
55
+ ax.legend()
56
+
57
+ # Save both image and data
58
+ save_path = os.path.join(OUTPUT_DIR, "kde_test.png")
59
+ scitex.io.save(fig, save_path)
60
+
61
+ # Verify CSV was created
62
+ csv_path = save_path.replace(".png", ".csv")
63
+ assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
64
+
65
+ # Read CSV and verify contents
66
+ df = pd.read_csv(csv_path)
67
+ assert "kde_test_kde_x" in df.columns, "Expected column 'kde_test_kde_x' not found"
68
+ assert "kde_test_kde_density" in df.columns, "Expected column 'kde_test_kde_density' not found"
69
+
70
+ # Close figure
71
+ scitex.plt.close(fig)
72
+ print("✓ plot_kde test successful")
73
+
74
+ def test_plot_image():
75
+ """Test image plotting and CSV export."""
76
+ print("Testing plot_image...")
77
+
78
+ # Create figure
79
+ fig, ax = scitex.plt.subplots()
80
+
81
+ # Generate data
82
+ np.random.seed(42) # For reproducibility
83
+ data = np.random.rand(20, 20)
84
+
85
+ # Plot with ID for tracking
86
+ ax.plot_image(data, cmap="viridis", id="image_test")
87
+
88
+ # Style the plot
89
+ ax.set_xyt("X", "Y", "Image Test")
90
+
91
+ # Save both image and data
92
+ save_path = os.path.join(OUTPUT_DIR, "image_test.png")
93
+ scitex.io.save(fig, save_path)
94
+
95
+ # Verify CSV was created
96
+ csv_path = save_path.replace(".png", ".csv")
97
+ assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
98
+
99
+ # Read CSV and verify contents
100
+ df = pd.read_csv(csv_path)
101
+ # The formatter should have converted the 2D array to a DataFrame
102
+ assert not df.empty, "CSV file is empty"
103
+
104
+ # Close figure
105
+ scitex.plt.close(fig)
106
+ print("✓ plot_image test successful")
107
+
108
+ def test_plot_shaded_line():
109
+ """Test shaded line plotting and CSV export."""
110
+ print("Testing plot_shaded_line...")
111
+
112
+ # Create figure
113
+ fig, ax = scitex.plt.subplots()
114
+
115
+ # Generate data
116
+ np.random.seed(42) # For reproducibility
117
+ x = np.linspace(0, 10, 100)
118
+ y_middle = np.sin(x)
119
+ y_lower = y_middle - 0.2
120
+ y_upper = y_middle + 0.2
121
+
122
+ # Plot with ID for tracking
123
+ ax.plot_shaded_line(x, y_lower, y_middle, y_upper, label="Sine with error", id="shaded_line_test")
124
+
125
+ # Style the plot
126
+ ax.set_xyt("X", "Y", "Shaded Line Test")
127
+ ax.legend()
128
+
129
+ # Save both image and data
130
+ save_path = os.path.join(OUTPUT_DIR, "shaded_line_test.png")
131
+ scitex.io.save(fig, save_path)
132
+
133
+ # Verify CSV was created
134
+ csv_path = save_path.replace(".png", ".csv")
135
+ assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
136
+
137
+ # Read CSV and verify contents
138
+ df = pd.read_csv(csv_path)
139
+ assert not df.empty, "CSV file is empty"
140
+
141
+ # Close figure
142
+ scitex.plt.close(fig)
143
+ print("✓ plot_shaded_line test successful")
144
+
145
+ def test_plot_scatter_hist():
146
+ """Test scatter histogram plotting and CSV export."""
147
+ print("Testing plot_scatter_hist...")
148
+
149
+ # Create figure
150
+ fig, ax = scitex.plt.subplots(figsize=(8, 8))
151
+
152
+ # Generate data
153
+ np.random.seed(42) # For reproducibility
154
+ x = np.random.normal(0, 1, 500)
155
+ y = x + np.random.normal(0, 0.5, 500)
156
+
157
+ # Plot with ID for tracking
158
+ ax.plot_scatter_hist(x, y, hist_bins=30, scatter_alpha=0.7, id="scatter_hist_test")
159
+
160
+ # Style the plot
161
+ ax.set_xyt("X Values", "Y Values", "Scatter Histogram Test")
162
+
163
+ # Save both image and data
164
+ save_path = os.path.join(OUTPUT_DIR, "scatter_hist_test.png")
165
+ scitex.io.save(fig, save_path)
166
+
167
+ # Verify CSV was created
168
+ csv_path = save_path.replace(".png", ".csv")
169
+ assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
170
+
171
+ # Read CSV and verify contents
172
+ df = pd.read_csv(csv_path)
173
+ assert not df.empty, "CSV file is empty"
174
+
175
+ # Close figure
176
+ scitex.plt.close(fig)
177
+ print("✓ plot_scatter_hist test successful")
178
+
179
+ def test_plot_violin():
180
+ """Test violin plotting and CSV export."""
181
+ print("Testing plot_violin...")
182
+
183
+ # Create figure
184
+ fig, ax = scitex.plt.subplots()
185
+
186
+ # Generate data
187
+ np.random.seed(42) # For reproducibility
188
+ data = [
189
+ np.random.normal(0, 1, 100),
190
+ np.random.normal(2, 1.5, 100),
191
+ np.random.normal(5, 0.8, 100),
192
+ ]
193
+ labels = ["Group A", "Group B", "Group C"]
194
+
195
+ # Plot with ID for tracking
196
+ ax.plot_violin(data, labels=labels, colors=["red", "blue", "green"], id="violin_test")
197
+
198
+ # Style the plot
199
+ ax.set_xyt("Groups", "Values", "Violin Plot Test")
200
+
201
+ # Save both image and data
202
+ save_path = os.path.join(OUTPUT_DIR, "violin_test.png")
203
+ scitex.io.save(fig, save_path)
204
+
205
+ # Verify CSV was created
206
+ csv_path = save_path.replace(".png", ".csv")
207
+ assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
208
+
209
+ # Read CSV and verify contents
210
+ df = pd.read_csv(csv_path)
211
+ assert not df.empty, "CSV file is empty"
212
+
213
+ # Close figure
214
+ scitex.plt.close(fig)
215
+ print("✓ plot_violin test successful")
216
+
217
+ def test_plot_heatmap():
218
+ """Test heatmap plotting and CSV export."""
219
+ print("Testing plot_heatmap...")
220
+
221
+ # Create figure
222
+ fig, ax = scitex.plt.subplots()
223
+
224
+ # Generate data
225
+ np.random.seed(42) # For reproducibility
226
+ data = np.random.rand(5, 10)
227
+ x_labels = [f"X{ii+1}" for ii in range(5)]
228
+ y_labels = [f"Y{ii+1}" for ii in range(10)]
229
+
230
+ # Plot with ID for tracking
231
+ ax.plot_heatmap(
232
+ data,
233
+ x_labels=x_labels,
234
+ y_labels=y_labels,
235
+ cbar_label="Values",
236
+ show_annot=True,
237
+ value_format="{x:.2f}",
238
+ cmap="viridis",
239
+ id="heatmap_test",
240
+ )
241
+
242
+ # Style the plot
243
+ ax.set_title("Heatmap Test")
244
+
245
+ # Save both image and data
246
+ save_path = os.path.join(OUTPUT_DIR, "heatmap_test.png")
247
+ scitex.io.save(fig, save_path)
248
+
249
+ # Verify CSV was created
250
+ csv_path = save_path.replace(".png", ".csv")
251
+ assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
252
+
253
+ # Read CSV and verify contents
254
+ df = pd.read_csv(csv_path)
255
+ assert not df.empty, "CSV file is empty"
256
+
257
+ # Close figure
258
+ scitex.plt.close(fig)
259
+ print("✓ plot_heatmap test successful")
260
+
261
+ def test_plot_ecdf():
262
+ """Test ECDF plotting and CSV export."""
263
+ print("Testing plot_ecdf...")
264
+
265
+ # Create figure
266
+ fig, ax = scitex.plt.subplots()
267
+
268
+ # Generate data
269
+ np.random.seed(42) # For reproducibility
270
+ data = np.random.normal(0, 1, 1000)
271
+
272
+ # Plot with ID for tracking
273
+ ax.plot_ecdf(data, label="Normal Distribution", id="ecdf_test")
274
+
275
+ # Style the plot
276
+ ax.set_xyt("Value", "Cumulative Probability", "ECDF Test")
277
+ ax.legend()
278
+
279
+ # Save both image and data
280
+ save_path = os.path.join(OUTPUT_DIR, "ecdf_test.png")
281
+ scitex.io.save(fig, save_path)
282
+
283
+ # Verify CSV was created
284
+ csv_path = save_path.replace(".png", ".csv")
285
+ assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
286
+
287
+ # Read CSV and verify contents
288
+ df = pd.read_csv(csv_path)
289
+ assert not df.empty, "CSV file is empty"
290
+
291
+ # Close figure
292
+ scitex.plt.close(fig)
293
+ print("✓ plot_ecdf test successful")
294
+
295
+ def test_multiple_plots():
296
+ """Test multiple plots on the same axis."""
297
+ print("Testing multiple plots on the same axis...")
298
+
299
+ # Create figure
300
+ fig, ax = scitex.plt.subplots()
301
+
302
+ # Generate data
303
+ np.random.seed(42) # For reproducibility
304
+ x = np.linspace(0, 10, 100)
305
+ y1 = np.sin(x)
306
+ y2 = np.cos(x)
307
+
308
+ # Create multiple plots with different IDs
309
+ ax.plot_line(y1, label="Sine", id="multi_test_sine")
310
+ ax.plot_line(y2, label="Cosine", id="multi_test_cosine")
311
+
312
+ # Style the plot
313
+ ax.set_xyt("X", "Y", "Multiple Plots Test")
314
+ ax.legend()
315
+
316
+ # Save both image and data
317
+ save_path = os.path.join(OUTPUT_DIR, "multiple_plots_test.png")
318
+ scitex.io.save(fig, save_path)
319
+
320
+ # Verify CSV was created
321
+ csv_path = save_path.replace(".png", ".csv")
322
+ assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
323
+
324
+ # Read CSV and verify contents
325
+ df = pd.read_csv(csv_path)
326
+ assert not df.empty, "CSV file is empty"
327
+
328
+ # Check that both plots are in the CSV
329
+ sine_cols = [col for col in df.columns if col.startswith("multi_test_sine")]
330
+ cosine_cols = [col for col in df.columns if col.startswith("multi_test_cosine")]
331
+ assert len(sine_cols) > 0, "Sine plot data not found in CSV"
332
+ assert len(cosine_cols) > 0, "Cosine plot data not found in CSV"
333
+
334
+ # Close figure
335
+ scitex.plt.close(fig)
336
+ print("✓ Multiple plots test successful")
337
+
338
+ if __name__ == "__main__":
339
+ print("Starting formatter verification tests...")
340
+ test_all_formatters()
341
+ print("\nAll formatter tests completed successfully!")
342
+ print(f"Output files are in: {OUTPUT_DIR}")
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
4
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters.py
5
+ # ----------------------------------------
6
+ import os
7
+ __FILE__ = (
8
+ "./src/scitex/plt/_subplots/_export_as_csv_formatters.py"
9
+ )
10
+ __DIR__ = os.path.dirname(__FILE__)
11
+ # ----------------------------------------
12
+
13
+ # Import formatters from the submodule
14
+ from scitex.plt._subplots._export_as_csv_formatters import (
15
+ # Standard matplotlib formatters
16
+ _format_plot,
17
+ _format_scatter,
18
+ _format_bar,
19
+ _format_barh,
20
+ _format_hist,
21
+ _format_boxplot,
22
+ _format_contour,
23
+ _format_errorbar,
24
+ _format_eventplot,
25
+ _format_fill,
26
+ _format_fill_between,
27
+ _format_imshow,
28
+ _format_imshow2d,
29
+ _format_violin,
30
+ _format_violinplot,
31
+
32
+ # Custom plotting formatters
33
+ _format_plot_box,
34
+ _format_plot_conf_mat,
35
+ _format_plot_ecdf,
36
+ _format_plot_fillv,
37
+ _format_plot_heatmap,
38
+ _format_plot_image,
39
+ _format_plot_joyplot,
40
+ _format_plot_kde,
41
+ _format_plot_line,
42
+ _format_plot_mean_ci,
43
+ _format_plot_mean_std,
44
+ _format_plot_median_iqr,
45
+ _format_plot_raster,
46
+ _format_plot_rectangle,
47
+ _format_plot_scatter_hist,
48
+ _format_plot_shaded_line,
49
+ _format_plot_violin,
50
+
51
+ # Seaborn formatters
52
+ _format_sns_barplot,
53
+ _format_sns_boxplot,
54
+ _format_sns_heatmap,
55
+ _format_sns_histplot,
56
+ _format_sns_jointplot,
57
+ _format_sns_kdeplot,
58
+ _format_sns_lineplot,
59
+ _format_sns_pairplot,
60
+ _format_sns_scatterplot,
61
+ _format_sns_stripplot,
62
+ _format_sns_swarmplot,
63
+ _format_sns_violinplot,
64
+ )
65
+
66
+ def main():
67
+ # Line
68
+ import scitex
69
+ import matplotlib.pyplot as plt
70
+
71
+ fig, ax = scitex.plt.subplots()
72
+ ax.plot([1, 2, 3], [4, 5, 6], id="plot1")
73
+ ax.plot([4, 5, 6], [1, 2, 3], id="plot2")
74
+ scitex.io.save(fig, "./plots.png")
75
+ scitex.io.save(ax.export_as_csv(), "./plots.csv")
76
+
77
+ # No tracking
78
+ fig, ax = scitex.plt.subplots(track=False)
79
+ ax.plot([1, 2, 3], [4, 5, 6], id="plot3")
80
+ ax.plot([4, 5, 6], [1, 2, 3], id="plot4")
81
+ scitex.io.save(fig, "./plots_wo_tracking.png")
82
+ scitex.io.save(ax.export_as_csv(), "./plots_wo_tracking.csv")
83
+
84
+ # Scatter
85
+ fig, ax = scitex.plt.subplots()
86
+ ax.scatter([1, 2, 3], [4, 5, 6], id="scatter1")
87
+ ax.scatter([4, 5, 6], [1, 2, 3], id="scatter2")
88
+ scitex.io.save(fig, "./scatters.png")
89
+ scitex.io.save(ax.export_as_csv(), "./scatters.csv")
90
+
91
+ # Box
92
+ fig, ax = scitex.plt.subplots()
93
+ ax.boxplot([1, 2, 3], id="boxplot1")
94
+ scitex.io.save(fig, "./boxplot1.png")
95
+ scitex.io.save(ax.export_as_csv(), "./boxplot1.csv")
96
+
97
+ # Bar
98
+ fig, ax = scitex.plt.subplots()
99
+ ax.bar(["A", "B", "C"], [4, 5, 6], id="bar1")
100
+ scitex.io.save(fig, "./bar1.png")
101
+ scitex.io.save(ax.export_as_csv(), "./bar1.csv")
102
+
103
+
104
+ if __name__ == "__main__":
105
+ # Main
106
+ import sys
107
+ import scitex
108
+
109
+ CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(
110
+ sys, plt, verbose=False, agg=True
111
+ )
112
+ main()
113
+ scitex.gen.close(CONFIG, verbose=False, notify=False)
114
+
115
+ # EOF
scitex/plt/_tpl.py ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-03-31 11:58:28 (ywatanabe)"
4
+
5
+ import numpy as np
6
+ import termplotlib as tpl
7
+
8
+
9
+ def termplot(*args):
10
+ """
11
+ Plots given y values against x using termplotlib, or plots a single y array against its indices if x is not provided.
12
+
13
+ Parameters:
14
+ - *args: Accepts either one argument (y values) or two arguments (x and y values).
15
+
16
+ Returns:
17
+ None. Displays the plot in the terminal.
18
+ """
19
+ if len(args) == 1:
20
+ y = args[0] # [REVISED]
21
+ x = np.arange(len(y))
22
+
23
+ if len(args) == 2:
24
+ x, y = args
25
+
26
+ fig = tpl.figure()
27
+ fig.plot(x, y)
28
+ fig.show()