plotsalot 0.1.1__tar.gz
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.
- plotsalot-0.1.1/.dockerignore +4 -0
- plotsalot-0.1.1/.gitattributes +2 -0
- plotsalot-0.1.1/.github/CODEOWNERS +1 -0
- plotsalot-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- plotsalot-0.1.1/.github/dependabot.yml +10 -0
- plotsalot-0.1.1/.github/workflows/ci.yml +22 -0
- plotsalot-0.1.1/.github/workflows/release.yml +90 -0
- plotsalot-0.1.1/.github/workflows/security.yml +21 -0
- plotsalot-0.1.1/.gitignore +22 -0
- plotsalot-0.1.1/.python-version +1 -0
- plotsalot-0.1.1/AGENTS.md +83 -0
- plotsalot-0.1.1/CHANGELOG.md +49 -0
- plotsalot-0.1.1/CONTRIBUTING.md +59 -0
- plotsalot-0.1.1/LICENSE +21 -0
- plotsalot-0.1.1/Makefile +41 -0
- plotsalot-0.1.1/PKG-INFO +149 -0
- plotsalot-0.1.1/PROJECT_BRIEF.md +109 -0
- plotsalot-0.1.1/PROJECT_MEMORY.md +45 -0
- plotsalot-0.1.1/README.md +118 -0
- plotsalot-0.1.1/REPRODUCIBILITY.md +90 -0
- plotsalot-0.1.1/SECURITY.md +29 -0
- plotsalot-0.1.1/STATISTICAL_ANALYSIS_PLAN.md +209 -0
- plotsalot-0.1.1/benchmarks/benchmark_m0.py +128 -0
- plotsalot-0.1.1/benchmarks/benchmark_m2.py +154 -0
- plotsalot-0.1.1/benchmarks/benchmark_m3.py +271 -0
- plotsalot-0.1.1/benchmarks/benchmark_m4.py +239 -0
- plotsalot-0.1.1/benchmarks/benchmark_m5a.py +167 -0
- plotsalot-0.1.1/benchmarks/benchmark_m5b.py +174 -0
- plotsalot-0.1.1/benchmarks/benchmark_m6a.py +264 -0
- plotsalot-0.1.1/benchmarks/benchmark_m6b.py +163 -0
- plotsalot-0.1.1/benchmarks/benchmark_m6c.py +240 -0
- plotsalot-0.1.1/benchmarks/results/m0-baseline.json +233 -0
- plotsalot-0.1.1/benchmarks/results/m2-baseline.json +454 -0
- plotsalot-0.1.1/benchmarks/results/m3-baseline.json +1662 -0
- plotsalot-0.1.1/benchmarks/results/m4-baseline.json +2228 -0
- plotsalot-0.1.1/benchmarks/results/m5a-baseline.json +375 -0
- plotsalot-0.1.1/benchmarks/results/m5b-baseline.json +1700 -0
- plotsalot-0.1.1/benchmarks/results/m6a-baseline.json +510 -0
- plotsalot-0.1.1/benchmarks/results/m6b-baseline.json +174 -0
- plotsalot-0.1.1/benchmarks/results/m6c-baseline.json +962 -0
- plotsalot-0.1.1/checklists/RELEASE_READINESS.md +75 -0
- plotsalot-0.1.1/checklists/REPOSITORY_SETUP.md +67 -0
- plotsalot-0.1.1/data/README.md +11 -0
- plotsalot-0.1.1/data/example.csv +3 -0
- plotsalot-0.1.1/data/regression-example.csv +6 -0
- plotsalot-0.1.1/data/walk-forward-example.csv +11 -0
- plotsalot-0.1.1/docs/AGENTIC_VERIFICATION_GUIDE.md +118 -0
- plotsalot-0.1.1/docs/BAYESIAN_REGRESSION_IMPLEMENTATION.md +152 -0
- plotsalot-0.1.1/docs/CONTRACTS.md +201 -0
- plotsalot-0.1.1/docs/GETTING_STARTED.md +132 -0
- plotsalot-0.1.1/docs/INTERPRETATION_AND_LIMITATIONS.md +95 -0
- plotsalot-0.1.1/docs/M2_STATISTICAL_METHODS.md +187 -0
- plotsalot-0.1.1/docs/M3_STATISTICAL_METHODS.md +323 -0
- plotsalot-0.1.1/docs/M4_STATISTICAL_METHODS.md +366 -0
- plotsalot-0.1.1/docs/M5_STATISTICAL_METHODS.md +558 -0
- plotsalot-0.1.1/docs/M6B_STATISTICAL_METHODS.md +466 -0
- plotsalot-0.1.1/docs/M6C_STATISTICAL_METHODS.md +582 -0
- plotsalot-0.1.1/docs/M6_STATISTICAL_METHODS.md +490 -0
- plotsalot-0.1.1/docs/MILESTONE_0.md +75 -0
- plotsalot-0.1.1/docs/MILESTONE_1.md +66 -0
- plotsalot-0.1.1/docs/MILESTONE_2.md +197 -0
- plotsalot-0.1.1/docs/MILESTONE_3.md +325 -0
- plotsalot-0.1.1/docs/MILESTONE_4.md +412 -0
- plotsalot-0.1.1/docs/MILESTONE_5.md +476 -0
- plotsalot-0.1.1/docs/MILESTONE_6.md +586 -0
- plotsalot-0.1.1/docs/PARQUET_DATASETS.md +76 -0
- plotsalot-0.1.1/docs/PROJECT_PLAN.md +55 -0
- plotsalot-0.1.1/docs/README.md +45 -0
- plotsalot-0.1.1/docs/REGRESSION_EVIDENCE.md +62 -0
- plotsalot-0.1.1/docs/RELEASING.md +79 -0
- plotsalot-0.1.1/docs/STATISTICAL_LEARNING_POINT_OF_VIEW.md +85 -0
- plotsalot-0.1.1/docs/USER_GUIDE.md +185 -0
- plotsalot-0.1.1/docs/adr/ADR-001-project-identity.md +29 -0
- plotsalot-0.1.1/docs/adr/ADR-002-renderer.md +29 -0
- plotsalot-0.1.1/docs/adr/ADR-003-dataframe-boundary.md +29 -0
- plotsalot-0.1.1/docs/adr/ADR-004-compatibility.md +31 -0
- plotsalot-0.1.1/docs/adr/ADR-005-robust-method-architecture.md +120 -0
- plotsalot-0.1.1/docs/adr/ADR-006-bayesian-engine-architecture.md +110 -0
- plotsalot-0.1.1/docs/adr/ADR-010-license-posture.md +43 -0
- plotsalot-0.1.1/docs/compatibility.md +218 -0
- plotsalot-0.1.1/docs/evidence/M0_ADVERSARIAL_REVIEW.md +57 -0
- plotsalot-0.1.1/docs/evidence/M0_IMPROVEMENT_PLAN.md +11 -0
- plotsalot-0.1.1/docs/evidence/M0_SIGNOFF.md +13 -0
- plotsalot-0.1.1/docs/evidence/M0_VERIFICATION.md +111 -0
- plotsalot-0.1.1/docs/evidence/M0_VERIFICATION_LOOP.md +26 -0
- plotsalot-0.1.1/docs/evidence/M1_ADVERSARIAL_REVIEW.md +101 -0
- plotsalot-0.1.1/docs/evidence/M1_IMPROVEMENT_PLAN.md +18 -0
- plotsalot-0.1.1/docs/evidence/M1_VERIFICATION.md +46 -0
- plotsalot-0.1.1/docs/evidence/M1_VERIFICATION_LOOP.md +53 -0
- plotsalot-0.1.1/docs/evidence/M2_ADVERSARIAL_REVIEW.md +39 -0
- plotsalot-0.1.1/docs/evidence/M2_SIGNOFF.md +23 -0
- plotsalot-0.1.1/docs/evidence/M2_VERIFICATION.md +87 -0
- plotsalot-0.1.1/docs/evidence/M2_VERIFICATION_LOOP.md +49 -0
- plotsalot-0.1.1/docs/evidence/M3A_ADVERSARIAL_REVIEW.md +31 -0
- plotsalot-0.1.1/docs/evidence/M3A_SIGNOFF.md +19 -0
- plotsalot-0.1.1/docs/evidence/M3A_VERIFICATION.md +74 -0
- plotsalot-0.1.1/docs/evidence/M3A_VERIFICATION_LOOP.md +27 -0
- plotsalot-0.1.1/docs/evidence/M3B_ADVERSARIAL_REVIEW.md +32 -0
- plotsalot-0.1.1/docs/evidence/M3B_SIGNOFF.md +19 -0
- plotsalot-0.1.1/docs/evidence/M3B_VERIFICATION.md +69 -0
- plotsalot-0.1.1/docs/evidence/M3B_VERIFICATION_LOOP.md +27 -0
- plotsalot-0.1.1/docs/evidence/M4_ADVERSARIAL_REVIEW.md +35 -0
- plotsalot-0.1.1/docs/evidence/M4_SIGNOFF.md +22 -0
- plotsalot-0.1.1/docs/evidence/M4_VERIFICATION.md +67 -0
- plotsalot-0.1.1/docs/evidence/M4_VERIFICATION_LOOP.md +49 -0
- plotsalot-0.1.1/docs/evidence/M5A_ADVERSARIAL_REVIEW.md +37 -0
- plotsalot-0.1.1/docs/evidence/M5A_SIGNOFF.md +21 -0
- plotsalot-0.1.1/docs/evidence/M5A_VERIFICATION.md +84 -0
- plotsalot-0.1.1/docs/evidence/M5A_VERIFICATION_LOOP.md +27 -0
- plotsalot-0.1.1/docs/evidence/M5B_ADVERSARIAL_REVIEW.md +40 -0
- plotsalot-0.1.1/docs/evidence/M5B_SIGNOFF.md +21 -0
- plotsalot-0.1.1/docs/evidence/M5B_VERIFICATION.md +84 -0
- plotsalot-0.1.1/docs/evidence/M5B_VERIFICATION_LOOP.md +28 -0
- plotsalot-0.1.1/docs/evidence/M6A_ADVERSARIAL_REVIEW.md +26 -0
- plotsalot-0.1.1/docs/evidence/M6A_SIGNOFF.md +28 -0
- plotsalot-0.1.1/docs/evidence/M6A_VERIFICATION.md +123 -0
- plotsalot-0.1.1/docs/evidence/M6A_VERIFICATION_LOOP.md +73 -0
- plotsalot-0.1.1/docs/evidence/M6B_ADVERSARIAL_REVIEW.md +26 -0
- plotsalot-0.1.1/docs/evidence/M6B_METHOD_AUDIT.md +88 -0
- plotsalot-0.1.1/docs/evidence/M6B_SIGNOFF.md +23 -0
- plotsalot-0.1.1/docs/evidence/M6B_VERIFICATION.md +39 -0
- plotsalot-0.1.1/docs/evidence/M6B_VERIFICATION_LOOP.md +72 -0
- plotsalot-0.1.1/docs/evidence/M6C_ADVERSARIAL_REVIEW.md +32 -0
- plotsalot-0.1.1/docs/evidence/M6C_METHOD_AUDIT.md +89 -0
- plotsalot-0.1.1/docs/evidence/M6C_PASS1_VERIFICATION.md +59 -0
- plotsalot-0.1.1/docs/evidence/M6C_PASS2_VERIFICATION.md +130 -0
- plotsalot-0.1.1/docs/evidence/M6C_SIGNOFF.md +31 -0
- plotsalot-0.1.1/docs/evidence/M6C_VERIFICATION.md +68 -0
- plotsalot-0.1.1/docs/evidence/M6C_VERIFICATION_LOOP.md +84 -0
- plotsalot-0.1.1/docs/evidence/M6_RELEASE_VERIFICATION.md +94 -0
- plotsalot-0.1.1/docs/evidence/M6_SIGNOFF.md +18 -0
- plotsalot-0.1.1/docs/evidence/m6a-correlation-calibration.json +57 -0
- plotsalot-0.1.1/docs/evidence/m6c-pass2-calibration-confirmation.json +95 -0
- plotsalot-0.1.1/docs/evidence/m6c-pass2-calibration.json +86 -0
- plotsalot-0.1.1/docs/upstream/README.md +12 -0
- plotsalot-0.1.1/docs/upstream/manifest.json +24 -0
- plotsalot-0.1.1/notebooks/README.md +15 -0
- plotsalot-0.1.1/notes/README.md +16 -0
- plotsalot-0.1.1/oracle/DESCRIPTION +11 -0
- plotsalot-0.1.1/oracle/Dockerfile +40 -0
- plotsalot-0.1.1/oracle/LICENSE +2 -0
- plotsalot-0.1.1/oracle/README.md +69 -0
- plotsalot-0.1.1/oracle/fixtures/input/degenerate.csv +4 -0
- plotsalot-0.1.1/oracle/fixtures/input/m2-correlation.csv +9 -0
- plotsalot-0.1.1/oracle/fixtures/input/m2-dot.csv +8 -0
- plotsalot-0.1.1/oracle/fixtures/input/m3-between.csv +13 -0
- plotsalot-0.1.1/oracle/fixtures/input/m3-within.csv +13 -0
- plotsalot-0.1.1/oracle/fixtures/input/m4-grouped.csv +9 -0
- plotsalot-0.1.1/oracle/fixtures/input/m4-independent.csv +7 -0
- plotsalot-0.1.1/oracle/fixtures/input/m4-one-way.csv +4 -0
- plotsalot-0.1.1/oracle/fixtures/input/m4-paired.csv +5 -0
- plotsalot-0.1.1/oracle/fixtures/input/m4-raw.csv +41 -0
- plotsalot-0.1.1/oracle/fixtures/input/m5a-coefficients.csv +4 -0
- plotsalot-0.1.1/oracle/fixtures/input/m5a-ols.csv +11 -0
- plotsalot-0.1.1/oracle/fixtures/input/m5b-meta.csv +6 -0
- plotsalot-0.1.1/oracle/fixtures/input/m6a-between.csv +19 -0
- plotsalot-0.1.1/oracle/fixtures/input/m6a-correlation.csv +11 -0
- plotsalot-0.1.1/oracle/fixtures/input/m6a-hist.csv +8 -0
- plotsalot-0.1.1/oracle/fixtures/input/m6a-within.csv +25 -0
- plotsalot-0.1.1/oracle/fixtures/input/m6c-bayes-meta.csv +4 -0
- plotsalot-0.1.1/oracle/fixtures/input/m6c-robust-meta.csv +11 -0
- plotsalot-0.1.1/oracle/fixtures/input/non-finite.csv +4 -0
- plotsalot-0.1.1/oracle/fixtures/input/normal.csv +6 -0
- plotsalot-0.1.1/oracle/fixtures/input/null-containing.csv +6 -0
- plotsalot-0.1.1/oracle/fixtures/input/small-sample.csv +3 -0
- plotsalot-0.1.1/oracle/fixtures/manifest.json +152 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/boundary-results.csv +3 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/installed-packages.csv +147 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m2-correlation-results.csv +4 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m2-corrmat-ggstatsplot.R +3 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m2-dot-ggstatsplot.R +11 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m2-dot-results.csv +5 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m2-scatter-ggstatsplot.R +11 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m3-between-ggstatsplot.R +18 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m3-between-results.csv +5 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m3-within-ggstatsplot.R +16 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m3-within-results.csv +5 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-categorical-results.csv +9 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-grouped-bar-ggstatsplot.R +59 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-grouped-pie-ggstatsplot.R +59 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-independent-bar-ggstatsplot.R +47 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-independent-pie-ggstatsplot.R +47 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-one-way-bar-ggstatsplot.R +11 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-one-way-pie-ggstatsplot.R +11 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-paired-bar-ggstatsplot.R +31 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-paired-pie-ggstatsplot.R +31 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-raw-bar-ggstatsplot.R +28 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m4-raw-pie-ggstatsplot.R +28 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m5a-coefficients-ggstatsplot.R +6 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m5a-ols-ggstatsplot.R +14 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m5a-ols-results.csv +3 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m5a-ols-summary.csv +2 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m5b-meta-ggstatsplot.R +13 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m5b-meta-results.csv +2 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m5b-meta-study-results.csv +6 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6a-between-ggstatsplot.R +18 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6a-between-results.csv +5 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6a-correlation-results.csv +2 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6a-hist-ggstatsplot.R +10 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6a-hist-results.csv +2 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6a-scatter-ggstatsplot.R +11 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6a-within-ggstatsplot.R +21 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6a-within-results.csv +5 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6c-bayes-meta-results.csv +6 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/m6c-robust-meta-results.csv +2 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/normal-ggstatsplot.R +9 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/normalized-results.csv +4 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/null-containing-ggstatsplot.R +9 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/session-info.txt +53 -0
- plotsalot-0.1.1/oracle/fixtures/r-output/small-sample-ggstatsplot.R +8 -0
- plotsalot-0.1.1/oracle/generate.R +1518 -0
- plotsalot-0.1.1/oracle/renv.lock +5155 -0
- plotsalot-0.1.1/pyproject.toml +75 -0
- plotsalot-0.1.1/schemas/analysis-result.schema.json +111 -0
- plotsalot-0.1.1/schemas/bayesian-result.schema.json +234 -0
- plotsalot-0.1.1/schemas/categorical-result.schema.json +147 -0
- plotsalot-0.1.1/schemas/coefficient-result.schema.json +700 -0
- plotsalot-0.1.1/schemas/comparison-result.schema.json +276 -0
- plotsalot-0.1.1/schemas/composition-result.schema.json +89 -0
- plotsalot-0.1.1/schemas/correlation-matrix-result.schema.json +66 -0
- plotsalot-0.1.1/schemas/correlation-result.schema.json +68 -0
- plotsalot-0.1.1/schemas/dotplot-result.schema.json +64 -0
- plotsalot-0.1.1/schemas/grouped-result.schema.json +146 -0
- plotsalot-0.1.1/schemas/robust-result.schema.json +122 -0
- plotsalot-0.1.1/schemas/telemetry-event.schema.json +141 -0
- plotsalot-0.1.1/src/plotsalot/__init__.py +325 -0
- plotsalot-0.1.1/src/plotsalot/analysis_cli.py +68 -0
- plotsalot-0.1.1/src/plotsalot/bayesian.py +1548 -0
- plotsalot-0.1.1/src/plotsalot/bayesian_result.py +929 -0
- plotsalot-0.1.1/src/plotsalot/categorical.py +507 -0
- plotsalot-0.1.1/src/plotsalot/categorical_analysis.py +726 -0
- plotsalot-0.1.1/src/plotsalot/categorical_data.py +194 -0
- plotsalot-0.1.1/src/plotsalot/categorical_grouped.py +382 -0
- plotsalot-0.1.1/src/plotsalot/categorical_result.py +346 -0
- plotsalot-0.1.1/src/plotsalot/cli.py +21 -0
- plotsalot-0.1.1/src/plotsalot/coefficient.py +1039 -0
- plotsalot-0.1.1/src/plotsalot/coefficient_analysis.py +823 -0
- plotsalot-0.1.1/src/plotsalot/coefficient_data.py +340 -0
- plotsalot-0.1.1/src/plotsalot/coefficient_meta_analysis.py +1118 -0
- plotsalot-0.1.1/src/plotsalot/coefficient_meta_result.py +705 -0
- plotsalot-0.1.1/src/plotsalot/coefficient_result.py +839 -0
- plotsalot-0.1.1/src/plotsalot/coefficient_summary_analysis.py +1052 -0
- plotsalot-0.1.1/src/plotsalot/coefficient_table_analysis.py +420 -0
- plotsalot-0.1.1/src/plotsalot/comparison.py +577 -0
- plotsalot-0.1.1/src/plotsalot/comparison_analysis.py +1292 -0
- plotsalot-0.1.1/src/plotsalot/comparison_data.py +317 -0
- plotsalot-0.1.1/src/plotsalot/comparison_grouped.py +454 -0
- plotsalot-0.1.1/src/plotsalot/comparison_result.py +331 -0
- plotsalot-0.1.1/src/plotsalot/composition.py +367 -0
- plotsalot-0.1.1/src/plotsalot/core.py +38 -0
- plotsalot-0.1.1/src/plotsalot/correlation.py +356 -0
- plotsalot-0.1.1/src/plotsalot/correlation_analysis.py +741 -0
- plotsalot-0.1.1/src/plotsalot/data.py +189 -0
- plotsalot-0.1.1/src/plotsalot/dataset.py +486 -0
- plotsalot-0.1.1/src/plotsalot/dataset_cli.py +93 -0
- plotsalot-0.1.1/src/plotsalot/dotplot.py +256 -0
- plotsalot-0.1.1/src/plotsalot/dotplot_analysis.py +368 -0
- plotsalot-0.1.1/src/plotsalot/evidence.py +236 -0
- plotsalot-0.1.1/src/plotsalot/grouped.py +898 -0
- plotsalot-0.1.1/src/plotsalot/histogram.py +233 -0
- plotsalot-0.1.1/src/plotsalot/histogram_analysis.py +335 -0
- plotsalot-0.1.1/src/plotsalot/ingest.py +48 -0
- plotsalot-0.1.1/src/plotsalot/model.py +47 -0
- plotsalot-0.1.1/src/plotsalot/plot.py +139 -0
- plotsalot-0.1.1/src/plotsalot/py.typed +1 -0
- plotsalot-0.1.1/src/plotsalot/regression.py +172 -0
- plotsalot-0.1.1/src/plotsalot/result.py +627 -0
- plotsalot-0.1.1/src/plotsalot/robust.py +243 -0
- plotsalot-0.1.1/src/plotsalot/robust_result.py +781 -0
- plotsalot-0.1.1/src/plotsalot/theme.py +99 -0
- plotsalot-0.1.1/src/plotsalot/time_validation_cli.py +84 -0
- plotsalot-0.1.1/src/plotsalot/validation.py +298 -0
- plotsalot-0.1.1/src/plotsalot/validation_evidence.py +206 -0
- plotsalot-0.1.1/templates/ADR.md +18 -0
- plotsalot-0.1.1/templates/AGENTIC_VERIFICATION_LOOP.md +74 -0
- plotsalot-0.1.1/templates/IMPROVEMENT_PLAN.md +35 -0
- plotsalot-0.1.1/templates/INCIDENT_REVIEW.md +13 -0
- plotsalot-0.1.1/templates/LATENCY_BUDGET.md +74 -0
- plotsalot-0.1.1/templates/STATISTICAL_ANALYSIS_PLAN.md +88 -0
- plotsalot-0.1.1/templates/TELEMETRY_REVIEW.md +53 -0
- plotsalot-0.1.1/templates/THREAT_MODEL.md +13 -0
- plotsalot-0.1.1/templates/WORK_NOTE.md +45 -0
- plotsalot-0.1.1/tests/test_betweenstats.py +196 -0
- plotsalot-0.1.1/tests/test_categorical_analysis.py +339 -0
- plotsalot-0.1.1/tests/test_categorical_data.py +230 -0
- plotsalot-0.1.1/tests/test_categorical_render_grouped.py +184 -0
- plotsalot-0.1.1/tests/test_categorical_result_contract.py +232 -0
- plotsalot-0.1.1/tests/test_coefficient_data.py +103 -0
- plotsalot-0.1.1/tests/test_coefficient_result_render.py +418 -0
- plotsalot-0.1.1/tests/test_coefficient_tables.py +538 -0
- plotsalot-0.1.1/tests/test_comparison_data.py +222 -0
- plotsalot-0.1.1/tests/test_contracts.py +175 -0
- plotsalot-0.1.1/tests/test_correlation.py +206 -0
- plotsalot-0.1.1/tests/test_data_boundary.py +86 -0
- plotsalot-0.1.1/tests/test_dataset.py +184 -0
- plotsalot-0.1.1/tests/test_documentation_examples.py +45 -0
- plotsalot-0.1.1/tests/test_dotplotstats.py +169 -0
- plotsalot-0.1.1/tests/test_evidence.py +145 -0
- plotsalot-0.1.1/tests/test_gghistostats.py +127 -0
- plotsalot-0.1.1/tests/test_grouped.py +228 -0
- plotsalot-0.1.1/tests/test_ingest.py +48 -0
- plotsalot-0.1.1/tests/test_m0_artifacts.py +14 -0
- plotsalot-0.1.1/tests/test_m2_contracts.py +342 -0
- plotsalot-0.1.1/tests/test_m3_contracts.py +413 -0
- plotsalot-0.1.1/tests/test_m3_grouped_composition.py +211 -0
- plotsalot-0.1.1/tests/test_m6a_robust.py +1001 -0
- plotsalot-0.1.1/tests/test_m6b_bayesian.py +970 -0
- plotsalot-0.1.1/tests/test_m6c_coefficient_summaries.py +571 -0
- plotsalot-0.1.1/tests/test_m6c_meta_analysis.py +727 -0
- plotsalot-0.1.1/tests/test_m6c_render_integration.py +351 -0
- plotsalot-0.1.1/tests/test_meta_analysis.py +249 -0
- plotsalot-0.1.1/tests/test_model.py +22 -0
- plotsalot-0.1.1/tests/test_project_license.py +33 -0
- plotsalot-0.1.1/tests/test_regression.py +64 -0
- plotsalot-0.1.1/tests/test_repository_policy.py +74 -0
- plotsalot-0.1.1/tests/test_validation.py +145 -0
- plotsalot-0.1.1/tests/test_validation_evidence.py +64 -0
- plotsalot-0.1.1/tests/test_withinstats.py +180 -0
- plotsalot-0.1.1/tools/calibrate_m6a.py +128 -0
- plotsalot-0.1.1/tools/calibrate_m6c.py +385 -0
- plotsalot-0.1.1/tools/check_docs.py +72 -0
- plotsalot-0.1.1/tools/check_licenses.py +62 -0
- plotsalot-0.1.1/tools/verify_benchmark.py +390 -0
- plotsalot-0.1.1/tools/verify_oracle.py +999 -0
- plotsalot-0.1.1/tools/verify_release.py +45 -0
- plotsalot-0.1.1/uv.lock +1425 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @joshuamyers22
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
## Outcome
|
|
2
|
+
|
|
3
|
+
Describe the behavior or risk changed.
|
|
4
|
+
|
|
5
|
+
## Evidence
|
|
6
|
+
|
|
7
|
+
- [ ] `make check`
|
|
8
|
+
- [ ] `make build`
|
|
9
|
+
- [ ] Security, data, and operational effects reviewed
|
|
10
|
+
|
|
11
|
+
## Risk and recovery
|
|
12
|
+
|
|
13
|
+
- Failure modes:
|
|
14
|
+
- Compatibility or migration impact:
|
|
15
|
+
- Rollback or forward-fix path:
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
concurrency:
|
|
9
|
+
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
jobs:
|
|
12
|
+
quality:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 10
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
17
|
+
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
18
|
+
with:
|
|
19
|
+
version: "0.12.5"
|
|
20
|
+
- run: uv sync --frozen --dev
|
|
21
|
+
- run: make check
|
|
22
|
+
- run: make audit build
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
tags: ["v[0-9]+.[0-9]+.[0-9]+"]
|
|
5
|
+
concurrency:
|
|
6
|
+
group: release-${{ github.ref }}
|
|
7
|
+
cancel-in-progress: false
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
timeout-minutes: 15
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
16
|
+
with:
|
|
17
|
+
persist-credentials: false
|
|
18
|
+
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
19
|
+
with:
|
|
20
|
+
version: "0.12.5"
|
|
21
|
+
- run: uv sync --frozen --dev
|
|
22
|
+
- name: Verify release tag
|
|
23
|
+
env:
|
|
24
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
25
|
+
run: uv run python tools/verify_release.py --tag "$RELEASE_TAG"
|
|
26
|
+
- run: make check audit build
|
|
27
|
+
- uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # v0.24.0
|
|
28
|
+
with:
|
|
29
|
+
path: ./dist
|
|
30
|
+
artifact-name: release-sbom.cdx.json
|
|
31
|
+
output-file: ./dist/release-sbom.cdx.json
|
|
32
|
+
format: cyclonedx-json
|
|
33
|
+
upload-artifact: false
|
|
34
|
+
- name: Generate release checksums
|
|
35
|
+
run: sha256sum dist/*.whl dist/*.tar.gz dist/release-sbom.cdx.json > dist/SHA256SUMS
|
|
36
|
+
- name: Upload release artifacts
|
|
37
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
38
|
+
with:
|
|
39
|
+
name: release-artifacts
|
|
40
|
+
path: |
|
|
41
|
+
dist/*.whl
|
|
42
|
+
dist/*.tar.gz
|
|
43
|
+
dist/release-sbom.cdx.json
|
|
44
|
+
dist/SHA256SUMS
|
|
45
|
+
if-no-files-found: error
|
|
46
|
+
retention-days: 7
|
|
47
|
+
|
|
48
|
+
github-release:
|
|
49
|
+
needs: build
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
timeout-minutes: 5
|
|
52
|
+
permissions:
|
|
53
|
+
contents: write
|
|
54
|
+
steps:
|
|
55
|
+
- name: Download release artifacts
|
|
56
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
57
|
+
with:
|
|
58
|
+
name: release-artifacts
|
|
59
|
+
path: dist
|
|
60
|
+
- uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
|
|
61
|
+
with:
|
|
62
|
+
generate_release_notes: true
|
|
63
|
+
fail_on_unmatched_files: true
|
|
64
|
+
files: |
|
|
65
|
+
dist/*.whl
|
|
66
|
+
dist/*.tar.gz
|
|
67
|
+
dist/release-sbom.cdx.json
|
|
68
|
+
dist/SHA256SUMS
|
|
69
|
+
|
|
70
|
+
publish-pypi:
|
|
71
|
+
needs: [build, github-release]
|
|
72
|
+
runs-on: ubuntu-latest
|
|
73
|
+
timeout-minutes: 5
|
|
74
|
+
environment:
|
|
75
|
+
name: pypi
|
|
76
|
+
url: https://pypi.org/p/plotsalot
|
|
77
|
+
permissions:
|
|
78
|
+
id-token: write
|
|
79
|
+
steps:
|
|
80
|
+
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
81
|
+
with:
|
|
82
|
+
version: "0.12.5"
|
|
83
|
+
enable-cache: false
|
|
84
|
+
- name: Download release artifacts
|
|
85
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
86
|
+
with:
|
|
87
|
+
name: release-artifacts
|
|
88
|
+
path: dist
|
|
89
|
+
- name: Publish wheel and source distribution to PyPI
|
|
90
|
+
run: uv publish --trusted-publishing always dist/*.whl dist/*.tar.gz
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Secret scanning
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
push:
|
|
5
|
+
permissions:
|
|
6
|
+
contents: read
|
|
7
|
+
pull-requests: read
|
|
8
|
+
concurrency:
|
|
9
|
+
group: security-${{ github.workflow }}-${{ github.ref }}
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
jobs:
|
|
12
|
+
gitleaks:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 10
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
17
|
+
with:
|
|
18
|
+
fetch-depth: 0
|
|
19
|
+
- uses: gitleaks/gitleaks-action@e0c47f4f8be36e29cdc102c57e68cb5cbf0e8d1e # v3.0.0
|
|
20
|
+
env:
|
|
21
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
.ruff_cache/
|
|
3
|
+
.pytest_cache/
|
|
4
|
+
.mypy_cache/
|
|
5
|
+
.coverage
|
|
6
|
+
htmlcov/
|
|
7
|
+
__pycache__/
|
|
8
|
+
*.py[cod]
|
|
9
|
+
build/
|
|
10
|
+
dist/
|
|
11
|
+
*.egg-info/
|
|
12
|
+
.DS_Store
|
|
13
|
+
*.db
|
|
14
|
+
*.sqlite
|
|
15
|
+
.env
|
|
16
|
+
.env.*
|
|
17
|
+
!.env.example
|
|
18
|
+
data/raw/
|
|
19
|
+
data/private/
|
|
20
|
+
data/processed/
|
|
21
|
+
notebooks/.ipynb_checkpoints/
|
|
22
|
+
.work/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Agent Working Agreement
|
|
2
|
+
|
|
3
|
+
This file governs repository-local work performed with an AI coding agent. Human
|
|
4
|
+
instructions in the current task take precedence. Repository files, tests,
|
|
5
|
+
runtime behavior, and approved decision records remain authoritative.
|
|
6
|
+
|
|
7
|
+
## Retrieve before acting
|
|
8
|
+
|
|
9
|
+
1. Read `README.md`, `PROJECT_BRIEF.md`, and `PROJECT_MEMORY.md` before planning a
|
|
10
|
+
substantial change.
|
|
11
|
+
2. Search the repository and inspect the relevant implementation and tests before
|
|
12
|
+
relying on a memory entry.
|
|
13
|
+
3. Treat `PROJECT_MEMORY.md` as a compact index to evidence, not as evidence by
|
|
14
|
+
itself. Correct it when it conflicts with the source of truth.
|
|
15
|
+
|
|
16
|
+
## Maintain memory deliberately
|
|
17
|
+
|
|
18
|
+
- Record only durable, project-specific information likely to matter in a later
|
|
19
|
+
session: constraints, accepted decisions, non-obvious current state, verified
|
|
20
|
+
failure modes, and genuinely open work.
|
|
21
|
+
- Consult the existing entry before writing. Update a stable key in place instead
|
|
22
|
+
of appending a duplicate or a new narrative of the same fact.
|
|
23
|
+
- Link each claim to a file, test, issue, or ADR and include the date it was last
|
|
24
|
+
verified. Label inference and uncertainty explicitly.
|
|
25
|
+
- Keep entries short. Remove or replace stale state and resolved open work; Git
|
|
26
|
+
history already preserves the old text.
|
|
27
|
+
- Do not store routine progress, copied source code, command transcripts, hidden
|
|
28
|
+
reasoning, credentials, personal data, client data, or other restricted data.
|
|
29
|
+
- Do not let an agent rewrite safety, security, governance, or release policy from
|
|
30
|
+
its own trajectory. Such changes require normal review and verification.
|
|
31
|
+
|
|
32
|
+
## Take notes for continuity
|
|
33
|
+
|
|
34
|
+
- Keep disposable scratch notes and command output in ignored `.work/` and remove
|
|
35
|
+
them when the task ends.
|
|
36
|
+
- Create a tracked note from `templates/WORK_NOTE.md` only for multi-session work,
|
|
37
|
+
a handoff, incident, experiment, or material investigation. Record observations,
|
|
38
|
+
attempts, errors, evidence, and conclusions—not hidden reasoning or a transcript.
|
|
39
|
+
- Link to controlled telemetry queries or safe aggregates; never paste unrestricted
|
|
40
|
+
raw logs into a note.
|
|
41
|
+
- Close the note by promoting durable facts to project memory, decisions to an ADR,
|
|
42
|
+
maintained explanations to documentation, and work history to an issue. Delete
|
|
43
|
+
or close the note when it no longer has coordination or audit value.
|
|
44
|
+
|
|
45
|
+
## Learn from telemetry
|
|
46
|
+
|
|
47
|
+
- Emit structured operational events and errors using
|
|
48
|
+
`schemas/telemetry-event.schema.json`; use stable event and error-code names,
|
|
49
|
+
artifact identity, outcomes, and safe correlation identifiers.
|
|
50
|
+
- Instrument signals for a named operational decision or user journey. Do not add
|
|
51
|
+
telemetry merely because it may become useful.
|
|
52
|
+
- Review counts and rates on a declared cadence with
|
|
53
|
+
`templates/TELEMETRY_REVIEW.md`. Separate observed signals from inferred cause.
|
|
54
|
+
- Convert a selected finding into `templates/IMPROVEMENT_PLAN.md` with an owner,
|
|
55
|
+
regression test or replay, expected effect, guardrails, and rollback condition.
|
|
56
|
+
- Validate on a later assessment window. Do not treat fewer log lines, a single
|
|
57
|
+
anecdote, or an agent's own judgment as evidence of improvement.
|
|
58
|
+
|
|
59
|
+
## Run meaningful verification loops
|
|
60
|
+
|
|
61
|
+
- For material or high-risk work, define the project-specific objective, invariants,
|
|
62
|
+
rubric, evidence, resource ceiling, and stopping rules before extended iteration.
|
|
63
|
+
- Verify early after coherent slices. Each later pass must add evidence or a meaningfully
|
|
64
|
+
different perspective—such as a focused test, static analysis, fault injection,
|
|
65
|
+
production-like replay, clean build, adversarial input, or independently briefed
|
|
66
|
+
review when the workflow authorizes one.
|
|
67
|
+
- Treat fresh context as a way to reduce anchoring, not as proof of independence or
|
|
68
|
+
correctness. An agent's self-review is never sole approval for safety, security,
|
|
69
|
+
governance, financial logic, or release decisions.
|
|
70
|
+
- Scale effort by risk, uncertainty, blast radius, reversibility, dependency reach, and
|
|
71
|
+
test strength. Token, iteration, and elapsed-time budgets are ceilings rather than
|
|
72
|
+
quality targets; lines of code alone do not determine them.
|
|
73
|
+
- Stop on the declared pass threshold, diminishing-return rule, resource ceiling, or
|
|
74
|
+
need for domain authority. Report unresolved findings instead of repeating the same
|
|
75
|
+
review against unchanged evidence.
|
|
76
|
+
- Use `templates/AGENTIC_VERIFICATION_LOOP.md` for auditable multi-pass work. Record
|
|
77
|
+
finding evidence and dispositions, never hidden reasoning or prompt transcripts.
|
|
78
|
+
|
|
79
|
+
## Close the loop
|
|
80
|
+
|
|
81
|
+
After a material change, update `PROJECT_MEMORY.md` only if durable project
|
|
82
|
+
knowledge changed. Review the diff, run the applicable quality gate, and ensure
|
|
83
|
+
the memory entry points to the evidence that passed.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Notable user-visible changes are recorded here. Plotsalot follows semantic
|
|
4
|
+
versioning for published package releases.
|
|
5
|
+
|
|
6
|
+
## 0.1.1 - 2026-09-15
|
|
7
|
+
|
|
8
|
+
- Reorganized the package documentation around installation, getting started,
|
|
9
|
+
task-oriented workflows, interpretation boundaries, and maintained evidence.
|
|
10
|
+
- Aligned repository setup, package metadata, documentation checks, and release
|
|
11
|
+
artifact handling with the production-project-template baseline.
|
|
12
|
+
|
|
13
|
+
## 0.1.0 - 2026-09-15
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- Polars-first one-sample histograms, labeled dot plots, scatter plots,
|
|
18
|
+
correlation matrices, independent and repeated comparisons, categorical bar
|
|
19
|
+
and pie analyses, coefficient plots, and aggregate meta-analysis workflows.
|
|
20
|
+
- Atomic grouped analysis, result-preserving plot composition, local Matplotlib
|
|
21
|
+
themes, and separate analysis/rendering APIs.
|
|
22
|
+
- Immutable, JSON-safe structured results with versioned schemas, sample and
|
|
23
|
+
method provenance, correction metadata, resource limits, and owned numerical
|
|
24
|
+
boundaries.
|
|
25
|
+
- Approved classical, fixed-20%-trim robust, and proper-prior Bayesian modes for
|
|
26
|
+
their documented workflow families, including deterministic bounded bootstrap,
|
|
27
|
+
quadrature, and randomized quasi-Monte Carlo computation.
|
|
28
|
+
- Strict caller-reported robust and posterior coefficient profiles plus
|
|
29
|
+
fixed-Student-t robust and proper-prior Bayesian aggregate meta-analysis.
|
|
30
|
+
- Pinned R-oracle fixtures, independent analytic checks, retained performance
|
|
31
|
+
baselines, installed-wheel smoke tests, vulnerability/license gates, and
|
|
32
|
+
milestone-specific verification and sign-off records.
|
|
33
|
+
|
|
34
|
+
### Compatibility
|
|
35
|
+
|
|
36
|
+
- Established plotsalot as an independent, adapted Python implementation of
|
|
37
|
+
selected `ggstatsplot` behavior rather than a line-by-line or pixel-identical
|
|
38
|
+
port.
|
|
39
|
+
- Adopted explicit subject identity for repeated designs, strict non-finite and
|
|
40
|
+
degenerate-sample rejection, owned Matplotlib rendering, and no silent method
|
|
41
|
+
fallback or partial grouped success.
|
|
42
|
+
|
|
43
|
+
### Known limitations
|
|
44
|
+
|
|
45
|
+
- M7 compatibility closure and 1.0 API hardening remain.
|
|
46
|
+
- The accepted M6C zero-heterogeneity calibration disposition is provisional and
|
|
47
|
+
must be revisited before 1.0.
|
|
48
|
+
- Nonparametric families, general fitted-model dispatch, arbitrary ggplot layer
|
|
49
|
+
compatibility, and unsupported upstream arguments remain deferred.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Plotsalot is a pre-1.0 scientific Python project. Keep changes bounded, preserve
|
|
4
|
+
the declared statistical and ownership contracts, and add evidence for changed
|
|
5
|
+
behavior.
|
|
6
|
+
|
|
7
|
+
## Set up a checkout
|
|
8
|
+
|
|
9
|
+
Use Python 3.11 or newer and the locked development environment:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
make setup
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
For a new clone or maintainer machine, complete
|
|
16
|
+
[`checklists/REPOSITORY_SETUP.md`](checklists/REPOSITORY_SETUP.md) before the
|
|
17
|
+
first commit or push.
|
|
18
|
+
|
|
19
|
+
## Make a change
|
|
20
|
+
|
|
21
|
+
- Work on a focused branch rather than directly on `main`.
|
|
22
|
+
- Keep Polars as the public tabular boundary and make numerical ownership
|
|
23
|
+
explicit.
|
|
24
|
+
- Do not change an approved statistical method, compatibility classification,
|
|
25
|
+
license, security policy, or release policy without the corresponding review.
|
|
26
|
+
- Add a regression test for corrected defects and deterministic seeds for random
|
|
27
|
+
procedures.
|
|
28
|
+
- Update user documentation, method specifications, schemas, and changelog
|
|
29
|
+
entries in the same change when public behavior changes.
|
|
30
|
+
- Keep credentials, private data, generated distributions, and raw telemetry out
|
|
31
|
+
of Git.
|
|
32
|
+
|
|
33
|
+
## Verify the change
|
|
34
|
+
|
|
35
|
+
Run the local quality and packaging gates:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
make check
|
|
39
|
+
make audit
|
|
40
|
+
make build
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`make oracle` regenerates the pinned R compatibility evidence and requires
|
|
44
|
+
Docker. `make benchmark` refreshes retained performance evidence. Run either only
|
|
45
|
+
when the change affects its declared boundary, then review the resulting diff.
|
|
46
|
+
|
|
47
|
+
## Submit a pull request
|
|
48
|
+
|
|
49
|
+
Pull requests must state:
|
|
50
|
+
|
|
51
|
+
- the user-visible or risk-reducing outcome;
|
|
52
|
+
- compatibility, statistical, security, and data-boundary effects;
|
|
53
|
+
- verification evidence and any deliberately unrun gate; and
|
|
54
|
+
- a rollback or forward-fix path.
|
|
55
|
+
|
|
56
|
+
The accountable owner must review release, security, governance, license, and
|
|
57
|
+
statistical-method changes. Automated checks and agent review do not replace
|
|
58
|
+
that approval. Maintainers should follow the [release procedure](docs/RELEASING.md)
|
|
59
|
+
and complete the release-readiness checklist before creating a version tag.
|
plotsalot-0.1.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Joshua Myers
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
plotsalot-0.1.1/Makefile
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
.PHONY: setup format lint typecheck test docs check audit build oracle verify-oracle benchmark verify-benchmark
|
|
2
|
+
setup:
|
|
3
|
+
uv sync --frozen --dev
|
|
4
|
+
format:
|
|
5
|
+
uv run ruff format .
|
|
6
|
+
lint:
|
|
7
|
+
uv run ruff check .
|
|
8
|
+
uv run ruff format --check .
|
|
9
|
+
typecheck:
|
|
10
|
+
uv run pyright
|
|
11
|
+
test:
|
|
12
|
+
uv run coverage run -m unittest discover -s tests
|
|
13
|
+
uv run coverage report
|
|
14
|
+
docs:
|
|
15
|
+
uv run python tools/check_docs.py
|
|
16
|
+
check: lint typecheck test docs
|
|
17
|
+
audit:
|
|
18
|
+
uv audit --preview-features audit-command --locked --no-dev
|
|
19
|
+
uv run python tools/check_licenses.py
|
|
20
|
+
build:
|
|
21
|
+
uv build --no-sources
|
|
22
|
+
oracle:
|
|
23
|
+
docker build --platform linux/arm64 --build-arg GGSTATSPLOT_REVISION=7a724cd0ab55668b9d0b2e84b12c711c5be68ac8 -t plotsalot-r-oracle:m0 -f oracle/Dockerfile .
|
|
24
|
+
docker run --rm --platform linux/arm64 -v "$(CURDIR):/work" plotsalot-r-oracle:m0
|
|
25
|
+
uv run python tools/verify_oracle.py --write-manifest
|
|
26
|
+
uv run python tools/verify_oracle.py
|
|
27
|
+
verify-oracle:
|
|
28
|
+
uv run python tools/verify_oracle.py
|
|
29
|
+
benchmark:
|
|
30
|
+
uv run python benchmarks/benchmark_m0.py
|
|
31
|
+
uv run python benchmarks/benchmark_m2.py
|
|
32
|
+
uv run python benchmarks/benchmark_m3.py
|
|
33
|
+
uv run python benchmarks/benchmark_m4.py
|
|
34
|
+
uv run python benchmarks/benchmark_m5a.py
|
|
35
|
+
uv run python benchmarks/benchmark_m5b.py
|
|
36
|
+
uv run python benchmarks/benchmark_m6a.py
|
|
37
|
+
uv run python benchmarks/benchmark_m6b.py
|
|
38
|
+
uv run python benchmarks/benchmark_m6c.py
|
|
39
|
+
uv run python tools/verify_benchmark.py
|
|
40
|
+
verify-benchmark:
|
|
41
|
+
uv run python tools/verify_benchmark.py
|
plotsalot-0.1.1/PKG-INFO
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: plotsalot
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Statistical visualizations and distribution diagnostics for Python
|
|
5
|
+
Project-URL: Homepage, https://github.com/joshuamyers22/plotsalot
|
|
6
|
+
Project-URL: Documentation, https://github.com/joshuamyers22/plotsalot/tree/main/docs
|
|
7
|
+
Project-URL: Repository, https://github.com/joshuamyers22/plotsalot
|
|
8
|
+
Project-URL: Issues, https://github.com/joshuamyers22/plotsalot/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/joshuamyers22/plotsalot/blob/main/CHANGELOG.md
|
|
10
|
+
Author: Joshua Myers
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: ggstatsplot,matplotlib,polars,statistics,visualization
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: MacOS
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
23
|
+
Classifier: Typing :: Typed
|
|
24
|
+
Requires-Python: >=3.11
|
|
25
|
+
Requires-Dist: matplotlib<4,>=3.10
|
|
26
|
+
Requires-Dist: numpy<3,>=2
|
|
27
|
+
Requires-Dist: polars<2,>=1.44.1
|
|
28
|
+
Requires-Dist: scipy<2,>=1.16
|
|
29
|
+
Requires-Dist: statsmodels<0.16,>=0.15
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# plotsalot
|
|
33
|
+
|
|
34
|
+
`plotsalot` is an independent Python library for statistical visualizations with
|
|
35
|
+
structured, extractable results. It provides Polars-first analysis workflows and
|
|
36
|
+
Matplotlib figures inspired by the public behavior of
|
|
37
|
+
[`ggstatsplot`](https://github.com/IndrajeetPatil/ggstatsplot).
|
|
38
|
+
|
|
39
|
+
The project is pre-1.0 alpha software. Its classical, robust, Bayesian,
|
|
40
|
+
categorical, coefficient, and meta-analysis families have passed their recorded
|
|
41
|
+
M0–M6 technical and statistical gates, but M7 compatibility closure and 1.0
|
|
42
|
+
hardening remain. Do not treat a successful computation or plot as automatic
|
|
43
|
+
validation of a statistical model or a substantive conclusion.
|
|
44
|
+
|
|
45
|
+
## Install
|
|
46
|
+
|
|
47
|
+
Plotsalot supports Python 3.11 and newer on Linux and macOS. After the first PyPI
|
|
48
|
+
release:
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
python -m pip install plotsalot
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
For development from a checkout:
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
make setup
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
R and Docker are development-only oracle tools. They are not package runtime
|
|
61
|
+
dependencies.
|
|
62
|
+
|
|
63
|
+
## Quick start
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
import polars as pl
|
|
67
|
+
|
|
68
|
+
from plotsalot import gghistostats
|
|
69
|
+
|
|
70
|
+
data = pl.DataFrame({"value": [1.0, 2.0, 3.0, 4.0, 5.0]})
|
|
71
|
+
plot = gghistostats(data, "value", test_value=0.0)
|
|
72
|
+
|
|
73
|
+
print(plot.result.to_dict())
|
|
74
|
+
plot.figure.savefig("histogram.svg")
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Each plotting function returns a typed container with a Matplotlib figure, named
|
|
78
|
+
axes, annotations, and a structured result. Analysis and rendering can also be
|
|
79
|
+
separated so visual changes do not recompute statistics:
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
from plotsalot import analyze_gghistostats, render_gghistostats
|
|
83
|
+
|
|
84
|
+
analysis = analyze_gghistostats(data, "value", test_value=0.0)
|
|
85
|
+
plot = render_gghistostats(analysis, title="Observed values")
|
|
86
|
+
plot.axes["main"].grid(axis="y", alpha=0.2)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Find the right documentation
|
|
90
|
+
|
|
91
|
+
| Need | Go to |
|
|
92
|
+
|---|---|
|
|
93
|
+
| Complete a first analysis | [Getting started](docs/GETTING_STARTED.md) |
|
|
94
|
+
| Choose a plot or analysis family | [User guide](docs/USER_GUIDE.md) |
|
|
95
|
+
| Interpret results and failure boundaries | [Interpretation and limitations](docs/INTERPRETATION_AND_LIMITATIONS.md) |
|
|
96
|
+
| Understand result and rendering contracts | [Contracts](docs/CONTRACTS.md) |
|
|
97
|
+
| Compare behavior with `ggstatsplot` | [Compatibility matrix](docs/compatibility.md) |
|
|
98
|
+
| Review statistical definitions | [Statistical methods index](docs/README.md#statistical-methods) |
|
|
99
|
+
| Reproduce tests, oracles, and benchmarks | [Reproducibility](REPRODUCIBILITY.md) |
|
|
100
|
+
| Contribute a change | [Contributing](CONTRIBUTING.md) |
|
|
101
|
+
|
|
102
|
+
## Supported workflow families
|
|
103
|
+
|
|
104
|
+
- one-sample histograms and labeled dot plots;
|
|
105
|
+
- scatter plots and correlation matrices;
|
|
106
|
+
- independent- and repeated-group comparisons;
|
|
107
|
+
- categorical bar and pie analyses;
|
|
108
|
+
- coefficient and aggregate meta-analysis plots;
|
|
109
|
+
- atomic grouped variants, plot composition, and local themes; and
|
|
110
|
+
- explicit classical, fixed-trim robust, and approved Bayesian modes where
|
|
111
|
+
listed in the [compatibility matrix](docs/compatibility.md).
|
|
112
|
+
|
|
113
|
+
The implementation is adapted rather than a drop-in port. It uses explicit
|
|
114
|
+
column names, typed Python results, owned NumPy boundaries, and Matplotlib
|
|
115
|
+
rendering. Unsupported modes fail explicitly; grouped operations do not return
|
|
116
|
+
partial results.
|
|
117
|
+
|
|
118
|
+
## Development
|
|
119
|
+
|
|
120
|
+
```sh
|
|
121
|
+
make setup
|
|
122
|
+
make check
|
|
123
|
+
make audit
|
|
124
|
+
make build
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The default quality gate runs formatting, linting, strict type checking, the test
|
|
128
|
+
suite, coverage enforcement, and documentation-link checks. Frozen R-oracle and
|
|
129
|
+
benchmark evidence are verified by the normal tests; regenerating them is an
|
|
130
|
+
explicit operation:
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
make oracle
|
|
134
|
+
make benchmark
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
See [the documentation index](docs/README.md) for project plans, decisions,
|
|
138
|
+
method specifications, and retained verification evidence.
|
|
139
|
+
|
|
140
|
+
## Project identity and license
|
|
141
|
+
|
|
142
|
+
Plotsalot is an independent project and is not endorsed by or affiliated with
|
|
143
|
+
the `ggstatsplot` maintainers. The upstream project is used as a pinned behavioral
|
|
144
|
+
reference under the adaptation rules recorded in the repository.
|
|
145
|
+
|
|
146
|
+
Plotsalot is MIT licensed. See [LICENSE](LICENSE) and
|
|
147
|
+
[ADR-010](docs/adr/ADR-010-license-posture.md) for the accepted distribution and
|
|
148
|
+
upstream-notice rules. Report security concerns according to
|
|
149
|
+
[SECURITY.md](SECURITY.md).
|