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,400 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-10-06 10:47:42 (ywatanabe)"
4
+ # _fdr_correction.py
5
+
6
+ """
7
+ Functionality:
8
+ - Implements False Discovery Rate (FDR) correction for multiple comparisons
9
+ - Provides both NumPy and PyTorch implementations
10
+
11
+ Input:
12
+ - Array-like object of p-values
13
+ - Alpha level for significance
14
+ - Method for correction ('indep' or 'negcorr')
15
+
16
+ Output:
17
+ - Boolean array indicating rejected hypotheses
18
+ - Array of corrected p-values
19
+
20
+ Prerequisites:
21
+ - NumPy, PyTorch, pandas, statsmodels, and scitex packages
22
+ """
23
+
24
+ """Imports"""
25
+ from typing import Union, Tuple
26
+ import numpy as np
27
+ import torch
28
+ import pandas as pd
29
+ from statsmodels.stats.multitest import fdrcorrection
30
+ import scitex
31
+ from ...decorators import pandas_fn
32
+
33
+ ArrayLike = Union[np.ndarray, torch.Tensor, pd.Series]
34
+
35
+
36
+ @pandas_fn
37
+ def fdr_correction(results: pd.DataFrame) -> pd.DataFrame:
38
+ """
39
+ Apply FDR correction to p-value columns in a DataFrame.
40
+
41
+ Example:
42
+ --------
43
+ >>> df = pd.DataFrame({'p_value': [0.01, 0.05, 0.1], 'other': [1, 2, 3]})
44
+ >>> fdr_correction(df)
45
+ p_value other p_value_fdr p_value_fdr_stars
46
+ 0 0.01 1 0.030000 **
47
+ 1 0.05 2 0.075000 *
48
+ 2 0.10 3 0.100000
49
+
50
+ Parameters:
51
+ -----------
52
+ results : pd.DataFrame
53
+ DataFrame containing p-value columns
54
+
55
+ Returns:
56
+ --------
57
+ pd.DataFrame
58
+ DataFrame with added FDR-corrected p-values and stars
59
+ """
60
+ pval_cols = scitex.stats.find_pval(results, multiple=True)
61
+ if not pval_cols:
62
+ return results
63
+
64
+ for pval_col in pval_cols:
65
+ non_nan = results.dropna(subset=[pval_col])
66
+ nan_rows = results[results[pval_col].isna()]
67
+
68
+ pvals = non_nan[pval_col]
69
+ if isinstance(pvals, pd.DataFrame):
70
+ pvals = pvals.values.flatten()
71
+
72
+ _, fdr_corrected_pvals = fdrcorrection(pvals)
73
+ non_nan[f"{pval_col}_fdr"] = fdr_corrected_pvals
74
+ nan_rows[f"{pval_col}_fdr"] = np.nan
75
+
76
+ results = pd.concat([non_nan, nan_rows]).sort_index()
77
+ results[f"{pval_col}_fdr_stars"] = results[f"{pval_col}_fdr"].apply(
78
+ scitex.stats.p2stars
79
+ )
80
+
81
+ return results
82
+
83
+
84
+ # def _ecdf(xx: ArrayLike) -> ArrayLike:
85
+ # """Compute empirical cumulative distribution function."""
86
+ # nobs = len(xx)
87
+ # return np.arange(1, nobs + 1) / float(nobs)
88
+
89
+ # def _ecdf_torch(xx: torch.Tensor) -> torch.Tensor:
90
+ # """Compute empirical cumulative distribution function using PyTorch."""
91
+ # nobs = len(xx)
92
+ # return torch.arange(1, nobs + 1, device=xx.device) / float(nobs)
93
+
94
+ # def fdr_correction_torch(pvals: torch.Tensor, alpha: float = 0.05, method: str = "indep") -> Tuple[torch.Tensor, torch.Tensor]:
95
+ # """
96
+ # P-value correction with False Discovery Rate (FDR) using PyTorch.
97
+
98
+ # Example:
99
+ # >>> pvals = torch.tensor([0.01, 0.02, 0.03, 0.04, 0.05])
100
+ # >>> reject, pvals_corrected = fdr_correction_torch(pvals)
101
+ # >>> print(reject, pvals_corrected)
102
+
103
+ # Parameters:
104
+ # -----------
105
+ # pvals : torch.Tensor
106
+ # Set of p-values of the individual tests
107
+ # alpha : float, optional
108
+ # Error rate (default is 0.05)
109
+ # method : str, optional
110
+ # 'indep' for Benjamini/Hochberg, 'negcorr' for Benjamini/Yekutieli (default is 'indep')
111
+
112
+ # Returns:
113
+ # --------
114
+ # reject : torch.Tensor
115
+ # Boolean tensor indicating rejected hypotheses
116
+ # pvals_corrected : torch.Tensor
117
+ # Tensor of corrected p-values
118
+ # """
119
+ # shape_init = pvals.shape
120
+ # pvals = pvals.ravel()
121
+
122
+ # pvals_sortind = torch.argsort(pvals)
123
+ # pvals_sorted = pvals[pvals_sortind]
124
+ # sortrevind = pvals_sortind.argsort()
125
+
126
+ # if method in ["i", "indep", "p", "poscorr"]:
127
+ # ecdffactor = _ecdf_torch(pvals_sorted)
128
+ # elif method in ["n", "negcorr"]:
129
+ # cm = torch.sum(1.0 / torch.arange(1, len(pvals_sorted) + 1, device=pvals.device))
130
+ # ecdffactor = _ecdf_torch(pvals_sorted) / cm
131
+ # else:
132
+ # raise ValueError("Method should be 'indep' or 'negcorr'")
133
+
134
+ # ecdffactor = ecdffactor.to(pvals_sorted.dtype)
135
+
136
+ # reject = pvals_sorted < (ecdffactor * alpha)
137
+
138
+ # if reject.any():
139
+ # rejectmax = torch.nonzero(reject, as_tuple=True)[0].max()
140
+ # else:
141
+ # rejectmax = torch.tensor(0, device=pvals.device)
142
+ # reject[:rejectmax+1] = True
143
+
144
+ # pvals_corrected_raw = pvals_sorted / ecdffactor
145
+ # pvals_corrected = torch.minimum(torch.ones_like(pvals_corrected_raw), torch.cummin(pvals_corrected_raw.flip(0), 0)[0].flip(0))
146
+
147
+ # pvals_corrected = pvals_corrected[sortrevind].reshape(shape_init)
148
+ # reject = reject[sortrevind].reshape(shape_init)
149
+ # return reject, pvals_corrected
150
+
151
+ if __name__ == "__main__":
152
+ pvals = [0.02, 0.03, 0.05]
153
+ pvals_torch = torch.tensor(np.array([0.02, 0.03, 0.05]))
154
+
155
+ reject, pvals_corrected = fdr_correction(pd.DataFrame({"p_value": pvals}))
156
+
157
+ reject_torch, pvals_corrected_torch = fdr_correction_torch(
158
+ pvals_torch, alpha=0.05, method="indep"
159
+ )
160
+
161
+ arr = pvals_corrected["fdr_p_value"].to_numpy().astype(float)
162
+ tor = pvals_corrected_torch.numpy().astype(float)
163
+ print(scitex.gen.isclose(arr, tor))
164
+
165
+ # #!/usr/bin/env python3
166
+ # # Time-stamp: "2024-10-06 09:26:33 (ywatanabe)"
167
+
168
+ # """
169
+ # Functionality:
170
+ # - Implements False Discovery Rate (FDR) correction for multiple comparisons
171
+ # - Provides both NumPy and PyTorch implementations
172
+
173
+ # Input:
174
+ # - Array-like object of p-values
175
+ # - Alpha level for significance
176
+ # - Method for correction ('indep' or 'negcorr')
177
+
178
+ # Output:
179
+ # - Boolean array indicating rejected hypotheses
180
+ # - Array of corrected p-values
181
+
182
+ # Prerequisites:
183
+ # - NumPy, PyTorch, pandas, statsmodels, and scitex packages
184
+ # """
185
+
186
+ # """Imports"""
187
+ # from typing import Union, Tuple
188
+ # import numpy as np
189
+ # import torch
190
+ # import pandas as pd
191
+ # from statsmodels.stats.multitest import fdrcorrection
192
+ # import scitex
193
+
194
+ # ArrayLike = Union[np.ndarray, torch.Tensor, pd.Series]
195
+
196
+ # def fdr_correction(results: pd.DataFrame) -> pd.DataFrame:
197
+ # """
198
+ # Apply FDR correction to p-values in a DataFrame.
199
+
200
+ # Example:
201
+ # >>> df = pd.DataFrame({'p_value': [0.01, 0.02, 0.03, 0.04, 0.05]})
202
+ # >>> corrected_df = fdr_correction(df)
203
+ # >>> print(corrected_df)
204
+
205
+ # Parameters:
206
+ # -----------
207
+ # results : pd.DataFrame
208
+ # DataFrame containing a 'p_value' column
209
+
210
+ # Returns:
211
+ # --------
212
+ # pd.DataFrame
213
+ # DataFrame with added 'fdr_p_value' and 'fdr_stars' columns
214
+ # """
215
+ # if "p_value" not in results.columns:
216
+ # return results
217
+ # _, fdr_corrected_pvals = fdrcorrection(results["p_value"])
218
+ # results["fdr_p_value"] = fdr_corrected_pvals
219
+ # results["fdr_stars"] = results["fdr_p_value"].apply(scitex.stats.p2stars)
220
+ # return results
221
+
222
+ # def fdr_correction(pvals, alpha=0.05, method="indep"):
223
+ # # https://github.com/mne-tools/mne-python/blob/main/mne/stats/multi_comp.py
224
+ # """P-value correction with False Discovery Rate (FDR).
225
+
226
+ # Correction for multiple comparison using FDR :footcite:`GenoveseEtAl2002`.
227
+
228
+ # This covers Benjamini/Hochberg for independent or positively correlated and
229
+ # Benjamini/Yekutieli for gen or negatively correlated tests.
230
+
231
+ # Parameters
232
+ # ----------
233
+ # pvals : array_like
234
+ # Set of p-values of the individual tests.
235
+ # alpha : float
236
+ # Error rate.
237
+ # method : 'indep' | 'negcorr'
238
+ # If 'indep' it implements Benjamini/Hochberg for independent or if
239
+ # 'negcorr' it corresponds to Benjamini/Yekutieli.
240
+
241
+ # Returns
242
+ # -------
243
+ # reject : array, bool
244
+ # True if a hypothesis is rejected, False if not.
245
+ # pval_corrected : array
246
+ # alpha : float
247
+ # Error rate.
248
+ # method : 'indep' | 'negcorr'
249
+ # If 'indep' it implements Benjamini/Hochberg for independent or if
250
+ # 'negcorr' it corresponds to Benjamini/Yekutieli.
251
+
252
+ # Returns
253
+ # -------
254
+ # reject : array, bool
255
+ # True if a hypothesis is rejected, False if not.
256
+ # pval_corrected : array
257
+ # alpha : float
258
+ # Error rate.
259
+ # method : 'indep' | 'negcorr'
260
+ # If 'indep' it implements Benjamini/Hochberg for independent or if
261
+ # 'negcorr' it corresponds to Benjamini/Yekutieli.
262
+
263
+ # Returns
264
+ # -------
265
+ # reject : array, bool
266
+ # True if a hypothesis is rejected, False if not.
267
+ # pval_corrected : array
268
+ # P-values adjusted for multiple hypothesis testing to limit FDR.
269
+
270
+ # Returns
271
+ # -------
272
+ # reject : array, bool
273
+ # True if a hypothesis is rejected, False if not.
274
+ # pval_corrected : array
275
+ # P-values adjusted for multiple hypothesis testing to limit FDR.
276
+
277
+ # References
278
+ # ----------
279
+ # .. footbibliography::
280
+ # """
281
+ # pvals = np.asarray(pvals)
282
+ # shape_init = pvals.shape
283
+ # pvals = pvals.ravel()
284
+
285
+ # pvals_sortind = np.argsort(pvals)
286
+ # pvals_sorted = pvals[pvals_sortind]
287
+ # sortrevind = pvals_sortind.argsort()
288
+
289
+ # if method in ["i", "indep", "p", "poscorr"]:
290
+ # ecdffactor = _ecdf(pvals_sorted)
291
+ # elif method in ["n", "negcorr"]:
292
+ # cm = np.sum(1.0 / np.arange(1, len(pvals_sorted) + 1))
293
+ # ecdffactor = _ecdf(pvals_sorted) / cm
294
+ # else:
295
+ # raise ValueError("Method should be 'indep' and 'negcorr'")
296
+
297
+ # reject = pvals_sorted < (ecdffactor * alpha)
298
+ # if reject.any():
299
+ # rejectmax = max(np.nonzero(reject)[0])
300
+ # else:
301
+ # rejectmax = 0
302
+ # reject[:rejectmax] = True
303
+
304
+ # pvals_corrected_raw = pvals_sorted / ecdffactor
305
+ # pvals_corrected = np.minimum.accumulate(pvals_corrected_raw[::-1])[::-1]
306
+ # pvals_corrected[pvals_corrected > 1.0] = 1.0
307
+ # pvals_corrected = pvals_corrected[sortrevind].reshape(shape_init)
308
+ # reject = reject[sortrevind].reshape(shape_init)
309
+ # return reject, pvals_corrected
310
+
311
+
312
+ # def fdr_correction(results: pd.DataFrame) -> pd.DataFrame:
313
+ # if "p_value" not in results.columns:
314
+ # return results
315
+ # _, fdr_corrected_pvals = fdrcorrection(results["p_value"])
316
+ # results["fdr_p_value"] = fdr_corrected_pvals
317
+ # results["fdr_stars"] = results["fdr_p_value"].apply(scitex.stats.p2stars)
318
+ # return results
319
+
320
+ # def _ecdf(xx: ArrayLike) -> ArrayLike:
321
+ # """Compute empirical cumulative distribution function."""
322
+ # nobs = len(xx)
323
+ # return np.arange(1, nobs + 1) / float(nobs)
324
+
325
+ # def _ecdf_torch(xx: torch.Tensor) -> torch.Tensor:
326
+ # """Compute empirical cumulative distribution function using PyTorch."""
327
+ # nobs = len(xx)
328
+ # return torch.arange(1, nobs + 1, device=xx.device) / float(nobs)
329
+
330
+ # def fdr_correction_torch(pvals: torch.Tensor, alpha: float = 0.05, method: str = "indep") -> Tuple[torch.Tensor, torch.Tensor]:
331
+ # """
332
+ # P-value correction with False Discovery Rate (FDR) using PyTorch.
333
+
334
+ # Example:
335
+ # >>> pvals = torch.tensor([0.01, 0.02, 0.03, 0.04, 0.05])
336
+ # >>> reject, pvals_corrected = fdr_correction_torch(pvals)
337
+ # >>> print(reject, pvals_corrected)
338
+
339
+ # Parameters:
340
+ # -----------
341
+ # pvals : torch.Tensor
342
+ # Set of p-values of the individual tests
343
+ # alpha : float, optional
344
+ # Error rate (default is 0.05)
345
+ # method : str, optional
346
+ # 'indep' for Benjamini/Hochberg, 'negcorr' for Benjamini/Yekutieli (default is 'indep')
347
+
348
+ # Returns:
349
+ # --------
350
+ # reject : torch.Tensor
351
+ # Boolean tensor indicating rejected hypotheses
352
+ # pvals_corrected : torch.Tensor
353
+ # Tensor of corrected p-values
354
+ # """
355
+ # shape_init = pvals.shape
356
+ # pvals = pvals.ravel()
357
+
358
+ # pvals_sortind = torch.argsort(pvals)
359
+ # pvals_sorted = pvals[pvals_sortind]
360
+ # sortrevind = pvals_sortind.argsort()
361
+
362
+ # if method in ["i", "indep", "p", "poscorr"]:
363
+ # ecdffactor = _ecdf_torch(pvals_sorted)
364
+ # elif method in ["n", "negcorr"]:
365
+ # cm = torch.sum(1.0 / torch.arange(1, len(pvals_sorted) + 1, device=pvals.device))
366
+ # ecdffactor = _ecdf_torch(pvals_sorted) / cm
367
+ # else:
368
+ # raise ValueError("Method should be 'indep' or 'negcorr'")
369
+
370
+ # ecdffactor = ecdffactor.to(pvals_sorted.dtype)
371
+
372
+ # reject = pvals_sorted < (ecdffactor * alpha)
373
+
374
+ # if reject.any():
375
+ # rejectmax = torch.nonzero(reject, as_tuple=True)[0].max()
376
+ # else:
377
+ # rejectmax = torch.tensor(0, device=pvals.device)
378
+ # reject[:rejectmax+1] = True
379
+
380
+ # pvals_corrected_raw = pvals_sorted / ecdffactor
381
+ # pvals_corrected = torch.minimum(torch.ones_like(pvals_corrected_raw), torch.cummin(pvals_corrected_raw.flip(0), 0)[0].flip(0))
382
+
383
+ # pvals_corrected = pvals_corrected[sortrevind].reshape(shape_init)
384
+ # reject = reject[sortrevind].reshape(shape_init)
385
+ # return reject, pvals_corrected
386
+
387
+
388
+ # if __name__ == "__main__":
389
+ # pvals = [0.02, 0.03, 0.05]
390
+ # pvals_torch = torch.tensor(np.array([0.02, 0.03, 0.05]))
391
+
392
+ # reject, pvals_corrected = fdr_correction(pvals, alpha=0.05, method="indep")
393
+
394
+ # reject_torch, pvals_corrected_torch = fdr_correction_torch(
395
+ # pvals, alpha=0.05, method="indep"
396
+ # )
397
+
398
+ # arr = pvals_corrected.astype(float)
399
+ # tor = pvals_corrected_torch.numpy().astype(float)
400
+ # print(scitex.gen.isclose(arr, tor))
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import numpy as np
4
+ import scipy.stats as stats
5
+ from statsmodels.stats.multicomp import MultiComparison
6
+
7
+
8
+ def multicompair(data, labels, testfunc=None):
9
+ # https://pythonhealthcare.org/2018/04/13/55-statistics-multi-comparison-with-tukeys-test-and-the-holm-bonferroni-method/
10
+ _labels = labels.copy()
11
+ # Set up the data for comparison (creates a specialised object)
12
+ for i_labels in range(len(_labels)):
13
+ _labels[i_labels] = [_labels[i_labels] for i_data in range(len(data[i_labels]))]
14
+
15
+ data, _labels = np.hstack(data), np.hstack(_labels)
16
+ MultiComp = MultiComparison(data, _labels)
17
+
18
+ if testfunc is not None:
19
+ # print(MultiComp.allpairtest(testfunc, mehotd='bonf', pvalidx=1))
20
+ return MultiComp.allpairtest(testfunc, method="bonf", pvalidx=1)
21
+ else:
22
+ # print(MultiComp.tukeyhsd().summary())
23
+ return MultiComp.tukeyhsd().summary()
24
+
25
+
26
+ # t_statistic, p_value = scipy.stats.ttest_ind(data1, data2, equal_var=False) # Welch's t test
27
+ # W_statistic, p_value = scipy.stats.brunnermunzel(data1, data2)
28
+ # H_statistic, p_value = scipy.stats.kruskal(*data) # one-way ANOVA on RANKs
@@ -0,0 +1,277 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-10-06 12:04:31 (ywatanabe)"
4
+
5
+ from bisect import bisect_right
6
+ import numpy as np
7
+ import scitex
8
+ from scipy import stats
9
+ from typing import Any, Literal, Dict, Callable
10
+
11
+
12
+ def _corr_test_base(
13
+ data1: np.ndarray,
14
+ data2: np.ndarray,
15
+ only_significant: bool,
16
+ num_permutations: int,
17
+ seed: int,
18
+ corr_func: Callable,
19
+ test_name: str,
20
+ ) -> Dict[str, Any]:
21
+ np.random.seed(seed)
22
+
23
+ non_nan_indices = ~(np.isnan(data1) | np.isnan(data2))
24
+ data1, data2 = data1[non_nan_indices], data2[non_nan_indices]
25
+
26
+ corr_obs, _ = corr_func(data1, data2)
27
+ surrogate = np.array(
28
+ [
29
+ corr_func(data1, np.random.permutation(data2))[0]
30
+ for _ in range(num_permutations)
31
+ ]
32
+ )
33
+
34
+ rank = bisect_right(sorted(surrogate), corr_obs)
35
+ pvalue = min(rank, num_permutations - rank) / num_permutations * 2
36
+
37
+ stars = scitex.stats.p2stars(pvalue)
38
+ sample_size = len(data1)
39
+ effect_size = np.abs(corr_obs)
40
+
41
+ result_string = (
42
+ f"{test_name} Corr. = {corr_obs:.3f}; p-value = {pvalue:.3f} "
43
+ f"(n={sample_size:,}, eff={effect_size:.3f}) {stars}"
44
+ )
45
+
46
+ if not only_significant or (only_significant and pvalue < 0.05):
47
+ print(result_string)
48
+
49
+ return {
50
+ "p_value": round(pvalue, 3),
51
+ "stars": stars,
52
+ "effsize": round(effect_size, 3),
53
+ "corr": round(corr_obs, 3),
54
+ "surrogate": surrogate,
55
+ "n": sample_size,
56
+ "test_name": f"Permutation-based {test_name} correlation",
57
+ "statistic": round(corr_obs, 3),
58
+ "H0": f"There is no {test_name.lower()} correlation between the two variables",
59
+ }
60
+
61
+
62
+ def corr_test_spearman(
63
+ data1: np.ndarray,
64
+ data2: np.ndarray,
65
+ only_significant: bool = False,
66
+ num_permutations: int = 1_000,
67
+ seed: int = 42,
68
+ ) -> Dict[str, Any]:
69
+ return _corr_test_base(
70
+ data1,
71
+ data2,
72
+ only_significant,
73
+ num_permutations,
74
+ seed,
75
+ stats.spearmanr,
76
+ "Spearman",
77
+ )
78
+
79
+
80
+ def corr_test_pearson(
81
+ data1: np.ndarray,
82
+ data2: np.ndarray,
83
+ only_significant: bool = False,
84
+ num_permutations: int = 1_000,
85
+ seed: int = 42,
86
+ ) -> Dict[str, Any]:
87
+ return _corr_test_base(
88
+ data1,
89
+ data2,
90
+ only_significant,
91
+ num_permutations,
92
+ seed,
93
+ stats.pearsonr,
94
+ "Pearson",
95
+ )
96
+
97
+
98
+ def corr_test(
99
+ data1: np.ndarray,
100
+ data2: np.ndarray,
101
+ test: Literal["pearson", "spearman"] = "pearson",
102
+ only_significant: bool = False,
103
+ num_permutations: int = 1_000,
104
+ seed: int = 42,
105
+ ) -> Dict[str, Any]:
106
+ """
107
+ Performs a correlation test between two datasets using permutation.
108
+
109
+ Parameters
110
+ ----------
111
+ data1 : np.ndarray
112
+ First dataset for correlation.
113
+ data2 : np.ndarray
114
+ Second dataset for correlation.
115
+ test : {"pearson", "spearman"}, optional
116
+ Type of correlation test to perform. Default is "pearson".
117
+ only_significant : bool, optional
118
+ If True, only prints significant results. Default is False.
119
+ num_permutations : int, optional
120
+ Number of permutations for the test. Default is 1,000.
121
+ seed : int, optional
122
+ Random seed for reproducibility. Default is 42.
123
+
124
+ Returns
125
+ -------
126
+ Dict[str, Any]
127
+ Contains 'p_value', 'stars', 'effsize', 'corr', 'surrogate', 'n', 'test_name', 'statistic', and 'H0'.
128
+
129
+ Example
130
+ -------
131
+ >>> xx = np.array([3, 4, 4, 5, 7, 8, 10, 12, 13, 15])
132
+ >>> yy = np.array([2, 4, 4, 5, 4, 7, 8, 19, 14, 10])
133
+ >>> results = corr_test(xx, yy, test="pearson")
134
+ """
135
+ if test == "spearman":
136
+ return corr_test_spearman(
137
+ data1, data2, only_significant, num_permutations, seed
138
+ )
139
+ elif test == "pearson":
140
+ return corr_test_pearson(data1, data2, only_significant, num_permutations, seed)
141
+ else:
142
+ raise ValueError("Invalid test type. Choose 'pearson' or 'spearman'.")
143
+
144
+
145
+ if __name__ == "__main__":
146
+ xx = np.array([3, 4, 4, 5, 7, 8, 10, 12, 13, 15])
147
+ yy = np.array([2, 4, 4, 5, 4, 7, 8, 19, 14, 10])
148
+ results_pearson = corr_test(xx, yy)
149
+ results_spearman = corr_test(xx, yy, test="spearman")
150
+ print("Pearson results:", results_pearson)
151
+ print("Spearman results:", results_spearman)
152
+ # #!/usr/bin/env python3
153
+ # # -*- coding: utf-8 -*-
154
+ # # Time-stamp: "2024-10-06 12:02:18 (ywatanabe)"
155
+
156
+ # from bisect import bisect_right
157
+ # import numpy as np
158
+ # import scitex
159
+ # from scipy import stats
160
+ # from typing import Any, Literal, Dict, List
161
+
162
+ # def _corr_test_base(
163
+ # data1: np.ndarray,
164
+ # data2: np.ndarray,
165
+ # only_significant: bool,
166
+ # num_permutations: int,
167
+ # seed: int,
168
+ # corr_func: callable,
169
+ # test_name: str
170
+ # ) -> Dict[str, Any]:
171
+ # np.random.seed(seed)
172
+
173
+ # non_nan_indices = ~(np.isnan(data1) | np.isnan(data2))
174
+ # data1, data2 = data1[non_nan_indices], data2[non_nan_indices]
175
+
176
+ # corr_obs, _ = corr_func(data1, data2)
177
+ # surrogate = [
178
+ # corr_func(data1, np.random.permutation(data2))[0]
179
+ # for _ in range(num_permutations)
180
+ # ]
181
+
182
+ # rank = bisect_right(sorted(surrogate), corr_obs)
183
+ # pvalue = min(rank, num_permutations - rank) / num_permutations * 2
184
+
185
+ # stars = scitex.stats.p2stars(pvalue)
186
+ # sample_size = len(data1)
187
+ # effect_size = np.abs(corr_obs)
188
+
189
+ # # result_string = (
190
+ # # f"{test_name} Corr. = {corr_obs:.3f}; p-value = {pvalue:.3f} "
191
+ # # f"(n={sample_size:,}, eff={effect_size:.3f}) {stars}"
192
+ # # )
193
+
194
+ # if not only_significant or (only_significant and pvalue < 0.05):
195
+ # print(result_string)
196
+
197
+ # return {
198
+ # "p_value": round(pvalue, 3),
199
+ # "stars": stars,
200
+ # "effsize": round(effect_size, 3),
201
+ # "corr": round(corr_obs, 3),
202
+ # "surrogate": np.array(surrogate),
203
+ # "n": sample_size,
204
+ # "test_name": f"Permutation-based {test_name} correlation",
205
+ # "statistic": round(corr_obs, 3),
206
+ # "H0": f"There is no {test_name.lower()} correlation between the two variables",
207
+ # }
208
+
209
+ # def corr_test_spearman(
210
+ # data1: np.ndarray,
211
+ # data2: np.ndarray,
212
+ # only_significant: bool = False,
213
+ # num_permutations: int = 1_000,
214
+ # seed: int = 42,
215
+ # ) -> Dict[str, Any]:
216
+ # return _corr_test_base(data1, data2, only_significant, num_permutations, seed, stats.spearmanr, "Spearman")
217
+
218
+ # def corr_test_pearson(
219
+ # data1: np.ndarray,
220
+ # data2: np.ndarray,
221
+ # only_significant: bool = False,
222
+ # num_permutations: int = 1_000,
223
+ # seed: int = 42,
224
+ # ) -> Dict[str, Any]:
225
+ # return _corr_test_base(data1, data2, only_significant, num_permutations, seed, stats.pearsonr, "Pearson")
226
+
227
+ # def corr_test(
228
+ # data1: np.ndarray,
229
+ # data2: np.ndarray,
230
+ # test: Literal["pearson", "spearman"] = "pearson",
231
+ # only_significant: bool = False,
232
+ # num_permutations: int = 1_000,
233
+ # seed: int = 42,
234
+ # ) -> Dict[str, Any]:
235
+ # """
236
+ # Performs a correlation test between two datasets using permutation.
237
+
238
+ # Parameters
239
+ # ----------
240
+ # data1 : np.ndarray
241
+ # First dataset for correlation.
242
+ # data2 : np.ndarray
243
+ # Second dataset for correlation.
244
+ # test : {"pearson", "spearman"}, optional
245
+ # Type of correlation test to perform. Default is "pearson".
246
+ # only_significant : bool, optional
247
+ # If True, only prints significant results. Default is False.
248
+ # num_permutations : int, optional
249
+ # Number of permutations for the test. Default is 1,000.
250
+ # seed : int, optional
251
+ # Random seed for reproducibility. Default is 42.
252
+
253
+ # Returns
254
+ # -------
255
+ # Dict[str, Any]
256
+ # Contains 'p_value', 'stars', 'effsize', 'corr', 'surrogate', 'n', 'test_name', 'statistic', and 'H0'.
257
+
258
+ # Example
259
+ # -------
260
+ # >>> xx = np.array([3, 4, 4, 5, 7, 8, 10, 12, 13, 15])
261
+ # >>> yy = np.array([2, 4, 4, 5, 4, 7, 8, 19, 14, 10])
262
+ # >>> results = corr_test(xx, yy, test="pearson")
263
+ # """
264
+ # if test == "spearman":
265
+ # return corr_test_spearman(data1, data2, only_significant, num_permutations, seed)
266
+ # elif test == "pearson":
267
+ # return corr_test_pearson(data1, data2, only_significant, num_permutations, seed)
268
+ # else:
269
+ # raise ValueError("Invalid test type. Choose 'spearman' or 'pearson'.")
270
+
271
+ # if __name__ == "__main__":
272
+ # xx = np.array([3, 4, 4, 5, 7, 8, 10, 12, 13, 15])
273
+ # yy = np.array([2, 4, 4, 5, 4, 7, 8, 19, 14, 10])
274
+ # results_spearman = corr_test(xx, yy)
275
+ # results_pearson = corr_test(xx, yy, test="pearson")
276
+ # print("Spearman results:", results_spearman)
277
+ # print("Pearson results:", results_pearson)