scitex 2.14.0__py3-none-any.whl → 2.15.2__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 (300) hide show
  1. scitex/__init__.py +71 -17
  2. scitex/_env_loader.py +156 -0
  3. scitex/_mcp_resources/__init__.py +37 -0
  4. scitex/_mcp_resources/_cheatsheet.py +135 -0
  5. scitex/_mcp_resources/_figrecipe.py +138 -0
  6. scitex/_mcp_resources/_formats.py +102 -0
  7. scitex/_mcp_resources/_modules.py +337 -0
  8. scitex/_mcp_resources/_session.py +149 -0
  9. scitex/_mcp_tools/__init__.py +4 -0
  10. scitex/_mcp_tools/audio.py +66 -0
  11. scitex/_mcp_tools/diagram.py +11 -95
  12. scitex/_mcp_tools/introspect.py +210 -0
  13. scitex/_mcp_tools/plt.py +260 -305
  14. scitex/_mcp_tools/scholar.py +74 -0
  15. scitex/_mcp_tools/social.py +244 -0
  16. scitex/_mcp_tools/template.py +24 -0
  17. scitex/_mcp_tools/writer.py +21 -204
  18. scitex/ai/_gen_ai/_PARAMS.py +10 -7
  19. scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
  20. scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
  21. scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
  22. scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
  23. scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
  24. scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
  25. scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
  26. scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
  27. scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
  28. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
  29. scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
  30. scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
  31. scitex/audio/README.md +40 -36
  32. scitex/audio/__init__.py +129 -61
  33. scitex/audio/_branding.py +185 -0
  34. scitex/audio/_mcp/__init__.py +32 -0
  35. scitex/audio/_mcp/handlers.py +59 -6
  36. scitex/audio/_mcp/speak_handlers.py +238 -0
  37. scitex/audio/_relay.py +225 -0
  38. scitex/audio/_tts.py +18 -10
  39. scitex/audio/engines/base.py +17 -10
  40. scitex/audio/engines/elevenlabs_engine.py +7 -2
  41. scitex/audio/mcp_server.py +228 -75
  42. scitex/canvas/README.md +1 -1
  43. scitex/canvas/editor/_dearpygui/__init__.py +25 -0
  44. scitex/canvas/editor/_dearpygui/_editor.py +147 -0
  45. scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
  46. scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
  47. scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
  48. scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
  49. scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
  50. scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
  51. scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
  52. scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
  53. scitex/canvas/editor/_dearpygui/_selection.py +295 -0
  54. scitex/canvas/editor/_dearpygui/_state.py +93 -0
  55. scitex/canvas/editor/_dearpygui/_utils.py +61 -0
  56. scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
  57. scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
  58. scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
  59. scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
  60. scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
  61. scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
  62. scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
  63. scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
  64. scitex/canvas/editor/flask_editor/_core.py +25 -1684
  65. scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
  66. scitex/cli/__init__.py +38 -43
  67. scitex/cli/audio.py +76 -27
  68. scitex/cli/capture.py +13 -20
  69. scitex/cli/introspect.py +481 -0
  70. scitex/cli/main.py +200 -109
  71. scitex/cli/mcp.py +60 -34
  72. scitex/cli/plt.py +357 -0
  73. scitex/cli/repro.py +15 -8
  74. scitex/cli/resource.py +15 -8
  75. scitex/cli/scholar/__init__.py +23 -8
  76. scitex/cli/scholar/_crossref_scitex.py +296 -0
  77. scitex/cli/scholar/_fetch.py +25 -3
  78. scitex/cli/social.py +314 -0
  79. scitex/cli/stats.py +15 -8
  80. scitex/cli/template.py +129 -12
  81. scitex/cli/tex.py +15 -8
  82. scitex/cli/writer.py +132 -8
  83. scitex/cloud/__init__.py +41 -2
  84. scitex/config/README.md +1 -1
  85. scitex/config/__init__.py +16 -2
  86. scitex/config/_env_registry.py +256 -0
  87. scitex/context/__init__.py +22 -0
  88. scitex/dev/__init__.py +20 -1
  89. scitex/diagram/__init__.py +42 -19
  90. scitex/diagram/mcp_server.py +13 -125
  91. scitex/gen/__init__.py +50 -14
  92. scitex/gen/_list_packages.py +4 -4
  93. scitex/introspect/__init__.py +82 -0
  94. scitex/introspect/_call_graph.py +303 -0
  95. scitex/introspect/_class_hierarchy.py +163 -0
  96. scitex/introspect/_core.py +41 -0
  97. scitex/introspect/_docstring.py +131 -0
  98. scitex/introspect/_examples.py +113 -0
  99. scitex/introspect/_imports.py +271 -0
  100. scitex/{gen/_inspect_module.py → introspect/_list_api.py} +43 -54
  101. scitex/introspect/_mcp/__init__.py +41 -0
  102. scitex/introspect/_mcp/handlers.py +233 -0
  103. scitex/introspect/_members.py +155 -0
  104. scitex/introspect/_resolve.py +89 -0
  105. scitex/introspect/_signature.py +131 -0
  106. scitex/introspect/_source.py +80 -0
  107. scitex/introspect/_type_hints.py +172 -0
  108. scitex/io/_save.py +1 -2
  109. scitex/io/bundle/README.md +1 -1
  110. scitex/logging/_formatters.py +19 -9
  111. scitex/mcp_server.py +98 -5
  112. scitex/os/__init__.py +4 -0
  113. scitex/{gen → os}/_check_host.py +4 -5
  114. scitex/plt/__init__.py +245 -550
  115. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
  116. scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  117. scitex/plt/gallery/README.md +1 -1
  118. scitex/plt/utils/_hitmap/__init__.py +82 -0
  119. scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
  120. scitex/plt/utils/_hitmap/_color_application.py +346 -0
  121. scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
  122. scitex/plt/utils/_hitmap/_constants.py +40 -0
  123. scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
  124. scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
  125. scitex/plt/utils/_hitmap/_query.py +113 -0
  126. scitex/plt/utils/_hitmap.py +46 -1616
  127. scitex/plt/utils/_metadata/__init__.py +80 -0
  128. scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
  129. scitex/plt/utils/_metadata/_artists/_base.py +195 -0
  130. scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
  131. scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
  132. scitex/plt/utils/_metadata/_artists/_images.py +80 -0
  133. scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
  134. scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
  135. scitex/plt/utils/_metadata/_artists/_text.py +106 -0
  136. scitex/plt/utils/_metadata/_csv.py +416 -0
  137. scitex/plt/utils/_metadata/_detect.py +225 -0
  138. scitex/plt/utils/_metadata/_legend.py +127 -0
  139. scitex/plt/utils/_metadata/_rounding.py +117 -0
  140. scitex/plt/utils/_metadata/_verification.py +202 -0
  141. scitex/schema/README.md +1 -1
  142. scitex/scholar/__init__.py +8 -0
  143. scitex/scholar/_mcp/crossref_handlers.py +265 -0
  144. scitex/scholar/core/Scholar.py +63 -1700
  145. scitex/scholar/core/_mixins/__init__.py +36 -0
  146. scitex/scholar/core/_mixins/_enrichers.py +270 -0
  147. scitex/scholar/core/_mixins/_library_handlers.py +100 -0
  148. scitex/scholar/core/_mixins/_loaders.py +103 -0
  149. scitex/scholar/core/_mixins/_pdf_download.py +375 -0
  150. scitex/scholar/core/_mixins/_pipeline.py +312 -0
  151. scitex/scholar/core/_mixins/_project_handlers.py +125 -0
  152. scitex/scholar/core/_mixins/_savers.py +69 -0
  153. scitex/scholar/core/_mixins/_search.py +103 -0
  154. scitex/scholar/core/_mixins/_services.py +88 -0
  155. scitex/scholar/core/_mixins/_url_finding.py +105 -0
  156. scitex/scholar/crossref_scitex.py +367 -0
  157. scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  158. scitex/scholar/examples/00_run_all.sh +120 -0
  159. scitex/scholar/jobs/_executors.py +27 -3
  160. scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
  161. scitex/scholar/pdf_download/_cli.py +154 -0
  162. scitex/scholar/pdf_download/strategies/__init__.py +11 -8
  163. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
  164. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
  165. scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
  166. scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
  167. scitex/scholar/pipelines/_single_steps.py +71 -36
  168. scitex/scholar/storage/_LibraryManager.py +97 -1695
  169. scitex/scholar/storage/_mixins/__init__.py +30 -0
  170. scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
  171. scitex/scholar/storage/_mixins/_library_operations.py +218 -0
  172. scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
  173. scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
  174. scitex/scholar/storage/_mixins/_resolution.py +376 -0
  175. scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
  176. scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
  177. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
  178. scitex/scholar/url_finder/.tmp/open_url/README.md +223 -0
  179. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +694 -0
  180. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +1160 -0
  181. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +344 -0
  182. scitex/scholar/url_finder/.tmp/open_url/__init__.py +24 -0
  183. scitex/security/README.md +3 -3
  184. scitex/session/README.md +1 -1
  185. scitex/session/__init__.py +26 -7
  186. scitex/session/_decorator.py +1 -1
  187. scitex/sh/README.md +1 -1
  188. scitex/sh/__init__.py +7 -4
  189. scitex/social/__init__.py +155 -0
  190. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  191. scitex/stats/_mcp/_handlers/__init__.py +31 -0
  192. scitex/stats/_mcp/_handlers/_corrections.py +113 -0
  193. scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
  194. scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
  195. scitex/stats/_mcp/_handlers/_format.py +94 -0
  196. scitex/stats/_mcp/_handlers/_normality.py +110 -0
  197. scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
  198. scitex/stats/_mcp/_handlers/_power.py +247 -0
  199. scitex/stats/_mcp/_handlers/_recommend.py +102 -0
  200. scitex/stats/_mcp/_handlers/_run_test.py +279 -0
  201. scitex/stats/_mcp/_handlers/_stars.py +48 -0
  202. scitex/stats/_mcp/handlers.py +19 -1171
  203. scitex/stats/auto/_stat_style.py +175 -0
  204. scitex/stats/auto/_style_definitions.py +411 -0
  205. scitex/stats/auto/_styles.py +22 -620
  206. scitex/stats/descriptive/__init__.py +11 -8
  207. scitex/stats/descriptive/_ci.py +39 -0
  208. scitex/stats/power/_power.py +15 -4
  209. scitex/str/__init__.py +2 -1
  210. scitex/str/_title_case.py +63 -0
  211. scitex/template/README.md +1 -1
  212. scitex/template/__init__.py +25 -10
  213. scitex/template/_code_templates.py +147 -0
  214. scitex/template/_mcp/handlers.py +81 -0
  215. scitex/template/_mcp/tool_schemas.py +55 -0
  216. scitex/template/_templates/__init__.py +51 -0
  217. scitex/template/_templates/audio.py +233 -0
  218. scitex/template/_templates/canvas.py +312 -0
  219. scitex/template/_templates/capture.py +268 -0
  220. scitex/template/_templates/config.py +43 -0
  221. scitex/template/_templates/diagram.py +294 -0
  222. scitex/template/_templates/io.py +107 -0
  223. scitex/template/_templates/module.py +53 -0
  224. scitex/template/_templates/plt.py +202 -0
  225. scitex/template/_templates/scholar.py +267 -0
  226. scitex/template/_templates/session.py +130 -0
  227. scitex/template/_templates/session_minimal.py +43 -0
  228. scitex/template/_templates/session_plot.py +67 -0
  229. scitex/template/_templates/session_stats.py +77 -0
  230. scitex/template/_templates/stats.py +323 -0
  231. scitex/template/_templates/writer.py +296 -0
  232. scitex/template/clone_writer_directory.py +5 -5
  233. scitex/ui/_backends/_email.py +10 -2
  234. scitex/ui/_backends/_webhook.py +5 -1
  235. scitex/web/_search_pubmed.py +10 -6
  236. scitex/writer/README.md +1 -1
  237. scitex/writer/_mcp/handlers.py +11 -744
  238. scitex/writer/_mcp/tool_schemas.py +5 -335
  239. scitex-2.15.2.dist-info/METADATA +648 -0
  240. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/RECORD +246 -150
  241. scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
  242. scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
  243. scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +0 -90
  244. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +0 -1571
  245. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +0 -6262
  246. scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +0 -1274
  247. scitex/dev/plt/data/mpl/dir_ax.txt +0 -459
  248. scitex/diagram/_compile.py +0 -312
  249. scitex/diagram/_diagram.py +0 -355
  250. scitex/diagram/_mcp/__init__.py +0 -4
  251. scitex/diagram/_mcp/handlers.py +0 -400
  252. scitex/diagram/_mcp/tool_schemas.py +0 -157
  253. scitex/diagram/_presets.py +0 -173
  254. scitex/diagram/_schema.py +0 -182
  255. scitex/diagram/_split.py +0 -278
  256. scitex/gen/_ci.py +0 -12
  257. scitex/gen/_title_case.py +0 -89
  258. scitex/plt/_mcp/__init__.py +0 -4
  259. scitex/plt/_mcp/_handlers_annotation.py +0 -102
  260. scitex/plt/_mcp/_handlers_figure.py +0 -195
  261. scitex/plt/_mcp/_handlers_plot.py +0 -252
  262. scitex/plt/_mcp/_handlers_style.py +0 -219
  263. scitex/plt/_mcp/handlers.py +0 -74
  264. scitex/plt/_mcp/tool_schemas.py +0 -497
  265. scitex/plt/mcp_server.py +0 -231
  266. scitex/scholar/data/.gitkeep +0 -0
  267. scitex/scholar/data/README.md +0 -44
  268. scitex/scholar/data/bib_files/bibliography.bib +0 -1952
  269. scitex/scholar/data/bib_files/neurovista.bib +0 -277
  270. scitex/scholar/data/bib_files/neurovista_enriched.bib +0 -441
  271. scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +0 -441
  272. scitex/scholar/data/bib_files/neurovista_processed.bib +0 -338
  273. scitex/scholar/data/bib_files/openaccess.bib +0 -89
  274. scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +0 -2178
  275. scitex/scholar/data/bib_files/pac.bib +0 -698
  276. scitex/scholar/data/bib_files/pac_enriched.bib +0 -1061
  277. scitex/scholar/data/bib_files/pac_processed.bib +0 -0
  278. scitex/scholar/data/bib_files/pac_titles.txt +0 -75
  279. scitex/scholar/data/bib_files/paywalled.bib +0 -98
  280. scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +0 -58
  281. scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +0 -87
  282. scitex/scholar/data/bib_files/seizure_prediction.bib +0 -694
  283. scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
  284. scitex/scholar/data/bib_files/test_complete_enriched.bib +0 -437
  285. scitex/scholar/data/bib_files/test_final_enriched.bib +0 -437
  286. scitex/scholar/data/bib_files/test_seizure.bib +0 -46
  287. scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
  288. scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
  289. scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
  290. scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
  291. scitex/scholar/data/impact_factor.db +0 -0
  292. scitex/scholar/examples/SUGGESTIONS.md +0 -865
  293. scitex/scholar/examples/dev.py +0 -38
  294. scitex-2.14.0.dist-info/METADATA +0 -1238
  295. /scitex/{gen → context}/_detect_environment.py +0 -0
  296. /scitex/{gen → context}/_get_notebook_path.py +0 -0
  297. /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
  298. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/WHEEL +0 -0
  299. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/entry_points.txt +0 -0
  300. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env python3
2
+ """Plotting session script template."""
3
+
4
+ TEMPLATE = {
5
+ "name": "Plotting Session Script",
6
+ "description": "@stx.session script optimized for figure generation with auto CSV export",
7
+ "filename": "plot_script.py",
8
+ "usage": """
9
+ Usage:
10
+ python plot_script.py
11
+ python plot_script.py --help
12
+
13
+ Note: stx.io.save(fig, "plot.png") automatically exports plot.csv with plotted data
14
+ """,
15
+ "content": '''#!/usr/bin/env python3
16
+ # -*- coding: utf-8 -*-
17
+ # Timestamp: "{timestamp}"
18
+ # File: {filepath}
19
+
20
+ """
21
+ {docstring}
22
+
23
+ Note: stx.io.save(fig, "plot.png") automatically exports plotted data to plot.csv
24
+ """
25
+
26
+ import numpy as np
27
+ import scitex as stx
28
+
29
+
30
+ @stx.session
31
+ def main(
32
+ n_points=100,
33
+ CONFIG=stx.INJECTED,
34
+ plt=stx.INJECTED,
35
+ COLORS=stx.INJECTED,
36
+ logger=stx.INJECTED,
37
+ ):
38
+ """Generate publication-ready figures with automatic data export."""
39
+ # Generate data
40
+ x = np.linspace(0, 2 * np.pi, n_points)
41
+ y = np.sin(x)
42
+
43
+ # Create figure using stx.plt (records all plotting calls)
44
+ fig, ax = plt.subplots()
45
+
46
+ # Use plot_line for automatic CSV export
47
+ ax.plot_line(x, y, color=COLORS.blue, label="sin(x)")
48
+ ax.set_xyt("X (radians)", "Y", "Sine Wave")
49
+ ax.legend_()
50
+
51
+ # Save figure (auto-exports CSV of plotted data)
52
+ stx.io.save(fig, "figure.png", symlink_to="./data")
53
+
54
+ logger.info(f"Figure saved to: {{CONFIG.SDIR_OUT}}/figure.png")
55
+ logger.info(f"Data exported to: {{CONFIG.SDIR_OUT}}/figure.csv")
56
+
57
+ return 0
58
+
59
+
60
+ if __name__ == "__main__":
61
+ main()
62
+
63
+ # EOF
64
+ ''',
65
+ }
66
+
67
+ # EOF
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env python3
2
+ """Statistical analysis session script template."""
3
+
4
+ TEMPLATE = {
5
+ "name": "Statistical Analysis Session",
6
+ "description": "@stx.session script for statistical testing with publication-ready output",
7
+ "filename": "stats_script.py",
8
+ "usage": """
9
+ Usage:
10
+ python stats_script.py
11
+ python stats_script.py --help
12
+
13
+ Available Tests:
14
+ stx.stats.test_ttest_ind() # Independent t-test
15
+ stx.stats.test_ttest_paired() # Paired t-test
16
+ stx.stats.test_anova() # One-way ANOVA
17
+ stx.stats.test_wilcoxon() # Wilcoxon signed-rank
18
+ stx.stats.test_mannwhitneyu() # Mann-Whitney U
19
+ """,
20
+ "content": '''#!/usr/bin/env python3
21
+ # -*- coding: utf-8 -*-
22
+ # Timestamp: "{timestamp}"
23
+ # File: {filepath}
24
+
25
+ """
26
+ {docstring}
27
+
28
+ Available Tests (23 total):
29
+ stx.stats.test_ttest_ind() # Independent t-test with effect size
30
+ stx.stats.test_ttest_paired() # Paired t-test
31
+ stx.stats.test_anova() # One-way ANOVA
32
+ stx.stats.test_wilcoxon() # Wilcoxon signed-rank (non-parametric)
33
+ stx.stats.test_mannwhitneyu() # Mann-Whitney U (non-parametric)
34
+
35
+ Output Formats:
36
+ return_as="dataframe" # pandas DataFrame
37
+ return_as="dict" # Python dictionary
38
+ return_as="latex" # LaTeX table
39
+ """
40
+
41
+ import numpy as np
42
+ import scitex as stx
43
+
44
+
45
+ @stx.session
46
+ def main(
47
+ n_samples=30,
48
+ effect_size=0.5,
49
+ CONFIG=stx.INJECTED,
50
+ plt=stx.INJECTED,
51
+ logger=stx.INJECTED,
52
+ ):
53
+ """Run statistical analysis with publication-ready output."""
54
+ # Generate sample data
55
+ rng = np.random.default_rng(42)
56
+ group1 = rng.normal(10, 2, n_samples)
57
+ group2 = rng.normal(10 + effect_size * 2, 2, n_samples)
58
+
59
+ # Run t-test with effect size and CI
60
+ result = stx.stats.test_ttest_ind(group1, group2, return_as="dataframe")
61
+ logger.info(f"T-test result:\\n{{result}}")
62
+
63
+ # Save results to CONFIG.SDIR_OUT
64
+ stx.io.save(result, "stats_results.csv")
65
+ logger.info(f"Results saved to: {{CONFIG.SDIR_OUT}}/stats_results.csv")
66
+
67
+ return 0
68
+
69
+
70
+ if __name__ == "__main__":
71
+ main()
72
+
73
+ # EOF
74
+ ''',
75
+ }
76
+
77
+ # EOF
@@ -0,0 +1,323 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-25
3
+ # File: src/scitex/template/_templates/stats.py
4
+ # ----------------------------------------
5
+
6
+ """Template for stx.stats statistical analysis module usage."""
7
+
8
+ TEMPLATE = {
9
+ "name": "Statistics Module",
10
+ "description": "stx.stats usage for publication-ready statistical analysis (23 tests)",
11
+ "filename": "stats_script.py",
12
+ "priority": 3,
13
+ "content": '''#!/usr/bin/env python3
14
+ # -*- coding: utf-8 -*-
15
+ # Timestamp: {timestamp}
16
+ # File: {filepath}
17
+
18
+ """
19
+ stx.stats - Publication-Ready Statistics
20
+ ========================================
21
+
22
+ stx.stats provides:
23
+ - 23 statistical tests with proper formatting
24
+ - Automatic normality checking
25
+ - Effect size calculations (Cohen's d, eta², etc.)
26
+ - APA/Nature-style result formatting
27
+ - Power analysis and sample size calculation
28
+ - Multiple comparison corrections
29
+
30
+ Usage Patterns
31
+ --------------
32
+ 1. Direct API: stx.stats.test_*(data, return_as="dataframe")
33
+ 2. CLI: scitex stats recommend --n-groups 3 --outcome continuous
34
+ 3. MCP: stats_recommend_tests, stats_run_test, stats_format_results
35
+
36
+ Output Formats
37
+ --------------
38
+ - return_as="dataframe": Full results as pandas DataFrame
39
+ - return_as="dict": Results as dictionary
40
+ - return_as="latex": Ready-to-use LaTeX string
41
+ - return_as="apa": APA-style formatted string
42
+ """
43
+
44
+ import numpy as np
45
+ import scitex as stx
46
+
47
+ # ============================================================
48
+ # Pattern 1: Two-Group Comparisons
49
+ # ============================================================
50
+
51
+ def two_group_comparison():
52
+ """Compare two independent groups."""
53
+ # Sample data
54
+ group1 = np.random.normal(10, 2, 50)
55
+ group2 = np.random.normal(12, 2, 50)
56
+
57
+ # Independent t-test (with normality check)
58
+ result = stx.stats.test_ttest_ind(
59
+ group1, group2,
60
+ return_as="dataframe" # Options: dataframe, dict, latex, apa
61
+ )
62
+ print("Independent t-test:")
63
+ print(result)
64
+ # Returns: t, p, Cohen's d, CI, normality test, power
65
+
66
+ # Mann-Whitney U (non-parametric alternative)
67
+ result_mwu = stx.stats.test_mannwhitneyu(
68
+ group1, group2,
69
+ return_as="dataframe"
70
+ )
71
+ print("\\nMann-Whitney U:")
72
+ print(result_mwu)
73
+
74
+ # Paired t-test (for matched samples)
75
+ pre = np.random.normal(10, 2, 30)
76
+ post = pre + np.random.normal(2, 1, 30) # Improvement
77
+
78
+ result_paired = stx.stats.test_ttest_rel(
79
+ pre, post,
80
+ return_as="latex" # Get LaTeX-formatted output
81
+ )
82
+ print("\\nPaired t-test (LaTeX):")
83
+ print(result_paired)
84
+
85
+ # ============================================================
86
+ # Pattern 2: Multi-Group Comparisons
87
+ # ============================================================
88
+
89
+ def multi_group_comparison():
90
+ """Compare three or more groups."""
91
+ # Three groups
92
+ group_a = np.random.normal(10, 2, 40)
93
+ group_b = np.random.normal(12, 2, 40)
94
+ group_c = np.random.normal(14, 2, 40)
95
+
96
+ # One-way ANOVA
97
+ result = stx.stats.test_anova(
98
+ group_a, group_b, group_c,
99
+ return_as="dataframe"
100
+ )
101
+ print("One-way ANOVA:")
102
+ print(result)
103
+ # Returns: F, p, eta², omega², power
104
+
105
+ # Kruskal-Wallis (non-parametric)
106
+ result_kw = stx.stats.test_kruskal(
107
+ group_a, group_b, group_c,
108
+ return_as="dataframe"
109
+ )
110
+ print("\\nKruskal-Wallis:")
111
+ print(result_kw)
112
+
113
+ # Post-hoc tests (after significant ANOVA)
114
+ result_posthoc = stx.stats.test_tukey_hsd(
115
+ group_a, group_b, group_c,
116
+ return_as="dataframe"
117
+ )
118
+ print("\\nTukey HSD post-hoc:")
119
+ print(result_posthoc)
120
+
121
+ # ============================================================
122
+ # Pattern 3: Correlation Analysis
123
+ # ============================================================
124
+
125
+ def correlation_analysis():
126
+ """Analyze relationships between variables."""
127
+ # Generate correlated data
128
+ x = np.random.normal(0, 1, 100)
129
+ y = 0.7 * x + np.random.normal(0, 0.5, 100)
130
+
131
+ # Pearson correlation
132
+ result = stx.stats.test_pearsonr(
133
+ x, y,
134
+ return_as="dataframe"
135
+ )
136
+ print("Pearson correlation:")
137
+ print(result)
138
+ # Returns: r, p, CI, R², power
139
+
140
+ # Spearman correlation (non-parametric)
141
+ result_spearman = stx.stats.test_spearmanr(
142
+ x, y,
143
+ return_as="dataframe"
144
+ )
145
+ print("\\nSpearman correlation:")
146
+ print(result_spearman)
147
+
148
+ # ============================================================
149
+ # Pattern 4: Categorical Data Analysis
150
+ # ============================================================
151
+
152
+ def categorical_analysis():
153
+ """Analyze categorical/count data."""
154
+ # Chi-square test
155
+ observed = np.array([[30, 20], [15, 35]])
156
+
157
+ result = stx.stats.test_chi2(
158
+ observed,
159
+ return_as="dataframe"
160
+ )
161
+ print("Chi-square test:")
162
+ print(result)
163
+ # Returns: chi2, p, Cramer's V, df
164
+
165
+ # Fisher's exact test (for small samples)
166
+ small_table = np.array([[5, 2], [1, 6]])
167
+ result_fisher = stx.stats.test_fisher_exact(
168
+ small_table,
169
+ return_as="dataframe"
170
+ )
171
+ print("\\nFisher's exact test:")
172
+ print(result_fisher)
173
+
174
+ # ============================================================
175
+ # Pattern 5: With @stx.session (Recommended)
176
+ # ============================================================
177
+
178
+ @stx.session
179
+ def main(
180
+ n_subjects=50,
181
+ CONFIG=stx.INJECTED,
182
+ plt=stx.INJECTED,
183
+ COLORS=stx.INJECTED,
184
+ logger=stx.INJECTED,
185
+ ):
186
+ """Complete statistical analysis workflow."""
187
+
188
+ # Generate experimental data
189
+ control = np.random.normal(100, 15, n_subjects)
190
+ treatment = np.random.normal(115, 15, n_subjects)
191
+
192
+ # 1. Run statistical test
193
+ result = stx.stats.test_ttest_ind(
194
+ control, treatment,
195
+ return_as="dataframe"
196
+ )
197
+ logger.info(f"Statistical test completed")
198
+
199
+ # 2. Save results
200
+ stx.io.save(result, CONFIG.SDIR_OUT / "stats_results.csv")
201
+
202
+ # 3. Create visualization with stats annotation
203
+ fig, ax = plt.subplots()
204
+
205
+ # Box plot
206
+ ax.boxplot([control, treatment], labels=["Control", "Treatment"])
207
+ ax.set_xyt("Group", "Score", "Treatment Effect")
208
+
209
+ # Add significance annotation
210
+ p_value = result["p_value"].values[0]
211
+ stars = stx.stats.p_to_stars(p_value)
212
+ ax.annotate(
213
+ stars,
214
+ xy=(1.5, max(control.max(), treatment.max()) * 1.05),
215
+ ha="center", fontsize=14
216
+ )
217
+
218
+ stx.io.save(fig, CONFIG.SDIR_OUT / "treatment_effect.png")
219
+
220
+ # 4. Export for paper
221
+ latex_result = stx.stats.test_ttest_ind(
222
+ control, treatment,
223
+ return_as="latex"
224
+ )
225
+ stx.io.save(latex_result, CONFIG.SDIR_OUT / "stats_latex.txt")
226
+
227
+ logger.info(f"Results saved to {{CONFIG.SDIR_OUT}}")
228
+ return 0
229
+
230
+ # ============================================================
231
+ # Pattern 6: Power Analysis & Sample Size
232
+ # ============================================================
233
+
234
+ def power_analysis_example():
235
+ """Calculate required sample size or achieved power."""
236
+ # Calculate required sample size for t-test
237
+ required_n = stx.stats.power_ttest(
238
+ effect_size=0.5, # Medium effect (Cohen's d)
239
+ alpha=0.05,
240
+ power=0.80,
241
+ alternative="two-sided"
242
+ )
243
+ print(f"Required sample size per group: {{required_n}}")
244
+
245
+ # Calculate achieved power
246
+ achieved_power = stx.stats.power_ttest(
247
+ effect_size=0.5,
248
+ alpha=0.05,
249
+ n=30, # Given sample size
250
+ alternative="two-sided"
251
+ )
252
+ print(f"Achieved power with n=30: {{achieved_power:.3f}}")
253
+
254
+ # ============================================================
255
+ # Available Statistical Tests
256
+ # ============================================================
257
+
258
+ """
259
+ stx.stats Available Tests (23 total):
260
+ =====================================
261
+
262
+ Parametric (Continuous):
263
+ ------------------------
264
+ - test_ttest_ind : Independent samples t-test
265
+ - test_ttest_rel : Paired samples t-test
266
+ - test_ttest_1samp : One-sample t-test
267
+ - test_anova : One-way ANOVA
268
+ - test_anova_rm : Repeated measures ANOVA
269
+ - test_pearsonr : Pearson correlation
270
+
271
+ Non-parametric:
272
+ ---------------
273
+ - test_mannwhitneyu : Mann-Whitney U test
274
+ - test_wilcoxon : Wilcoxon signed-rank test
275
+ - test_kruskal : Kruskal-Wallis H test
276
+ - test_friedman : Friedman test
277
+ - test_spearmanr : Spearman correlation
278
+
279
+ Categorical:
280
+ ------------
281
+ - test_chi2 : Chi-square test
282
+ - test_fisher_exact : Fisher's exact test
283
+ - test_mcnemar : McNemar's test
284
+
285
+ Post-hoc:
286
+ ---------
287
+ - test_tukey_hsd : Tukey HSD
288
+ - test_dunn : Dunn's test (after Kruskal)
289
+
290
+ Normality:
291
+ ----------
292
+ - test_shapiro : Shapiro-Wilk test
293
+ - test_normaltest : D'Agostino-Pearson test
294
+
295
+ Helpers:
296
+ --------
297
+ - p_to_stars(p) : Convert p-value to significance stars
298
+ - power_ttest(...) : Power analysis for t-tests
299
+ - effect_size_cohens_d : Calculate Cohen's d
300
+ - correct_pvalues : Multiple comparison correction (FDR, Bonferroni)
301
+
302
+ CLI Commands:
303
+ -------------
304
+ scitex stats recommend --n-groups 2 # Recommend appropriate test
305
+ scitex stats --help # Show all options
306
+
307
+ MCP Tools:
308
+ ----------
309
+ stats_recommend_tests # Get test recommendations
310
+ stats_run_test # Execute a specific test
311
+ stats_format_results # Format for publication
312
+ stats_power_analysis # Power/sample size calculation
313
+ stats_correct_pvalues # Multiple comparison correction
314
+ """
315
+
316
+ if __name__ == "__main__":
317
+ main()
318
+ ''',
319
+ }
320
+
321
+ __all__ = ["TEMPLATE"]
322
+
323
+ # EOF