scitex 2.14.0__py3-none-any.whl → 2.15.3__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.
- scitex/__init__.py +71 -17
- scitex/_env_loader.py +156 -0
- scitex/_mcp_resources/__init__.py +37 -0
- scitex/_mcp_resources/_cheatsheet.py +135 -0
- scitex/_mcp_resources/_figrecipe.py +138 -0
- scitex/_mcp_resources/_formats.py +102 -0
- scitex/_mcp_resources/_modules.py +337 -0
- scitex/_mcp_resources/_session.py +149 -0
- scitex/_mcp_tools/__init__.py +4 -0
- scitex/_mcp_tools/audio.py +66 -0
- scitex/_mcp_tools/diagram.py +11 -95
- scitex/_mcp_tools/introspect.py +210 -0
- scitex/_mcp_tools/plt.py +260 -305
- scitex/_mcp_tools/scholar.py +74 -0
- scitex/_mcp_tools/social.py +27 -0
- scitex/_mcp_tools/template.py +24 -0
- scitex/_mcp_tools/writer.py +17 -210
- scitex/ai/_gen_ai/_PARAMS.py +10 -7
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
- scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
- scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
- scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
- scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
- scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
- scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
- scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
- scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
- scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
- scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
- scitex/audio/README.md +40 -36
- scitex/audio/__init__.py +129 -61
- scitex/audio/_branding.py +185 -0
- scitex/audio/_mcp/__init__.py +32 -0
- scitex/audio/_mcp/handlers.py +59 -6
- scitex/audio/_mcp/speak_handlers.py +238 -0
- scitex/audio/_relay.py +225 -0
- scitex/audio/_tts.py +18 -10
- scitex/audio/engines/base.py +17 -10
- scitex/audio/engines/elevenlabs_engine.py +7 -2
- scitex/audio/mcp_server.py +228 -75
- scitex/canvas/README.md +1 -1
- scitex/canvas/editor/_dearpygui/__init__.py +25 -0
- scitex/canvas/editor/_dearpygui/_editor.py +147 -0
- scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
- scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
- scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
- scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
- scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
- scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
- scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
- scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
- scitex/canvas/editor/_dearpygui/_selection.py +295 -0
- scitex/canvas/editor/_dearpygui/_state.py +93 -0
- scitex/canvas/editor/_dearpygui/_utils.py +61 -0
- scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
- scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
- scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
- scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
- scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
- scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
- scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
- scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
- scitex/canvas/editor/flask_editor/_core.py +25 -1684
- scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
- scitex/cli/__init__.py +38 -43
- scitex/cli/audio.py +160 -41
- scitex/cli/capture.py +133 -20
- scitex/cli/introspect.py +488 -0
- scitex/cli/main.py +200 -109
- scitex/cli/mcp.py +60 -34
- scitex/cli/plt.py +414 -0
- scitex/cli/repro.py +15 -8
- scitex/cli/resource.py +15 -8
- scitex/cli/scholar/__init__.py +154 -8
- scitex/cli/scholar/_crossref_scitex.py +296 -0
- scitex/cli/scholar/_fetch.py +25 -3
- scitex/cli/social.py +355 -0
- scitex/cli/stats.py +136 -11
- scitex/cli/template.py +129 -12
- scitex/cli/tex.py +15 -8
- scitex/cli/writer.py +49 -299
- scitex/cloud/__init__.py +41 -2
- scitex/config/README.md +1 -1
- scitex/config/__init__.py +16 -2
- scitex/config/_env_registry.py +256 -0
- scitex/context/__init__.py +22 -0
- scitex/dev/__init__.py +20 -1
- scitex/diagram/__init__.py +42 -19
- scitex/diagram/mcp_server.py +13 -125
- scitex/gen/__init__.py +50 -14
- scitex/gen/_list_packages.py +4 -4
- scitex/introspect/__init__.py +82 -0
- scitex/introspect/_call_graph.py +303 -0
- scitex/introspect/_class_hierarchy.py +163 -0
- scitex/introspect/_core.py +41 -0
- scitex/introspect/_docstring.py +131 -0
- scitex/introspect/_examples.py +113 -0
- scitex/introspect/_imports.py +271 -0
- scitex/{gen/_inspect_module.py → introspect/_list_api.py} +48 -56
- scitex/introspect/_mcp/__init__.py +41 -0
- scitex/introspect/_mcp/handlers.py +233 -0
- scitex/introspect/_members.py +155 -0
- scitex/introspect/_resolve.py +89 -0
- scitex/introspect/_signature.py +131 -0
- scitex/introspect/_source.py +80 -0
- scitex/introspect/_type_hints.py +172 -0
- scitex/io/_save.py +1 -2
- scitex/io/bundle/README.md +1 -1
- scitex/logging/_formatters.py +19 -9
- scitex/mcp_server.py +98 -5
- scitex/os/__init__.py +4 -0
- scitex/{gen → os}/_check_host.py +4 -5
- scitex/plt/__init__.py +245 -550
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
- scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/plt/gallery/README.md +1 -1
- scitex/plt/utils/_hitmap/__init__.py +82 -0
- scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
- scitex/plt/utils/_hitmap/_color_application.py +346 -0
- scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
- scitex/plt/utils/_hitmap/_constants.py +40 -0
- scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
- scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
- scitex/plt/utils/_hitmap/_query.py +113 -0
- scitex/plt/utils/_hitmap.py +46 -1616
- scitex/plt/utils/_metadata/__init__.py +80 -0
- scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
- scitex/plt/utils/_metadata/_artists/_base.py +195 -0
- scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
- scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
- scitex/plt/utils/_metadata/_artists/_images.py +80 -0
- scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
- scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
- scitex/plt/utils/_metadata/_artists/_text.py +106 -0
- scitex/plt/utils/_metadata/_csv.py +416 -0
- scitex/plt/utils/_metadata/_detect.py +225 -0
- scitex/plt/utils/_metadata/_legend.py +127 -0
- scitex/plt/utils/_metadata/_rounding.py +117 -0
- scitex/plt/utils/_metadata/_verification.py +202 -0
- scitex/schema/README.md +1 -1
- scitex/scholar/__init__.py +8 -0
- scitex/scholar/_mcp/crossref_handlers.py +265 -0
- scitex/scholar/core/Scholar.py +63 -1700
- scitex/scholar/core/_mixins/__init__.py +36 -0
- scitex/scholar/core/_mixins/_enrichers.py +270 -0
- scitex/scholar/core/_mixins/_library_handlers.py +100 -0
- scitex/scholar/core/_mixins/_loaders.py +103 -0
- scitex/scholar/core/_mixins/_pdf_download.py +375 -0
- scitex/scholar/core/_mixins/_pipeline.py +312 -0
- scitex/scholar/core/_mixins/_project_handlers.py +125 -0
- scitex/scholar/core/_mixins/_savers.py +69 -0
- scitex/scholar/core/_mixins/_search.py +103 -0
- scitex/scholar/core/_mixins/_services.py +88 -0
- scitex/scholar/core/_mixins/_url_finding.py +105 -0
- scitex/scholar/crossref_scitex.py +367 -0
- scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/scholar/examples/00_run_all.sh +120 -0
- scitex/scholar/jobs/_executors.py +27 -3
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
- scitex/scholar/pdf_download/_cli.py +154 -0
- scitex/scholar/pdf_download/strategies/__init__.py +11 -8
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
- scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
- scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
- scitex/scholar/pipelines/_single_steps.py +71 -36
- scitex/scholar/storage/_LibraryManager.py +97 -1695
- scitex/scholar/storage/_mixins/__init__.py +30 -0
- scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
- scitex/scholar/storage/_mixins/_library_operations.py +218 -0
- scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
- scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
- scitex/scholar/storage/_mixins/_resolution.py +376 -0
- scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
- scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
- scitex/security/README.md +3 -3
- scitex/session/README.md +1 -1
- scitex/session/__init__.py +26 -7
- scitex/session/_decorator.py +1 -1
- scitex/sh/README.md +1 -1
- scitex/sh/__init__.py +7 -4
- scitex/social/__init__.py +155 -0
- scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/stats/_mcp/_handlers/__init__.py +31 -0
- scitex/stats/_mcp/_handlers/_corrections.py +113 -0
- scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
- scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
- scitex/stats/_mcp/_handlers/_format.py +94 -0
- scitex/stats/_mcp/_handlers/_normality.py +110 -0
- scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
- scitex/stats/_mcp/_handlers/_power.py +247 -0
- scitex/stats/_mcp/_handlers/_recommend.py +102 -0
- scitex/stats/_mcp/_handlers/_run_test.py +279 -0
- scitex/stats/_mcp/_handlers/_stars.py +48 -0
- scitex/stats/_mcp/handlers.py +19 -1171
- scitex/stats/auto/_stat_style.py +175 -0
- scitex/stats/auto/_style_definitions.py +411 -0
- scitex/stats/auto/_styles.py +22 -620
- scitex/stats/descriptive/__init__.py +11 -8
- scitex/stats/descriptive/_ci.py +39 -0
- scitex/stats/power/_power.py +15 -4
- scitex/str/__init__.py +2 -1
- scitex/str/_title_case.py +63 -0
- scitex/template/README.md +1 -1
- scitex/template/__init__.py +25 -10
- scitex/template/_code_templates.py +147 -0
- scitex/template/_mcp/handlers.py +81 -0
- scitex/template/_mcp/tool_schemas.py +55 -0
- scitex/template/_templates/__init__.py +51 -0
- scitex/template/_templates/audio.py +233 -0
- scitex/template/_templates/canvas.py +312 -0
- scitex/template/_templates/capture.py +268 -0
- scitex/template/_templates/config.py +43 -0
- scitex/template/_templates/diagram.py +294 -0
- scitex/template/_templates/io.py +107 -0
- scitex/template/_templates/module.py +53 -0
- scitex/template/_templates/plt.py +202 -0
- scitex/template/_templates/scholar.py +267 -0
- scitex/template/_templates/session.py +130 -0
- scitex/template/_templates/session_minimal.py +43 -0
- scitex/template/_templates/session_plot.py +67 -0
- scitex/template/_templates/session_stats.py +77 -0
- scitex/template/_templates/stats.py +323 -0
- scitex/template/_templates/writer.py +296 -0
- scitex/template/clone_writer_directory.py +5 -5
- scitex/ui/_backends/_email.py +10 -2
- scitex/ui/_backends/_webhook.py +5 -1
- scitex/web/_search_pubmed.py +10 -6
- scitex/writer/README.md +1 -1
- scitex/writer/__init__.py +43 -34
- scitex/writer/_mcp/handlers.py +11 -744
- scitex/writer/_mcp/tool_schemas.py +5 -335
- scitex-2.15.3.dist-info/METADATA +667 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/RECORD +241 -120
- scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
- scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
- scitex/diagram/_compile.py +0 -312
- scitex/diagram/_diagram.py +0 -355
- scitex/diagram/_mcp/__init__.py +0 -4
- scitex/diagram/_mcp/handlers.py +0 -400
- scitex/diagram/_mcp/tool_schemas.py +0 -157
- scitex/diagram/_presets.py +0 -173
- scitex/diagram/_schema.py +0 -182
- scitex/diagram/_split.py +0 -278
- scitex/gen/_ci.py +0 -12
- scitex/gen/_title_case.py +0 -89
- scitex/plt/_mcp/__init__.py +0 -4
- scitex/plt/_mcp/_handlers_annotation.py +0 -102
- scitex/plt/_mcp/_handlers_figure.py +0 -195
- scitex/plt/_mcp/_handlers_plot.py +0 -252
- scitex/plt/_mcp/_handlers_style.py +0 -219
- scitex/plt/_mcp/handlers.py +0 -74
- scitex/plt/_mcp/tool_schemas.py +0 -497
- scitex/plt/mcp_server.py +0 -231
- scitex/scholar/examples/SUGGESTIONS.md +0 -865
- scitex/scholar/examples/dev.py +0 -38
- scitex-2.14.0.dist-info/METADATA +0 -1238
- /scitex/{gen → context}/_detect_environment.py +0 -0
- /scitex/{gen → context}/_get_notebook_path.py +0 -0
- /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/WHEEL +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/entry_points.txt +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.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
|