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,189 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-12-05 09:20:53 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/stats/desc/_describe.py
5
+
6
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/stats/desc/_describe.py"
7
+
8
+ """
9
+ Functionality:
10
+ - Computes descriptive statistics on PyTorch tensors
11
+ Input:
12
+ - PyTorch tensor or numpy array
13
+ Output:
14
+ - Descriptive statistics (mean, std, quantiles, etc.)
15
+ Prerequisites:
16
+ - PyTorch, NumPy
17
+ """
18
+
19
+ from typing import List, Optional, Tuple, Union
20
+
21
+ import numpy as np
22
+ import torch
23
+
24
+ from ...decorators import batch_fn, torch_fn
25
+ from ._nan import (
26
+ nancount,
27
+ nankurtosis,
28
+ nanmax,
29
+ nanmean,
30
+ nanmin,
31
+ nanq25,
32
+ nanq50,
33
+ nanq75,
34
+ nanskewness,
35
+ nanstd,
36
+ nanvar,
37
+ )
38
+ from ._real import kurtosis, mean, q25, q50, q75, skewness, std
39
+
40
+
41
+ def verify_non_leakage(
42
+ x: torch.Tensor,
43
+ dim: Optional[Union[int, Tuple[int, ...]]] = None,
44
+ ):
45
+ """
46
+ Verifies that statistics computation doesn't leak information across samples.
47
+
48
+ Parameters
49
+ ----------
50
+ x : torch.Tensor
51
+ Input tensor
52
+ dim : Optional[Union[int, Tuple[int, ...]]]
53
+ Dimension(s) used for computation
54
+
55
+ Returns
56
+ -------
57
+ bool
58
+ True if verification passes
59
+
60
+ Raises
61
+ ------
62
+ AssertionError
63
+ If statistics leak information across samples
64
+ """
65
+ # Full calculation
66
+ described, _ = describe(x, dim=(1, 2))
67
+
68
+ # Compute statistics on first sample
69
+ x_first = x[:1]
70
+ described_first, _ = describe(x_first, dim=dim)
71
+
72
+ # Verify shapes match
73
+ assert (
74
+ described_first.shape == described[:1].shape
75
+ ), f"Shape mismatch: {described_first.shape} != {described[:1].shape}"
76
+
77
+ # Verify values match
78
+ torch.testing.assert_close(
79
+ described_first,
80
+ described[:1],
81
+ rtol=1e-5,
82
+ atol=1e-8,
83
+ msg="Statistics leak information across samples",
84
+ )
85
+
86
+ return True
87
+
88
+
89
+ @batch_fn
90
+ @torch_fn
91
+ def describe(
92
+ x: torch.Tensor,
93
+ axis: int = -1,
94
+ dim: Optional[Union[int, Tuple[int, ...]]] = None,
95
+ keepdims: bool = False,
96
+ funcs: Union[List[str], str] = [
97
+ "nanmean",
98
+ "nanstd",
99
+ "nankurtosis",
100
+ "nanskewness",
101
+ "nanq25",
102
+ "nanq50",
103
+ "nanq75",
104
+ ],
105
+ device: Optional[torch.device] = None,
106
+ batch_size: int = -1,
107
+ ) -> Tuple[torch.Tensor, List[str]]:
108
+ """
109
+ Computes various descriptive statistics.
110
+
111
+ Parameters
112
+ ----------
113
+ x : torch.Tensor
114
+ Input tensor
115
+ axis : int, default=-1
116
+ Deprecated. Use dim instead
117
+ dim : int or tuple of ints, optional
118
+ Dimension(s) along which to compute statistics
119
+ keepdims : bool, default=True
120
+ Whether to keep reduced dimensions
121
+ funcs : list of str or "all"
122
+ Statistical functions to compute
123
+ device : torch.device, optional
124
+ Device to use for computation
125
+
126
+ Returns
127
+ -------
128
+ Tuple[torch.Tensor, List[str]]
129
+ Computed statistics and their names
130
+ """
131
+ dim = axis if dim is None else dim
132
+ dim = (dim,) if isinstance(dim, int) else tuple(dim)
133
+
134
+ func_names = funcs
135
+ func_candidates = {
136
+ "mean": mean,
137
+ "std": std,
138
+ "kurtosis": kurtosis,
139
+ "skewness": skewness,
140
+ "q25": q25,
141
+ "q50": q50,
142
+ "q75": q75,
143
+ "nanmean": nanmean,
144
+ "nanstd": nanstd,
145
+ "nanvar": nanvar,
146
+ "nankurtosis": nankurtosis,
147
+ "nanskewness": nanskewness,
148
+ "nanq25": nanq25,
149
+ "nanq50": nanq50,
150
+ "nanq75": nanq75,
151
+ "nanmax": nanmax,
152
+ "nanmin": nanmin,
153
+ "nancount": nancount,
154
+ # "nanprod": nanprod,
155
+ # "nanargmin": nanargmin,
156
+ # "nanargmax": nanargmax,
157
+ }
158
+
159
+ if funcs == "all":
160
+ _funcs = list(func_candidates.values())
161
+ func_names = list(func_candidates.keys())
162
+ else:
163
+ _funcs = [func_candidates[ff] for ff in func_names]
164
+
165
+ calculated = [ff(x, dim=dim, keepdims=keepdims) for ff in _funcs]
166
+ return torch.stack(calculated, dim=-1), func_names
167
+
168
+
169
+ if __name__ == "__main__":
170
+ from scitex.stats.desc._describe import describe, verify_non_leakage
171
+
172
+ # x = np.random.rand(4, 3, 2)
173
+ # x = np.random.rand(390, 250, 16, 100, 100)
174
+ # print(scitex.stats.desc.nankurtosis(x, dim=(1,2)).shape)
175
+
176
+ x = np.random.rand(10, 250, 16, 100, 100)
177
+
178
+ described, _ = describe(x[:10], dim=(-2, -1), batch_size=1)
179
+ # verify_non_leakage(x, dim=(1, 2))
180
+ # # print(describe(x, dim=(1, 2), keepdims=False)[0].shape)
181
+ # # print(describe(x, funcs="all", dim=(1, 2), keepdims=False)[0].shape)
182
+
183
+
184
+ """
185
+ python ./scitex_repo/src/scitex/stats/desc/_describe.py
186
+ python -m src.scitex.stats.desc._describe
187
+ """
188
+
189
+ # EOF
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-25 20:51:05 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/stats/desc/_nan.py
5
+
6
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/stats/desc/_nan.py"
7
+
8
+ from scitex.decorators import torch_fn, batch_fn
9
+ import torch
10
+
11
+
12
+ @torch_fn
13
+ @batch_fn
14
+ def nanmax(x, axis=-1, dim=None, batch_size=None, keepdims=False):
15
+ min_value = torch.finfo(x.dtype).min
16
+ dim = axis if dim is None else dim
17
+ if isinstance(dim, (tuple, list)):
18
+ for d in sorted(dim, reverse=True):
19
+ x = x.nan_to_num(min_value).max(dim=d, keepdims=keepdims)[0]
20
+ else:
21
+ x = x.nan_to_num(min_value).max(dim=dim, keepdims=keepdims)[0]
22
+ return x
23
+
24
+
25
+ @torch_fn
26
+ @batch_fn
27
+ def nanmin(x, axis=-1, dim=None, batch_size=None, keepdims=False):
28
+ max_value = torch.finfo(x.dtype).max
29
+ dim = axis if dim is None else dim
30
+ if isinstance(dim, (tuple, list)):
31
+ for d in sorted(dim, reverse=True):
32
+ x = x.nan_to_num(max_value).min(dim=d, keepdims=keepdims)[0]
33
+ else:
34
+ x = x.nan_to_num(max_value).min(dim=dim, keepdims=keepdims)[0]
35
+ return x
36
+
37
+
38
+ @torch_fn
39
+ @batch_fn
40
+ def nansum(x, axis=-1, dim=None, batch_size=None, keepdims=False):
41
+ return torch.nansum(x, dim=dim, keepdims=keepdims)
42
+
43
+
44
+ @torch_fn
45
+ @batch_fn
46
+ def nanmean(x, axis=-1, dim=None, batch_size=None, keepdims=False):
47
+ return torch.nanmean(x, dim=dim, keepdims=keepdims)
48
+
49
+
50
+ @torch_fn
51
+ @batch_fn
52
+ def nanvar(x, axis=-1, dim=None, batch_size=None, keepdims=False):
53
+ tensor_mean = nanmean(x, dim=dim, keepdims=True)
54
+ return (x - tensor_mean).square().nanmean(dim=dim, keepdims=keepdims)
55
+
56
+
57
+ @torch_fn
58
+ @batch_fn
59
+ def nanstd(x, axis=-1, dim=None, batch_size=None, keepdims=False):
60
+ return torch.sqrt(nanvar(x, dim=dim, keepdims=keepdims))
61
+
62
+
63
+ # @torch_fn
64
+ # def nanzscore(x, axis=-1, dim=None, batch_size=None, keepdims=True):
65
+ # _mean = nanmean(x, dim=dim, keepdims=True)
66
+ # _std = nanstd(x, dim=dim, keepdims=True)
67
+ # zscores = (x - _mean) / _std
68
+ # return zscores if keepdims else zscores.squeeze(dim)
69
+ @torch_fn
70
+ @batch_fn
71
+ def nanzscore(x, axis=-1, dim=None, batch_size=None, keepdims=True):
72
+ dim = axis if dim is None else dim
73
+ if isinstance(dim, (tuple, list)):
74
+ _mean = nanmean(x, dim=dim, keepdims=True)
75
+ _std = nanstd(x, dim=dim, keepdims=True)
76
+ else:
77
+ _mean = nanmean(x, dim=dim, keepdims=True)
78
+ _std = nanstd(x, dim=dim, keepdims=True)
79
+ zscores = (x - _mean) / _std
80
+ return zscores if keepdims else zscores.squeeze(dim)
81
+
82
+
83
+ # @torch_fn
84
+ # def nankurtosis(x, axis=-1, dim=None, batch_size=None, keepdims=False):
85
+ # zscores = nanzscore(x, axis=axis, keepdims=True)
86
+ # n = (~torch.isnan(x)).sum(dim=dim, keepdim=True).to(x.dtype) # Changed this line
87
+ # k = torch.nanmean(torch.pow(zscores, 4.0), dim=dim, keepdims=keepdims)
88
+ # correction = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))
89
+ # return correction * k - 3 * (n - 1)**2 / ((n - 2) * (n - 3))
90
+
91
+
92
+ # @torch_fn
93
+ # def nankurtosis(x, axis=-1, dim=None, batch_size=None, keepdims=False):
94
+ # dim = axis if dim is None else dim
95
+ # if isinstance(dim, (tuple, list)):
96
+ # zscores = nanzscore(x, dim=dim, keepdims=True)
97
+ # n = (~torch.isnan(x)).sum(dim=dim, keepdim=True).to(x.dtype)
98
+ # k = torch.nanmean(torch.pow(zscores, 4.0), dim=dim, keepdims=keepdims)
99
+ # correction = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))
100
+ # result = correction * k - 3 * (n - 1)**2 / ((n - 2) * (n - 3))
101
+ # return result.squeeze() if not keepdims else result
102
+ # else:
103
+ # # Original code for single dimension
104
+ # zscores = nanzscore(x, dim=dim, keepdims=True)
105
+ # n = (~torch.isnan(x)).sum(dim=dim, keepdim=True).to(x.dtype)
106
+ # k = torch.nanmean(torch.pow(zscores, 4.0), dim=dim, keepdims=keepdims)
107
+ # correction = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))
108
+ # result = correction * k - 3 * (n - 1)**2 / ((n - 2) * (n - 3))
109
+ # return result.squeeze() if not keepdims else result
110
+
111
+ # @torch_fn
112
+ # def nanskewness(x, axis=-1, dim=None, batch_size=None, keepdims=False):
113
+ # zscores = nanzscore(x, axis=axis, keepdims=True)
114
+ # n = (~torch.isnan(x)).sum(dim=dim, keepdim=True).to(x.dtype) # Changed this line
115
+ # s = torch.nanmean(torch.pow(zscores, 3.0), dim=dim, keepdims=keepdims)
116
+ # correction = n**2 / ((n - 1) * (n - 2))
117
+ # return correction * s
118
+
119
+
120
+ @torch_fn
121
+ @batch_fn
122
+ def nankurtosis(x, axis=-1, dim=None, batch_size=None, keepdims=False):
123
+ zscores = nanzscore(x, axis=axis, keepdims=True)
124
+ return torch.nanmean(torch.pow(zscores, 4.0), dim=dim, keepdims=keepdims) - 3.0
125
+
126
+
127
+ @torch_fn
128
+ @batch_fn
129
+ def nanskewness(x, axis=-1, dim=None, batch_size=None, keepdims=False):
130
+ zscores = nanzscore(x, axis=axis, keepdims=True)
131
+ return torch.nanmean(torch.pow(zscores, 3.0), dim=dim, keepdims=keepdims)
132
+
133
+
134
+ @torch_fn
135
+ @batch_fn
136
+ def nanprod(x, axis=-1, dim=None, batch_size=None, keepdims=False):
137
+ dim = axis if dim is None else dim
138
+ if isinstance(dim, (tuple, list)):
139
+ for d in sorted(dim, reverse=True):
140
+ x = x.nan_to_num(1).prod(dim=d, keepdims=keepdims)
141
+ else:
142
+ x = x.nan_to_num(1).prod(dim=dim, keepdims=keepdims)
143
+ return x
144
+
145
+
146
+ @torch_fn
147
+ @batch_fn
148
+ def nancumprod(x, axis=-1, dim=None, batch_size=None, keepdims=False):
149
+ dim = axis if dim is None else dim
150
+ if isinstance(dim, (tuple, list)):
151
+ raise ValueError("cumprod does not support multiple dimensions")
152
+ return x.nan_to_num(1).cumprod(dim=dim)
153
+
154
+
155
+ @torch_fn
156
+ @batch_fn
157
+ def nancumsum(x, axis=-1, dim=None, batch_size=None, keepdims=False):
158
+ dim = axis if dim is None else dim
159
+ if isinstance(dim, (tuple, list)):
160
+ raise ValueError("cumsum does not support multiple dimensions")
161
+ return x.nan_to_num(0).cumsum(dim=dim)
162
+
163
+
164
+ @torch_fn
165
+ @batch_fn
166
+ def nanargmin(x, axis=-1, dim=None, batch_size=None, keepdims=False):
167
+ max_value = torch.finfo(x.dtype).max
168
+ dim = axis if dim is None else dim
169
+ if isinstance(dim, (tuple, list)):
170
+ for d in sorted(dim, reverse=True):
171
+ x = x.nan_to_num(max_value).argmin(dim=d, keepdims=keepdims)
172
+ else:
173
+ x = x.nan_to_num(max_value).argmin(dim=dim, keepdims=keepdims)
174
+ return x
175
+
176
+
177
+ @torch_fn
178
+ @batch_fn
179
+ def nanargmax(x, axis=-1, dim=None, batch_size=None, keepdims=False):
180
+ min_value = torch.finfo(x.dtype).min
181
+ dim = axis if dim is None else dim
182
+ if isinstance(dim, (tuple, list)):
183
+ for d in sorted(dim, reverse=True):
184
+ x = x.nan_to_num(min_value).argmax(dim=d, keepdims=keepdims)
185
+ else:
186
+ x = x.nan_to_num(min_value).argmax(dim=dim, keepdims=keepdims)
187
+ return x
188
+
189
+
190
+ @torch_fn
191
+ @batch_fn
192
+ def nanquantile(x, q, axis=-1, dim=None, batch_size=None, keepdims=False):
193
+ dim = axis if dim is None else dim
194
+ if isinstance(dim, (tuple, list)):
195
+ # For multiple dimensions, flatten them first
196
+ # Save original shape for potential keepdims
197
+ original_shape = x.shape
198
+
199
+ # Calculate new shape: keep dimensions not in dim, flatten those in dim
200
+ dim_list = list(dim) if isinstance(dim, tuple) else dim
201
+ # Normalize negative dimensions
202
+ dim_list = [d if d >= 0 else len(original_shape) + d for d in dim_list]
203
+
204
+ # Determine which dimensions to keep
205
+ keep_dims = [i for i in range(len(original_shape)) if i not in dim_list]
206
+
207
+ # Permute tensor to move dims to reduce to the end
208
+ perm_dims = keep_dims + dim_list
209
+ x_perm = x.permute(perm_dims)
210
+
211
+ # Reshape to flatten the dimensions to reduce
212
+ new_shape = [original_shape[i] for i in keep_dims] + [-1]
213
+ x_flat = x_perm.reshape(new_shape)
214
+
215
+ # Apply nanquantile on the flattened dimension
216
+ mask = ~torch.isnan(x_flat)
217
+ x_filtered = torch.where(mask, x_flat, torch.tensor(float("inf")))
218
+ result = torch.quantile(x_filtered, q / 100, dim=-1, keepdim=keepdims)
219
+
220
+ # If keepdims, reshape back with singleton dimensions
221
+ if keepdims:
222
+ final_shape = list(original_shape)
223
+ for d in dim_list:
224
+ final_shape[d] = 1
225
+ result = result.reshape(final_shape)
226
+
227
+ return result
228
+ else:
229
+ mask = ~torch.isnan(x)
230
+ x_filtered = torch.where(mask, x, torch.tensor(float("inf")))
231
+ x = torch.quantile(x_filtered, q / 100, dim=dim, keepdim=keepdims)
232
+ return x
233
+
234
+
235
+ def nanq25(x, axis=-1, dim=None, batch_size=None, keepdims=False):
236
+ kwargs = {"axis": axis, "dim": dim, "keepdims": keepdims}
237
+ if batch_size is not None:
238
+ kwargs["batch_size"] = batch_size
239
+ return nanquantile(x, 25, **kwargs)
240
+
241
+
242
+ def nanq50(x, axis=-1, dim=None, batch_size=None, keepdims=False):
243
+ kwargs = {"axis": axis, "dim": dim, "keepdims": keepdims}
244
+ if batch_size is not None:
245
+ kwargs["batch_size"] = batch_size
246
+ return nanquantile(x, 50, **kwargs)
247
+
248
+
249
+ def nanq75(x, axis=-1, dim=None, batch_size=None, keepdims=False):
250
+ kwargs = {"axis": axis, "dim": dim, "keepdims": keepdims}
251
+ if batch_size is not None:
252
+ kwargs["batch_size"] = batch_size
253
+ return nanquantile(x, 75, **kwargs)
254
+
255
+
256
+ @torch_fn
257
+ @batch_fn
258
+ def nancount(x, axis=-1, dim=None, batch_size=None, keepdims=False):
259
+ """Count number of non-NaN values along specified dimensions.
260
+
261
+ Parameters
262
+ ----------
263
+ x : torch.Tensor
264
+ Input tensor
265
+ axis : int, default=-1
266
+ Deprecated. Use dim instead
267
+ dim : int or tuple of ints, optional
268
+ Dimension(s) along which to count
269
+ keepdims : bool, default=True
270
+ Whether to keep reduced dimensions
271
+
272
+ Returns
273
+ -------
274
+ torch.Tensor
275
+ Count of non-NaN values
276
+ """
277
+ dim = axis if dim is None else dim
278
+ mask = ~torch.isnan(x)
279
+
280
+ if isinstance(dim, (tuple, list)):
281
+ for d in sorted(dim, reverse=True):
282
+ mask = mask.sum(dim=d, keepdims=keepdims)
283
+ else:
284
+ mask = mask.sum(dim=dim, keepdims=keepdims)
285
+
286
+ return mask
287
+
288
+
289
+ # EOF
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-17 21:17:13 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/stats/desc/_real.py
5
+
6
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/stats/desc/_real.py"
7
+
8
+ """
9
+ Functionality:
10
+ - Computes descriptive statistics on PyTorch tensors
11
+ Input:
12
+ - PyTorch tensor or numpy array
13
+ Output:
14
+ - Descriptive statistics (mean, std, quantiles, etc.)
15
+ Prerequisites:
16
+ - PyTorch, NumPy
17
+ """
18
+
19
+
20
+ import numpy as np
21
+ import torch
22
+
23
+ from ...decorators import torch_fn
24
+
25
+
26
+ @torch_fn
27
+ def mean(x, axis=-1, dim=None, keepdims=False):
28
+ return x.mean(dim, keepdims=keepdims)
29
+
30
+
31
+ @torch_fn
32
+ def std(x, axis=-1, dim=None, keepdims=False):
33
+ return x.std(dim, keepdims=keepdims)
34
+
35
+
36
+ @torch_fn
37
+ def var(x, axis=-1, dim=None, keepdims=False):
38
+ return x.var(dim, keepdims=keepdims)
39
+
40
+
41
+ @torch_fn
42
+ def zscore(x, axis=-1, dim=None, keepdims=True):
43
+ _mean = mean(x, dim=dim, keepdims=True)
44
+ _std = std(x, dim=dim, keepdims=True)
45
+ zscores = (x - _mean) / _std
46
+ return zscores if keepdims else zscores.squeeze(dim)
47
+
48
+
49
+ @torch_fn
50
+ def skewness(x, axis=-1, dim=None, keepdims=False):
51
+ zscores = zscore(x, axis=axis, keepdims=True)
52
+ return torch.mean(torch.pow(zscores, 3.0), dim=dim, keepdims=keepdims)
53
+
54
+
55
+ @torch_fn
56
+ def kurtosis(x, axis=-1, dim=None, keepdims=False):
57
+ zscores = zscore(x, axis=axis, keepdims=True)
58
+ return torch.mean(torch.pow(zscores, 4.0), dim=dim, keepdims=keepdims) - 3.0
59
+
60
+
61
+ @torch_fn
62
+ def quantile(x, q, axis=-1, dim=None, keepdims=False):
63
+ dim = axis if dim is None else dim
64
+ if isinstance(dim, (tuple, list)):
65
+ for d in sorted(dim, reverse=True):
66
+ x = torch.quantile(x, q / 100, dim=d, keepdims=keepdims)
67
+ else:
68
+ x = torch.quantile(x, q / 100, dim=dim, keepdims=keepdims)
69
+ return x
70
+
71
+
72
+ @torch_fn
73
+ def q25(x, axis=-1, dim=None, keepdims=False):
74
+ return quantile(x, 25, axis=axis, dim=dim, keepdims=keepdims)
75
+
76
+
77
+ @torch_fn
78
+ def q50(x, axis=-1, dim=None, keepdims=False):
79
+ return quantile(x, 50, axis=axis, dim=dim, keepdims=keepdims)
80
+
81
+
82
+ @torch_fn
83
+ def q75(x, axis=-1, dim=None, keepdims=False):
84
+ return quantile(x, 75, axis=axis, dim=dim, keepdims=keepdims)
85
+
86
+
87
+ if __name__ == "__main__":
88
+ # from scitex.stats.desc import *
89
+
90
+ x = np.random.rand(4, 3, 2)
91
+ print(describe(x, dim=(1, 2), keepdims=False)[0].shape)
92
+ print(describe(x, funcs="all", dim=(1, 2), keepdims=False)[0].shape)
93
+
94
+ # EOF
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env python3
2
+ """Scitex multiple module."""
3
+
4
+ from ._bonferroni_correction import bonferroni_correction, bonferroni_correction_torch
5
+ from ._fdr_correction import ArrayLike, fdr_correction
6
+ from ._multicompair import multicompair
7
+
8
+ __all__ = [
9
+ "ArrayLike",
10
+ "bonferroni_correction",
11
+ "bonferroni_correction_torch",
12
+ "fdr_correction",
13
+ "multicompair",
14
+ ]
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env python3
2
+ # Time-stamp: "2021-09-25 15:39:51 (ylab)"
3
+
4
+ import numpy as np
5
+ import torch
6
+ import scitex
7
+
8
+
9
+ def bonferroni_correction(pval, alpha=0.05):
10
+ # https://github.com/mne-tools/mne-python/blob/main/mne/stats/multi_comp.py
11
+ """P-value correction with Bonferroni method.
12
+
13
+ Parameters
14
+ ----------
15
+ pval : array_like
16
+ Set of p-values of the individual tests.
17
+ alpha : float
18
+ Error rate.
19
+
20
+ Returns
21
+ -------
22
+ reject : array, bool
23
+ True if a hypothesis is rejected, False if not.
24
+ pval_corrected : array
25
+ P-values adjusted for multiple hypothesis testing to limit FDR.
26
+ """
27
+ pval = np.asarray(pval)
28
+ pval_corrected = pval * float(pval.size)
29
+ # p-values must not be larger than 1.
30
+ pval_corrected = pval_corrected.clip(max=1.0)
31
+ reject = pval_corrected < alpha
32
+ return reject, pval_corrected
33
+
34
+
35
+ def bonferroni_correction_torch(pvals, alpha=0.05):
36
+ """P-value correction with Bonferroni method.
37
+
38
+ Parameters
39
+ ----------
40
+ pvals : array_like
41
+ Set of p-values of the individual tests.
42
+ alpha : float
43
+ Error rate.
44
+
45
+ Returns
46
+ -------
47
+ reject : array, bool
48
+ True if a hypothesis is rejected, False if not.
49
+ pvals_corrected : array
50
+ P-values adjusted for multiple hypothesis testing to limit FDR.
51
+ """
52
+ pvals = torch.tensor(pvals)
53
+ pvals_corrected = pvals * torch.tensor(pvals.size()).float()
54
+ # p-values must not be larger than 1.
55
+ pvals_corrected = pvals_corrected.clip(max=1.0)
56
+ reject = pvals_corrected < alpha
57
+ return reject, pvals_corrected
58
+
59
+
60
+ if __name__ == "__main__":
61
+ pvals_npy = np.array([0.02, 0.03, 0.05])
62
+ pvals_torch = torch.tensor(np.array([0.02, 0.03, 0.05]))
63
+
64
+ reject, pvals_corrected = bonferroni_correction(pvals_npy, alpha=0.05)
65
+
66
+ reject_torch, pvals_corrected_torch = bonferroni_correction_torch(
67
+ pvals_torch, alpha=0.05
68
+ )
69
+
70
+ arr = pvals_corrected.astype(float)
71
+ tor = pvals_corrected_torch.numpy().astype(float)
72
+ print(scitex.gen.isclose(arr, tor))