Skip to main content

Python SDK and CLI (sfs) for StickForStats — statistical analysis with automatic assumption validation (Guardian) and manuscript statistical verification

Project description

StickForStats Python SDK

Python client for the StickForStats statistical analysis platform -- featuring the Guardian Statistical Protection System, Autonomous Intelligence Layer, and Manuscript Review Engine.

Installation

pip install stickforstats

With CLI support (adds sfs command):

pip install stickforstats[cli]

Quick Start

from stickforstats import StickForStats

client = StickForStats(
    base_url="http://localhost:8000/api/v1",
    api_key="your-api-key",
)

# Run a t-test with Guardian protection
result = client.stats.ttest(
    data={"control": [23, 25, 28, 22, 27], "treatment": [30, 33, 29, 35, 31]},
    alpha=0.05,
)
print(f"t = {result.t_statistic}, p = {result.p_value}")
if result.guardian and not result.guardian.passed:
    print("Guardian violations:", result.guardian.violations)

Use as a context manager to ensure connections are cleaned up:

with StickForStats(api_key="tok_abc123") as sfs:
    desc = sfs.stats.descriptive(data=[10, 20, 30, 40, 50])
    print(f"Mean: {desc.mean}, SD: {desc.std_dev}")

Statistical Tests

t-Test

result = client.stats.ttest(
    data={"before": [5.1, 4.9, 5.3], "after": [6.2, 5.8, 6.5]},
    paired=True,
    alpha=0.05,
)

ANOVA

result = client.stats.anova(
    data={
        "group_a": [4.1, 3.9, 4.5, 4.2],
        "group_b": [5.2, 5.5, 5.1, 5.3],
        "group_c": [6.0, 6.3, 5.8, 6.1],
    },
    post_hoc="tukey",
)

Correlation

result = client.stats.correlation(
    x=[1, 2, 3, 4, 5],
    y=[2, 4, 5, 4, 5],
    method="pearson",
)
print(f"r = {result.correlation}, p = {result.p_value}")

Regression

result = client.stats.regression(
    data={"x1": [1, 2, 3], "x2": [4, 5, 6], "y": [7, 8, 9]},
    dependent="y",
    predictors=["x1", "x2"],
    regression_type="linear",
)
print(f"R-squared = {result.r_squared}")

Descriptive Statistics

result = client.stats.descriptive(data=[12, 15, 18, 22, 25, 30])
print(f"Mean: {result.mean}, Median: {result.median}, SD: {result.std_dev}")

Power Analysis

# Determine required sample size
result = client.power.ttest(effect_size=0.5, alpha=0.05, power=0.80)
print(f"Required n = {result.sample_size}")

# Comprehensive power report
report = client.power.report(
    data={"group1": [1, 2, 3], "group2": [4, 5, 6]},
    tests=["ttest", "anova"],
)

Nonparametric Tests

# Mann-Whitney U
result = client.nonparametric.mann_whitney(
    group1=[3.1, 2.5, 4.0, 3.8],
    group2=[5.2, 4.9, 6.1, 5.5],
)

# Kruskal-Wallis
result = client.nonparametric.kruskal_wallis(
    data={"a": [1, 2, 3], "b": [4, 5, 6], "c": [7, 8, 9]},
)

Categorical Tests

# Chi-square independence
result = client.categorical.chi_square_independence(
    observed=[[10, 20], [30, 40]],
)

# Fisher's exact test
result = client.categorical.fishers_exact(
    table=[[8, 2], [1, 5]],
)

Autonomous Intelligence

# Smart profiling
profile = client.autonomous.profile(
    data={"age": [25, 30, 35], "score": [80, 85, 90], "group": [1, 2, 1]},
)
print(profile.recommendations)

# Natural-language query
answer = client.autonomous.query(
    question="Is there a significant difference between groups?",
    data={"group1": [1, 2, 3], "group2": [4, 5, 6]},
)
print(answer.narrative)

# Guardian cascade (auto-fallback to nonparametric if assumptions violated)
cascade = client.autonomous.cascade(
    data={"control": [1, 1, 2], "treatment": [10, 50, 100]},
    test="ttest",
)
if cascade.fallback_used:
    print(f"Guardian redirected to: {cascade.executed_test}")

Manuscript Review

# Full manuscript analysis
report = client.manuscript.analyze(
    "paper.pdf",
    field="psychology",
    alpha=0.05,
)
print(f"Score: {report.overall_score}")
for claim in report.claims:
    status = "PASS" if claim.verified else "FAIL"
    print(f"  [{status}] {claim.text}")

# Check consistency
consistency = client.manuscript.check_consistency("paper.pdf")
if not consistency.consistent:
    for issue in consistency.inconsistencies:
        print(f"  Inconsistency: {issue}")

Platform Usage

# Check your quota
usage = client.platform.usage()
print(f"Tier: {usage.tier}, Remaining: {usage.remaining_quota}")

# List available tiers
tiers = client.platform.tiers()
for tier in tiers:
    print(f"{tier.name}: {tier.monthly_requests} requests/month")

CLI Usage

Configure your connection once:

sfs config --api-key YOUR_API_KEY --base-url http://localhost:8000/api/v1

Run analyses from the terminal:

# Run a t-test
sfs analyze --file data.csv --test ttest --alpha 0.05

# Descriptive statistics
sfs analyze --file data.csv --test descriptive

# Regression
sfs analyze --file data.csv --test regression --dependent y --predictors "x1,x2"

# Smart profiling
sfs profile --file data.csv

# Natural-language query
sfs query "compare groups" --file data.csv

# Manuscript review
sfs manuscript --file paper.pdf --field psychology

# Check usage
sfs usage

Authentication

The SDK supports two authentication methods:

User token (default):

client = StickForStats(api_key="tok_abc123")
# Sends: Authorization: Token tok_abc123

Platform key (for server-to-server integration):

client = StickForStats(api_key="pk_live_xyz", platform_key=True)
# Sends: X-API-Key: pk_live_xyz

Error Handling

from stickforstats import StickForStats, AuthenticationError, ValidationError, APIError

client = StickForStats(api_key="bad-key")

try:
    result = client.stats.ttest(data={"a": [1], "b": [2]})
except AuthenticationError:
    print("Invalid API key")
except ValidationError as e:
    print(f"Bad input: {e.field_errors}")
except APIError as e:
    print(f"Server error [{e.status_code}]: {e.message}")

Requirements

  • Python 3.8+
  • httpx >= 0.24
  • pydantic >= 2.0
  • click >= 8.0 and rich >= 13.0 (optional, for CLI)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stickforstats-0.2.1.tar.gz (17.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stickforstats-0.2.1-py3-none-any.whl (22.6 kB view details)

Uploaded Python 3

File details

Details for the file stickforstats-0.2.1.tar.gz.

File metadata

  • Download URL: stickforstats-0.2.1.tar.gz
  • Upload date:
  • Size: 17.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stickforstats-0.2.1.tar.gz
Algorithm Hash digest
SHA256 588f8f8fd1f4a179a770df5591189a5b65ad5fc43f47e38d500de2efa910ad23
MD5 4bec6e5a99031f385a8546a3f5d228c6
BLAKE2b-256 af97780d57396992009005f909fbb75499a52e295c366697deeb09c5f6b761f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for stickforstats-0.2.1.tar.gz:

Publisher: publish-sdk.yml on visvikbharti/stickforstats_new

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stickforstats-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: stickforstats-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 22.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stickforstats-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1b31c6aa08938d869265c39240c06c1ff6ba960b1716a2d3a061f4ddaa8e2441
MD5 d27da3eeaae24bd688208c25f77b6389
BLAKE2b-256 b78f16dd0355ad33a7127ce0ac2808fff6c3d8185346f796b79f1d7da80c0827

See more details on using hashes here.

Provenance

The following attestation bundles were made for stickforstats-0.2.1-py3-none-any.whl:

Publisher: publish-sdk.yml on visvikbharti/stickforstats_new

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page