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/gen/misc.py ADDED
@@ -0,0 +1,730 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-16 16:26:59 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/gen/misc.py
5
+
6
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/gen/misc.py"
7
+
8
+ #!/usr/bin/env python3
9
+ # -*- coding: utf-8 -*-
10
+ # Time-stamp: "2024-11-02 12:50:29 (ywatanabe)"
11
+ # File: ./scitex_repo/src/scitex/gen/misc.py
12
+
13
+ import math
14
+ import os
15
+ import shutil
16
+ import threading
17
+ import time
18
+ import warnings
19
+ from bisect import bisect_left
20
+ from functools import wraps
21
+
22
+
23
+ import numpy as np
24
+ import pandas as pd
25
+ import readchar
26
+ import torch
27
+
28
+
29
+ def find_closest(list_obj, num_insert):
30
+ """Find the closest value in a sorted list to a given number.
31
+
32
+ Parameters
33
+ ----------
34
+ list_obj : list
35
+ A sorted list of numbers.
36
+ num_insert : float or int
37
+ The number to find the closest value to.
38
+
39
+ Returns
40
+ -------
41
+ tuple
42
+ A tuple containing (closest_value, index_of_closest_value).
43
+
44
+ Example
45
+ -------
46
+ >>> find_closest([1, 3, 5, 7, 9], 6)
47
+ (5, 2)
48
+ >>> find_closest([1, 3, 5, 7, 9], 8)
49
+ (7, 3)
50
+ """
51
+ """
52
+ Assumes list_obj is sorted. Returns the closest value to num.
53
+ If the same number is included in list_obj, the smaller number is returned.
54
+
55
+ Example:
56
+ list_obj = np.array([0, 1, 1, 2, 3, 3])
57
+ num = 1.2
58
+ closest_num, closest_pos = take_the_closest(list_obj, num)
59
+ print(closest_num, closest_pos)
60
+ # 1 2
61
+
62
+ list_obj = np.array([0, 1, 1, 2, 3, 3])
63
+ num = 1
64
+ closest_num, closest_pos = take_the_closest(list_obj, num)
65
+ print(closest_num, closest_pos)
66
+ # 1 1
67
+ """
68
+ if math.isnan(num_insert):
69
+ closest_num = np.nan
70
+ closest_pos = np.nan
71
+
72
+ pos_num_insert = bisect_left(list_obj, num_insert)
73
+
74
+ if pos_num_insert == 0:
75
+ closest_num = list_obj[0]
76
+ closest_pos = pos_num_insert
77
+
78
+ if pos_num_insert == len(list_obj):
79
+ closest_num = list_obj[-1]
80
+ closest_pos = pos_num_insert
81
+
82
+ else:
83
+ pos_before = pos_num_insert - 1
84
+
85
+ before_num = list_obj[pos_before]
86
+ after_num = list_obj[pos_num_insert]
87
+
88
+ delta_after = abs(after_num - num_insert)
89
+ delta_before = abs(before_num - num_insert)
90
+
91
+ if np.abs(delta_after) < np.abs(delta_before):
92
+ closest_num = after_num
93
+ closest_pos = pos_num_insert
94
+
95
+ else:
96
+ closest_num = before_num
97
+ closest_pos = pos_before
98
+
99
+ return closest_num, closest_pos
100
+
101
+
102
+ ################################################################################
103
+ ## mutable
104
+ ################################################################################
105
+ def isclose(mutable_a, mutable_b):
106
+ """Check if two mutable objects are close to each other.
107
+
108
+ This function compares two mutable objects (e.g., lists, numpy arrays) element-wise
109
+ to determine if they are close to each other.
110
+
111
+ Parameters
112
+ ----------
113
+ mutable_a : list or numpy.ndarray
114
+ The first mutable object to compare.
115
+ mutable_b : list or numpy.ndarray
116
+ The second mutable object to compare.
117
+
118
+ Returns
119
+ -------
120
+ bool
121
+ True if the objects are close to each other, False otherwise.
122
+
123
+ Example
124
+ -------
125
+ >>> isclose([1.0, 2.0, 3.0], [1.0, 2.0001, 3.0])
126
+ True
127
+ >>> isclose([1.0, 2.0, 3.0], [1.0, 2.1, 3.0])
128
+ False
129
+ """
130
+ return [math.isclose(a, b) for a, b in zip(mutable_a, mutable_b)]
131
+
132
+
133
+ ################################################################################
134
+ ## dictionary
135
+ ################################################################################
136
+
137
+
138
+ ################################################################################
139
+ ## variables
140
+ ################################################################################
141
+ def is_defined_global(x_str):
142
+ """
143
+ Example:
144
+ print(is_defined('a'))
145
+ # False
146
+
147
+ a = 5
148
+ print(is_defined('a'))
149
+ # True
150
+ """
151
+ return x_str in globals()
152
+
153
+
154
+ def is_defined_local(x_str):
155
+ """
156
+ Example:
157
+ print(is_defined('a'))
158
+ # False
159
+
160
+ a = 5
161
+ print(is_defined('a'))
162
+ # True
163
+ """
164
+ return x_str in locals()
165
+
166
+
167
+ ################################################################################
168
+ ## versioning
169
+ ################################################################################
170
+ def is_later_or_equal(package, tgt_version, format="MAJOR.MINOR.PATCH"):
171
+ """Check if the installed version of a package is later than or equal to a target version.
172
+
173
+ Parameters
174
+ ----------
175
+ package : str
176
+ The name of the package to check.
177
+ tgt_version : str
178
+ The target version to compare against.
179
+ format : str, optional
180
+ The version format (default is "MAJOR.MINOR.PATCH").
181
+
182
+ Returns
183
+ -------
184
+ bool
185
+ True if the installed version is later than or equal to the target version, False otherwise.
186
+
187
+ Example
188
+ -------
189
+ >>> is_later_or_equal('numpy', '1.18.0')
190
+ True
191
+ >>> is_later_or_equal('pandas', '2.0.0')
192
+ False
193
+ """
194
+
195
+ import numpy as np
196
+
197
+ indi, matched = scitex.gen.search(["MAJOR", "MINOR", "PATCH"], format.split("."))
198
+ imp_major, imp_minor, imp_patch = [
199
+ int(v) for v in np.array(package.__version__.split("."))[indi]
200
+ ]
201
+ tgt_major, tgt_minor, tgt_patch = [
202
+ int(v) for v in np.array(tgt_version.split("."))[indi]
203
+ ]
204
+
205
+ print(
206
+ f"\npackage: {package.__name__}\n"
207
+ f"target_version: {tgt_version}\n"
208
+ f"imported_version: {imp_major}.{imp_minor}.{imp_patch}\n"
209
+ )
210
+
211
+ ## Mjorr
212
+ if imp_major > tgt_major:
213
+ return True
214
+
215
+ if imp_major < tgt_major:
216
+ return False
217
+
218
+ if imp_major == tgt_major:
219
+
220
+ ## Minor
221
+ if imp_minor > tgt_minor:
222
+ return True
223
+
224
+ if imp_minor < tgt_minor:
225
+ return False
226
+
227
+ if imp_minor == tgt_minor:
228
+
229
+ ## Patch
230
+ if imp_patch > tgt_patch:
231
+ return True
232
+ if imp_patch < tgt_patch:
233
+ return False
234
+ if imp_patch == tgt_patch:
235
+ return True
236
+
237
+
238
+ ################################################################################
239
+ ## File
240
+ ################################################################################
241
+ def _copy_a_file(src, dst, allow_overwrite=False):
242
+ """Copy a single file from source to destination.
243
+
244
+ Parameters
245
+ ----------
246
+ src : str
247
+ The path to the source file.
248
+ dst : str
249
+ The path to the destination file.
250
+ allow_overwrite : bool, optional
251
+ If True, allows overwriting existing files (default is False).
252
+
253
+ Raises
254
+ ------
255
+ FileExistsError
256
+ If the destination file already exists and allow_overwrite is False.
257
+
258
+ Example
259
+ -------
260
+ >>> _copy_a_file('/path/to/source.txt', '/path/to/destination.txt')
261
+ >>> _copy_a_file('/path/to/source.txt', '/path/to/existing.txt', allow_overwrite=True)
262
+ """
263
+ if src == "/dev/null":
264
+ print(f"\n/dev/null was not copied.\n")
265
+
266
+ else:
267
+
268
+ if dst.endswith("/"):
269
+ _, src_fname, src_ext = scitex.path.split(src)
270
+ # src_fname = src + src_ext
271
+ dst = dst + src_fname + src_ext
272
+
273
+ if not os.path.exists(dst):
274
+ shutil.copyfile(src, dst)
275
+ print(f'\nCopied "{src}" to "{dst}".\n')
276
+
277
+ else:
278
+ if allow_overwrite:
279
+ shutil.copyfile(src, dst)
280
+ print(f'\nCopied "{src}" to "{dst}" (overwritten).\n')
281
+
282
+ if not allow_overwrite:
283
+ print(f'\n"{dst}" exists and copying from "{src}" was aborted.\n')
284
+
285
+
286
+ def copy_files(src_files, dists, allow_overwrite=False):
287
+ """Copy multiple files from source(s) to destination(s).
288
+
289
+ Parameters
290
+ ----------
291
+ src_files : str or list of str
292
+ The path(s) to the source file(s).
293
+ dists : str or list of str
294
+ The path(s) to the destination file(s) or directory(ies).
295
+ allow_overwrite : bool, optional
296
+ If True, allows overwriting existing files (default is False).
297
+
298
+ Example
299
+ -------
300
+ >>> copy_files('/path/to/source.txt', '/path/to/destination/')
301
+ >>> copy_files(['/path/to/file1.txt', '/path/to/file2.txt'], ['/path/to/dest1/', '/path/to/dest2/'])
302
+ >>> copy_files('/path/to/source.txt', '/path/to/existing.txt', allow_overwrite=True)
303
+ """
304
+ if isinstance(src_files, str):
305
+ src_files = [src_files]
306
+
307
+ if isinstance(dists, str):
308
+ dists = [dists]
309
+
310
+ for sf in src_files:
311
+ for dst in dists:
312
+ _copy_a_file(sf, dst, allow_overwrite=allow_overwrite)
313
+
314
+
315
+ def copy_the_file(sdir):
316
+ """Copy the current script file to a specified directory.
317
+
318
+ This function copies the script file that called it to a specified directory.
319
+ It uses the calling script's filename and copies it to the given directory.
320
+
321
+ Parameters
322
+ ----------
323
+ sdir : str
324
+ The destination directory where the file should be copied.
325
+
326
+ Note
327
+ ----
328
+ This function will not copy the file if it's run in an IPython environment.
329
+
330
+ Example
331
+ -------
332
+ >>> copy_the_file('/path/to/destination/')
333
+ """
334
+ THIS_FILE = inspect.stack()[1].filename
335
+ _, fname, ext = scitex.path.split(__file__)
336
+
337
+ # dst = sdir + fname + ext
338
+
339
+ if "ipython" not in __file__:
340
+ _copy_a_file(__file__, dst)
341
+
342
+
343
+ def is_nan(X):
344
+ """Check if the input contains any NaN values and raise an error if found.
345
+
346
+ This function checks for NaN values in various data types including pandas DataFrames,
347
+ numpy arrays, PyTorch tensors, and scalar values.
348
+
349
+ Parameters
350
+ ----------
351
+ X : pandas.DataFrame, numpy.ndarray, torch.Tensor, float, or int
352
+ The input data to check for NaN values.
353
+
354
+ Raises
355
+ ------
356
+ ValueError
357
+ If any NaN value is found in the input.
358
+
359
+ Example
360
+ -------
361
+ >>> import numpy as np
362
+ >>> import pandas as pd
363
+ >>> import torch
364
+ >>> is_nan(pd.DataFrame({'a': [1, 2, np.nan]}))
365
+ ValueError: NaN was found in X
366
+ >>> is_nan(np.array([1, 2, 3]))
367
+ # No error raised
368
+ >>> is_nan(torch.tensor([1.0, float('nan'), 3.0]))
369
+ ValueError: NaN was found in X
370
+ >>> is_nan(float('nan'))
371
+ ValueError: X was NaN
372
+ """
373
+ if isinstance(X, pd.DataFrame):
374
+ if X.isna().any().any():
375
+ raise ValueError("NaN was found in X")
376
+ elif isinstance(X, np.ndarray):
377
+ if np.isnan(X).any():
378
+ raise ValueError("NaN was found in X")
379
+ elif torch.is_tensor(X):
380
+ if X.isnan().any():
381
+ raise ValueError("NaN was found in X")
382
+ elif isinstance(X, (float, int)):
383
+ if math.isnan(X):
384
+ raise ValueError("X was NaN")
385
+
386
+
387
+ def partial_at(func, index, value):
388
+ """Create a partial function with a fixed argument at a specific position.
389
+
390
+ This function creates a new function that calls the original function with a
391
+ fixed argument inserted at the specified index position.
392
+
393
+ Parameters
394
+ ----------
395
+ func : callable
396
+ The original function to be partially applied.
397
+ index : int
398
+ The position at which to insert the fixed argument.
399
+ value : any
400
+ The fixed argument value to be inserted.
401
+
402
+ Returns
403
+ -------
404
+ callable
405
+ A new function that calls the original function with the fixed argument.
406
+
407
+ Example
408
+ -------
409
+ >>> def greet(greeting, name):
410
+ ... return f"{greeting}, {name}!"
411
+ >>> hello = partial_at(greet, 0, "Hello")
412
+ >>> hello("Alice")
413
+ 'Hello, Alice!'
414
+ >>> hello("Bob")
415
+ 'Hello, Bob!'
416
+ """
417
+
418
+ @wraps(func)
419
+ def result(*rest, **kwargs):
420
+ args = []
421
+ args.extend(rest[:index])
422
+ args.append(value)
423
+ args.extend(rest[index:])
424
+ return func(*args, **kwargs)
425
+
426
+ return result
427
+
428
+
429
+ # def describe(df, method="mean", round_factor=1, axis=0):
430
+ # assert method in ["mean_std", "mean_ci", "median_iqr"]
431
+ # df = pd.DataFrame(df)
432
+ # with warnings.catch_warnings():
433
+ # warnings.simplefilter("ignore", RuntimeWarning)
434
+ # if method == "mean":
435
+ # return round(np.nanmean(df, axis=axis), 3), round(
436
+ # np.nanstd(df, axis=axis) / round_factor, 3
437
+ # )
438
+ # if method == "median":
439
+ # med = df.median(axis=axis)
440
+ # IQR = df.quantile(0.75, axis=axis) - df.quantile(0.25, axis=axis)
441
+ # return round(med, 3), round(IQR / round_factor, 3)
442
+
443
+
444
+ def describe(df, method="mean_std", round_factor=3, axis=0):
445
+ """
446
+ Compute descriptive statistics for a DataFrame.
447
+
448
+ Example
449
+ -------
450
+ import pandas as pd
451
+ import numpy as np
452
+ data = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
453
+ result = describe(data, method='mean_std')
454
+ print(f"n={result['n']}, mean={result['mean']}, std={result['std']}")
455
+
456
+ Parameters
457
+ ----------
458
+ df : pandas.DataFrame or array-like
459
+ Input data.
460
+ method : str, optional
461
+ Statistical method to use. Options are 'mean_std', 'mean_ci', 'median_iqr'.
462
+ Default is 'mean_std'.
463
+ round_factor : int, optional
464
+ Factor to divide the spread statistic by. Default is 3.
465
+ axis : int, optional
466
+ Axis along which to compute statistics. Default is 0.
467
+
468
+ Returns
469
+ -------
470
+ dict
471
+ Dictionary containing statistics based on the method chosen.
472
+ """
473
+ assert method in ["mean_std", "mean_ci", "median_iqr"]
474
+ df = pd.DataFrame(df)
475
+ nn = df.notna().sum(axis=axis)
476
+
477
+ with warnings.catch_warnings():
478
+ warnings.simplefilter("ignore", RuntimeWarning)
479
+ if method in ["mean_std", "mean_ci"]:
480
+ mm = np.nanmean(df, axis=axis)
481
+ if method == "mean_std":
482
+ ss = np.nanstd(df, axis=axis)
483
+ key = "std"
484
+ else: # mean_ci
485
+ ss = 1.96 * np.nanstd(df, axis=axis) / np.sqrt(nn)
486
+ key = "ci"
487
+ return {
488
+ "n": np.round(nn, 3),
489
+ "mean": np.round(mm, 3),
490
+ key: np.round(ss, 3),
491
+ }
492
+ else: # median_iqr
493
+ med = df.median(axis=axis)
494
+ iqr = df.quantile(0.75, axis=axis) - df.quantile(0.25, axis=axis)
495
+ return {
496
+ "n": np.round(nn, round_factor),
497
+ "median": np.round(med, round_factor),
498
+ "iqr": np.round(iqr, round_factor),
499
+ }
500
+
501
+
502
+ def _return_counting_process():
503
+ import multiprocessing
504
+
505
+ def _count():
506
+ counter = 0
507
+ while True:
508
+ print(counter)
509
+ time.sleep(1)
510
+ counter += 1
511
+
512
+ p1 = multiprocessing.Process(target=_count)
513
+ p1.start()
514
+ return p1
515
+
516
+
517
+ def wait_key(process, tgt_key="q"):
518
+ """Wait for a specific key press while a process is running.
519
+
520
+ This function waits for a specific key to be pressed while a given process
521
+ is running. It's typically used to provide a way to interrupt or terminate
522
+ a long-running process.
523
+
524
+ Parameters
525
+ ----------
526
+ process : multiprocessing.Process
527
+ The process to monitor while waiting for the key press.
528
+ tgt_key : str, optional
529
+ The target key to wait for (default is "q" for quit).
530
+
531
+ Returns
532
+ -------
533
+ None
534
+
535
+ Note
536
+ ----
537
+ This function will block until either the target key is pressed or the
538
+ monitored process terminates.
539
+
540
+ Example
541
+ -------
542
+ >>> import multiprocessing
543
+ >>> def long_running_task():
544
+ ... while True:
545
+ ... pass
546
+ >>> p = multiprocessing.Process(target=long_running_task)
547
+ >>> p.start()
548
+ >>> wait_key(p) # This will wait until 'q' is pressed or the process ends
549
+ """
550
+ """
551
+ Example:
552
+
553
+ p1 = scitex.gen._return_counting_process()
554
+ scitex.gen.wait_key(p1)
555
+ # press q
556
+ """
557
+ pressed_key = None
558
+ while pressed_key != tgt_key:
559
+ pressed_key = readchar.readchar()
560
+ print(pressed_key)
561
+ process.terminate()
562
+
563
+
564
+ class ThreadWithReturnValue(threading.Thread):
565
+ """
566
+ Example:
567
+ t = ThreadWithReturnValue(
568
+ target=func, args=(,), kwargs={key: val}
569
+ )
570
+ t.start()
571
+ out = t.join()
572
+
573
+ """
574
+
575
+ def __init__(
576
+ self,
577
+ group=None,
578
+ target=None,
579
+ name=None,
580
+ args=(),
581
+ kwargs={},
582
+ Verbose=None,
583
+ ):
584
+ Thread.__init__(self, group, target, name, args, kwargs)
585
+ self._return = None
586
+
587
+ def run(self):
588
+ if self._target is not None:
589
+ self._return = self._target(*self._args, **self._kwargs)
590
+
591
+ def join(self, *args):
592
+ ### fixme
593
+ Thread.join(self, *args)
594
+ return self._return
595
+
596
+
597
+ def unique(data, axis=None):
598
+ """
599
+ Identifies unique elements in the data along the specified axis and their counts, returning a DataFrame.
600
+
601
+ Parameters:
602
+ - data (array-like): The input data to analyze for unique elements.
603
+ - axis (int, optional): The axis along which to find the unique elements. Defaults to None.
604
+
605
+ Returns:
606
+ - df (pandas.DataFrame): DataFrame with unique elements and their counts.
607
+ """
608
+ if axis is None:
609
+ uqs, counts = np.unique(data, return_counts=True)
610
+ else:
611
+ uqs, counts = np.unique(data, axis=axis, return_counts=True)
612
+
613
+ if axis is None:
614
+ df = pd.DataFrame({"uq": uqs, "n": counts})
615
+ else:
616
+ df = pd.DataFrame(uqs, columns=[f"axis_{i}" for i in range(uqs.shape[1])])
617
+ df["n"] = counts
618
+
619
+ df["n"] = df["n"].apply(lambda x: f"{int(x):,}")
620
+
621
+ return df
622
+
623
+
624
+ def unique(data, axis=None):
625
+ """
626
+ Identifies unique elements in the data along the specified axis and their counts, returning a DataFrame.
627
+
628
+ Parameters:
629
+ - data (array-like): The input data to analyze for unique elements.
630
+ - axis (int, optional): The axis along which to find the unique elements. Defaults to None.
631
+
632
+ Returns:
633
+ - df (pandas.DataFrame): DataFrame with unique elements and their counts.
634
+ """
635
+ # Find unique elements and their counts
636
+ if axis is None:
637
+ uqs, counts = np.unique(data, return_counts=True)
638
+ df = pd.DataFrame({"Unique Elements": uqs, "Counts": counts})
639
+ else:
640
+ uqs, counts = np.unique(data, axis=axis, return_counts=True)
641
+ # Create a DataFrame with unique elements
642
+ df = pd.DataFrame(
643
+ uqs,
644
+ columns=[f"Unique Elements Axis {i}" for i in range(uqs.shape[1])],
645
+ )
646
+ # Add a column for counts
647
+ df["Counts"] = counts
648
+
649
+ # Format the 'Counts' column with commas for thousands
650
+ df["Counts"] = df["Counts"].apply(lambda x: f"{x:,}")
651
+
652
+ return df
653
+
654
+
655
+ def uq(*args, **kwargs):
656
+ """Alias for the unique function.
657
+
658
+ This function is a wrapper around the unique function, providing the same
659
+ functionality with a shorter name.
660
+
661
+ Parameters
662
+ ----------
663
+ *args : positional arguments
664
+ Positional arguments to be passed to the unique function.
665
+ **kwargs : keyword arguments
666
+ Keyword arguments to be passed to the unique function.
667
+
668
+ Returns
669
+ -------
670
+ array_like
671
+ The result of calling the unique function with the given arguments.
672
+
673
+ See Also
674
+ --------
675
+ unique : The main function for finding unique elements.
676
+
677
+ Example
678
+ -------
679
+ >>> uq([1, 2, 2, 3, 3, 3])
680
+ array([1, 2, 3])
681
+ """
682
+ return unique(*args, **kwargs)
683
+
684
+
685
+ # def mv_col(dataframe, column_name, position):
686
+ # temp_col = dataframe[column_name]
687
+ # dataframe.drop(labels=[column_name], axis=1, inplace=True)
688
+ # dataframe.insert(loc=position, column=column_name, value=temp_col)
689
+ # return dataframe
690
+
691
+
692
+ def float_linspace(start, stop, num_points):
693
+ """Generate evenly spaced floating-point numbers over a specified interval.
694
+
695
+ This function is similar to numpy's linspace, but ensures that the output
696
+ consists of floating-point numbers with a specified number of decimal places.
697
+
698
+ Parameters
699
+ ----------
700
+ start : float
701
+ The starting value of the sequence.
702
+ stop : float
703
+ The end value of the sequence.
704
+ num_points : int
705
+ Number of points to generate.
706
+
707
+ Returns
708
+ -------
709
+ numpy.ndarray
710
+ Array of evenly spaced floating-point values.
711
+
712
+ Example
713
+ -------
714
+ >>> float_linspace(0, 1, 5)
715
+ array([0. , 0.25, 0.5 , 0.75, 1. ])
716
+ >>> float_linspace(1, 2, 3)
717
+ array([1. , 1.5, 2. ])
718
+ """
719
+ num_points = int(num_points) # Ensure num_points is an integer
720
+
721
+ if num_points < 2:
722
+ return np.array([start, stop]) if num_points == 2 else np.array([start])
723
+
724
+ step = (stop - start) / (num_points - 1)
725
+ values = [start + i * step for i in range(num_points)]
726
+
727
+ return np.array(values)
728
+
729
+
730
+ # EOF